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

时间:2016-03-15 15:52:11

标签: eclipse antlr antlr4

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

grammar MetaCoder;

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

value: init
     | INT
     ;

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

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

// 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显示以下错误:

The method xxx of type MetaCoderBaseListener must override a superclass method

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

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

2 个答案:

答案 0 :(得分:0)

在发布问题之后,StackOverflow提出了一些相关的问题,而且这个问题有答案:

Trouble Setting Up ANTLR 4 IDE on Eclipse Luna (4.4)

在我的情况下,问题是我的项目没有转换为Facets。

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

答案 1 :(得分:0)

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