为什么ANTLR 4 Eclipse插件会生成错误的代码?
问题描述:
我是ANTLR的新手,在版本4中进行了第一次实验。由于我使用Eclipse Mars,因此我决定安装Eclipse ANTLR 4插件。全部完成后,我创建了下面的语法(MetaCoder.g4
文件):为什么ANTLR 4 Eclipse插件会生成错误的代码?
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
该消息似乎是正确的,因为此类没有祖先。
出了什么问题以及如何解决?
答
刚刚张贴的问题后,StackOverflow的sugested一些相关的问题,而这其中有答案:
Trouble Setting Up ANTLR 4 IDE on Eclipse Luna (4.4)
的问题,在我的情况,是我的项目未转换为字母。
一旦我这样做,错误消失。
答
这听起来像ANTLR没有正确创建MetaCoderListener
类,定义这些方法。当您使用ANTLR生成解析器时,尝试使用-listener
作为参数生成它。这将生成适当的监听器,然后您将执行该类监听器(访客也一样,使用-visitor
参数来生成访问者)。