语法树
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
抽象语法树 Abstract Syntax Tree, AST
Tom 2015/02/25
Agenda
• 编译步骤(Compile step) • 抽象语法树(Abstract Syntax Tree(AST)) • Eclipse AST • JavaCC AST • Clang AST
翻译步骤
操作。
2022/3/23
访问者模式(Visitor Pattern)
package com.tom.vistor;
public abstract class Node { /** * 接受操作 */ public abstract void accept(Visitor visitor);
}
package com.tom.vistor;
2022/3/23
抽象语法树 Abstract Syntax Tree(AST)
语法分析程序从扫描程序中获取记号形式的源代码, 并完成定义程序结构的语法分析(syntax analysis)。 语法分析定义了程序的结构元素及其关系。通常将语 法分析的结果表示为分析树( parse tree)或语法树 (syntax tree)
访问者模式涉及到的角色如下: ● 抽象访问者(Visitor)角色:声明了一个或者多个方法操作,形 成所有的具体访问者角色必须实现的接口。 ● 具体访问者(ConcreteVisitor)角色:实现抽象访问者所声明的 接口,也就是抽象访问者所声明的各个访问操作。 ● 抽象节点(Node)角色:声明一个接受操作,接受一个访问者对 象作为一个参数。 ● 具体节点(ConcreteNode)角色:实现了抽象节点所规定的接受 操作。 ● 结构对象(ObjectStructure)角色:有如下的责任,可以遍历结 构中的所有元素;如果需要,提供一个高层次的接口让访问者对象可以 访问每一个元素;如果需要,可以设计成一个复合对象或者一个聚集, 如List或Set。
抽象的语法树( abstract syntax tree)
编译步骤 – 语义分析
a [index] = 4 + 2
语义分析程序(semantic analyzer)
程序的语义就是它的“意思”。在执行之前被确定确定而不易由语法表示和 由分析程序分析的特征。这些特征被称作静态语义( static semantic), 静 态语义包括声明和类型检查。 由语义分析程序计算的额外信息(诸如数据类型)被称为属性( a t t r i b u t e),它们通常是作为注释或“装饰”增加到树中(还可将属性添加到符 号表中)。
if(a>b) a = a-b;
语法分析树
if
>
=
a
ba
-
a
b
抽象语法树
条件 部分
If语句
Then 部分
Else 部分
抽象语法树 Abstract Syntax Tree(AST)
While语句节点 while-stmt→ while( expression ) statement
If语句节点表示 If-stmt→ if( expression ) statement [else statement]
package com.tom.vistor;
public class NodeA extends Node{ /** * 接受操作 */ @Override public void accept(Visitor visitor) { visitor.visit(this); } /** * NodeA特有的方法 */ public String operationA(){ return "NodeA"; }
PPT模板下载:/moban/ 节日PPT模板:/jieri/ PPT背景图片:/beijing/ 优秀PPT下载:/xiazai/ Word教程: /word/ 资料下载:/ziliao/ 范文下载:/fanwen/ 教案下载:/jiaoan/
抽象语法树(Abstract Syntax Tree (AST))是编程语言 的源代码的抽象语法结构的树状表现形式。树上的每 个节点都表示源代码中的一种结构。之所以说语法是 “抽象”的,是因为抽象语法树的结构不依赖于被编 译语言的原文法(语法分析阶段所采用的文法)。
抽象语法树 Abstract Syntax Tree(AST)
编译步骤 – 代码生成器和目标代码优化
a [index] = 4 + 2
代码生成器(code generator)
中间代码(IR)
M O V R0, index ;; value of index -> R0 M U L R0, 2 ;; double value in R0 M O V R1, &a ;; address of a -> R1 A D D R1, R0 ;; add R0 to R1 M O V *R1, 6 ;; constant 6 -> address in R1
编译步骤 – 优化程序
a [index] = 4 + 2 源代码优化程序(source code optimizer)
编译器通常包括许多代码改进或优化步骤。比如:常量合并(constant folding)。输出称为中间代码(intermediate code), 这个中间代码也称作中间表 示( intermediate representation, IR)。
抽象语法树 Abstract Syntax Tree(AST)
程序节点 program→ { var-declaration | fun-declaration }
抽象语法的遍历
深度优先搜索算法(Depth-First-Search),是搜索 算法的一种。是沿着树的深度遍历树的节点,尽可 能深的搜索树的分支。当节点v的所有边都己被探寻 过,搜索将回溯到发现节点v的那条边的起始节点。 这一过程一直进行到已发现从源节点可达的所有节 点为止。
抽象语法树 Abstract Syntax Tree(AST)
函数声明节点 fun-declaration→ ( void | int ) ID( params ) compound-stmt
表达式语句节点 expression→ ID = expression | simple-expression simple-expression→ additive-expression [ relop additive-expression ] relop → < | <= | > | >= | == | != additive-expression→ term [( + | - ) term ] term→ factor [ ( * | / ) factor ] factor→ ( expression )| ID | call | NUM
词法分析(Lexical analysis)
编译器通常以字符流的形式阅读源 程序。扫描程序执行词法分析( Lexical analysis): • 它将字符序列收集到称作记号(
t o k e n)的有意义单元中,执 行与拼写相似的任务。 • 完成将记号分放到符号表或文字 表
a 标识符 [ 左括号 记号 i n d e x 标识符 (t o k e n) ] 右括号 = 赋值 4 数字 + 加号 2 数字
public interface Visitor { /**
* 对应于NodeA的访问操作 */ public void visit(NodeA node); /** * 对应于NodeB的访问操作 */ public void visit(NodeB node); }
package com.tom.vistor;
2022/3/23
访问者模式(Visitor Pattern)
数据结构的每一个节点都可以接受一个访问者的调用,此节点向访问者对
象传入节点对象,而访问者对象则反过来执行节点对象的操作。这样的过
程叫做“双重分派”。节点调用访问者,将它自己传入,访问者则将某算法
针对此节点执行
结抽构象对节访象点问(O(者Nb(ojVedicest)iSt角otr色)u角c:t色ure:)
目标代码优化程序(target code optimizer)
MOV R0, index ;; value of index -> R0 SHL R0 ;; double value in R0 MOV &a[R0], 6 ;; constant 6 -> address a + R0
编译步骤
源代码
角声色明:一了有个一如接个下受或的操者责作多任,个,接方可
以受法遍一操历个作结访,构问形中者成的对所所象有有作的元为具素;
如一体果个访需参问要数者,。角提色供必一须个实高现层
次的的接接口口。让访问者对象可
以需合L具(实的具(实的CiCs访要对现接体ot现接体o或nn问,象了受节抽口访ccSrr每可或抽操e点e象,e问ttt一以者e。e象作访也者NV个设一节。问就oisd元计个i点者是teo)素成聚r所所抽角)角;一集规声象色色如个,定明访::果复如 问者所声明的各个访问
在现代编译器的构造过程中,经常使用抽象语法树(Abstract Syntax Tree )作为一种中间形式,这样做可以把翻译过程从语法分析过程中分离出来 ,使得层次非常清晰。
Agenda
• 编译步骤(Compile step) • 抽象语法树(Abstract Syntax Tree(AST)) • Eclipse AST • JavaCC AST • Clang AST
行业PPT模板:/hangye/ PPT素材下载:/sucai/ PPT图表下载:/tubiao/ PPT教程: /powerpoint/ Excel教程:/excel/ PPT课件下载:/kejian/ 试卷下载:/shiti/
优点: 1. 使用中间形式,可以比较容易地构造面向不同目标平台和不同语言的
编译器 2. 针对中间形式,可以进行独立于目标平台的代码优化。 缺点:产生中间代码的编译过程与不产生中间代码的编译过程相比在效率 上会显得有些低
编译器的中间形式
很多现代的编译器都使用了中间形式,比较常见的中间形式有: 逆波兰表示, N元表示, 树形表示
深度优化遍历与二叉树的前 (先)序遍历(DLR)相似, 有递归算法和非递归算法。
访问者模式(Visitor Pattern)
• 访问者模式(Visitor Pattern):提供一个作用于某对象结构中的各元素的 操作,它使我们可以在不改变各元素的类的前提下定义作用于这些元 素的新操作。访问者模式是一种对象行为型模式。
后端 (back end)
扫描程序(s c a n n e r)
词法分析 记号(Token)
语法分析程序 语法树
语义分析程序 注释树
源代码优化程序 中间代码
代码生成器 目பைடு நூலகம்代码
目标代码优化程序
前端 (front end)
目标代码
编译器构造模型
在现代编译器的构造过程中,前端主要实现从源程序到中间形式( Intermediate Representation)的转换,而编译器的后端用来完成从中间形 式到具体目标机代码的转换,这是一种广泛采用的编译器构造模型。
一段英文翻译成中文,需经下列步骤:
1. 识别出句子中的单词
词法分析
2. 分析句子的语法结构
语法分析
3. 根据句子的含义初步分析
语义分析及中间代码生成
4. 对译文进行修饰
代码优化
5. 写出最后的译文
目标代码生成
编译步骤 – 词法分析
源代码 a [index] = 4 + 2
扫描程序(s c a n n e r)
符号表 文字表
编译步骤 – 语法分析
a [index] = 4 + 2
语法分析程序(p a r s e r)
从扫描程序中获取记号形式的源代 码,并完成定义程序结构的语法分 析,这与自然语言中句子的语法分 析类似。 语法分析定义了程序的结构元素及 其关系。通常将语法分析的结果表 示为分析树( parse tree)或语法 树(syntax tree)