【问题标题】:Did "!", "^" and "$" had a special meaning in Antlr3?“!”、“^”和“$”在 Antlr3 中是否有特殊含义?
【发布时间】:2020-10-01 07:15:02
【问题描述】:

我没有任何关于 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)
  ;

【问题讨论】:

    标签: antlr antlr4


    【解决方案1】:

    ^->与树重写有关: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 中使用:它们用于引用子规则或令牌:

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

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

    编辑

    kaby76 有一个 Github 页面,其中包含一些将语法转换为 ANTLR4 的说明:https://github.com/kaby76/AntlrVSIX/blob/master/doc/Import.md#antlr3

    【讨论】:

    • 感谢您的快速答复。你知道他们是否有任何从 ANTLR3 到 v4 的迁移指南
    • 不客气。不,曾经有一个合流页面,但那是离线的,并且 Intenet 存档 (web.archive.org) 也没有副本。但是除了树重写之外,v3 和 v4 之间几乎没有语法差异。
    • 没有任何好的指南,但我已经明确概述了我为将 Antltr3 语法转换为 Antlr4 here 而实现的转换。
    • 很好,将它添加到我的答案@kaby76
    猜你喜欢
    • 2013-04-18
    • 1970-01-01
    • 2015-09-08
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多