ANTLR4 中基于目标的成员

Target based members in ANTLR4

有没有办法区分语言目标并在语法文件中提供适当版本的@members?不同的语言目标使用不同的注释和语法。我想为不同的目标语言维护相同的语法文件。

对于 Cpp (C++) 目标:

@members {
  // C++ target:
  bool a_boolean = 0;
}

对于Python3目标:

@members {
  # Python target:
  a_boolean: bool = True
}

对于Java目标:

@members {
  /** Java target:
   */
  Boolean a_boolean = true;
}

或者是否有任何可以检查目标语言的 ANTLR4 元条件?这是我自己的语法,但是有什么东西吗?

@members {
  $if Cpp
    // C++ target:
    bool a_boolean = 0;
  $fi

  $if Python
    # Python target:
    a_boolean: bool = True
  $fi

  $if Java
    /** Java target:
     */
    Boolean a_boolean = true;
  $fi
}

这一切都不可能。这是 ANTLR4 在解析器生成时执行的简单复制粘贴操作,包括缩进 + 换行符等所有空格。

您唯一的选择是区分 C++ 和所有其他目标,因为对于 C++,我已经介绍了 additional named actions,例如 @parser::definitions

但是,如果您向出现在所有目标中的 @members 之类的命名操作添加一些内容,那么您最终将在结果文件中包含非 C++ 代码(当使用 C++ 作为目标时)。

总之,您的方法行不通,您最好使用不同的解决方案,例如解析器和词法分析器的基 class,其中包含您需要的成员变量。详情搜索:

options {
    superClass = ...;
}