抽象语法树(AST)
抽象语法树(AST)
抽象语法树(AST)
最近在做一个类JA V A语言的编译器,整个开发过程,用抽象语法树(Abstract SyntaxTree,AST)作为程序的一种中间表示,所以首先就要学会建立相对应源代码的AST和访问AST。Eclipse AST是Eclipse JDT的一个重要组成部分,定义在包org.eclipse.jdt.core.dom中,用来表示JA V A语言中的所有语法结构。
Eclipse AST的总体结构
1、org.eclipse.jdt.core.dom.AST(AST节点类)
Eclipse AST的工厂类,用于创建表示各种语法结构的节点。
2、org.eclipse.jdt.core.dom.ASTNode及其派生类(AST类)用于表示JA V A语言中的所有语法结构,在实际使用中常作为AST上的节点出现。
3、org.eclipse.jdt.core.dom.ASTVisitor(ASTVisitor类)Eclipse AST的访问者类,定义了统一的访问AST中各个节点的方法。
详细介绍:
一、AST节点类
整体结构包括CompilationUnit类(编译单元)、TypeDeclaration类(类型声明)、MethodDeclaration类(方法声明);
语句包括Block类(语句块)、ExpressionStatement类(表达式)、IfStatement(if语句)、WhileStatement类(while语句)、EmptyStatement类(空语句)、BreakStatement类和ContinueStatement类;
表达式包括MethodInvocation类(方法调用)、Assignment
类(赋值表达式)(“=”、“+=”、“-=”、“*=”、“/=”)、InfixExpression类(中缀表达式)(“+”、“-”、“*”、“/”、“%”、“==”、“!=”、“<"、“<=”、“>=”、“&&”、“||”。)、PrefixExpression类(前缀表达式)(“+”PLUS “-”MINUS “!”NOT)、ParenthesizedExpression类(带括号的表达式)、NumberLiteral类(整数)、Name类(simple)、MethodInvocation类(方法调用)。
二、AST类
关键是创建编译单元节点,创建类AST的实例。
AST ast = AST.newAST(JLS3);
三、ASTVisitor类
它提供与节点类有关的visit()方法和endVisit()法,与节点类无关的preVisit()方法和postVisit()方法。
boolean visit( T node):这类方法如果返回true,则接着访问
子节点。如果返回false,则不再访问子节点。
void endVisit(T node):这类方法在节点node的子节点已经被访问或者是在visit(node)返回false后调用。
void preVisit():这类方法在visit(node)之前被调用。
void postVisit():这类方法在endVisit(node)之后被调用。
在做简单解释器过程中,分析句子时我主要用到了上面的visit()和endVisit()方法,其中visit()方法是比较好理解的,主要是endVisit()方法在没有特定语法分析树的情况下分析是比较抽象的,所以下面我举几个例子分析。
endVisit()在node的子节点已被访问后调用型:
a、赋值语句分析为例:
i1 = 1;
i4 = i1;
它们对应语法树结构:
Expressionstatement
Assignment