我无耻地窃取another question的{略微编辑过的'标题,因为我遇到了同样的问题,并且说问题还没有得到解答(已经差不多一年了)。
摘要:我的监听器的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"
的大小;即使该节点/规则明确已访问,也不会打印{{1}}。
对于有问题的树,应该至少有一些声明(可以通过查看图形树来验证这一点)。
任何帮助或提示?
提前致谢!
答案 0 :(得分:1)
在某些方面,即使没有提供答案,只需发布到StackOverflow也会有所帮助 特别是问题出在你自己的时候......
Antlr没有任何问题(我使用4.7,顺便说一下)语法没有任何问题,并且听众没有任何问题。事实证明,该项目有两个非常相似的语法,有两个非常相似的名称;我正在使用错误的语法匹配和听众。