语法错误:'public'对我来说完全出乎意料



我正在尝试将工作antlr移植到antlr4,但找不到为什么我得到错误:

语法错误:'public'给了我一个完全的惊喜

:

public root
    : NEWLINE* global_block EOF -> ^(Root global_block)
    ;

?

顺便说一句,我也得到:

syntax error: '->' came as a complete surprise to me while looking for rule element 
syntax error: '^' came as a complete surprise to me

实用的解决方案

删除public修饰符。默认情况下,规则是公开的。

无法识别public的原因

我不知道!根据Antlr4语法(https://github.com/antlr/grammars-v4/blob/master/antlr4/ANTLRv4Parser.g4),应该允许public。但是,我不确定这种语法是否正是用于Antlr4的语法。

你的规范中更严重的问题

AST构造函数在Antlr4中不再支持,所以^(Root global_block)不再可能了。您需要一个树访问器(或侦听器)来构建自定义树:

运行带有-visitor选项的antlr,生成访问者类。该类是一个泛型类,每个规则都有一个visit方法,例如

public class PropertyFileBaseVisitor<T> extends AbstractParseTreeVisitor<T>
implements PropertyFileVisitor<T>
{
    @Override public T visitFile(PropertyFileParser.FileContext ctx) { ... }
    @Override public T visitProp(PropertyFileParser.PropContext ctx) { ... }

}

它返回任何T,因此您可以简单地编写一个访问者来构建所需类型的树并返回它。有关使用访问器的更深入讨论,请参阅ANTLR中使用侦听器的If/else语句

相关内容

  • 没有找到相关文章

最新更新