《ANTLR 4权威指南 》一2.4 使用语法分析树来构建语言类应用程序

2.4 使用语法分析树来构建语言类应用程序

为了编写一个语言类应用程序,我们必须对每个输入的词组或者子词组执行一些适当的操作。进行这项工作最简单的方式是操作语法分析器自动生成的语法分析树。这种方式的优点在于,我们能够重回我们所熟悉的Java领域。这样,在语言类应用程序进一步的构建过程中,我们就不需要再学习复杂的ANTLR语法了。
首先,我们来认识一下ANTLR在识别和建立语法分析树的过程中使用的数据结构和类名。熟悉这些数据结构将为我们未来的讨论奠定基础。
前已述及,词法分析器处理字符序列并将生成的词法符号提供给语法分析器,语法分析器随即根据这些信息来检查语法的正确性并建造出一棵语法分析树。这个过程对应的ANTLR类是CharStream、Lexer、Token、Parser,以及ParseTree。连接词法分析器和语法分析器的“管道”就是TokenStream。图2-2展示了这些类型的对象在内存中的交互方式。
ANTLR尽可能多地使用共享数据结构来节约内存。如图2-2所示,语法分析树中的叶子节点(词法符号)仅仅是盛放词法符号流中的词法符号的容器。每个词法符号都记录了自己在字符序列中的开始位置和结束位置,而非保存子字符串的拷贝。其中,不存在空白字符对应的词法符号(索引为2和4的字符)的原因是,我们假定我们的词法分析器会丢弃空白字符。
图2-2中也显示出,ParseTree的子类RuleNode和TerminalNode,二者分别是子树的根节点和叶子节点。RuleNode有一些令人熟悉的方法,例如getChild()和getParent(),但是,对于一个特定的语法,RuleNode并不是确定不变的。为了更好地支持对特定节点的元素的访问,ANTLR会为每条规则生成一个RuleNode的子类。如图2-3所示,在我们的赋值语句的例子中,子树根节点的类型实际上是StatContext、AssignContext以及ExprContext。

因为这些根节点包含了使用规则识别词组过程中的全部信息,它们被称为上下文(context)对象。每个上下文对象都知道自己识别出的词组中,开始和结束位置处的词法符号,同时提供访问该词组全部元素的途径。例如,AssignContext类提供了方法ID()和方法expr()来访问标识符节点和代表表达式的子树。
给定这些类型的具体实现,我们可以手工写出对语法分析树进行深度优先遍历的代码。这样,在访问其中的节点时,我们可以进行一切所需的操作。这个过程中的典型操作是诸如计算结果、更新数据结构或者产生输出一类的事情。实际上,我们可以利用ANTLR自动生成并遍历树的机制,而不需要每次都重复编写遍历树的代码。

时间: 2024-08-19 22:38:43

《ANTLR 4权威指南 》一2.4 使用语法分析树来构建语言类应用程序的相关文章

《ANTLR 4权威指南》——2.4 使用语法分析树来构建语言类应用程序

2.4 使用语法分析树来构建语言类应用程序 为了编写一个语言类应用程序,我们必须对每个输入的词组或者子词组执行一些适当的操作.进行这项工作最简单的方式是操作语法分析器自动生成的语法分析树.这种方式的优点在于,我们能够重回我们所熟悉的Java领域.这样,在语言类应用程序进一步的构建过程中,我们就不需要再学习复杂的ANTLR语法了. 首先,我们来认识一下ANTLR在识别和建立语法分析树的过程中使用的数据结构和类名.熟悉这些数据结构将为我们未来的讨论奠定基础. 前已述及,词法分析器处理字符序列并将生成

《ANTLR 4权威指南》——2.4节使用语法分析树来构建语言类应用程序

2.4 使用语法分析树来构建语言类应用程序 为了编写一个语言类应用程序,我们必须对每个输入的词组或者子词组执行一些适当的操作.进行这项工作最简单的方式是操作语法分析器自动生成的语法分析树.这种方式的优点在于,我们能够重回我们所熟悉的Java领域.这样,在语言类应用程序进一步的构建过程中,我们就不需要再学习复杂的ANTLR语法了. 首先,我们来认识一下ANTLR在识别和建立语法分析树的过程中使用的数据结构和类名.熟悉这些数据结构将为我们未来的讨论奠定基础. 前已述及,词法分析器处理字符序列并将生成

《ANTLR 4权威指南》——2.5 语法分析树监听器和访问器

2.5 语法分析树监听器和访问器 ANTLR的运行库提供了两种遍历树的机制.默认情况下,ANTLR使用内建的遍历器访问生成的语法分析树,并为每个遍历时可能触发的事件生成一个语法分析树监听器接口(parse-tree listener interface).监听器非常类似于XML解析器生成的SAX文档对象.SAX监听器接收类似startDocument()和endDocument()的事件通知.一个监听器的方法实际上就是回调函数,正如我们在图形界面程序中响应复选框点击事件一样.除了监听器的方式,我

《ANTLR 4权威指南》——3.3 将生成的语法分析器与Java程序集成

3.3 将生成的语法分析器与Java程序集成 在语法准备就绪之后,我们就可以将ANTLR自动生成的代码和一个更大的程序进行集成.在本节中,我们将会使用一个简单的Java示例程序的main()方法调用我们的"初始化语句解析器",并打印出和TestRig的"-tree"选项类似的语法分析树.下面是完整的Test.java程序,它体现出了2.1节中的完整的识别流程. 上面的程序使用了很多ANTLR运行库的类,像是CommonTokenStream和ParseTree,我们

《ANTLR 4权威指南 》一导读

前 言 ANTLR是一款强大的语法分析器生成工具,可用于读取.处理.执行和翻译结构化的文本或二进制文件.它被广泛应用于学术领域和工业生产实践,是众多语言.工具和框架的基石.Twitter搜索使用ANTLR进行语法分析,每天处理超过20亿次查询:Hadoop生态系统中的Hive.Pig.数据仓库和分析系统所使用的语言都用到了ANTLR:Lex Machina将ANTLR用于分析法律文本:Oracle公司在SQL开发者IDE和迁移工具中使用了ANTLR:NetBeans公司的IDE使用ANTLR来解

《ANTLR 4权威指南》——导读

前 言 ANTLR是一款强大的语法分析器生成工具,可用于读取.处理.执行和翻译结构化的文本或二进制文件.它被广泛应用于学术领域和工业生产实践,是众多语言.工具和框架的基石.Twitter搜索使用ANTLR进行语法分析,每天处理超过20亿次查询:Hadoop生态系统中的Hive.Pig.数据仓库和分析系统所使用的语言都用到了ANTLR:Lex Machina将ANTLR用于分析法律文本:Oracle公司在SQL开发者IDE和迁移工具中使用了ANTLR:NetBeans公司的IDE使用ANTLR来解

《ANTLR 4权威指南》——2.2 实现一个语法分析器

2.2 实现一个语法分析器 ANTLR工具依据类似于我们之前看到的assign的语法规则,产生一个递归下降的语法分析器(recursive-descent parser).递归下降的语法分析器实际上是若干递归方法的集合,每个方法对应一条规则.下降的过程就是从语法分析树的根节点开始,朝着叶节点(词法符号)进行解析的过程.首先调用的规则,即语义符号的起始点,就会成为语法分析树的根节点.在前一节的例子中,就是调用stat()方法作为起始点的.这种解析过程的更广为人知的名字是"自上而下的解析"

《ANTLR 4权威指南 》一2.2 实现一个语法分析器

2.2 实现一个语法分析器 ANTLR工具依据类似于我们之前看到的assign的语法规则,产生一个递归下降的语法分析器(recursive-descent parser).递归下降的语法分析器实际上是若干递归方法的集合,每个方法对应一条规则.下降的过程就是从语法分析树的根节点开始,朝着叶节点(词法符号)进行解析的过程.首先调用的规则,即语义符号的起始点,就会成为语法分析树的根节点.在前一节的例子中,就是调用stat()方法作为起始点的.这种解析过程的更广为人知的名字是"自上而下的解析"

《ANTLR 4权威指南》——2.2节实现一个语法分析器

2.2 实现一个语法分析器ANTLR工具依据类似于我们之前看到的assign的语法规则,产生一个递归下降的语法分析器(recursive-descent parser).递归下降的语法分析器实际上是若干递归方法的集合,每个方法对应一条规则.下降的过程就是从语法分析树的根节点开始,朝着叶节点(词法符号)进行解析的过程.首先调用的规则,即语义符号的起始点,就会成为语法分析树的根节点.在前一节的例子中,就是调用stat()方法作为起始点的.这种解析过程的更广为人知的名字是"自上而下的解析",