编译原理第六章
编译原理 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分析-小结资料

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章-语义分析

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章-语义分析

• 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. 出现在产生式________和出现在产生式________不由所给的产生式的属性计算规则进行计算,而是由其他产生式的属性规则计算或者由属性计算器的参数提供。