无法识别
我不知道!根据Antlr4语法(https://github.com/antlr/grammars-v4/blob/master/antlr4/ANTLRv4Parser.g4),应该允许
我正在尝试将工作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语句