【发布时间】:2017-11-16 12:35:25
【问题描述】:
我无耻地盗用 another question 的(稍微编辑的)标题,因为我遇到了同样的问题,并且说问题还没有得到回答(已经快一年了)。
总结:我的听众的enter*** 方法不起作用。我可以使用visitTerminal 方法增加一个计数器,并且我已经测试了enterEveryRule(在另一个问题中),它也可以工作。但是enterVariableDeclaration 没有做任何事情,甚至enterInit 也没有被调用。
为了清楚起见:init 是我语法的首要规则。使用TestRig 时,我可以获得此树/规则的图形表示。
我的听众的代码:
class MyListener extends MyGrammarBaseListener {
private int terminalCounter = 0;
private List<String> variables = new ArrayList<>();
@Override
public void visitTerminal(TerminalNode node) {
terminalCounter++;
}
@Override
public void enterVariableDeclaration(MyGrammarParser.VariableDeclarationContext ctx) {
variables.add(ctx.getText());
}
@Override
public void enterInit(JavaExamGrammarParser.InitContext ctx) {
System.out.println("init");
}
int getTerminalNodeCount() {
return terminalCounter;
}
List<String> getVariables() {
return variables;
}
}
输出很简单:
143
0
其中143是终端节点数,0是variables的大小; "init" 不会打印,即使该节点/规则确实被访问过。
对于有问题的树,至少应该有一些声明(可以通过查看图形树来验证这一点)。
任何帮助或提示?
提前致谢!
【问题讨论】:
-
我以前在开发语法的过程中更改了根规则时也发生过这种情况。你确定你的 tree walker 是从规则
init开始的吗? -
我从未更改过我的顶级/根规则,所以不应该是这样。
-
与我们分享您的语法可能会有所帮助...您使用的是哪个版本的 ANTLR?
-
在下面查看我的答案。我只是犯了一个菜鸟的错误。