编译原理 龙书 第二版 第4章
编译原理第4章答案

第四章词法分析1.构造下列正规式相应的DFA:(1)1(0|1) * 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为1101012341下表由子集法将NFA 转换为 DFA:I I0=ε-closure(MoveTo(I,0))I1=ε-closure(MoveTo(I,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]001101A B C D E110,1(2)1(1010 * | 1(010) * 1)* 0 对应的 NFA 为εε1101010 01234561εε101978ε下表由子集法将NFA 转换为 DFA:I I=ε-closure(MoveTo(I,0))I1= ε-closure(MoveTo(I,1))A[0]B[1,6]B[1,6]C[10]D[2,5,7]C[10]D[2,5,7]E[3,8]B[1,6]E[3,8]F[1,4,6,9] F[1,4,6,9]G[1,2,5,6,9,10]D[2,5,7]G[1,2,5,6,9,10]H[1,3,6,9,10]I[1,2,5,6,7] H[1,3,6,9,10]J[1,6,9,10]K[2,4,5,7] I[1,2,5,6,7]L[3,8,10]I[1,2,5,6,7] J[1,6,9,10]J[1,6,9,10]D[2,5,7]K[2,4,5,7]M[2,3,5,8]B[1,6]L[3,8,10]F[1,4,6,9] M[2,3,5,8]N[3]F[1,4,6,9] N[3]O[4]O[4]P[2,5]P[2,5]N[3]B[1,6]1L111111010B I KA D E F M00110 00C11G H J101NP O(3)a((a|b) * |ab * a)* b(略 )(4)b((ab) * | bb) * ab(略 )2.已知 NFA=( {x,y,z},{0,1},M,{x},{z} )其中:M(x,0)={z},M(y,0)={x,y},M(z,0)={x,z},M(x,1)={x}, M(y,1)=φ ,M(z,1)={y},构造相应的 DFA。
编译原理_chapter4

Fa | (E)
描述IF语句的二义文法
<stmt>→ if <expr> then <stmt>
| if <expr> then <stmt> else <stmt>
| other
(4.7)
根据if语句中else与then配对情况将其分为配对 的语句和不配对的语句两类。
上述if语句的文法没有对这两个不同的概念加 以区分,只是简单地将它们都定义为<stmt>, 从而导致该文法是二义性的。
if e1 then if e2 then s1 else s2的语法树
二义性(ambiquity)的定义
对于文法G,如果L(G)中存在一个具有两 棵或两棵以上分析树的句子,则称G是二 义性的。也可以等价地说:如果L(G)中
存在一个具有两个或两个以上最左(或最
右)推导的句子,则G是二义性文法。 如果一个文法G是二义性的,假设
2021/4/25
计算机学院 辛明影
E E→a a
E
E→a a
一棵树!
9
关于语法树的几点结论
短语:一棵子树的 所有叶子自左至右 排列起来形成一个 相对于子树根的短 语。教材p50
短语:
a, a,a,
a+a, a+a*a
2021/4/25
E E* E E +E
a
aa
10
关于语法树的几点结论
直接短语:仅有父子两 代的一棵子树,它的 所有叶子自左至右排列 起来所形成的符号串。
对于一般情况而言,若某一文法G的产生 式具有如下形式:
A→A α1| A α2 |…| A αm| β1| β2|…| βn
编译原理课件第四章

单词符号
语法分
源程序 词法分
语法分 析树 编译程序
析器 取下一单词 析器
后续部分
... 符号表
• 语法分析的方法: • 自下而上分析法(Bottom-up)
• 基本思想:从输入串开始,逐步进行“归约”,
直到文法的开始符号。即从树末端开始,构造语法 树。所谓归约,是指根据文法的产生式规则,把产 生式的右部替换成左部符号。
FIRST( i)∩FOLLOW(A)= i=1,2,...,n
如果一个文法G满足以上条件,则称该文法G为L L(1)文法。
• 对于一个满足上述条件的文法,可以对其输入串进行有效的无回溯的自上而下分析。假 设要用非终结符A进行匹配,面临的输入符号为a,A的所有产生式为 A→ 1 | 2 | … | n 1. 若aFIRST( i),则指派 i执行匹配任务;
Q→Sab | ab | b • 现在的Q不含直接左递归,把它代入到S的有关候选后,S变成
S→Sabc | abc | bc | c
• 例 考虑文法G(S)
S→Qc|c Q→Rb|b R→Sa|a
• S变成
S→Sabc | abc | bc | c
• 消除S的直接左递归后: S→abcS | bcS | cS S→abcS | Q→Sab |ab | b R→Sa|a
P P
含有左递归的文法将使自上而下的分 析陷入无限循环。
4.3 LL(1)分析法
• 构造不带回溯的自上而下分析算法 • 要消除文法的左递归性 • 克服回溯
4.3.1 左递归的消除
• 直接消除见诸于产生式中的左递归:假定关于非终结符P的规则为 P→P |
其中不以P开头。 我们可以把P的规则等价地改写为如下的非直接左递归形式:
编译原理第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)文法。
编译原理chapter4 语法分析

type array[simple] of type {注:A=type,a=array,
type→array[simple ] of type}
array[num dotdot num] of type
{注:A=simple, a=num
simple→num dotdot num }
array[num dotdot num] of simple
aSbAa (SbA) aSbbaa (ba) aabbaa (a)
S
a
A
S
S
b
A
a
aபைடு நூலகம்
ba
精品文档
7
4.2预测分析器 4 .2 .1 预测分析 预测分析的原理 4 .2 .2 递归预测分析器的构造 用一组递归过程实现预测分析,产生式的状 态转换图可作为编写递归过程的兰图。 4 .2 .3 非递归预测分析器的构造—LL(1) 对于每一步分析,分析表项M[A,a]=‘A ’ 表示:面对非终结符号精A品和文档向前看符号a应选 8
A 1 2 ... n
i,j(1 i,j n i<>j),从 i推导出来的第一个 终结符号集合(称为FIRST( i) )和从 j推 导出来的第一个终结符号集合(称为FIRST( j) )不相交,即, FIRST( i) FIRST( j)=
精品文档
12
定义4.1 令G[S]=(VT,VN,S,P),则
FIRST( )= a a*… a VT
例4.2 文法G[S],其产生式如下:
S→aA|d A→bAS|ε (4.2)
若 w=abd,则构造最左推导的过程如下:
S aA {注:A=S,a=a,S→aA}
abAS {注:A=A,a=b,A→ bAS}
编译原理课后习题答案清华大学出版社第二版

b∶=10; end (q); procedure s; var c,d; procedure r;
var e,f;
begin (r)
call q;
end (r); begin (s)
call r; end (s);
begin (p) call s;
end (p);
begin (main)
第6题 计算机执行用高级语言编写的程序有哪些途径?它们之间的主要区别是什么?
答案:计算机执行用高级语言编写的程序主要途径有两种,即解释与编译。 像 Basic 之类的语言,属于解释型的高级语言。它们的特点是计算机并不事先对高级语
言进行全盘翻译,将其变为机器代码,而是每读入一条高级语句,就用解释器将其翻译为一 条机器代码,予以执行,然后再读入下一条高级语句,翻译为机器代码,再执行,如此反 复。
CAL L A 调用过程,完成填写静态链、动态链、返回地址,给出被调用过程的基地址值,送入基址 寄存器 B 中,目标程序的入口地址 A 的值送指令地址寄存器 P 中,使指令从 A 开始执 行。 第 6题
给出对 PL/0 语言作如下功能扩充时的语法图和 EBNF 的语常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶 段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符 号表管理等工作。 (5) 后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段, 即目标代码生成,以及相关出错处理和符号表操作。 (6) 遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。
(2) 扩充 repeat 语句的语法图为:
EBNF 的语法描述为: 〈 重复语句〉::= repeat〈语句〉{;〈语句第 3 章 文法和语言
清华大学编译原理第二版课后习答案

Lw.《编译原理》课后习题答案第一章第1章引论第1题解释下列术语:(1)编译程序(2)源程序(3)目标程序(4)编译程序的前端(5)后端(6)遍答案:(1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。
(2)源程序:源语言编写的程序称为源程序。
(3)目标程序:目标语言书写的程序称为目标程序。
(4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。
通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符号表管理等工作。
(5)后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。
(6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。
第2题一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。
答案:一个典型的编译程序通常包含8个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。
其各部分的主要功能简述如下。
词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。
语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。
语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。
中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式的中间语言代码,如三元式或四元式。
中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。
盛威网()专业的计算机学习网站1《编译原理》课后习题答案第一章目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。
表格管理程序:负责建立、填写和查找等一系列表格工作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第四章
习题4.2.1:考虑上下文无关文法: S->S S +|S S *|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→ rexpr + rterm | rterm
rterm→rterm rfactor | rfactor
rfactor→ rfactor * | rprimary
rprimary→a | b
1)对这个文法提取公因子
2)提取公因子的变换使这个文法适用于自顶向下的语法分析技术吗?
3)提取公因子之后,原文法中消除左递归
4)得到的文法适用于自顶向下的语法分析吗?
解
1)提取左公因子之后的文法变为
rexpr→ rexpr + rterm | rterm
rterm→rterm rfactor | rfactor
rfactor→ rfactor * | rprimary
rprimary→a | b
2)不可以,文法中存在左递归,而自顶向下技术不适合左递归文法
3)消除左递归后的文法
rexpr -> rterm rexpr’
rexpr’-> + rterm rexpr’|ε
rterm-> rfactor rterm’
rterm’-> rfactor rterm’|ε
rfactor-> rprimay rfactor’
rfactor’-> *rfactor’|ε
rprimary-> a | b
4)该文法无左递归,适合于自顶向下的语法分析
习题4.4.1:为下面的每一个文法设计一个预测分析器,并给出预测分析表。
可能要先对文法进行提取左公因子或消除左递归
(3)S->S(S)S|ε
(5)S->(L)|a L->L,S|S
解
(3)
①消除该文法的左递归后得到文法
S->S’
S’->(S)SS’|ε
②计算FIRST和FOLLOW集合
FIRST(S)={(,ε} FOLLOW(S)={),$}
FIRST(S’)={(,ε} FOLLOW(S’)={),$}
③
(5)
①消除该文法的左递归得到文法
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→S(S)S|ε
5)S→(L)|a,L→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函数,给出这个文法的语法分析表。
这个文法是SLR文法吗?
S→SS+|SS*|a
解:
①构造该文法的增广文法如下
S’->S
S->SS+
S->SS*
S->a
②构造该文法的LR(0)项集如下
③GOTO函数如下
GOTO(I0,S)=I1 GOTO(I0,a)=I2
GOTO(I1,S)=I3 GOTO(I1,a)=I2 GOTO(I1,$)=acc
GOTO(I3,S)=I3 GOTO(I3,+)=I4 GOTO(I3,*)=I5 GOTO(I3,a)=I2
④构造该文法的语法分析表
注:FOLLOW(S’)=FOLLOW(S)={+,*,a,$}
这个文法是SLR文法,因为语法分析表中没有重复的条目
习题4.6.6说明下面文法
S→SA|A
A→a
是SLR(1)的,而不是LL(1)的。
证明:
1)可以求得FIRST(SA)=FIRST(A)={a},故该文法不是LL(1)文法
2)构造该文法的增广文法的语法分析表如下
①构造增广文法
S’->S
S->SA
S->A
A->a
②构造LR(0)项集族
③GOTO函数如下
GOTO(I0,S)=I1 GOTO(I0,A)=I2 GOTO(I0,a)=I3
GOTO(I1,A)=I4 GOTO(I1,a)=I3 GOTO(I1,$)=acc
④构建语法分析表如下(FOLLOW(A)=FOLLOW(S)={a,$})
可以看到该语法分析表中没有重复的条目故该文法是SLR(1)文法
习题4.7.4说明下面的文法
S->Aa|bAc|dc|bda
A->d
是LALR(1)的,但不是SLR(1)的
证明:
1、构造该文法的SLR(1)语法分析表
①构造增广文法
S’->S
S->Aa
S->bAc
S->dc
S->bda
A->d
②构造LR(0)项集族
③GOTO函数
GOTO(I0,S)=I1 GOTO(I0,A)=I2 GOTO(I0,b)=I3 GOTO(I0,d)=I4 GOTO(I1,$)=acc GOTO(I2,a)=I5 GOTO(I3,A)=I6 GOTO(I3,d)=I7 GOTO(I4,c)=I8 GOTO(I6,c)=I9 GOTO(I7,a)=I10
④构建SLR语法分析表如下(FOLLOW(A)={a,c})
可以看到在图中存在二义性的条目,故该文法不是SLR(1)文法
2、构造该文法的LALR(1)语法分析表
①构造该增广文法的LR(1)项集族如下
③GOTO函数
GOTO(I0,S)=I1 GOTO(I0,A)=I2 GOTO(I0,b)=I3 GOTO(I0,d)=I4 GOTO(I1,$)=acc GOTO(I2,a)=I5 GOTO(I3,A)=I6 GOTO(I3,d)=I7
GOTO(I4,c)=I8 GOTO(I6,c)=I9 GOTO(I7,a)=I10
可见该分析表中不存在二义性的条目,故该文法是LALR(1)文法
习题4.7.5说明下面的文法
S->Aa|bAc|Bc|bBa
A->d
B->d
是LR(1)的,但不是LALR(1)的
证明:
1、构造该文法的LR(1)语法分析表
①构造该文法的增广文法
S’->S
S->Aa
S->bAc
S->Bc
S->bBa
A->d
B->d
②构造该增广文法的LR(1)项集族如下
②项集合并:没有可以合并的项集
③GOTO 函数
GOTO(I0,S)=I1 GOTO(I0,A)=I2 GOTO(I0,b)=I3 GOTO(I0,B)=I4 GOTO(I0,d)=I5 GOTO(I1,$)=acc GOTO(I2,a)=I6 GOTO(I3,A)=I7 GOTO(I3,B)=I8 GOTO(I3,d)=I9 GOTO(I4,c)=I10 GOTO(I7,c)=I11 GOTO(I8,a)=I12
2、 构造该文法的LALR(1)语法分析表 ①合并LR(1)项集族 I5和I9可以合并为I59。