“!”、“^”和“$”在 Antlr3 中有特殊含义吗?

Did "!", "^" and "$" had a special meaning in Antlr3?

我对 ANTLR 没有任何先验知识(我最近了解了一些关于 ANTLR4 的知识),但我必须将旧语法翻译成新版本,而 eclipse 告诉我,它们不是那些可行的替代品字符并显示语法错误“'!'完全出乎我的意料”。 我已经删除了那些字符并且它不会成为问题,但也许它在 ANTLR3 中有一个特殊的功能。 提前致谢。

global_block:
    DATABASE! IDENTIFIER!
  | GLOBALS! define_section!+ END! GLOBALS!
  | GLOBALS! STRING!
;

main_block: MAIN sequence? END em=MAIN
    -> ^(MAIN MAIN '(' ')' sequence? $em)
  ;

^->与树重写相关:https://theantlrguy.atlassian.net/wiki/spaces/ANTLR3/pages/2687090/Tree+construction

ANTLR4 不支持(v4 有树遍历的监听器和访问器,但不再重写)。只需在解析器规则中删除所有这些 !-> ...(不要删除词法分析器规则中的 -> ...,如 -> channel(...),v4 仍然支持它)。

所以在你的情况下,这些规则在 ANTLR4 中是有效的:

global_block
 : DATABASE IDENTIFIER
 | GLOBALS define_section+ END GLOBALS
 | GLOBALS STRING
 ;

main_block
 : MAIN sequence? END MAIN
 ;

$ 仍然可以在 ANTLR4 中使用:它们用于引用 sub-rules 或标记:

expression
 : lhs=expression operator=(PLUS | MINUS) rhs=expression
 | NUMBER
 ;

以便在嵌入式代码块中,您可以执行:$lhs.someField.someMethod()。在您的情况下,您也可以删除它们,因为它们可能仅用于树重写规则。

编辑

kaby76 has a Github page with some instructions for converting grammars to ANTLR4: https://github.com/kaby76/AntlrVSIX/blob/master/doc/Import.md#antlr3