antlr4 - 语法错误: 'public' came as a complete surprise to me

标签 antlr4

我正在尝试将正在工作的 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/

相关文章:

java - 如何修复与语义谓词一起使用的左递归中的错误?

javascript - ANTLR4 Javascript 解析器正则表达式和除法运算符冲突

antlr - 使用 ANTLR4 生成的访问者生成 AST

java - ANTLR v4 的 mysql 语法文件中的语法错误

antlr4 - 处理以ANTLR4中的转义引号结尾的字符串文字

python - 属性错误: 'MuParser' object has no attribute 'startRule'

java - 在监听器中使用 ParserRuleContext 遍历 token - ANTLR4

antlr4 - 堆栈溢出解析ANTLR4中的非常大的表达式

java - ANTLR4 TestRig (grun) 抛出 java.lang.NoClassDefFoundError 异常

c# - ANTLR:如何避免在用户修改文本时重新解析整个文件