编译原理第六章

合集下载

编译原理 6章

编译原理 6章

尽管上面这些映射函数都不包含一个以上的对偶,但这个PDA 仍是非确定的。其中,前五个转换函数用于把输入符号移进栈 。接下来的六个用于完成归约工作,该PDA恰好识别L(G).
1 2 3 4 5 6
考虑输入串a*a+a,只 有下面的移动序列 才能够到达终止状 态: (q,$,a*a+a)├ (q,$a,*a+a)├ (q,$F,*a+a)├ (q,$T,*a+a)├ (q,$T*,a+a)├ (q,$T*a,+a)├
例6.5 考虑算术表 达式文法G3[E]: E→E+T E→T T→TF T→F F→(E) F→a
该文法的PDA映射函数δ为 δ(q,ε,a)={(q,a)} 根据规则6(①) δ(q,ε,+)={(q,+)} δ(q,ε,*)={(q,*)} δ(q,ε,‘(’)={(q,‘(’)} δ(q,ε,‘)’)={(q,‘)’)} δ(q,E+T,ε)={(q,E)} 根据规则6(②) δ(q, T,ε)={(q,E)} δ(q,T*F,ε)={(q,T)} δ(q,F,ε)={(q,T)} δ(q,(E),ε)={(q,F)} δ(q,a,ε)={(q,F)} δ(q,$E,ε)={(r,ε)} 根据规则6(③)
7 (q,$T*F,+a)├ 8 (q,$T,+a)├ 9 (q,$E,+a)├ 10 (q,$E+,a)├ 11 (q,$E+a,ε)├ 12 (q,$E+F,ε)├ 13 (q,$E+T,ε)├ 14 (q,$E,ε)├ 15 (r,ε,ε)├
E→E+T E→T T→TF T→F F→(E) F→a
关系积记为r1r2xr1r2y当且仅当存在w使得xr1w与wr2y传递闭包关系r的传递闭包记为rxyxry当且仅当存在n0使得xrny自反传递闭包关系r的传递闭包记为rxyxry当且仅当存在n0使得xrny其中r0为恒等布尔矩阵和关系?关系可用集合定义也可用布尔矩阵表示xry当且仅当mxy1?定理61mrtmrt?定理62mr1r2mr1mr2?定理63mr1r2mr1mr2?定理64mrmr传递闭包的warshall算法forj

编译原理 第6章-LR分析-小结资料

编译原理 第6章-LR分析-小结资料
LR(0)项目集规范族; 对LR(1)或 LALR(1)分析表,构造 LR(1)项目集规范族。
Compiler Construction Principles
(2)构造识别文法规范句型活前缀的DFA。 (3)将DFA转换成相应的LR分析表。
四种分析表的构造基本相同,仅对含 归约项目的项目集构造分析表元素不同。
构造该文法的LR(0)项目集族和转换函 数如下图所示。
I0:
S′→·S S →·(S)
S
S →·
(
S
I2:SS S
→(·S) →·(S) →·
(
I1: S'→S.
I3: S →(S·) )
I4: S →(S)·
0. S' →S 1. S →(S) 2. S →ε
见表
该文法不是LR(0)文法。因为I0,I2中 含有移进—归约的冲突。
)
I6: S→S(S·), )/(
2. S → ε S →· , )/(
S →S·(S), )/(
Compiler Construction Principles
所有的LR(1)项目集中没有移进—归约 的冲突,所以该文法为LR(1)文法 或该文法为SLR(1)文法, 任何SLR(1)文 法都是LR(1)或LALR(1)文法
3 S2 S4
4 r1 r1 r1
FOLLOW(S) ={ #, (, ) }
Compiler Construction Principles
步骤 栈中状态
10
2 01
3 012
4 0123
5 01232
6
012323
7 0123234
8 0123
9 01234

吉林大学编译原理课件第六章

吉林大学编译原理课件第六章

类型的内部表示
类型的种类:标准、子界、枚举、数组、记录、 类型的种类:标准、子界、枚举、数组、记录、
集合、文件、指针类型等等。 集合、文件、指针类型等等。 TypeKind=(intTy,boolTy,charTy,realTy,enumTy, subTy,arrayTy,recordTy,setTy,fileTy,pointerTy)
符号表的实现
用局部符号表实现 proc p:x,y,z proc p1:x,y1,z1 proc p2:y y,z x,y1,z1,y proc p3:z,a x,y,a x,z
符号表的实现
用全局符号表实现 proc p0:x,y proc p1:x,z y proc p2:x1,y1 y x,z
语义分析和符号表
主要内容: 主要内容: 语义分析概述(必要性、功能、描述方法) 语义分析概述(必要性、功能、描述方法) 符号表 类型表达式 声明和程序体的语义分析
语义分析的必要性
语法和语义的区别; 语法和语义的区别; 语法: 语法:关于什么样的字符串才是该语言 在组成ห้องสมุดไป่ตู้构上合法的程序的法则。 在组成结构上合法的程序的法则。 语义: 语义:关于结构上合法的程序的意义的 法则。 法则。
内部表示( 内部表示(AttributeIR): ):
常量: 常量: 类型: 类型: 变量: 变量: 域名*: 域名 : 过函: 过函:
TypePtr TypePtr Kind Kind Value Forward Access Off Off Level Parm Class Code Size Forward Level Off
TypePtr Kind TypePtr Kind
HostType

编译原理第6章-语义分析

编译原理第6章-语义分析

Compiler Construction Principles & Implementation Techniques
College of Computer Science & Technology
6.2 符号表
• 什么是符号表 • 标识符的内部表示 • 类型的内部表示 • 值的内部表示 • 符号表的组织
-7-
College of Computer Science & Technology
基于Tokenlist的语义分析
int x,y; int f();
($int, -) ($id, x) ($comma, -) ($id, y) ($semi,-) ($int, -) ($id, f) ($lparen, -) ($rparen,-) ($semi,-)
• Off:当前函数是形参函数时,为其分配的地址偏移;
• Param: 指向当前函数的形式参数列表的指针;
• Code: 指向函数对应的目标代码的起始地址;
• Size: 目标代码的大小;
• Forward: 该声明为函数原型时取值 true,否则取值为false;
• 例:int f(int x, float*y, int inc()) { … }
6.1 语义分析概述
• 语法 vs.语义 • 静态语义 vs. 动态语义 • 语义错误 • 语义分析的一般过程
Compiler Construction Principles & Implementation Techniques
-2-
College of Computer Science & Technology
i : (0, 0) p: (0, 1) x : (0, 12) q: (0,…) main: (0,…)

编译原理第6章-语义分析

编译原理第6章-语义分析

• Kind
– 标识符的种类, 所有变量标识符的Kind = varKind;
• TypePtr
– 指向变量类型的内部表示;
• Access: (dir, indir); • Level: 层数 • Offset: 偏移量 • Value: 初始化时赋给变量的值的内部表示 • 例:int x = 10; • float y; Compiler Construction Principles & Implementation Techniques • float* z;
• switch语句的分支常量表达式不能有重复; • 枚举类型的元素不能重复; Compiler Construction Principles & Implementation Techniques • 结构类型的域名不能重复等
-10-
• 其他语义错误
College of Computer Science & Technology
标识符未声明重复声明类型不符种类不符等collegecomputersciencetechnologycompilerconstructionprinciplesimplementationtechniques语义分析的功能5语义分析程序抽象语法树抽象语法树符号表语义分析程序tokenlisttokenlist符号表语义错误语义错误collegecomputersciencetechnologycompilerconstructionprinciplesimplementationtechniques类pascal语言的抽象语法树类型声明变量声明过程声明根结点prok类型声明typek变量声明vark程序体stmlk程序头pheadk声明过程体stmlkcollegecomputersciencetechnologycompilerconstructionprinciplesimplementationtechniques类c语言的抽象语法树程序root节点node1节点node2节点noden节点node语句类型声明变量声明函数声明函数声明常量声明namevaluenametypenametype声明局部量声明collegecomputersciencetechnologycompilerconstructionprinciplesimplementationtechniques基于抽象语法树的语义分析基于抽象语法树的语义分析是自左向右先根遍历抽象语法树的过程在符号表中查找该标识符检查标识符的使用与声明时的属性是否一致不一致则报告语义错误8collegecomputersciencetechnologycompilerconstructionprinciplesimplementationtechniques基于tokenlist的语义分析intsemiintrparensemiintidxentrycommaidyentrysemiintidfentrylparenrparensemixvarkindintptr

编译原理第六章属性文法和语法制导翻译

编译原理第六章属性文法和语法制导翻译

第六章 属性文法和语法制导翻译要紧内容:[1] 法制导翻译的大体思想; [2] 属性文法的大体概念; [3] 基于属性文法的处置方式;[4] 在自上而下分析和自下而上分析中的属性计算。

大体要求:[1] 明白得语法制导翻译和属性文法的大体思想和方式, [2] 把握属性的计算方式。

教学要点:本章中,咱们将第一介绍属性文法的大体概念,然后介绍基于属性文法的处置方式,讨论如安在自上而下分析和自下而上分析中实现属性的计算。

讲义摘要:6.1 属性文法一、语义分析的任务一、静态语义分析或静态审查。

例如,类型检查、操纵流检查(操纵流语句必需使操纵转移到合法的地址 )、维数检查、越界检查、名字的作用域分析 等。

二、动态语义处置。

若是静态语义正确,语义处置那么要执行真正的翻译。

例如,变量的存储分派;表达式的求值;语句的翻译(中间代码的生成)。

3、总目标:生成等价的中间代码二、属性文法 一、属性所谓属性,其涉及的概念比较普遍,经常使用以描述事物或人的特点、性质,品质等等。

比如,谈到一个 物体,能够用“颜色”描述它,谈起某人,能够利用“有幽默感“来形容他。

对编译程序利用的语法树的结点,能够用"类型"、"值"或"存储位置"来描述它。

二、属性文法(也称属性翻译文法)属性文法是Knuth 在1968年第一提出的。

它是在上下文无关文法的基础上,为每一个文法符号(终结符或非终结符)配备假设干相关的“值”(称为属性)。

这些属性代表与文法符号相关信息,例如它的类型、值、代码序列、符号表内容等等。

属性与变量一样,能够进行计算和传递。

属性加工的进程即是语义处置的进程。

关于文法的每一个产生式都配备了一组属性的计算规那么,称为语义规那么。

语义规那么所描述的工作能够包括属性计算、静态语义检查、符号表操作、代码生成等等。

3、属性文法的形式化概念形式上讲,一个属性文法是一个三元组:A=(G,V,F),其中 G:是一个上下文无关文法。

第6章 属性文法和语法制导翻译 (编译原理 陈火旺).


3
CH.6 属性文法和语法制导翻译
• 在分析-综合模式的编译器中,语义分析是分 析过程的最后一个步骤,只有在这一步才真 正开始考虑程序语言的意义,并着手把它们 翻译成某种中间代码。这一过程通常采用的 方法是属性文法和语法制导翻译方法。 • 语法制导翻译方法的基本思想是,根据翻译 的需要设置文法符号的属性,用属性描述语 法结构的语义,用属性的计算完成翻译。 • 属性文法使文法符号属性值的计算和产生式 相联系。随着语法分析的进行,执行属性值 的计算,从而完成语义分析和翻译的任务。
37
抽象语法树:简例
• 例,为下面文法的句子 a-4+c 建立抽象语法树。 E E+T | E-T | T T (E) T id | num • 为每个运算量或运算符号都建立一个结点。 E • 可以根据表达式的运算顺序自下而上的构造 --+ 语法树 E + T 手工构造。 抽象语法树

9
属性文法、语义规则(2)
• 属性文法的形式: 产生式 语义规则 . 综合属性 A b:=f(c1,c2,…,ck) – 例如 P137.表6.1的属性文法: 继承属性 • EE1+ T E.val := E1.val+ T.val 综合属 – 例如 P139.表6.2的属性文法: 性 DTL L.in := T.type LL1 , id L .in := L.in 1 继承属性 继承属性
10
• 例, P137.
假设:
产生式 ABC
语义规则 A.b:=A.a+B.c C.d:=B.c+1 A有综合属性b和继承属性a B有综合属性c C有继承属性d
继承属性A.a和综合属性B.c在其他适当的地方计算。

编译原理作业集-第六章-修订

第六章属性文法和语法制导翻译本章要点1. 属性文法,基于属性文法的处理方法;2. S-属性文法的自下而上计算;3. L-属性文法的自顶向下翻译;4. 自下而上计算继承属性;本章目标掌握和理解属性方法、基于属性文法的处理方法、S-属性文法和自下而上计算、L-属性文法和自顶向下翻译、自下而上计算继承属性等内容。

本章重点1.语法制导翻译基本思想。

2.语义规则的两种描述方法:语法制导的定义和翻译方案。

语法制导的定义没有指明语义规则的计算次序,而翻译方案显式给出语义规则(或叫语义动作)的计算次序和位置。

3.基于属性文法的处理方法,综合属性定义(S属性定义)和L属性定义。

4.设计简单问题的语法制导定义和翻译方案,这是本章的重点和难点。

这种设计可看成是一种程序设计,是一种事件驱动形式的程序设计,因此它比一般的编程要难得多。

这里的事件是句子中各种语法结构的识别。

5.语义规则的三种计算方法:分析树方法、基于规则的方法和忽略规则的方法。

6.S属性的自下而上计算(边语法分析边属性计算,忽略规则的方法)。

7.L属性的自上而下计算(边语法分析边属性计算,忽略规则的方法)。

8.递归计算(先语法分析后属性计算,基于规则的方法)。

本章难点1. 设计简单问题的语法制导定义和翻译方案;作业题一、单项选择题:1. 文法开始符号的所有________作为属性计算前的初始值。

a. 综合属性b. 继承属性c. 继承属性和综合属性d. 都不是2. 对应于产生式A→XY继承属性Y.y的属性计算,可能正确的语义规则是________。

a. A.a:=f(X.x,Y.y);b. )Y.y:=f(A.a,Y.y);c. Y.y:=f(X.x);d. A.a:=f(Y.y);3. 描述文法符号语义的属性有两种,一种称为__ __,另一种称为__ ___。

a. L-属性b. R-属性c. 综合属性d. 继承属性4. 出现在产生式________和出现在产生式________不由所给的产生式的属性计算规则进行计算,而是由其他产生式的属性规则计算或者由属性计算器的参数提供。

编译原理第六章算符优先分析法

编译原理第六章算符优先分析法第六章算符优先分析法课前索引【课前思考】◇什么是⾃下⽽上语法分析的策略?◇什么是移进-归约分析?◇移进-归约过程和⾃顶向下最右推导有何关系?◇⾃下⽽上语法分析成功的标志是什么?◇什么是可归约串?◇移进-归约过程的关键问题是什么?◇如何确定可归约串?◇如何决定什么时候移进,什么时候归约?◇什么是算符⽂法?什么是算符优先⽂法?◇算符优先分析是如何识别可归约串的?◇算符优先分析法的优缺点和局限性有哪些?【学习⽬标】算符优先分析法是⾃下⽽上(⾃底向上)语法分析的⼀种,尤其适应于表达式的语法分析,由于它的算法简单直观易于理解,因此,也是学习其它⾃下⽽上语法分析的基础。

通过本章学习学员应掌握:◇对给定的⽂法能够判断该⽂法是否是算符⽂法◇对给定的算符⽂法能够判断该⽂法是否是算符优先⽂法◇对给定的算符⽂法能构造算符优先关系表,并能利⽤算符优先关系表判断该⽂法是否是算符优先⽂法。

◇能应⽤算符优先分析算法对给定的输⼊串进⾏移进-归约分析,在分析的每⼀步能确定当前应移进还是归约,并能判断所给的输⼊串是否是该⽂法的句⼦。

◇了解算符优先分析法的优缺点和实际应⽤中的局限性。

【学习指南】算符优先分析法是⾃下⽽上语法分析的⼀种,它的算法简单、直观、易于理解,所以通常作为学习其它⾃下⽽上语法分析的基础。

为学好本章内容,学员应复习有关语法分析的知识,如:什么是语⾔、⽂法、句⼦、句型、短语、简单短语、句柄、最右推导、规范归约基本概念。

【难重点】◇通过本章学习后,学员应该能知道算符⽂法的形式。

◇对⼀个给定的算符⽂法能构造算符优先关系分析表,并能判别所给⽂法是否为算符优先⽂法。

◇分清规范句型的句柄和最左素短语的区别,进⽽分清算符优先归约和规范归约的区别。

◇算符优先分析的可归约串是句型的最左素短语,在分析过程中如何寻找可归约串是算符优先分析的关键问题。

对⼀个给定的输⼊串能应⽤算符优先关系分析表给出分析(归约)步骤,并最终判断所给输⼊串是否为该⽂法的句⼦。

编译原理第6章代码优化


合并已知量 删除公共子表达式(删除多余的运算)
删除无用赋值
第6部分 代码优化
循环优化
是指对循环中的代码进行优化。
循环优化包括:

代码外提 删除归纳变量 强度削弱
第6部分 代码优化
全局优化
是在整个程序范围内进行的优化, 需 进行数据流分析, 花费代价很高。
第6部分 代码优化
第6部分 代码优化
6.1.2 基本块的DAG表示
DAG(Directed Acyclic Graph)是一种有向图,
常常用来对基本块进行优化。 一个基本块的DAG是一种其结点带有下述标记 或附加信息的DAG:
第6部分 代码优化
(1) 图的叶结点(无后继的结点)以一标识符(变量名)或 常数作为标记,表示该结点代表该变量或常数的值。 如果叶结点用来表示一变量A的地址,则用addr(A) 作为该结点的标记。通常把叶结点上作为标记的标 识符加上下标0,以表示它是该变量的初值。 (2) 图的内部结点(有后继的结点)以一运算符作为标记, 表示该结点代表应用该运算符对其直接后继结点所 代表的值进行运算的结果。 (3) 图中各个结点上可能附加一个或多个标识符,表 示这些变量具有该结点所代表的值。 一个基本块由一个四元式序列组成,且每一个 四元式都可以用相应的DAG结点表示。
(1) G中四元式(2)和(6)都是已知量和已知量的 运算,G'已合并;
(2) G中四元式(5)是一种无用赋值,G'已将它 删除; (3) G中四元式(3)和(7)的R+r是公共子表达 式, G'只对它们计算了一次,即删除了多余的R+r 运算。 因此,G‘是对G实现上述三种优化的结果。
第6部分 代码优化
第6部分 代码优化
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档