`ParseTreeListener`在ANTLR中意味着什么?

时间:2014-12-14 09:00:23

标签: antlr antlr4 antlr3

我从<一书中读到了关于ParseTreeListener的以下陈述。最终的ANTLR 4参考>

  

ANTLR生成一个特定于 每个语法的ParseTreeListener子类   使用每个规则的进入和退出方法。

我对each grammar概念感到有点困惑。我的承诺是:

  • 语言相当于语法。
  • 语法只是一套规则。
  • 程序相当于代表它的解析树。

因此,如果我们正在使用ANTLR处理语言应用程序,那么应该只有一个语法。因此,应该只有一个ParseTreeListener。那么each在这里意味着什么?

ADD 1

在我阅读时,我感觉grammar这里特定于*.g4文件。也许一种语言可以有多个*.g4个文件。我不确定我对此是否正确。我会不断更新这个问题。

1 个答案:

答案 0 :(得分:2)

定义.g4语法后,您可以告诉Antlr4生成一个实现ParseTreeListener的类。更详细地说,假设你有一个语法Lang,那么Antlr4会生成一个接口LangParserListener和一个类LangParserBaseListener

  • 界面定义了上面提到的所有进入和退出方法。
  • 课程LangParserBaseListener为您提供默认的“无操作”功能。每个方法的实现(注意Lang.g4中的每个表达式有两种方法 - 所以这可能是一个非常大的类/接口)。

LangParserBaseListener的要点是,它可以让您更轻松地添加一个只想听“聆听”的聆听者。一小部分规则。为此,只需继承它并覆盖相应的方法。

每个语法实现多个侦听器确实很有意义,例如:第一遍用于定义所有出现的符号,第二遍用于取消引用所有符号引用。这也是Antlr4参考教科书的一部分。

希望有所帮助 FRICKE