我从<一书中读到了关于ParseTreeListener
的以下陈述。最终的ANTLR 4参考> :
ANTLR生成一个特定于 每个语法的ParseTreeListener子类 使用每个规则的进入和退出方法。
我对each grammar
概念感到有点困惑。我的承诺是:
因此,如果我们正在使用ANTLR处理语言应用程序,那么应该只有一个语法。因此,应该只有一个ParseTreeListener
。那么each
在这里意味着什么?
在我阅读时,我感觉grammar
这里仅特定于*.g4
文件。也许一种语言可以有多个*.g4
个文件。我不确定我对此是否正确。我会不断更新这个问题。
答案 0 :(得分:2)
定义.g4语法后,您可以告诉Antlr4生成一个实现ParseTreeListener的类。更详细地说,假设你有一个语法Lang
,那么Antlr4会生成一个接口LangParserListener
和一个类LangParserBaseListener
。
LangParserBaseListener
为您提供默认的“无操作”功能。每个方法的实现(注意Lang.g4中的每个表达式有两种方法 - 所以这可能是一个非常大的类/接口)。 LangParserBaseListener
的要点是,它可以让您更轻松地添加一个只想听“聆听”的聆听者。一小部分规则。为此,只需继承它并覆盖相应的方法。
每个语法实现多个侦听器确实很有意义,例如:第一遍用于定义所有出现的符号,第二遍用于取消引用所有符号引用。这也是Antlr4参考教科书的一部分。
希望有所帮助 FRICKE