为什么 ANTLR 4 Eclipse 插件会生成错误代码?

Why is ANTLR 4 Eclipse plugin generating wrong code?

我是 ANTLR 新手,我的第一次实验是在版本 4 中进行的。由于我使用 Eclipse Mars,我决定安装 Eclipse ANTLR 4 插件。全部完成后,我创建了以下语法(MetaCoder.g4 文件):

1
2
3
4
5
6
7
8
9
10
11
12
grammar MetaCoder;

init: '{' value (',' value)* '}' ;

value: init
     | INT
     ;

INT: [0-9]+ ;
WS: [ \\t\
\
]+ -> skip ; // skip spaces, tabs, newlines

插件生成为以下java代码(我删除了大部分注释以使其更短):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Generated from MetaCoder.g4 by ANTLR 4.4

import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.misc.NotNull;
import org.antlr.v4.runtime.tree.ErrorNode;
import org.antlr.v4.runtime.tree.TerminalNode;

public class MetaCoderBaseListener implements MetaCoderListener {
    @Override public void enterInit(@NotNull MetaCoderParser.InitContext ctx) { }
    @Override public void exitInit(@NotNull MetaCoderParser.InitContext ctx) { }
    @Override public void enterValue(@NotNull MetaCoderParser.ValueContext ctx) { }
    @Override public void exitValue(@NotNull MetaCoderParser.ValueContext ctx) { }

    @Override public void enterEveryRule(@NotNull ParserRuleContext ctx) { }
    @Override public void exitEveryRule(@NotNull ParserRuleContext ctx) { }
    @Override public void visitTerminal(@NotNull TerminalNode node) { }
    @Override public void visitErrorNode(@NotNull ErrorNode node) { }
}

对于所有被覆盖的方法,Eclipse 显示以下错误:

1
The method xxx of type MetaCoderBaseListener must override a superclass method

消息似乎是正确的,因为这个类没有祖先。

出了什么问题以及如何解决?


听起来 ANTLR 没有正确创建 MetaCoderListener 类,定义了这些方法。当您使用 ANTLR 生成解析器时,请尝试使用 -listener 作为参数来生成它。这将生成正确的侦听器,然后您的类将实现该侦听器(访问者也是如此。使用 -visitor 参数来生成访问者)。


刚刚发布了这个问题,StackOverflow 就提出了一些相关的问题,这个问题有答案:

在 Eclipse Luna (4.4) 上设置 ANTLR 4 IDE 时遇到问题

就我而言,问题是我的项目没有转换为 Facets。

一旦我这样做了,错误就消失了。