Java ANTLR 4监听器输入方法不会被调用

时间:2017-11-16 12:35:25

标签: java listener antlr4

我无耻地窃取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}}。

对于有问题的树,应该至少有一些声明(可以通过查看图形树来验证这一点)。

任何帮助或提示?

提前致谢!

1 个答案:

答案 0 :(得分:1)

在某些方面,即使没有提供答案,只需发布​​到StackOverflow也会有所帮助 特别是问题出在你自己的时候......

Antlr没有任何问题(我使用4.7,顺便说一下)语法没有任何问题,并且听众没有任何问题。事实证明,该项目有两个非常相似的语法,有两个非常相似的名称;我正在使用错误的语法匹配和听众。