编译原理作业集第四章修订版
编译原理作业集-第四章-修订版
第四章语法分析—自上而下分析本章要点1. 语法分析器的功能;2. 自上而下分析方法,LL(1) 文法3. 递归下降分析程序构造;4. 预测分析表的构造及预测分析过程;5. LL(1) 分析中的错误处理。
本章目标理解和掌握语法分析器的功能、自上而下分析所面临的问题、LL (1)分析法、递归下降分析的构造过程、预测分析程序等内容。
本章重点1.语法分析器的功能,自上而下的基本概念2.LL ( 1)文法的条件及其判别,计算first 集和follow 集3.递归下降分析方法、预测分析表的构造及其预测过程。
本章难点1. 非终结符的First 集合,产生式候选的First 集合,非终结符的follow 集合的求解;2. 左递归消除;3. 递归下降分析程序的编写;作业题一、单项选择题:1. 高级语言编译程序常用的语法分析方法中,递归下降分析法属于分析法。
a.自左至右b.自顶向下c.自底向上d.自右向左 2. 上下文无关文法可以用来描述。
a.正则表达式b.正规文法c.扩展的BNFd.翻译模式3. 自上而下分析面临的四个问题中,不包括a.需消除左递归;b.存在回朔;c.虚假匹配;d.寻找可归约串4. 语法分析器接收以 ________ 为单位的输入,并产生有关信息供以后各阶段使用。
a.表达式;b.产生式;c.单词;d.语句;5. 自上而下分析的主旨是,对任何单词符号串,试图用一切可能的办法,从文法开始符号 (根结点)出发, ________ 。
a.为输入串寻找最右推导;b.为输入串寻找最左直接子树;c.为输入串建立最右直接子树;d.为输入串寻找最左推导;6. 把规则T T F | T*F 表示成扩展的巴克斯范式以后,画出它的语法图应该是。
7. 下列文法中, ________ 是LL(1)文法。
a. S T aSb|abb. S T ab|Sab8. 设有文法G :S T Ap|Bq A T a|cA B T b|dB则,First(Ap)={ ______________ } a. a,c b. b,d c. p, q d. A, p.答案:1. b ; 2. c ; 3. d ; 4. c ; 5. d ; 6.图 a ;、填空题:1. _________________________________________________ 语法分析器的工作本质上就是按 ,识别输入符号串是否为一个句子。
编译原理 第四章习题
S→aA A→Ab|b (1) 构造识别该文法项目活前缀的DFA (2) 判定该文法是否为LR(0)文法。若是的话构造相应的LR分析 表。 (3) 对句子abbb#进行分析。、 6.已知文法G[S] S→ r D D→ D , i D→ i (1) 构造识别该文法项目活前缀的DFA (2) 判定该文法为哪类LR文法?构造相应. 对文法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的 句子。 2. 已知文法G[S]: S→MH|a H→LSo|ε K→dML|ε L→eHf M→K|bLM (1)求出各个非终结符的First集Follow集。 (2)判断G是否是LL(1)文法,如果是,构造LL(1)分析表。 3.已知文法G[Z] Z→aAAa A→bF’b F’→F F→cF|c (1) 求出各个非终结符的FIRSTVT 集和LASTVT集。 (2) 判断该文法是否为算符优先文法。(请以a,b,c,’,#的顺 序构造相应的算符优先矩阵。) 4. 设有文法G[S]: S→V V→T|ViT T→F|T+F F→)V*|( (1) 求出各个非终结符的FIRSTVT 集和LASTVT集。 (2) 判断该文法是否为算符优先文法。(请以i,+,*,(,),#的顺 序构造相应的算符优先矩阵) (3)给出(+(i(#的分析过程。 5. 已知文法G[s]
编译原理第4章.doc
第四章作业4.1 对下面文法,设计递归下降分析程序。
S→aAS|(A) , A→Ab|c解:将左递归去掉,将规则A→Ab|c 改成 A→c{b}非终结符号S的分析程序如下:非终结符号A的分析程序如下:4.2 设有文法G[Z]:Z∷=(A) , A∷=a|Bb , B∷=Aab若采用递归下降分析方法,对此文法来说,在分析过程中,能否避免回溯?为什么?解:若采用递归下降分析方法,对此文法来说,在分析过程中,不能避免回朔。
因为A∷=a|Bb和B∷=Aab构成了间接的左递归,不满足实现没有回溯的递归下降分析方法的条件,因此在分析过程中,将造成回溯。
4.3 若有文法如下,设计递归下降分析程序。
<语句>→<语句><赋值语句>|ε<赋值语句>→ID=<表达式><表达式>→<项>|<表达式>+<项>|<表达式>-<项><项>→<因子>|<项>*<因子>|<项>/<因子><因子>→ID|NUM|(<表达式>)解:首先,去掉左递归(1)<语句>→<语句><赋值语句>|ε改为: <语句>→{<赋值语句>}(3)<表达式>→<项> | <表达式> + <项> | <表达式> - <项> 改为:<表达式>→<项>{(+ | -)<项>}(4)<项>→<因子> | <项> * <因子> | <项> / <因子>改为:<项>→<因子>{(* | /)<因子>}则文法变为:<语句>→{<赋值语句>}<赋值语句>→ID=<表达式><表达式>→<项>{(+ | -)<项>}<项>→<因子>{(* | /)<因子>}<因子>→ID|NUM|(<表达式>)非终结符号 <语句>→{<赋值语句>} 的分析程序如下:非终结符号 <赋值语句>→ID=<表达式> 的分析程序如下:非终结符号<表达式>→<项>{(+ | -)<项>} 的分析程序如下:非终结符号 <项>→<因子>{(* | /)<因子>} 的分析程序如下:非终结符号 <因子>→ID|NUM|(<表达式>) 的分析程序如下:4.4 有文法G[A]:A::=aABe|ε,B::=Bb|b(1)求每个非终结符号的FOLLOW集。
编译原理第4章习题答案
S-> S’ S’->(S)SS’| First( (S)SS’) = { ( } Follow(S)=Follow(S’)= { (, ),$ }
预测分析表
非终结符 S ( S->S’ ) S->S’ $ S->S’
S’
S’->(S)SS’
S’->
S’->
S’->
冲突
仔细分析后,发现该文法 S->S(S)S| 是二义性文法。 二义性文法不可能是LL(1)文法。 例如:( ) ( )
S->aS’ S’->aS’AS’|Ɛ A->+|*
First(S) = First(aS’)={a} First(S’)= First(aS’AS’) ∪ First(Ɛ)= {a} ∪{Ɛ}= {a, Ɛ} First(A) = { +,*}
Follow(S) ={$} 因为 S->aS’,所以把Follow(S)加入到Follow(S’)中。 因为 S’->aS’AS’的第一个S’ ,所以把First(AS’)={+,*}加入到Follow(S’)中。 因为 S’->aS’AS’的第二个S’ ,所以Follow(S)加入到Follow(S’)中。 所以,Follow(S’)= {$, +,*} 对 S’->aS’AS’的A ,当A后面的S’推导出非空时,把First(S’)-{Ɛ}={a}加入到Follow(A)中。 对 S’->aS’AS’的A ,当A后面的S’推导出空时,把Follow(S’)={$,+,*}加入到Follow(A)中。 所以,Follow(A)= {a, +,*,$} 对于S’->aS’AS’|Ɛ,因为First(aS’AS’) ∩Follow(S’)={a} ∩{$,+,*}=空集,所以没有冲突。 对于A->+|*,因为First(+) ∩First(*)={+} ∩{*}=空集,所以没有冲突。 所以该文法是LL(1)文法。
编译原理第四章
FIRST( F ) = { (, id
}
FIRST( T ) = FIRST( F ) = { (, id } FIRST( E ) = FIRST( T ) = { (, id } FIRST( E' ) = { +,ε }
FIRST( T' ) = { *, ε }
定义
教学进度
FOLLOW( A ) 的计算法(P67)
计算机科学与工程系
表达式文法直接左递归的消除
E → E + T|T T → T * F|F F → ( E )|id
E E' T T' F → → → → → T + F * ( E' T E'|ε T' F T'|ε E )|id
教学进度
计算机科学与工程系
把直接左递归改为直接右递归:
将规则A →A1|A2|...|Am|1|2|...|n 改写为: A → 1 A’ |2 A’ |...|n A’ A’ → 1A’|2 A’ |...|m A’ | ε
• top down parsing:推导
• bottom up parsing:归约
教学进度
4.2 自顶向下语法分析
• 基本思想:
计算机科学与工程系
• 从文法的开始符号出发,向下推导出句子; • 试图用一切可能的办法,从文法开始符号出发, 自上而下地为输入串建立一课语法树;(寻找一 个最左推导) • 此分析过程本质上是一种试探过程。 • 非确定的自上而下分析法实际上采用的是一种 穷尽一切可能的试探法。
• E → T E' • E'→ + T E'|ε • T → F T' • T'→ * F T'|ε • F → ( E )|id 按照最左推导过程,构造分析树
蒋立源编译原理第三版第四章-习题与答案
蒋立源编译原理第三版第四章-习题与答案(总15页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--第五章习题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)文法。
编译原理第四章(6-6)
(3) 若状态i为X→ α · A β, A∈Vn
则从i引ε弧到所有A → · r的状态 (4) 将NFA确定化为 DFA M.
12
5)LR(0)分析表构造---只适用于LR(0)文法
根据LR(0)文法的 C={ C0 , C1 ,……, Cn } (1)若GO(Ci,a)=Cj , a∈Vt 置ACTION(i,a)=Sj (2)若A→ α· ∈ Ci , 所有a∈Vt (含#) 置ACTION(i,a)=rj (3)若S→δ · ∈ Ck , (S为拓广文法开始符号) 置ACTION(k,#)=acc (4)若GO(Ci,A)=Cj , A∈Vn ,置GOTO(i,A)=j (5)其它:空白(error)
(若其中某项目集已经存在就略去)
4
例题 DFA构造
G[E]:E→E+T∣E-T∣T T →i∣(E) 拓广文法 G[S]:S →E# E→E+T∣E-T∣T T →i∣(E) 所有项目 S → · E# S →E · # S →E# · E→ · E+T E→E · +T E→E+ · T E→ · E-T E→E · -T E→E- · T E→ · T E→T · T→·i T→i· T → · (E) T →(·E) T →(E ·)
8
拓广文法 G[S]: S →E# E→E+T∣E-T∣T T →i∣(E)
0
5
# E
T
( 2 1 i
+ - 3 i ( i
T 6 8
7
i
T 9 +
(
-
T
E ) 10 11
(
4
识别活前缀和可归前缀的FA
9
编译原理第四章作业答案
非终结符
FIRSTVT
LASTVT
E
+ * ↑( i
+ * ↑) i
T
* ↑( i
* ↑) i
F
↑( i
↑)i
P
(i
)i
2).关系 1.由#E#,知 # = # ;由(E)知 ( = ) 2.求 < 关系 考察对象:文法中终结符号在前,非终结符号在后的相邻符号对 由#E # < FIRSTVT(E) 由+T + < FIRSTVT(T) 由*F * < FIRSTVT(F) 由↑F ↑< FIRSTVT(F) 由(E ( < FIRSTVT(E)
T→F
F→-P
F→P
P→(E)
P→i
(1) 构造 G 的算符优先矩阵;
(2) 指出 G 不是算符优先文法,即指出具有多重定义的优先矩阵元素;
(3)将 G 改写为算符优先文法。
解:
(1)求每个非终结符号的 FIRSTVT 集和 LASTVT 集
S→E
E→E-T|T
T→T*F|F
F→-P|P
P→(E)|i
Z 11 Z 12 Z 13
(S
A
B ) = (φ (S ) + () [S ] + [])Z 21
Z 22
Z
23
Z 31 Z 32 Z 33
Z 11 Z 12 Z 13 ε φ φ A B φ Z 11 Z 12 Z 13
Z 21
Z 22
Z
23
=
φ
ε
φ
+
ε
φ
φ
Z
21
Z 22
编译原理第4章习题解答
第4章习题解答:1,2,3,4 解答略!5. 解答:(1)× (2)√ (3)× (4)√ (5)√ (6)√(7)×(8)×6. 解答:(1)A:④ B:③ C:③ D:④ E:②(2)A:④ B:④ C:③ D:③ E:②7.解答:(1) 消除给定文法中的左递归,并提取公因子:bexpr→bterm {or bterm }bterm→bfactor {and bfactor}bfactor→not bfactor | (bexpr) | true |false(2) 用类C语言写出其递归分析程序:void bexpr();{bterm();WHILE(lookahead =='or') { match ('or');bterm();}}void bterm();{bfactor();WHILE(lookahead =='and'){ match ('and');bfactor();}} void bfactor();{if (llokahead=='not') then {match ('not');bfactor();}else if(lookahead=='(') then {match (‘(');bexpr();match(')');}else if(lookahead =='true')then match ('true) else if (lookahead=='false')then match ('false');else error;}8. 解答:消除所给文法的左递归,得G':S →(L)|aL → SL'L'→ ,SL' |实现预测分析器的不含递归调用的一种有效方法是使用一张分析表和一个栈进行联合控制,下面构造预测分析表:根据文法G'有:First(S) = { ( , a ) Follow(S) = { ) , , , #}First(L) = { ( , a ) Follow(L) = { ) }First(L') = { ,} Follow(L') = { ) }按以上结果,构造预测分析表M如下:文法G'是LL(1)的,因为它的LL(1)分析表不含多重定义入口。
编译原理第四章
20
有穷自动机的化简
1. 去掉多余的状态 例 2. 合并等价状态 状态S和T等价的条件: (1). S和T必须同时为终态 非终态 终态或非终态 终态 非终态. (2).对于每一个输入符号, S和T的后继状态 必须在等价状态中.
21
有穷自动机的化简: (1) 把自动机的状态分成终态 非终态 终态和非终态 终态 非终态两 个集合. (2) 对某一集合,某一输入符号,若它们的后 继状态在多个集合中,则把该集合分裂. (3) 重复(2),直到不再产生新的集合为止. (4) 每一集合为化简后的一个状态.
词法分析程序的功能是读入源程序,输出单词. 单词一般有5种: 1.单词的种类 (1). 关键字. (2). 标志符: (3). 常数: (4). 运算符: (5). 界符:
如PASCAL中的begin , end等 变量名, 过程名等. 如25, 3.14等 如 +, -, *, / 等 如,,;,(,)等
26
ε
N(s) N(t)
ε
x
ε ε
y
其中x是NFA(r)的初态,y是NFA(r)的终态,x到N(s)和N(t) 的初态各有一个ε弧,从N(s)和N(t)的终态各有一个弧到y,现在 N(s)和N(t)的初态或终态已不作为N(r)的初态和终态了. ② 对正规式r=st,构造 r=st, x N(s) N(t) y 其中N(s)的初态成了N(r)的初态,N(t)的终态变成了N(r)的 终态,N(s)的终态与N(t)的初态合并为N(r)的一个既不是初态 也不是终态的状态.
9
例: 正规式的性质: 1. r | s = s | r 2. r | (s | t ) = ( r | s ) | t 3. ( r s ) t = r ( s t ) 4. r ( s | t ) = r s | r t (s|t)r=sr|tr 5. εr=r rε=r
编译原理第4章答案精编版
1构造下列正规式相应的DFA(1) 1(0⑴ * 101(2) 1(1010* | 1(010) * 1)* 0 (3) a((a|b) *|ab *a)* b (4) b((ab) * | bb) * ab 解:(1)1(0|1)*101 对应的 NFA 为I10 = &closure(MoveTo(l,0)) I 1 = &closure(MoveTo(l,1)) A[0]B[1] B[1] B[1] C[1,2] C[1,2] D[1,3] C[1,2] D[1,3] B[1] E[1,4] E[1,4]B[1]B[1]F 表由子集法将NFA 转换为DFA第四章词法分析(2)1(10101 1££|ab a) b ( | bb) ab ((3) a((a|b) (4) b((ab)2•已知 NFA=( {x,y,z},{0,1},M,{x},{z} M(y,1)= $ ,M(z,1)={y},构造相应的 解:根据题意有NFA 图如下)其中:M(x,0)={z},M(y,0)={x,y},M(z,0)={x,z},M(x,1)={x},DFAnFI 10 = &closure(MoveTo(l,0)) I 1 = &closure(MoveTo(l,1))A[x] B[z] A[x]B[z] C[x,z] D[y]C[x,z] C[x,z] E[x,y]D[y] E[x,y]E[x,y] F[x,y,z] A[x]F[x,y,z] F[x,y,z] E[x,y]F面将该DFA最小化:(1) 首先将它的状态集分成两个子集:P i={A,D,E},P 2={B,C,F}(2) 区分P2:由于F(F,1)=F(C,1)=E,F(F,0)=F 并且F(C,O)=C,所以F, C 等价。
由于F(B,O)=F(C,O)=C,F(B,1)=D,F(C,1)=E,而D, E 不等价(见下步),从而B 与C, F 可以区分。
编译原理第4章习题及答案(词法分析)
解:
4.8构造以下3型文法相应的最简自动机(“最简自动机”应该是“最简确定自动机”):
G:S → aS|bA|a
A → aS|bA|bB
B →bB | b
解:
a
b
Ia
Ib
-S
SZ
A
-S
SZ
A
A
S
AB
+SZ
SZ
A
B
BZ
A
S
AB
+Z
AB
S
ABZ
+ABZ
S
ABZ
4.9构造以下自动机相应的3型文法G:
(3)由正规式(1|…|9)(0|1|2|…|9)*构造的DFA3为:
(4)依题意构造的DFA4为:
(5)确定有限自动机与3型文法等价。而“a和b的个数相等的所有ab串”属上下文有关,需要1型文法描述,故确定有限自动机不能描述。
4.4构造下列正规式相应的NFA,然后转换为DFA:
(1)(a|b)*a(a|b|ε)
习题 第4章词法分析
4.1编写以下字符串集的正规式(若没有正规式则说明原因):
(1)以a开头和结尾的所有小写字母串;
(2)以a开头或/和结尾的所有小写字母串;
(3)不以0开头的所有数字串;
(4)每个5均在每个1之前的所有数字串;
(5)a和b的个数相等的所有ab串。
4.2简述由下列正规式生成的语言:
(1)(a|b)*a(a|b|ε)
4.5构造自动机A1和A2,使得
L(A1)={ε,an,ban|n≥1}
L(A2)={ε,(ab)n|n≥1}
4.6将下列NFA确定化:
4.7消除下列εDA的ε边:
编译原理 第4章习题解答
第四章习题解答4.1词法分析的主要任务是对源程序进行扫描,从中识别出单词,它是编译过程的第一步,也是编译过程中不可缺少的部分。
4.2单词符号一般分为五类:关键字、标识符、常数、运算符和界限符。
分别用整数1、2、3、4、5表示。
对于这种非一符一个类别码的编码形式,一个单词符号除了给出它的单词类别码之外,还要给出它的自身值。
标识符的自身值被表示成按字节划分的内部码。
常数的自身值是其二进制值。
由于语言中的关键字、运算符和界限符的数量都是确定的,因此,对这些单词符号可采用一符一个单词类别码。
如果采取一符一个单词类别码,那么这些单词符号的自身值就不必给出了。
4.3设计词法分析程序有如下几种方法:①由正规文法设计词法分析程序——程序设计语言的单词一般都可以用正规文法描述,从正规文法可构造一个FA。
再对FA确定化和状态个数最少化,最后得到一个化简了的DFA。
这个DFA正是词法分析程序的设计框图,这样,由DFA编制词法分析程序就容易了。
②由正规表达式设计词法分析程序——正规表达式也是描述单词的一种方便工具。
由正规表达式转换成NDFA,然后再对它确定化和状态个数最少化,可得一个DFA。
再由DFA编制词法分析程序。
4.4符号表在编译程序中具有十分重要的意义,它是编译程序中不可缺少的部分。
在编译程序中,符号表用来存放在程序中出现的各种标识符及其语义属性。
一个标识符包含了它全部的语义属性和特征。
标识符的全部属性不可能在编译程序的某一个阶段获得,而需要在它的各个阶段中去获得。
在编译程序的各个阶段,不仅要用获取的标识符信息去更新符号表中的内容,添加新的标识符及其属性,而且需要去查找符号表,引用符号表中的信息。
因为,符号表是编译程序进行各种语义检查(即语义分析)的依据,是进行地址分配的依据。
标识符处理的基本思想是,当遇到定义性标识符时,先去查符号表(标识符表)。
如果此标识符已在符号表中登记过,那么表明该标识符被多次声明,将作为一个错误,因为一个标识符只能被声明一次;如果标识符在符号表中未登记过,那么将构造此标识符的机内符,并在符号表中进行登记。
蒋立源编译原理第三版第四章习题与答案
蒋⽴源编译原理第三版第四章习题与答案第4章习题14-1 消除下列⽂法的左递归性。
(1) S→SA|A A→SB|B|(S)|( ) B→[S]|[ ](2) S→AS|b A→SA|a(3) S→(T)|a|ε T→S|T,S4-2 对于如下⽂法,求各候选式的FIRST集和各⾮终结符号的FOLLOW集。
S→aAB|bA|ε A→aAb|ε B→bB|ε4-3 验证下列⽂法是否为LL(1)⽂法。
(1) S→AB|CDa A→ab|c B→dE|εC→eC|ε D→fD|f E→dE|ε(2) S→aABbCD|ε A→ASd|ε B→SAc|eC|εC→Sf|Cg|ε D→aBD|ε4-4 对于如下的⽂法G[S]:S→Sb|Ab|bA→Aa|a(1) 构造⼀个与G等价的LL(1)⽂法G′[S];(2) 对于G′[S],构造相应的LL(1)分析表;(3) 利⽤LL(1)分析法判断符号串aabb是否是⽂法G[S]的合法句⼦。
4-5 设已给⽂法S→SaB|bB A→S|a B→Ac(1) 构造⼀个与G等价的LL(1)⽂法G′[S];(2) 对于G′[S],构造相应的LL(1)分析表;(3) 利⽤LL(1)分析法判断符号串bacabc是否是⽂法G[S]的合法句⼦。
第4章习题答案4-1 解:(1) ⽂法G[S]中的S,A都是间接左递归的⾮终结符号。
将A产⽣式的右部代⼊产⽣式S→A中,得到与原⽂法等价的⽂法G′[S]:S→SA|SB|B|(S)|( )A→SB|B|(S)|( )B→[S]|[ ]⽂法G′[S]中的S是直接左递归的⾮终结符号,则消除S产⽣式的直接递归性后,我们便得到了与原⽂法等价且⽆任何左递归性的⽂法G"[S]:S→BS′|(S)S′|( )S′A→SB|B|(S)|( )B→[S]|[ ](2) ⽂法G[S]中的S,A都是间接左递归的⾮终结符号。
将A产⽣式代⼊产⽣式S→AS中,得到与原⽂法等价的⽂法G′[S]:S→SAS|aS|bA→SA|a⽂法G′[S]中的S是直接左递归的⾮终结符号,则消除S产⽣式的直接递归性后,我们便得到了与原⽂法等价且⽆任何左递归性的⽂法G"[S]:S→aSS′|bS′S′→ASS′|εA→SA|a(3) ⽂法G[S]中的T是直接左递归的⾮终结符号。
精品课件-编译原理(第四版)-第4章
我们再举一例说明属性文法。一简单变量类型说明的文法G[D] 如下:
G[D]:D→int L∣float L
L→L, id∣id
其对应的属性文法为
(1)D→TL
L.in=T.type
(2)T→int
T.type=int
(3)T→float
T.type=float
(4)L→L(1),id L(1).in=L.in; addtype ( id.entry, L.in )
(1)赋值语句:左部 表达式
(2)条件语句:表达式 语句1 语句2
与抽象语法相对应的语法树称为抽象语法树或抽象树, 如赋值语句x=a−b*c的抽象语法树如图4-4(a) 所示,而图4-4(b) 则是该赋值语句的普通语法树。
图4–4 x=a−b*c的语法树
(a) 抽象语法树;(b) 普通语法树 图
语义栈 _ __ _7 _7_ _7_ _ _7_9 _7_9_ _7_9_ _ _7_9_5 _7_45 _52
输入串 7+9*5#
+9*5# +9*5#
9*5# *5# *5# 5# # # # #
主要动作 s3 r4 s4 s3 r4 s5 s3 r4 r2 r1 acc
Hale Waihona Puke 4.2 属 性 文 法一个源程序经过词法分析、语法分析之后,表明该源程序 在书写上是正确的,并且符合程序语言所规定的语法。但是语 法分析并未对程序内部的逻辑含义加以分析,因此编译程序接 下来的工作是语义分析,即审查每个语法成分的静态语义。如 果静态语义正确,则生成与该语言成分等效的中间代码,或者 直接生成目标代码。直接生成机器语言或汇编语言形式的目标 代码的优点是编译时间短且无需中间代码到目标代码的翻译, 而中间代码的优点是使编译结构在逻辑上更为简单明确,特别 是使目标代码的优化比较容易实现。
编译原理第四章答案
“编译技术”第四章作业4-1 已知文法G[C]:C→iEtS|iEtSeSE→ a|bS→ a+b|a*b(1)提取左公共因子;(2)计算修改后文法的每个非终结符的FIRST集和FOLLOW集;(3)给出递归下降分析程序。
(3)递归下降分析程序void match(token t){if(lookahead=='t')lookahead = nexttoken;else error;}void C(){if(lookahead=='i'){match('i');E();if(lookahead=='t'){match('t');S();Cprime();}else error;}else error;}void Cprime(){if(lookahead=='e'){match('e');S();}}void E(){if(lookahead=='a')match('a');else if(lookahead=='b')match('b');else error;}void S(){if(lookahead=='a'){match('a');Sprime();}}void Sprime(){if (lookahead=='+'){match('+');if(lookahed=='b'){match('b');}else error();}else if(lookahead=='*'){match('*');if(lookahead=='b'){match('b');}else error();}}4-2 已知文法G[Z]:Z→Az|bA→ Za|a(1)删除左递归;(2)计算修改后文法的每个非终结符的FIRST集和FOLLOW集;(3)给出递归下降分析程序。
清华版编译原理课后答案——第四章参考答案
第四章参考答案 第1题:确定化: S AB CZ重新命名,令{AB}为B 、{AC}为C 、{ABZ}为Z 其中S 为初态,Z 为终态 (3)确定化: 0 1 2 34重新命名,以0、1、2、3、4代替{S},{A}, {AB},{AZ},{ABZ}得DFAa,b其中0为初态,3,4为终态第2题: A B C DE F重新命名,以A 、B、C、D、E、F代替{X},{Z },{XZ },{ Y },{ XY },{XYZ}得DFA 其中A 为初态,B,C,F为终态第3题: 确定化:ABC D E F G重新命名,以A 、B、C、D、E、F代替{S},{VQ },{QU },{ VZ },{ V },{QUZ},{Z}得DFA 其中A 为初态,D ,F ,G 为终态第4题: (1)A BC重新命名,以A、B、C代替{0}、{01}、{1}得DFA 其中A 为初态,A ,B 为终态初始分划得终态组{A,B},非终态组{C} Π0:{A,B},{C}对终态组进行审查,判断A 和B 是等价的,故这是最后的划分 重新命名,以A 、C 代替{A,B}、{C}得DFA(2)这是DFA ,直接最小化初始分划得:终态组{0},非终态组{1,2,3,4,5} Π0:{0},{1,2,3,4,5} 对{1,2,3,4,5}进行审查:∵{4} 输入a 后到达{0},{1,2,3,5}输入a 后到达{1,3,5},故得到新分划 {0,1,3,5},{4} Π1:{0},{4},{1,2,3,5} 对{1,2,3,5}进行审查:∵{1,5} 输入b 后到达{4},{2,3} 输入b 后到达{2,3},故得到新分划 {1, 5},{2,3} Π2:{0},{4},{1, 5},{2,3}对{1, 5},{2,3}进行审查:{1, 5} 输入a 后到达{1, 5}{2} 输入a 后到达{1},{3} 输入a 后到达{3},故得到新分划{2},{3}Π3:{0},{2},{3},{4},{1, 5}这是最后分划了重新命名,以0,2,3,4,1代替{0},{2},{3},{4},{1, 5}得DFA 略 第7题首先判断E ,F 为多余状态根据正则文法转化为NFA 的方法构造确定化: 0 1 2 34 5 6最小化:初始分划得:终态组{3,4},非终态组{0,1,2,5,6}Π0:{3,4},{0,1,2,5,6}对{0,1,2,5,6}进行审查: {1,2}输入b 到达{3,4},而{0,5,6}输入b 到达{2,5,6},故得到新分划{1,2},{0,5,6} Π1:{3,4},{1,2},{0,5,6} 对{0,5,6}进行审查:{0}经过b 到达{2},{5,6}经过b 到达{5,6},故得到新分划{0}{5,6} Π3:{0},{1,2},{3,4},{5,6}这是最后划分了。
编译原理第4章作业答案
第四章习题4.2.1:考虑上下文无关文法:S-〉SS+|SS*|a 以及串aa+a* (1)给出这个串的一个最左推导 S-> S S *-> S S + S * -> a S + S * -> a a + S * -aa +a(3)给出这个串的一棵语法分析树习题4.3.1:下面是一个只包含符号a 和b 的正则表达式的文法。
它使用+替代表示并运算的符号|,以避免和文法中作为元符号使用的竖线相混淆:rexpr T rexpr+rterm|rtermrterm —rtermrfactor|rfactorrfactor —rfactor*|rprimaryrprimary —a|b1)对这个文法提取公因子2)提取公因子的变换使这个文法适用于自顶向下的语法分析技术吗? 3)提取公因子之后,原文法中消除左递归4)得到的文法适用于自顶向下的语法分析吗? 解1)提取左公因子之后的文法变为rexpr —rexpr+rterm|rtermrterm —rtermrfactor|rfactorrfactor —rfactor*|rprimaryrprimary —a|b 2)不可以,文法中存在左递归,而自顶向下技术不适合左递归文法 3)消除左递归后的文法rexpr->rtermrexpr'rexpr'->+rtermrexpr'l e rterm->rfactorrterm'rterm'->factorrterm'|erfactor->rprimayrfactor'fact or'-〉*rfactor'|erprimary->a|b4) 该文法无左递归,适合于自顶向下的语法分析习题4.4.1:为下面的每一个文法设计一个预测分析器,并给出预测分析表。
可能要先对文法进行提取左公因子或消除左递归 (3)S-〉S(S)S|*(5)S->(L)|aL->L,S|S 解 (3)①消除该文法的左递归后得到文法S-〉S'S'-〉(S)SS'|*②计算FIRST 和FOLLOW 集合FIRST(S)={(,*}FOLLOW(S)={),$} FIRST(S')={(,*}FOLLOW(S')={),$}③构建预测分析表①消除该文法的左递归得到文法S-〉(L)|a L->SL' L'-〉,SL'|£②计算FIRST 与FOLLOW 集合FIRST(S)={(,a}FOLLOW(S)={),,,$}FIRST(L)={(,a}FOLLOW(L)={)} FIRST(L')={,,£}FOLLOW(L')={)}习题4.4.4计算练习4.2.2的文法的FIRST 和FOLLOW 集合3)S T S(S)S|5) S T (L)|a,L T L,S|S 解:3)FIRST(S)={£,(}FOLLOW(S)={(,),$} 5) FIRST(S)={(,a}FOLLOW(S)={),,,$}FIRST (L )={(,a}FOLLOW (L )={),,}习题4.6.2为练习4.2.1中的增广文法构造SLR 项集,计算这些项集的GOTO 函数,给出这个文法的语法分析表。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第四章语法分析—自上而下分析本章要点1. 语法分析器的功能;2. 自上而下分析方法,LL(1)文法3. 递归下降分析程序构造;4. 预测分析表的构造及预测分析过程;5. LL(1)分析中的错误处理。
本章目标理解和掌握语法分析器的功能、自上而下分析所面临的问题、LL(1)分析法、递归下降分析的构造过程、预测分析程序等内容。
本章重点1.语法分析器的功能,自上而下的基本概念2.LL(1)文法的条件及其判别,计算first集和follow集3.递归下降分析方法、预测分析表的构造及其预测过程。
本章难点1. 非终结符的First集合,产生式候选的First集合,非终结符的follow集合的求解;2. 左递归消除;3. 递归下降分析程序的编写;作业题一、单项选择题:1. 高级语言编译程序常用的语法分析方法中,递归下降分析法属于分析法。
a. 自左至右b. 自顶向下c. 自底向上d. 自右向左 2. 上下文无关文法可以用 来描述。
a. 正则表达式b. 正规文法c. 扩展的BNFd. 翻译模式 3. 自上而下分析面临的四个问题中,不包括a. 需消除左递归;b. 存在回朔;c. 虚假匹配;d. 寻找可归约串4. 语法分析器接收以________为单位的输入,并产生有关信息供以后各阶段使用。
a. 表达式;b. 产生式;c. 单词;d. 语句;5. 自上而下分析的主旨是,对任何单词符号串,试图用一切可能的办法,从文法开始符号(根结点)出发,________。
a. 为输入串寻找最右推导;b. 为输入串寻找最左直接子树;c. 为输入串建立最右直接子树;d. 为输入串寻找最左推导;6. 把规则T→F | T*F 表示成扩展的巴克斯范式以后,画出它的语法图应该是 。
图a图b图c图d7. 下列文法中,_______是LL(1)文法。
a. S →aSb|abb. S →ab|Sabc. S →aS|bd. S →aS|a 8. 设有文法G : S→Ap|Bq A→a|cAB→b|dB则,First(Ap)={_______________} a. a,c b. b,d c. p, q d. A, p一.答案:1. b ;2. c ;3. d ;4. c ;5. d ;6. 图a ;二、填空题:1. 语法分析器的工作本质上就是按____________________,识别输入符号串是否为一个句子。
这里所说的输入串是指由____________________组成的有限序列。
2. 自顶向下分析会遇到的主要问题是____________________和__________________。
3. 自上而下地为输入串建立一棵语法树,就是为输入串寻找一个______________。
4. 在扩充的巴科斯范式中,用______________表示符号或串α的出现可有可无。
5. 对于一个文法,当给出一串符号时,怎么能知道它是不是该文法的一个句子呢?这就要判断,看是否能。
6. 文法exp → exp addop term | term 消除左递归的结果为。
7. 写出E→T | E+T的EBNF范式为。
8. 扩展的巴克斯范式描述语法的好处是,直观易懂,便于表示。
二.答案:1. 文法的产生式,单词符号(文法的终结符)2. 左递归,回溯;3.最左推导;4. 方括号(或[α]);5. 从文法的开始符号出发推导出这个输入串。
(或:能否建立一棵与输入串相匹配的语法分析树。
)6. exp → term exp′;exp′→ addop term exp′| ε;7. E→T{+T};8. 左递归消去和左因子提取。
三、判断题:1. LL(k)文法都不是二义性的。
()2. 存在一种算法,能判定任何上下文无关文法是否是LL(1)的。
( )3. 一个文法是含有左递归的,如果存在非终结符P,使得P⇒*αP。
()4. 提取公共左因子的副产品是引进了大量的非终结符和ε产生式。
( )5. 把一个文法改造成任何非终结符的所有后选终结首符集两两不相交的办法是消除左递归。
( )6. 若X∈V T,则FIRST(X)={ X }。
( )7. 一个文法的预测分析表含有多重定义入口,说明该文法是LL(1)的。
()8. 自上而下分析及自下而上分析中的“下”是指被分析的源程序串。
()三.答案:1. √;2. √;3. ×;4. √;5. ×;6. √;7. ×;8. √;四、名词解释:1. 左递归;2. 递归下降分析器;3. LL(1)文法;4. 预测分析表5. 自上而下分析四.答案:1.一个文法如果存在非终结符P,P=>+Pα,则称该文法是左递归的。
2. 当一个文法满足LL(1)条件时,可以为它构造一个不带回溯的的自上而下分析程序,该程序是由一组递归过程组成的,每个过程对应文法的一个非终结符。
这样的分析程序称为递归下降分析器。
3. 一个文法G,如果满足以下条件,则称为LL(1)文法:(1)文法不含左递归;(2)对于文法中每一个非终结符A的各个产生式的候选首符集两两不相交;(3)对文法中的每个非终结符A,若它存在某个候选首符集包含ε,则A的First集合和Follow 集合的交集为空。
4. 预测分析表是一个M[A, a]形式的矩阵。
其中A为非终结符,a是终结符或“#”。
矩阵元素M[A, a]中存放着一条关于A的产生式,指出当A面临输入符号a时所应采取的候选。
M[A, a]中也可能存放一个“出错标志”,指出A根本不该面临输入符号a。
5. 自上而下分析是,对任何输入串,试图用一切可能的办法,从文法开始符号(根结点)出发,自上而下地为输入串建立一棵语法树。
或者说,为输入串寻找一个最左推导。
五、简答题:1. 词法分析和语法分析都是对字符串进行识别的,二者有何区别?2. 试说明没有一个左递归文法是LL(1)的。
3. 试说明没有一个LL(1)文法是二义性的。
4. 为什么要消除回溯?5. 为什么要提取左因子?6. 下面文法是有左递归吗?若有,提取左递归。
Declist→Declist; Decl | DeclDecl→idList:TypeIdList→Idlist, id | idType→ScalarType | array (ScalarTypeList) of TypeScalarType→id | Bound..BoundBound→Sign IntLiteral | idSign→+ | - | eScalarTypeList→ScalarTypeList, ScalarType | ScalarType五.答案:1. 答:词法分析的输入符号串是一个单词,而语法分析的输入符号串是一个句子。
词法分析的一个输入符号串是由单个符号组成的单词;语法分析的输入符号串是由词法分析得来的单词组成的句子。
2. 对于任一个左递归文法来说,存在一个A∈V N,有A A...,因此,在文法中必有如下的规则序列:A → A1...A1 → A2........................An→ Aα|βAαβ。
显然,FIRST(Aα)∩FIRST(β)≠Φ。
因此,没有一个左递归文法是LL(1)的。
3. 解:设有一个LL(1)文法G是二义性的,那么,一定存在一个W∈L(G),W=a1, a2......, a n,有两棵不同的分析树。
如果按最左推导构造这两棵分析树,按么,一定有两个最左推导序列,这来年改革最左推导序列的不同在于,于对某一个A∈V N和当前要匹配的a i(1≤i≤n),分别使用A的两个不同的候选式A→α和A→β进行推导以匹配a i(i) 若αε且βε,则必有a i∈FIRST(α)且a i∈FIRST(β),FIRST(α)∩FIRST(β)≠Φ(ii) 若α和β有一个能推导出ε,比如βε,则a i∈FIRST(α)且a i∈FOLLOW(A)显然,FIRST(α)∩FOLLOW(A)≠Φ无论(i)还是(ii),都和G是LL(1)文法矛盾。
4. 假定当前轮到非终结符A去执行匹配任务,A共有n个候选α1、α2、……αn,这时候该用哪一个候选去替换A,原始的办法是采用对所有候选采取“试探”的方法。
如果某个候选不成功就需要“回退”。
这个回退的过程会导致前次匹配的许多工作推到重来,效率低。
而且,最终匹配不成功的时候,难以直到输入串中出错的确切位置。
5. 假定当前轮到非终结符A去执行匹配任务,A共有n个候选α1、α2、……αn,即A→α1|α2|……|αn。
A面临的第一个输入符号为a,如果a属于某个First(αi),则用该αi来匹配A。
但是,若a既属于某个First(αi),又属于某个First(αj),则说明αi和αi存在共同的左部,也就是说,有共同的左因子。
此时无法确定到底是用αi还是用αj来匹配A。
所以要消除左因子。
六、应用题1. 已知文法G[S]:S → (L) | aL → L,S | Sⅰ.消除左递归,若有左因子则提取之;ⅱ.对(1)中得到的文法求First集合和Follow集合ⅲ.对(1)中得到的文法构造一个预测分析表;ⅳ.给出对句子(a,(a,a))上的分析动作1.答案:将所给文法消除左递归得G′:S → (L) | aL → SL′L′→ ,SL′ |ε实现预测分析器的不含递归调用的一种有效方法是使用一张分析表和一个栈进行联合控制,下面构造预测分析表:根据文法G′有FIRST(S) = { ( , a } FOLLOW(S) = {#, ) , ′,′}FIRST(L) = { ( , a } FOLLOW(S) = { ) }FIRST(L′) = {′,′, ε} FOLLOW(L′) = { ) }2. 考查文法G(s):S→( T ) | a + S | aT→T, S | Sⅰ. 消除文法的左递归,提取公共左因子ⅱ. 改造后的文法是LL(1)的吗?为什么?ⅲ. 如果是LL(1)文法,对每个非终结符,写出不带回朔的递归子程序。
2.答案:ⅰ.消除文法的左递归G ( s ):S→ ( T ) | a + S | aT→ S T′T`→ , S T′| ε再提取公共左因子,最后得到改造后的文法G[S]:①S→( T ) | a S′②S′→ + S | ε③T→ S T′④T′→, S T′ | εⅱ.First(S)={(,a };Follow(S)={#,‘,’};First(S’)={+,ε};Follow(S’)= {#,‘,’};First(T)={(,a };Follow(T)={ ) };First(T’)={‘,’ ,ε}; Follow(T’) ={ ) };产生式①的两个候选的First集合:Fist((T))={(},First(aS’)={a}不相交,满足条件。