抽象语法树(AST)

抽象语法树(AST)
抽象语法树(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

相关主题
相关文档
最新文档