编译原理第五章13本
编译原理chapter5
若S+ …X,则X•>#。
第五章 优先分析法
第二节 简单优先分析方法
三、简单优先分析的基本思想
根据优先关系的定义,将简单优先文法中各 文法符号之间的这种关系用一个矩阵表示,称 作简单优先矩阵。PDA读入一个单词后,比较 栈顶符号和该单词的优先级,若栈顶符号优先 级低于该单词,继续读入;若栈顶符号优先级 高于或等于读入符号,则找句柄进行归约,找 不到句柄就继续读入。直到最后栈内只剩下开 始符号,输入串读到“#”为止。此时识别正 确。
1、自下而上归约
2、规定算符(更一般地说,指终结符)的优先级 及结合规则,以使得分析过程唯一
3、比较相邻两个算符而决定动作
注:1)这里的关键是对所有算符定义某种优先 关系
2)算符优先分析法是仿效四则运算的计算过 程而构造的一种语法分析方法
第五章 优先分析法 第三节 算符优先分析方法 一、基本思想
4、实例 表达式文法:
第五章 优先分析法 第二节 简单优先分析方法
四、简单优先矩阵
用于表示文法符号之间的简单优先关系的矩阵。
注:简单优先矩阵的构造可通过Warshall算法实 现。
第五章 优先分析法 第二节 简单优先分析方法
五、简单优先分析法的优缺点
优点:技术简单 缺点:适用范围小,分析表尺寸太大。
第五章 优先分析法 第三节 算符优先分析方法 一、基本思想
设A1A2…Ai-1AiAi+1…An是文法G的一个句型, 1)、若AiVN,则Ai-1、Ai+1 VT,即不许出现相继两个
非终结符;
第五章 优先分析法
第三节 算符优先分析方法 四、算符优先文法及优先表的构造 3、算符文法和算符优先文法定义的意义
编译原理课件Chapter_5
•
结点N的属性值由N的产生式所关联的语义规则来定义 通过N的子结点或N本身的属性值来定义
结点N的属性值由N的父结点所关联的语义规则来定义 依赖于N的父结点、N本身和N的兄弟结点上的属性值 不允许N的继承属性通过N的子结点上的属性来定义, 但允许N的综合属性依赖于N本身的继承属性 终结符号有综合属性 (来自词法分析),但无继承属性
–
每个语义规则都根据产生式体中的属性值来计算头部 非终结符号的属性值
栈中的状态/文法符号可以附加相应的属性值 归约时,按照语义规则计算归约得到的符号的属性值 要求副作用不影响其它属性的求值 没有副作用的SDD称为属性文法
•
S属性的SDD可以和LR语法分析器一起实现
– –
•
语义规则不应该有复杂的副作用
•
•
•
抽象语法树的表示方法
– –
叶子结点中只存放词法值 内部结点中存放了op值和参数 (通常指向其它结点)
30
构造简单表达式的抽象语法树的SDD
属性E.node指向E对应的抽象语法树的根结点
31
表达式抽象语法树的构造过程
•
输入
•
a–4+c
•
步骤
p1 = new Leaf(id, entry_a); p2 = new Leaf(num, 4); p3 = new Node('–', p1, p2); p4 = new Leaf(id, entry_c); p5 = new Node('+', p3, p4);
–
–
9
语法分析树上的SDD求值 (1)
•
•
实践中很少先构造语法分析树再进行SDD求值, 但在分析树上求值有助于翻译方案的可视化,便 于理解 注释语法分析树
编译原理-第5章-习题与答案2上课讲义
编译原理-第5章-习题与答案2第五章习题5-1 设有文法G[S]:S→A/ A→aA∣AS∣/(1) 找出部分符号序偶间的简单优先关系。
(2) 验证G[S]不是简单优先文法。
5-2 对于算符文法G[S]:S→E E→E-T∣T T→T*F∣F F→-P∣P P→(E)∣i(1) 找出部分终结符号序偶间的算符优先关系。
(2) 验证G[S]不是算符优先文法。
5-3 设有文法G′[E]:E→E1 E1→E1+T1|T1 T1→T T→T*F|F F→(E)|i其相应的简单优先矩阵如题图5-3所示,试给出对符号串(i+i)进行简单优先分析的过程。
题图5-3 文法G′[E]的简单优先矩阵5-4 设有文法G[E]:E→E+T|TT→T*F|FF→(E)|i其相应的算符优先矩阵如题图5-4所示。
试给出对符号串(i+i)进行算符优先分析的过程。
题图5-4 文法G[E]的算符优先矩阵5-5 对于下列的文法,试分别构造识别其全部可归前缀的DFA和LR(0)分析表,并判断哪些是LR(0)文法。
(1) S→aSb∣aSc∣ab(2) S→aSSb∣aSSS∣c(3) S→A A→Ab∣a5-6 下列文法是否是SLR(1)文法?若是,构造相应的SLR(1)分析表,若不是,则阐明其理由。
(1) S→Sab∣bR R→S∣a(2) S→aSAB∣BA A→aA∣B B→b(3) S→aA∣bB A→cAd∣ε B→cBdd∣ε5-7 对如下的文法分别构造LR(0)及SLR(1)分析表,并比较两者的异同。
S→cAd∣b A→ASc∣a5-8 对于文法G[S]:S→A A→BA∣ε B→aB∣b(1) 构造LR(1)分析表;(2) 给出用LR(1)分析表对输入符号串abab的分析过程。
5-9 对于如下的文法,构造LR(1)项目集族,并判断它们是否为LR(1)文法。
(1) S→A A→AB∣ε B→aB∣b(2) S→aSa∣a第5章习题答案25-1 解:(1) 由文法的产生式和如答案图5-1(a)所示的句型A//a/的语法树,可得G中的部分优先关系如答案图5-1(b)所示。
编译原理第五章 课后题
4.对下面文法:
S->AS | b
A->SA | a
(1)列出该文法所有的LR(0)项目。
(2)构造这个文法的LR(0)项目集规范族及识别活前缀的DFA
答:文法拓广:
S’->S
S->AS | b
A->SA | a
LR(0)项目:
S’->.SS’->S.
S->.ASS->A.SS->AS.
=> ((T,(T))a)(T)
=> ((T,S),a)T,S
=> ((T),a)(T)
=> (S,a)S
=>(T, a)a
=>(T, S)T, S
=>(T)(T)
=> S
“移进-规约”的过程:
符号栈输入串动作
# (((a,a), ^,(a)),a)#预备
#( ((a,a), ^,(a)),a)#进
因为项目集规范族的I3中,有移进和归约的冲突。所以不是LR(0)的
(2)证明是SLR(1)的
提示:
上图继续画完,找出所有冲突的情况,根据SLR(1)解决办法可以解决,(过程略)所以为SLR(1)的
或构造出SLR分析表,无多重定义入口,所以是SLR的.
8.证明文法:
A→BaBb|DbDa
B→ε
D→ε
是LR(1)但不是SLR(1)。
#((T,S,(a)),a)#归,用S->^
#((T,(a)),a)#归,用T->T,S
#((T,(a)),a)#进
#((T,(a)),a)#进
#((T,(a)),a)#进
《编译原理》课后习题答案第5章
《编译原理》课后习题答案第5章《编译原理》课后习题答案第5章.pdf《编译原理》课后习题答案第5章.pdf第5章自顶向下语法分析方法第1题对文法G[S] S→a|∧|(T) T→T,S|S(1) 给出(a,(a,a))和(((a,a),∧,(a)),a)的最左推导。
(2) 对文法G,进行改写,然后对每个非终结符写出不带回溯的递归子程序。
(3) 经改写后的文法是否是LL(1)的?给出它的预测分析表。
(4) 给出输入串(a,a)#的分析过程,并说明该串是否为G的句子。
答案:(1) 对(a,(a,a)的最左推导为:S(T) (T,S) (S,S) (a,S) (a,(T)) (a,(T,S)) (a,(S,S)) (a,(a,S)) (a,(a,a))对(((a,a),∧,(a)),a) 的最左推导为:S(T) (T,S) (S,S) ((T),S) ((T,S),S) ((T,S,S),S) ((S,S,S),S) (((T),S,S),S) (((T,S),S,S),S) (((S,S),S,S),S) (((a,S),S,S),S) (((a,a),S,S),S) (((a,a),∧,S),S) (((a,a),∧,(T)),S)(((a,a),∧,(S)),S)《编译原理》课后习题答案第5章.pdf《编译原理》课后习题答案第5章.pdf(((a,a),∧,(a)),S) (((a,a),∧,(a)),a)(2) 改写文法为:0) S→a 1) S→∧ 2) S→( T ) 3) T→S N 4) N→, S N 5) N→ε非终结符FIRST集FOLLOW集S {a,∧,(} {#,,,)} T {a,∧,(} {)} N {,,ε} {)}对左部为N的产生式可知:FIRST (→, S N)={,} FIRST (→ε)={ε} FOLLOW (N)={)}由于SELECT(N →, S N)∩SELECT(N →ε) ={,}∩ { )}= 所以文法是LL(1)的。
编译原理第三版王生原
编译原理第三版王生原编译原理是计算机科学中非常重要的一门课程,它涉及到编程语言的设计、编译器的构建以及程序的执行过程等方面。
《编译原理》第三版由王生原编著,是一本经典的教材,被广泛应用于计算机相关专业的教学和研究中。
本书共分为13章,内容涵盖了编译原理的基本概念、词法分析、语法分析、语法制导翻译、中间代码生成、运行时环境等多个方面。
每一章都详细介绍了相关的理论知识,并通过大量的实例和案例分析,帮助读者深入理解和掌握编译原理的核心内容。
在第一章中,王生原介绍了编译原理的基本概念和编译器的工作原理。
他首先阐述了编译器在程序设计和执行过程中的重要作用,然后详细介绍了编译器的基本结构和工作流程。
通过对编译器的整体框架和各个模块的功能进行分析,读者可以清晰地了解编译器的工作过程,为后续的学习打下坚实的基础。
接下来的几章分别介绍了词法分析和语法分析的原理和方法,包括正规表达式、有限自动机、上下文无关文法等内容。
王生原通过丰富的例子和图表,生动地阐述了这些复杂概念,帮助读者理解和掌握这些重要的知识点。
在中间代码生成和运行时环境这两个关键章节中,王生原详细介绍了中间代码的生成过程和运行时环境的组织结构,为读者展示了编译器如何将高级语言程序翻译成目标代码,并在目标机器上执行的全过程。
除了理论知识的讲解,本书还包括了大量的实例和案例分析,帮助读者将理论知识应用到实际的编译器设计和实现中。
通过这些实例,读者可以更加直观地了解编译原理的应用,提高自己的实际编程能力。
总的来说,王生原的《编译原理》第三版是一本很好的教材,它系统全面地介绍了编译原理的基本概念和核心技术,适合计算机相关专业的学生和从业人员阅读和参考。
通过学习本书,读者可以全面深入地了解编译原理的知识体系,提高自己的编程能力,为今后的学习和工作打下坚实的基础。
编译原理第5章
二.算符优先分析法的基本思路
是仿照算术表达式的四则运算过程而设计的一 种语法分析方法。
终结符号 运算符 非终结符号 运算对象 算符优先分析法的关键在于用合适的方法去定义 任何两个可能相继出现的结符号a和b(它们之间 可能插有一个非终结符号)之间的优先级。然后利 用这种关系比较相邻运算符之间的优先级来确定 可归约串并进行归约。
bcde#
归约Ab
4
#aA
bcde#
移进
5
#aAb
cde#
归约AAb
6
#aA
cde#
移进
7
#aAc
de#
移进
8
#aAcd
e#
归约Bd
9
#aAcB
e#
移进
10
#aAcBe
# 归约SaAcBe
11
#S
#
接受
5.2算符优先分析法 概述 一. 算符文法的定义 二. 算符优先分析法的基本思想
算符优先分析法概述
第五章 自底向上分析
P94
概论
▪ 思想
• 自下而上的语法分析过程是最右推导的逆过
程(最左归约);即从输入串开始,朝着文 法开始符号进行归约,直至到达文法开始符 号为止的过程。
▪ 核心
• 寻找句型中的“句柄”进行归约,用不同的
方法寻找句柄,就可获得不同的分析方法
5.1 自底向上分析
一、规范归约
•归约 G=(VT,VN,S,P),α, β ∈(VT∪VN)*,A→β∈P,
规范句型的特点:
生式如下:
①S→aAcBe
②A→b
句柄后不会出现非终结符号。
③A→Ab
④B→d
对输入串abbcde#进行分析
编译原理第五章 (2)
可归前缀集:
开始符产生式的右部
{aAc} {aAc,aAbb } {aAc,aAbb,ab }
13
A → Abb[2] A → b[3]
LR(0)分析法基本概念
LR(0)项目: S 若A→是产生式,则称A→为LR(0)项目(简称项目)。 a A A c c
例: S → aAc 对应四个LR(0)项目: c 1. S → aAc 符号栈中不包含句柄的任何部分 2. S → aAc 符号栈中包含句柄中的a 3. S → aAc 符号栈中包含句柄中的aA 4. S → aAc 符号栈中包含完整句柄aAc
G[S]的LRSM
B e [4]
例3:构造LR(0)状态机 SE$ EE+T ET T id T ( E )
25
SE$ EE+T ET T id T ( E )
0
T
9
T
6
S→ E $ E→ E+T E→ T T→ id T→ ( E )
(
id +
E→T
活前缀的描述性定义 形成可归前缀之前,包括可 归前缀在内所有规范句型的前缀都称为活前缀。 LR类语法分析的思想。 LR(0)分析法关键技术是计算文法的所有规范活
前缀及所有归约规范活前缀。
9
派生定理
开始符产生式的右部是归约活前缀。 如果A是归约活前缀,且A→是产生式,则也 是归约活前缀。 分析: A A、 A
20
例1:计算下列文法的LR(0)状态机。 G[S]: S → aAc[1] A → dbb[2] A → b[3]
21
0
S → aAc[1]
εNO a
G[S]: S → aAc[1] A → dbb[2] A → b[3]
编译原理 第五章
一个文法符号串的开始符号集合定义如下: 定义5.1 设G=(VT,VN,S,P)是上下文无关文法 FIRST(α)={a|α aβ,a∈VT,α,β∈V*} 若α ε,则规定ε∈FIRST(α).
不难求出在例5.2文法G2中 FIRST(Ap)={a,c} FIRST(Bq)={b,d} 因此有 FIRST(A)∩(FIRST(B)= 这样文法G2中,关于S的两个产生式的右部虽然都以非 终结符开始,但它们右部的符号串可能推导出的首符号集 合不相交,因而可以根据当前的输入符号是属于哪个产生 式右部的首符号集合而决定选择相应产生式进行推导,因 此仍能构造确定的自顶向下分析。
定义5.4 一个上下文无关文法是LL(1)文法的充分 必要条件是:对每个非终结符A的两个不同产生式, A→α, A→β,满足 SELECT(A→α)∩SELECT(A→β)= 其中α,β不同时能 ε。
LL(1)文法也可定义为: 一个文法G是LL(1)的,当且仅当对于G的每 一个非终结符A的任何两个不同产生式 A→α|β, 下面的条件成立: ① FIRST(α)∩FIRST(β)= ,也就是α和 β推导不出以某个相同的终结符a为首的符号串; 它们不应该都能推出空字ε. ② 假若β ε那么, FIRST(α)∩ FOLLOW(A)= 也就是,若β ε 则α所能推出的串的首符号不应在FOLLOW(A) 中(如例5.3)。这种表示与定义5.4相比计算步骤 少,但不如定义5.4清晰。
东北大学秦皇岛分校编译原理课件 第五章
是LL(1) 文法!!
FIRST(*FD)={*}, FOLLOW(D)=FOLLOW(T)=FIRST(B)FOLLOW(B)={+,#,)}
对于F,只需要考虑FIRST集合:FIRST((E))={(},FIRST(i)={i},交为空。 12
G[ E]:
(1) (4) (7)
E –> TE’ T –> FT’ F –> (E)
增加新的非终结符号 将形如U→y1|y2|…|ym|Ux1|Ux2|…|Uxn 的规则改写成: U→y1 A |y2 A |…|ym A A → x1 A |x2 A |…|xn A| ε
23
消除左递归
例:E → E+T|T T →T*F|F F →(E)| a
G[ E]: (1) (3) (5) (7) E → TE’ E’ → F → (E) (2) E’ → +TE’ (4) T → FT’ (8) F →a
9
如何计算FOLLOW集合
FOLLOW(U)是由文法的所有句型U的后继终结符 或“#”组成的。 求FOLLOW(U)的算法为:
(1)如果U为文法的识别符号,令#∈FOLLOW(U); (2)如有形如 A→U 的规则,则 FIRST( )中非 ε 的元素属于 FOLLOW(U); (3)如有形如 A →U 或 A →U 而 FIRST()含有 ε 元素这样的 规则,则 FOLLOW(A)的元素属于FOLLOW(U)。 注:(2)(3)即为规则A→U 中, 可为ε或有 →ε的情况。
E’ –> +TE’ |
14
课堂练习:判断文法G[S]是否为LL(1)文法
G[S]: S →AB A →bBC C →aC| ε B →a|Sb
编译原理 第9讲第五章 优质课件
LL(1)文法判别
LL(1)文法(充分必要条件) 一个上下文无关文法G是LL(1)的,当且仅当对于G的每一个非终结符
A的任何两个不同产生式A α β ,下面的条件成立: 1.FIRST(α )∩FIRST(β )=,也就是α 和β 推导不出以同一个终结
符a为首的符号串;它们不应该都能推出空字. 2.假若β =>* ,那么,FIRST(α )∩FOLLOW(A)=.
识别输入串w=ccap是否为该文法的句子 试探,推导过程:
S=>Ap=>cAp=>ccAp=>ccap 试探成功
文法特点: 产生式的右部不全是由终结符开始 如果两个产生式有相同的左部,那么它们右部由不同的终结符或非终结符开始 没有空产生式
12
例子(3)
例:文法G1: S → aA | d
A → bAS | ε
3
语法分析
在语言的编译实现中,把句子分析的过程
称为语法分析,即完成这个任务的程序 称为语法分析程序或称为识别程序。分 析算法又称识别算法。 从左到右的分析算法,即总是从左到右地
识别输入符号串,首先识别符号串中的
最左符号,进而依次识别右边的一个符
号,直到分析结束。
4
分析算法分类
自上而下分析法:
从文法的开始符号出发,寻找与输入符 号串匹配的推导,或者说,为输入串寻 找一个最左推导。
这时
w的第二个符号可以与叶子 结点a得以匹配,但第三个 符号d却不能与下一叶子结 点b匹配
怎么办?-查看A有无另一个选 择,有!回溯,把A为根的 子树剪掉,扫描过的输入串 中的a吐出来,再试探用产生 式(3)构造推导S cAd cad
识别输入串w=caa的过程: 1.S cAd 2.选择(2)扩展A,得到推导S cAd
编译原理第三版 第五章 自下而上语法分析
a
b a
A a
b A A a a
c A a
d c A a
e B B c c A A a a
S
(2) 分析树: 用树表示“移进 - 归约 ”过程
A A B S
b
A
b
b
d
a
A
直接短语
T i F
句柄
T
T * F F ( E ) i
E + T T F
规范归约
设α是文法G的一个句子, 若序列αn, αn-1, …, α0,满足: (1)αn = α; (2) α0 = S; (3)对任 意i , 0< i ≤n , αi-1 是从αi 将句柄替换成 相应产生左部符号而得到的;则称该序列是一个 规范归约。
1、归约与分析树
(1)移进-归约法: 使用符号栈, 把输入符号逐一移 进栈, 栈顶出现某个产生式右部时归约为左部。
例 :给定文法 G: (1) S→aAcBe (2) A→b (3) A→Ab (4) B→d 输入串 abbcde是否为句子? 归约过程如下: 步骤: 1. 2. 进 进 动作: a b
例:文法G: G[E]: E→E+E|E*E |(E) |i (1) E→E+T│T (2) T→T*F│F (3) F→P↑F│P (4) P→(E)│i 算符优先关系为: 由(4): P→(E) ∴( =) 由(1) (2): E→E+T, T => T*F ∴+<* 由(2) (3): T→T*F, F => P↑F ∴ *<↑ 由(1): E→E+T, E => E+T ∴ +>+ 由(3): F→P↑F, F=> P↑F ∴ ↑ <↑ 由(4): P→(E), E => E+T ∴ ( < +, +>) ... ∴ G为算符优先文法(优先关系表如表5.1所示,P90) #看作终结符号
编译原理答案第五章
练习5.1解答:输入(4*7+1)*2n,带注释的分析树如下:练习5.2解答: (1)根据表5.3中的语法制导定义建立表达式((a)+(b))的分析树和语法树(2)根据图5.17的翻译模式构造((a)+(b))的分析树和语法树练习5.3解答:设置下面的函数和属性:expr1||expr2:把表达式expr2拼写在表达式expr1后面。
deletep(expr):去掉表达式expr左端的‘(’和右端的‘)’。
E.expr,T.expr,F.expr:属性变量,分别表示E,T,F的表达式。
E.add,T.add,F.add,属性变量,若为true,则表示其表达式中外层有‘+’号,否则无‘+’号。
E.pmark,T.pmark,F.pmark,属性变量,若为true,表示E,T,F的表达式中左端为‘(’,右端是‘)’。
语法制导定义如下:产生式语义规则E -> E1 +T if(T.pmark==true)THEN E.expr=E1.expr||'+'||deletep(T.expr) ELSE E.expr:=E1.expr||'+'||T.expr;E.add:=true;E.pmark:=false;E -> T if(T.pmark==true)THEN E.expr:=deletep(T.expr)ELSE E.expr:=T.expr;E.add:=T.add;E.pmark:=false;T -> T1*F T.expr:=T1.expr||'*'||F.expr; T.add:=false;T.pmark:=false;T -> F T.expr:=F.expr; T.add:=F.add;T.pmark:=F.pmark;F -> (E) if(E.add==false)THEN BEGINF.expr:=E.expr;F.add:=false;F.pmark:=false;ENDELSE BEGINF.expr:='('||E.expr||')';F.add:=true;F.pmark:=true;END;F -> id F.expr:=id.lexval;F.add:=false;F.pmark:=false;练习5.4解答: (1)语法制导定义如下:产生式语义规则E -> E1+T if(E1.type==int) AND (T.type==int) THEN E.type:=intELSE E.type:=real;E -> T E.type:=T.type;T -> num T.type:=int;T -> num.num T.type:=real;(2)设E.pf和T.pf分别是E和T的前缀形式,||是两个字符串的连接,语法制导定义如下:产生式语义规则E -> E1+T if(E1.type==int) AND (T.type==int)THEN E.type:=intELSE BEGINE.type:=real;if(E1.type==int) AND (T.type==real)THEN E1.pf:='inttoreal'||E1.pfELSE if(E1.type==real)AND(T.type==int)THEN T.pf:='inttoreal'||T.pfEND;E.pf:='+'||E1.pf||T.pf;E -> T E.type:=T.type; E.pf:=T.pf;T -> num T.type:=int; T.pf:=int.lexval;T ->num.numT.type:=real; T.pf:=real.lexval;练习5.5解答: (1)用综合属性决定s.val的语法制导定义:产生式语义规则S -> L S.val:=L.val;S ->L1.L2S.val:=L1.val+L2.val*L2.p;L -> B L.val:=B.val; L.p:=2-1;L -> L1B L.val:=L1.val*2+B.val; L.p:=L.p*2-1;B -> 0 B.val:=0;B -> 1 B.val:=1;注:L.p表示恢复L.val的因子。
编译原理chapter13
第五章运行环境源程序最终需要运行。
因此必须了解:与源程序等价的目标程序如何在内存中运行,为了程序的正确运行需要什么样的支持。
不同的源语言结构,所需的运行环境和支持不同。
本章仅以最简单的、基于过程的、顺序执行的程序为前提讨论,即源程序的基本结构是顺序执行的过程,过程与过程之间仅通过子程序调用的方式进行控制流的转移。
讨论内容:1.静态的过程运行时具有什么样的动态特性;2.运行时需要什么样的环境支持(存储空间分配);3.过程之间的调用与返回应如何实现,等。
5.1过程的动态特性5.1.1过程与活动<1>过程、活动、生存期过程的每一次运行称为一次活动(activation)。
活动是一个动态的概念,它有有限的生存期(life time)。
定义5.1活动的生存期是指从进入活动的第一条指令执行到离开此活动前的最后一条指令执行的这段时间,其中包括调用其它过程时其它活动的生存期。
■<2>活动之间的通信①子程序调用:call/return,特点是有去必有回•顺序调用:生存期不交•嵌套调用:生存期嵌套,关系由活动执行轨迹的条件(例如参数等)动态确定•容易混淆的概念:过程的并行定义和嵌套定义(作用域不交和嵌套)②消息传递:send/receive,特点是可以有去无回。
5.1.1过程与活动(续1)<3>顺序执行程序的控制流特点:程序的执行在时间上是顺序的和排他的。
即在程序执行的任一瞬间,有且仅有一个活动正在活动。
假想时间是一支笔,则任何一个顺序执行程序的执行过程(控制流)是一个“一笔画”。
控制流满足:()①控制流是连续的;②过程间的控制流可以用树来表示。
<4>活动树定义5.2描绘控制进入和离开活动方式的树结构被称为活动树:①每个结点代表过程的一个活动;②根代表主程序的活动;③结点a是b的父亲,当且仅当控制流从a的活动进入b的活动;④结点a处于b的左边,当且仅当a的生存期先于b的生存期。
北大编译原理chapter5
7
例5.1 台式计算器程序的语法制导定义(表5.1) 产生式 L→En E →E1+T E →T T →T1*F T →F F →(E) F →digit 语义规则 print(Eval) E val := E1 val+T val E val := T val T val := T1 val+F val T val := F val F val := E val F val := digitlexval
19
5.2.1 语法树 产生式s→if B then S1 else S2的语法树 if-then-else / | \ B S1 S2 赋值语句的语法树 assignment variable expression 在语法树中,运算符号和关键字都不在 叶结点,而是在内部结点中出现。
20
5.2.2 建立表达式的语法树 建立表达式的语法树使用的函数 1. mknode(op,left,right) 建立一个运算符号结 点,标号是op,两个域left和right指向运算分 量结点的指针。 2.mkleaf(id,entry) 建立一个标识符结点,由 标号id标识,一个域entry指向标识符符号 表中相应的项。 3. mkleaf(num,val) 建立一个数结点,标号为 num ,域val用于存放数的值。 返回新建立结点的指针。
17
5.2 语法树(syntax tree)的构造 ◆抽象语法(abstract syntax) 从具体语法中抽象出语言结构的本质 本质性的 本质 东西,而不考虑语言的具体符号表示,从而可 简化语义的形式描述。 在不同的语言中赋值语句有不同的写法: x=y; x:=y; y→x 等等,可以用抽象形式 assignment(variable,expression) 把前面各种具体形式统一起来。
(完整版)编译原理第五章作业参考答案
第五章自顶向下语法分析方法1.对文法G[S]S→a|∧|(T)T→T,S|S(1)给出(a,(a,a))和(((a,a),∧,(a)),a)的最左推导。
(2)对文法G,进行改写,然后对每个非终结符写出不带回溯的递归子程序。
(3)经改写后的文法是否是LL(1)的?给出它的预测分析表。
(4)给出输入串(a,a)#的分析过程,并说明该串是否为G的句子。
解:(1) (a,(a,a))的最左推导为S→(T)→(T,S)→(S,S)→(a,(T))→(a,(T,S))→(a,(S,a))→(a,(a,a))(((a,a),∧,(a)),a)的最左推导为S→(T)→(T,S)→(S,a)→((T),a)→((T,S),a)→((T,S,S),a)→((S,∧,(T)),a)→(((T),∧,(S)),a) →(((T,S),∧,(a)),a)→(((S,a),∧,(a)),a)→(((a,a),∧,(a)),a)(2)由于有T→T,S的产生式,所以消除该产生式的左递归,增中一个非终结符U有新的文法G/[S]:S→a|∧|(T)T→SUU→,SU|ε分析子程序的构造方法对满足条件的文法按如下方法构造相应的语法分析子程序。
(1) 对于每个非终结号U,编写一个相应的子程序P(U);(2) 对于规则U::=x1|x2|..|xn,有一个关于U的子程序P(U),P(U)按如下方法构造:IF CH IN FIRST(x1) THEN P(x1)ELSE IF CH IN FIRST(x2) THEN P(x2)ELSE ......IF CH IN FIRST(xn) THEN P(xn)ELSE ERROR其中,CH存放当前的输入符号,是一个全程变量;ERROR是一段处理出错信息的程序;P(xj)为相应的子程序。
(3) 对于符号串x=y1y2...yn;p(x)的含义为:BEGINP(y1);P(y2);...P(yn);END如果yi是非终结符,则P(yi)代表调用处理yi的子程序;如果yi是终结符,则P(yi)为形如下述语句的一段子程序IF CH=yi THEN READ(CH) ELSE ERROR即如果当前文法中的符号与输入符号匹配,则继续读入下一个待输入符号到CH中,否则表明出错。
编译原理-第五章
利用下面的两条规则,可把包含直接左递归的产生式转换成 用扩展BNF表示法表示的产生式。
❖ ① 提公因子
每当一条产生式中有公因子可提的时候,就把它提出来,若
原产生式是
A→x|xy
则可写成 A→x(y|ε),这里把ε当作最后一个候选式。
❖ ② 若 A→x|y|…|z|Av
是一组产生式,且它只有一个直接左递归的右部位于最后,
如果x是一个终结符串,而且h中至多最左符号是终 结符,那么,(q,y,h)是该NDPDA的一个构形,而且
(q,xy,S)├*(q,y,h)
5.2 消除左递归方法
5.2.1 文法的左递归性
❖ 文法的左递归性属文法递归性的一种,在一文法中,所有形
如
A→xAy x,y ∈(∑∪N) *,A∈N
称为递归产生式(或自嵌入产生式)。
U→1|1|…|n
都有 SELECT (U→i)∩SELECT(U→j)= (ij, i, j=1, 2, …, n),则文法G是一个LL(1)文法。
5.3造
1. 设X(VN∪VT),FIRST(X)的构造
❖ ① 若XVT,则FIRST(X)={X};
(可空)。 ❖ δ 是一个转换函数,它将三元组(q,a,Z)映象成对偶集
{(p1,h1),(p2,h2),…},即,δ(q,a,Z)= {(p1,h1),(p2,h2),…} .
5.1.2 PDA的 构形和移动
PDA的一个构形是一个三元组:(q,w,h) ❖ 其中,q∈Q;w∈∑*是尚待扫描的输入串,包括读
第五章 自上而下语法分析
❖ 语法分析是继词法分析之后编译过程的第2阶段。 它的主要任务是对词法分析的输出结果——单词序 列进行分析,识别合法的语法单位。
编译原理chapter5
struct expty expTy (Tr_exp exp; Ty_ty ty) { struct expty e; e.exp=exp; e.ty=ty; return e; }
5.2 Type-Checking Expressions
• 举例:在Tiger语言中,加法表达式e1+e2
– 两个操作数都必须是整型的(类型检查器必须对此检查) – 结果是整型(类型检查器将返回这种类型)
• 用散列表对字典操作(插入、搜索和删除)的平均时间 为Θ(1),此操作在最坏情况下的操作正比于元素个数n。 • 二叉搜索树对字典的基本操作能在O(logn)的时间内完成。
5.1.3 Efficient Functional Symbol Tables
• 二叉搜索树:
m1={bat→1, camel→2, dog→3} m2=m1+{mouse→4}
• 当σ′= σ + { a→τ },是通过以a 作为键值将τ 插入散 列表来实现的。
void insert ( string key, void *binding) { int index = hash(key) % SIZE table[index] = Bucket ( key, binding, table[index]); } unsigned int hash ( char *s0) { unsigned int h=0; char *s; for ( s=s0; *s; s++) h=h*65599 + *s; return h; }
– formals:各个形式参数的类型;
– result:该函数返回的结果的类型(或Void)。
5.2 Tiger编译器的绑定
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
列,包括空字。
假定G是一个不含-产生式的算符文法。 对于任何一对终结符a、b,我们说: 1. a b 当且仅当文法G中含有形如 P→…ab…或P→…aQb…的产生式; 2. a b 当且仅当G中含有形如P→…aR…
的产生式, 而R b…或R Qb…; 3. a b 当且仅当G中含有形如P→…Rb… 的产生式,而 R
首先需要对G的每个非终结符P构造两个集合
FIRSTVT(P)和LASTVT(P):
LASTVT ( P ) {a | P a ,或 P aQ , a VT 而 Q V N }
3. a
b 当且仅当G中含有形如P→…Rb…
的产生式,而 R
…a或R …aQ。
把上例倒过来写,则得到: S aAcBe aAcde aAbcde abbcde 显然这是一个最右推导。
规范归约是关于是一个最右推导的逆过程 最左归约 规范推导
由规范推导推出的句型称为规范句型。
S
a A b a
S B
d A S b S B e a A c B e
A
c
b
eaAcFra bibliotekB d
+ b并不意味着b
注意:与数学上的<>=不同
+ a
a,如 (
+ 和 +
(
5.2.1 算符优先文法及优先表构造
一个文法,如果它的任一产生式的右部都 不含两个相继(并列)的非终结符,即不含 如下形式的产生式右部: …QR… 则我们称该文法为算符文法。 约定:
a、b代表任意终结符; P、Q、R代表任意非终结符; ‘…’代表由终结符和非终结符组成的任意序
步骤 符号栈 输入串 0 # i1*i2+i3# 1 #i1 *i2+i3# 2 #F *i2+i3# 3 #T *i2+i3# 4 #T* i2+i3#
动作 预备 进 归,用F→i 归,用T→F 进
G(E):
E T | E+T T F | T*F F (E) | i
步骤 符号栈 输入串 4 #T* i2+i3# 5 #T*i2 +i3# 6 #T*F +i3# 7 #T +i3# 8 #E +i3# 9 #E+ i3#
符)构造一个相应的子程序,每个子程序识 别一定的语法单位,通过子程序间的信息反 馈和联合作用实现对输入串的识别。
预测分析程序
优点:直观、简单和宜于手工实现。
G(E): E i| E+E | E-E | E*E | E/E | (E) i*i+i E*i+i E*E+i E+i E+E E E E + E
FIRSTVT(P)和LASTVT(P):
FIRSTVT ( P ) { a | P a ,或 P Qa , a V T 而 Q V N }
a
b
当且仅当G中含有形如P→…aR…
的产生式, 而R b…或R Qb…;
从算符优先文法G构造优先关系表的算法。 通过检查G的每个产生式的每个候选式,可 找出所有满足a b的终结符对。
首先讨论构造集合FIRSTVT(P)的算法。 按其定义,可用下面两条规则来构造集合 FIRSTVT(P):
1. 若有产生式P→a…或P→Qa…,则 aFIRSTVT(P);
2. 若aFIRSTVT(Q),且有产生式P→Q…, 则aFIRSTVT(P)。
如果把这个算法稍为形式化一点,我们 可得如下所示的一个程序(包括一个过程 和主程序):
动作 进 进 归,用F→i 归,用T→T*F 归,用E→T 进
G(E):
E T | E+T T F | T*F F (E) | i
步骤 9 10 11 12 13 14
符号栈 #E+ #E+i3 #E+F #E+T #E #E
输入串 i3# # # # # #
动作 进 进 归,用F→i 归,用T→F 归,用E→E+T 接受
E i
* E
i
i
例:设文法G(S): (1) S aAcBe (2) A b (3) A Ab (4) B d 试对abbcde进行“移进-归约”分析。
e B d B b c c A b S a a
abbcde bbcde bcde cde de e
步骤: 1 动作: 进a
2 3 4 5 6 进b 归(2) 进b 归(3) 进c
且 S A A
*
则称是句型相对于非终结符A的短语。 特别是,如果有A,则称是句型相对 于规则A 的直接短语。一个句型的最左 直接短语称为该句型的句柄。
示例:考虑文法G(E): E T | E+T T F | T*F F (E) | i 和句型i1*i2+i3: E E+T E+F E+i3 T+i3 T*F+i3 T*i2+i3 F*i2+i3 i1*i2+i3
从算符优先文法G构造优先关系表的算法。 通过检查G的每个产生式的每个候选式,可 找出所有满足a b的终结符对。
首先需要对G的每个非终结符P构造两个集合
FIRSTVT(P)和LASTVT(P):
FIRSTVT ( P ) {a | P a , 或 P Qa , a V T 而 Q V N }
PROCEDURE INSERT(P,a); IF NOT F[P,a] THEN BEGIN F[P,a]:=TRUE; 把(P,a)下推进STACK栈 END;
主程序:
BEGIN FOR 每个非终结符P和终结符a DO F[P,a]:=FALSE; FOR 每个形如P→a…或P→Qa…的产生式 DO INSERT(P,a); WHILE STACK 非空 DO BEGIN 把STACK的顶项,记为(Q,a),上托出去; FOR 每条形如P→Q…的产生式 DO INSERT(P,a); END OF WHILE; END
回顾
语法分析的方法:
自下而上分析法(Bottom-up)
基本思想:从输入串开始,逐步进行“归
约”,直到文法的开始符号。即从树末端开始, 构造语法树。所谓 归约 ,是指根据文法的产
生式规则,把产生式的右部替换成左部符号。
归约
采用“移进-归约”思想进行自下而上分析。 基本思想:用一个寄存符号的先进后出栈,把输 入符号一个一个地移进到栈里,当栈顶形成某个 产生式的候选式时,即把栈顶的这一部分替换成 (归约为)该产生式的左部符号。
编译原理
第五章 语法分析——自下而上分析
第五章 语法分析——自下而上分析
自上而下分析法(Top-down) 自下而上分析法(Bottom-up)
语法分析的方法:
自上而下分析法(Top-down)
基本思想:它从文法的开始符号出发,反复
使用各种产生式,寻找"匹配"的推导。
递归下降分析法:对每一语法变量(非终结
这个算法的工作结果得到一个二维数组F, 从它可得任何非终结符P的FIRSTVT。 FIRSTVT(P)={a | F[P,a]=TRUE}
同理,可构造计算LASTVT的算法。
LASTVT ( P ) {a | P a ,或 P aQ , a VT 而 Q V N }
的产生式, 而R b…或R Qb…; 3. a b 当且仅当G中含有形如P→…Rb… 的产生式,而 R …a或R …aQ。
从算符优先文法G构造优先关系表的算法。 通过检查G的每个产生式的每个候选式,可 找出所有满足a b的终结符对。
首先需要对G的每个非终结符P构造两个集合
短语: i1,i2,i3, i1*i2, i1*i2+i3 直接短语: i1,i2,i3 句柄: i1
定义:假定是文法G的一个句子,我们 称序列 n, n-1, ,0 是一个规范归约,如果此序列满足: 1 n= 2 0为文法的开始符号,即0=S 3 对任何i,0 i n, i-1是从i经把句 柄替换成为相应产生式左部符号而得到 的。
比较 FIRST ( ) = {a | a ..., a VT }
LASTVT ( P ) {a | P a ,或 P aQ , a VT 而 Q V N }
*
*
比较 FOLLOW ( A ) {a | S ... Aa..., a VT }
…a或R …aQ。
如果一个算符文法G中的任何终结符对(a, b)至多只满足下述三关系之一: a b, a b, a b 则称G是一个算符优先文法。 国防科技大学计算机系602教研室
例:考虑下面的文法G(E):
(1) E→E+T | T (2) T→T*F | F (3) F→P F | P (4) P→(E) | i 由第(4)条规则,有 ‘(’ ‘)’; 由规则E→E+T和TT*F, 有 *; 由(2) T→T*F 和(3) F→P F ,可得* ↑; 由(1)E→E+T和E E+T,可得+ +; 由(3)F→PF和F PF,可得↑ ↑。 由(4)P→(E)和 EE+TT+TT*F+TF*F+T P↑F*F+Ti↑F*F+T 有 ( +、( *、( ↑和( i。