我正在尝试将正在工作的 antlr 移植到 antlr4,但找不到出现错误的原因:
syntax error: 'public' came as a complete surprise to me
关于:
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 constructors are no longer supported in 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
,因此您可以简单地编写一个访问者来构建所需类型的树并返回它。有关使用访问者的更深入讨论,请参阅 If/else statements in ANTLR using listeners
关于antlr4 - 语法错误: 'public' came as a complete surprise to me,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23951122/