使用AST树

翻译 2013年12月02日 22:39:50

第五章、使用AST树中间结果来计算表达式值

现在我们已经知道,通过创建ANTLR 语法文件 以及添加一些动作来实现一个“转换器”,这一章节将介绍另外一种方式来实现同样的功能,这需要额外用到一些树结构。我们将使用相同的grammar语法来创建一个中间数据结果,只是用树的创建规则来替换我们之前添加的一些动作。一旦,我们有了树结构,就可以用树解析器来解析树,并且执行一些动作。

ANTLR将会从grammar文件从创建一个树解析器。Parser grammar 会把输入的字符流转换成一个树结构,然后输解析器会对其解析求值。

尽管之前的方法更加直接,但是从语言规划来讲做得不够好。向grammar中添加方法调用、while循环,意味着,解析器要执行相同的代码多次。每当需要调用一个方法时,解析器需要重解析这个方法。因此相比较AST方法,之前的方法不够灵活,AST方法生成AST树来存储中间结果,再遍历树执行相关操作。很明显,重复遍历树比重复解析grammar效率更高。

一个中间结果通常是一棵树,树中节点不止是符号,还有表示符号间关系的节点。举例来说,下面的图表示了3+4这个表达式:

 

在许多例子中,你会看到树被表示成文本形式。比如,3+4可表示为(+ 3 4 )。括号后面第一个符号是根节点,随后的事他的孩子。表达式3+4*5的一颗AST树,文本形似为 (+ 3 * 4  5)),如下图所示:

 

正如我们看到的,AST树结构严格表示了操作优先级。这里,乘法必须先被执行,因为加法需要乘法的结果作为操作参数。

AST不同于解析树,解析树代表了解析规则。下图展示了本例子中的解析树:

 

解析树的叶子节点是输入符号,非叶节点是规则名。根节点prog表示,3+4是一个prog。更具体的说是一个stat,而stat是由expr组成。所以解析树,记录了recognizer如何与输入进行匹配的。

在实际中,让语法和树解耦是非常有用的。因此,AST树不受解析树的影响。一个语法通常会改变解析树的结构但不会影响AST,这对处理AST树的代码来说很有意义。

一旦生成好了AST树,你可以有多种方式访问它,来计算你要的结果。一般来说,我建议你使用tree grammar 来生成访问树的代码。

在下一章节,你将学习如何创建AST树,怎样通过一个tree grammar访问它,如何在tree grammar中设置动作。最会,你会得到一个和之前有一样功能的转换器。

 

创建ASTS

ANTLR创建AST是很简单的。我们需要在解析grammar里面设置树的创建规则,来指明我们需要怎样创建树。相比之前方法加入action,这里的语法更小,能更快被读写。当我们使用选项:option=AST,每个语法规则,将返回一个树节点,或者一颗子树。最顶层规则返回的树,将是一颗完整的AST树。

 

一开始我们需要告诉ANTLR我们需要创建AST树:

grammar Expr;

options {

output=AST;

// ANTLR can handle literally any tree node type.

// For convenience, specify the Java type

ASTLabelType=CommonTree; // type of $stat.tree ref etc...

}

如果仅仅这样设置,将会创建一颗平坦的AST树,每个匹配字符,都是一个AST节点,而AST树就是这些节点组成的列表。为了指定树的结构,我们需要简单的指明,哪些字符需要被考虑为操作,哪些不需要放到树中。我们分别使用和 !这两个后缀。

现在我们修改规则如下:

expr: multExpr (('+' ^|'-' ^) multExpr)*

;

multExpr

: atom ('*' ^ atom)*

;

atom: INT

| ID

| '(' ! expr ')' !

;

我们只需要对+ - * ( )添加操作。!符号防止’(‘ ‘)’后面是告诉ANTLR不要为圆括号创建节点。

下面,我们要为progstat重写语法。为每种可能性添加规则:

/** Match a series of stat rules and, for each one, print out

* the tree stat returns, $stat.tree. toStringTree() prints

* the tree out in form: (root child1 ... childN)

* ANTLR's default tree construction mechanism will build a list

* (flat tree) of the stat result trees. This tree will be the input

* to the tree parser.

*/

prog: ( stat {System.out.println($stat.tree.toStringTree());} )+ ;

stat: expr NEWLINE -> expr

| ID '=' expr NEWLINE -> ^('=' ID expr)

| NEWLINE ->

;

->符号右边的语法是tree grammar 语法,他指明树的结构如何创建。^()里面的第一个元素是根节点,其余元素是他的孩子。你可以认为重写的规则是语法到语法的转换。有些时候,我们会看到,在tree grammar中精确的 树创建规则可能会有多种形式。Prog规则只是打印树,没有任何指定的树生成规则。默认的规则创建时,prog是有stat树组成的数组。

Stat第一种形式,直接返回expr生成的树结构。第二种形式,返回一颗子树,以 为根节点,ID 为第一个孩子,expr返回的树结构为第二个孩子。第三种形式,不创建任何树。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

相关文章推荐

抽象语法树(AST)

抽象语法树(AST)最近在做一个类JAVA语言的编译器,整个开发过程,用抽象语法树(Abstract SyntaxTree,AST)作为程序的一种中间表示,所以首先就要学会建立相对应源代码的AST和访...

抽象语法树(AST)

抽象语法树(AST) 最近在做一个类JAVA语言的编译器,整个开发过程,用抽象语法树(Abstract SyntaxTree,AST)作为程序的一种中间表示,所以首先就要学会建立相对应源代码的AST...

【eclipse高效开发】——AST的获取与访问

【eclipse高效开发】——AST的获取与访问 Eclipse中的Eclipse JDT提供了一组访问和操作Java源代码的API,Eclipse AST是其中一个重要组成部分,它提供了...

ANTLR语法树与树的遍历

ANTLR中抽象语法树(AST)的生成和使用 直接在语法文件中嵌入求值处理代码的方式在ANTLR中称为嵌入式动作。复杂情况下需要基于语法树遍历生成目标代码。前者语法复杂时使语法文件臃肿。另外,语法...

Eclipse AST 实现一个类信息统计小程序

Eclipse AST设计并实现一个类信息统计小程序,可以统计一个类中方法的个数、属性的个数、源代码行数、代码行最多的方法名以及代码行数、参数个数最多的方法名及其参数的个数等信息...

【Eclipse AST】AST的获取与访问

从本文开始将由浅入深向大家介绍AST的使用。Eclipse中的Eclipse JDT提供了一组访问和操作Java源代码的API,Eclipse AST是其中一个重要组成部分,它提供了AST、ASTPa...
  • LoveLion
  • LoveLion
  • 2014年02月10日 23:47
  • 18656

AST 抽象语法树学习

阅读原文Abstract Syntax Tree 抽象语法树简介在使用前端许多工具插件的时候,我们大多知道每个工具库、每个插件能做什么,不过很多同学其实并不清楚背后用到的技术,如webpack、rol...
  • Dear_Mr
  • Dear_Mr
  • 2017年05月20日 21:01
  • 1692

antlr的使用

我从以下几个问题入手介绍ANTLR的相关知识。  1 ANTLR是什么?  ANTLR, ANother Tool for Language Recognition, 是一个可以接受含有语法描述的...
  • novelly
  • novelly
  • 2013年10月23日 20:24
  • 1080

从嵌套表达式谈抽象语法树(AST)到平台无关中间指令(IR)的翻译过程(线性化)

从嵌套表达式谈抽象语法树(AST)到平台无关中间指令(IR)的翻译过程(线性化) #一些想到的东西: ## 要掌握编译器前端Parser的语法解析是怎么回事,不需要用完整的C语...
  • cteng
  • cteng
  • 2016年04月26日 22:23
  • 871

AST-抽象语法树

转自:http://blog.csdn.net/philosophyatmath/article/details/38170131 抽象语法树简介 (一)简介 抽象语法树(abs...
  • cmdssd1
  • cmdssd1
  • 2015年05月14日 09:49
  • 2278
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用AST树
举报原因:
原因补充:

(最多只允许输入30个字)