Antlr4 在输入符号处没有可行的替代方案

Antlr4 No viable alternative at input symbols

我正在实现一个简单的程序遍历器语法,但我在多行中遇到了这个常见错误。我认为这是由同样的原因引起的,但我是 antlr 的新手,所以我无法弄清楚。

例如,在以下代码片段中:

program
  : (declaration)*
    (statement)*
    EOF!
  ;

我收到错误:

No viable alternative at input '!'

EOF 之后,我遇到了类似的错误:

declaration
  : INT VARNUM '=' expression ';'
  -> ^(DECL VARNUM expression)
  ;

我收到错误:

No viable alternative at input '->'

看了其他问题,才知道一个token匹配多个定义会导致这个问题。但是我还没有用任何输入测试它,我在 intelliJ 中遇到了这个错误。我该如何解决我的问题?

这是 ANTLR v3 语法,你正试图用 ANTLR v4 编译它,这是行不通的。

要么降级到 ANTLR v3,要么使用 v4 语法。不同之处在于 v4 不支持自动 AST 生成,而您正尝试使用 AST 构造运算符,但已被删除。

第一个片段只需要您删除 !。括号不是必需的。

program
  : declaration*
    statement*
    EOF
  ;

至于第二个,删除 ->:

之后的所有内容
declaration
  : INT VARNUM '=' expression ';'
  ;

如果您需要使用 v4 构建 AST,请参阅