我试图将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
答案 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