语法错误:' public'对我来说完全是一个惊喜

时间:2014-05-30 09:22:52

标签: antlr4

我试图将antlr移植到antlr4,但无法找到我收到错误的原因:

  

语法错误:&#39> public'对我来说完全是一个惊喜

在:

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

btw我也得到了:

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

1 个答案:

答案 0 :(得分:2)

务实的解决方案

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

无法识别原因public

我不知道!根据Antlr4语法(https://github.com/antlr/grammars-v4/blob/master/antlr4/ANTLRv4Parser.g4),应该允许public。但是,我不确定这个语法是否与Antlr4完全相同。

规范中的一个更严重的问题

AST constructors are no longer supported in Antlr4因此^(Root global_block)不再可能。您需要树访问者(或监听器)来构建自定义树:

使用antlr选项运行-visitor以生成访问者类。此类是一个泛型类,每个规则都有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,因此您只需编写一个构建所需类型树的访问者并将其返回。有关使用访问者的更深入讨论,请参阅If/else statements in ANTLR using listeners