“ParseTreeListener”在ANTLR中是什么意思?

“ParseTreeListener”在ANTLR中是什么意思?,antlr,antlr4,antlr3,Antlr,Antlr4,Antlr3,我阅读了《权威的ANTLR 4参考》一书中关于ParsetReListener的以下陈述: ANTLR生成一个特定于每个语法的ParseTreeListener子类 每个规则的输入和退出方法 我对每种语法的概念都有点困惑。我的理解是: 语言与其语法是等价的 语法只是一套规则 程序相当于表示它的解析树 因此,如果我们使用ANTLR开发语言应用程序,那么应该只有一种语法。因此,应该只有一个ParseTreeListener。那么这里的每个是什么意思呢 加1 当我继续阅读时,我有一种感觉,这里的语

我阅读了《权威的ANTLR 4参考》一书中关于ParsetReListener的以下陈述:

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

我对
每种语法的概念都有点困惑。我的理解是:

  • 语言与其语法是等价的
  • 语法只是一套规则
  • 程序相当于表示它的解析树
因此,如果我们使用ANTLR开发语言应用程序,那么应该只有一种语法。因此,应该只有一个
ParseTreeListener
。那么这里的
每个
是什么意思呢

加1
当我继续阅读时,我有一种感觉,这里的
语法
只是特定于
*.g4
文件。也许一种语言可以有多个
*.g4
文件。我不确定这一点是否正确。我会不断更新这个问题。

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

  • 该接口定义了上面提到的所有进入和退出方法
  • LangParserBaseListener
    为每个方法提供了默认的“无操作”实现(请注意,Lang.g4中的每个表达式都有两个方法-因此这可能是一个相当大的类/接口)
LangParserBaseListener
的要点是,添加一个只想“侦听”规则的一小部分的侦听器更容易。为此,只需从中继承并重写相应的方法

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

希望有帮助
fricke

您可以拥有一个包含多种语言的语言应用程序,如同一本书中描述的孤岛语言。@Mephy是否可以在多个*.g4语法文件中定义一种语言?也许我还没有读过。@smwikipedia通常你会把lexer规则和parser规则的声明分成两个不同的文件。另一个选项是使用导入(从文件加载一组规则)。