为什么 ANTLR 4 Eclipse 插件会生成错误的代码?
Why is ANTLR 4 Eclipse plugin generating wrong code?
我是 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
消息似乎是正确的,因为这个 class 没有祖先。
出了什么问题以及如何解决?
刚刚发布问题后,Whosebug 提出了一些相关问题,这个问题有答案:
就我而言,问题是我的项目没有转换为 Facets。
一旦我这样做了,错误就消失了。
听起来 ANTLR 没有正确创建 MetaCoderListener
class,定义这些方法。当您使用 ANTLR 生成解析器时,请尝试使用 -listener
作为参数来生成它。这将生成适当的侦听器,然后您 class 将实现(访问者也是如此。使用 -visitor
参数生成访问者)。
我是 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
消息似乎是正确的,因为这个 class 没有祖先。
出了什么问题以及如何解决?
刚刚发布问题后,Whosebug 提出了一些相关问题,这个问题有答案:
就我而言,问题是我的项目没有转换为 Facets。
一旦我这样做了,错误就消失了。
听起来 ANTLR 没有正确创建 MetaCoderListener
class,定义这些方法。当您使用 ANTLR 生成解析器时,请尝试使用 -listener
作为参数来生成它。这将生成适当的侦听器,然后您 class 将实现(访问者也是如此。使用 -visitor
参数生成访问者)。