编译原理-第五章习题答案

合集下载

编译原理-第5章-习题与答案2上课讲义

编译原理-第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)所示。

编译原理_第1-5章习题课答案

编译原理_第1-5章习题课答案

(1)以01结尾的二进制数串。 (0 | 1)*01
(2)能被5整除的十进制数。
0|5
| (1|2|3|4|5|6|7|8|9)
(3)包含奇數個1或奇數個0的二進制串
0*1(0|10*1)*|1*0(0|10*1)*
(4)英文字母组成的所有符号串,要求符号串中的 字母按字典序排列。
(A | a)* (B | b)* (C | c)*… (Z | z)*
I00
0 ΦC
0
B {c,d} 1 0
E
1
{c,d} D
{c,d,f}
1
1
{c,d}
{c,d,f}
chapter1~5习题
I1 {b,c,d} 1 {c,dF,e}
{c,d,e} 0 {c,d,e} {c,d,e,g}
{c,d,e}
S
0
A(始态)
Φ
B
C
C
C
D
E
E
C
F(终态)
E
1 B D D D F(终态) D
1(0|1)*101 1(0|1)*101
chapter1~5习题
g
1
a
(0|1)* b
101
d
g
1 a
0
ε
ε
b
c
1
1
0
1
d
e
f
g
编译原理
②.状态转换矩阵
1 a
0
ε
ε
b
c
1
chapter1~5习题
1
0
1
d
e
f
g
I {a} {b,c,d} {c,d} {c,d,e} {c,d,f} {c,d,e,g}

《编译原理》课后习题答案

《编译原理》课后习题答案

第7 题证明下述文法G[〈表达式〉]是二义的。

〈表达式〉∷=a|(〈表达式〉)|〈表达式〉〈运算符〉〈表达式〉〈运算符〉∷=+|-|*|/答案:可为句子a+a*a 构造两个不同的最右推导:最右推导1 〈表达式〉=>〈表达式〉〈运算符〉〈表达式〉=>〈表达式〉〈运算符〉a=>〈表达式〉* a=>〈表达式〉〈运算符〉〈表达式〉* a=>〈表达式〉〈运算符〉a * a=>〈表达式〉+ a * a=>a + a * a最右推导2 〈表达式〉=>〈表达式〉〈运算符〉〈表达式〉=>〈表达式〉〈运算符〉〈表达式〉〈运算符〉〈表达式〉=>〈表达式〉〈运算符〉〈表达式〉〈运算符〉a=>〈表达式〉〈运算符〉〈表达式〉* a=>〈表达式〉〈运算符〉a * a=>〈表达式〉+ a * a=>a + a * a第8 题文法G[S]为:S→Ac|aB A→ab B→bc该文法是否为二义的?为什么?答案:对于串abc(1)S=>Ac=>abc (2)S=>aB=>abc即存在两不同的最右推导。

所以,该文法是二义的。

或者:对输入字符串abc,能构造两棵不同的语法树,所以它是二义的。

第9 题考虑下面上下文无关文法:S→SS*|SS+|a(1)表明通过此文法如何生成串aa+a*,并为该串构造语法树。

(2)G[S]的语言是什么?答案:(1)此文法生成串aa+a*的最右推导如下S=>SS*=>SS*=>Sa*=>SS+a*=>Sa+a*=>aa+a*(2)该文法生成的语言是:*和+的后缀表达式,即逆波兰式。

第10 题文法S→S(S)S|ε(1) 生成的语言是什么?(2) 该文法是二义的吗?说明理由。

答案:(1)嵌套的括号(2)是二义的,因为对于()()可以构造两棵不同的语法树。

第11 题令文法G[E]为:E→T|E+T|E-T T→F|T*F|T/F F→(E)|i证明E+T*F 是它的一个句型,指出这个句型的所有短语、直接短语和句柄。

编译原理第三版课后习题答案

编译原理第三版课后习题答案

编译原理第三版课后习题答案编译原理是计算机科学中的一门重要课程,它研究的是如何将高级程序语言转换为机器语言的过程。

而《编译原理》第三版是目前被广泛采用的教材之一。

在学习过程中,课后习题是巩固知识、提高能力的重要环节。

本文将为读者提供《编译原理》第三版课后习题的答案,希望能够帮助读者更好地理解和掌握这门课程。

第一章:引论习题1.1:编译器和解释器有什么区别?答案:编译器将整个源程序转换为目标代码,然后一次性执行目标代码;而解释器则逐行解释源程序,并即时执行。

习题1.2:编译器的主要任务是什么?答案:编译器的主要任务是将高级程序语言转换为目标代码,包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等过程。

第二章:词法分析习题2.1:什么是词法分析?答案:词法分析是将源程序中的字符序列划分为有意义的词素(token)序列的过程。

习题2.2:请给出识别下列词素的正则表达式:(1)整数:[0-9]+(2)浮点数:[0-9]+\.[0-9]+(3)标识符:[a-zA-Z_][a-zA-Z_0-9]*第三章:语法分析习题3.1:什么是语法分析?答案:语法分析是将词法分析得到的词素序列转换为语法树的过程。

习题3.2:请给出下列文法的FIRST集和FOLLOW集:S -> aAbA -> cA | ε答案:FIRST(S) = {a}FIRST(A) = {c, ε}FOLLOW(S) = {$}FOLLOW(A) = {b}第四章:语义分析习题4.1:什么是语义分析?答案:语义分析是对源程序进行静态和动态语义检查的过程。

习题4.2:请给出下列文法的语义动作:S -> if E then S1 else S2答案:1. 计算E的值2. 如果E的值为真,则执行S1;否则执行S2。

第五章:中间代码生成习题5.1:什么是中间代码?答案:中间代码是一种介于源代码和目标代码之间的表示形式,它将源代码转换为一种更容易进行优化和转换的形式。

5编译原理,陈意云 ,课后答案5

5编译原理,陈意云 ,课后答案5

10
7.5 (续) (续
• (a) *a-+bc • (c) 表达式翻成前缀形式的语法制导定义
E -> E+T | T T -> T*F | F F -> -F | (E) | id L -> En { printf(E.string); } E -> E1 + T { E.string = “+” + E1.string + T.string; } E -> T { E.string = T.string; } T -> T1*F { T.string = “*” + T1.string + F.string; } T -> F { T.string = F.string; } F -> -F1 { F.string = “-” + F1.string; } F -> (E) { F.string = E.string; } F -> id { F.string = id.value; }
2011-3-28
luanj@
8
7.4 (续) (续
• D -> ID_LIST:T ID_LIST -> ID_LIST,ID_LIST|id • D -> { Init(idtable) } ID_LIST:T { for each name in idtable do enter(name, T.type, offset); offset := offset + T.width; end; } ID_LIST -> { Init(idtable1); Init(idtable2) } ID_LIST1,ID_LIST2 { merge(idtable1, idtable2, idtable) } ID_LIST -> id { add(idtable, ); }

编译原理 第5章习题解答

编译原理 第5章习题解答

第五章习题解答5.1 设一NDPDA识别由下述CFG定义的语言,试给出这个NDPDA的完整形式描述。

S→SASCS→εA→AaA→bC→DcDD→d5.2 消除下列文法的左递归:① G[A]:A→BX∣CZ∣WB→Ab∣BcC→Ax∣By∣Cp② G[E]:E→ET+∣ET–∣TT→TF*∣TF/FF→(E)∣i③ G[X]:X→Ya∣Zb∣cY→ Zd∣Xe∣fZ→X e∣Yf∣a④ G[A]:A→Ba|Aa|cB→Bb|Ab|d5.3 设文法G[<语句>]:<语句>→<变量>: = <表达式>|if<表达式>then<语句>|if<表达式>then<语句>else<语句> <变量>→i<表达式>→<项>|<表达式>+<项><项>→<因子>|<项>*<因子><因子>→<变量>|′(′<表达式>′)′试构造该文法的递归下降子程序。

5.4 设文法G[E]:E→ TE'E'→ + E∣εT→ FT'T'→ T∣εF→ PF'F'→ *F∣εP→ (E)∣ a∣^①构造该文法的递归下降分析程序;②求该文法的每一个非终结符的FIRST集合和FOLLOW集合;③构造该文法的LL(1)分析表,并判断此文法是否为LL(1)文法。

5.5 设文法G[S]:S→ SbA∣aAB→ SbA→ Bc①将此文法改写为LL(1)文法;②求文法的每一个非终结符的FIRST集合和FOLLOW集合;③构造相应的LL(1)分析表。

5.6 设文法G[S]:S→ aABbcd∣εA→ ASd∣εB→ SAh∣eC∣εC→ Sf∣Cg∣εD→ aBD∣ε①求每一个非终结符的FOLLOW集合;②对每一个非终结符的产生式选择,构造FIRST集合;③该文法是LL(1)文法。

【编译原理】1-5章课后习题答案精心整理版,可直接缩印

【编译原理】1-5章课后习题答案精心整理版,可直接缩印

第一章1.2 计算机执行用高级语言编写的程序有哪些途径?它们之间的主要区别是什么? 【解答】计算机执行用高级语言编写的程序主要有两种途径:解释和编译。

这两种途径的主要区别在于:解释方式下不生成目标代码程序,而编译方式下生成目标代码程序。

从执行速度上看,编译型的高级语言比解释型的高级语言要快,但解释方式下的人机界面比编译型好,便于程序调试。

(在解释方式下,翻译程序事先并不采用将高级语言程序全部翻译成机器代码程序,然后执行这个机器代码程序的方法,而是每读入一条源程序的语句,就将其解释(翻译)成对应其功能的机器代码语句串并执行,而所翻译的机器代码语句串在该语句执行后并不保留,最后再读入下一条源程序语句,并解释执行。

这种方法是按源程序中语句的动态执行顺序逐句解释(翻译)执行的,如果一语句处于一循环体中,则每次循环执行到该语句时,都要将其翻译成机器代码后再执行。

在编译方式下,高级语言程序的执行是分两步进行的:第一步首先将高级语言程序全部翻译成机器代码程序,第二步才是执行这个机器代码程序。

因此,编译对源程序的处理是先翻译,后执行。

)1.3 请画出编译程序的总框图。

如果你是一个编译程序的总设计师,设计编译程序时应当考虑哪些问题? 【解答】编译程序总框图如图1-1所示。

作为一个编译程序的总设计师,首先要深刻理解被编译的源语言其语法及语义;其次,要充分掌握目标指令的功能及特点,如果目标语言是机器指令,还要搞清楚机器的硬件结构以及操作系统的功能;第三,对编译的方法及使用的软件工具也必须准确化。

总之,总设计师在设计编译程序时必须估量系统功能要求、硬件设备及软件工具等诸因素对编译程序构造的影响等。

第二章2.1 正规式M1和M2等价是指:M1和M2所识别的语言集相等。

2.2 什么是扫描器?扫描器的功能是什么?【解答】扫描器就是词法分析器,它接受输入的源程序,对源程序进行词法分析并识别出一个个单词符号,其输出结果是单词符号,供语法分析器使用。

5编译原理,陈意云 ,课后答案5

5编译原理,陈意云 ,课后答案5

2019/2/12
luanj@
8
7.4 (续)
• D -> ID_LIST:T ID_LIST -> ID_LIST,ID_LIST|id • D -> { Init(idtable) } ID_LIST:T { for each name in idtable do enter(name, T.type, offset); offset := offset + T.width; end; } ID_LIST -> { Init(idtable1); Init(idtable2) } ID_LIST1,ID_LIST2 { merge(idtable1, idtable2, idtable) } ID_LIST -> id { add(idtable, ); }
编译原理习题课(5)
栾 俊 luanj@ 2019/2/12
7.1
• 把算术表达式 –(a+b)*(c+d)+(a+b-c) 翻译成: (a) 语法树 (b) 有向无环图 (c) 后缀表示 (d) 三地址代码
2019/2/12
luanj@
{ enter(, T.type, offset); offset += T.width; } { T.type = integer; T.width = 4; } { T.type = real; T.width = 8; } { T.type = array(num.val, T1.type); T.width = num.val * T1.width; } { T.type = pointer(T1.type); T.width = 4; }
2019/2/12 luanj@ 11

程序设计语言_编译原理(第三版-习题库-答案)第五章 语法制导翻译及中间代码生成

程序设计语言_编译原理(第三版-习题库-答案)第五章 语法制导翻译及中间代码生成

第五章语法制导翻译及中间代码生成5.1说明属性文法与属性翻译文法有何异同?5.2考虑下面的属性文法:Z →sXattribution:Z.a=X.c;X.b=X.a;Z.p=X.b;Z →t Xattribution:X.b=X.d;Z.a=X.b;X →uattribution:X.d=1;X.c=X.d;X →Vattribuion:X.c=2;X.d=X.c;(1) 上述文法中的属性哪些是继承的?哪些是综合的?(2) 上述文法中的属性依赖是否出现了循环?5.3为什么说S属性文法一定是L属性文法?反之结论亦正确吗?5.4将下列中缀式改写为逆波兰式。

(1) -A*(B+C)↑(D-E)(2) ((a*d+c)/d+e)*f+g(3) a+x≤4∨(C∧d*3)(4) a∨b∧c+d*e↑f(5) s=0; i=1;while (i<=100) {s+=i*i; i++;}5.5将下列后缀式改写为中缀式。

(1) abc*+(2) abc-*cd+e/-(3) abc+≤a0>∧ab+0≠a0∧∨(4) ab<p1 BZ xab-c↑= p2 BR gh=↑↑p1p25.6设已给文法G[E]:E →E+T | -T | TT →T*F | FF →P ↑F | PP →(E) | i试设计一个递归下降分析器,要求此分析器在语法分析过程中,将所分析的符号串翻译成后缀式。

5.7设已给布尔表达式文法G[Z]:Z →EE →T{∨T}T →F{∧F}F → F | (E) | b试设计一个递归下降分析器,它把由G[Z]所描述的布尔表达式翻译为四元式序列。

5.8(1) 利用54节所给的属性翻译文法将赋值语句:X=A*(B+C)+D翻译成四元式序列,给出语法制导的翻译过程。

(2) 利用55节所给的属性翻译文法将布尔表达式:A∧(B∨(C∨D F))翻译成四元式序列,给出语法制导的翻译过程。

(3) 利用56节所给的属性翻译文法将语句:while A<C∧B>0 doif A=1 then C∶=C+1else while A<=D do A∶=A+2翻译成四元式序列,给出语法制导的翻译过程。

编译原理-第五章习题答案

编译原理-第五章习题答案

上一页
下一页
11
例:5.3 文法:SaAcBe A bAb B d 句子:abbcde
步骤 (1) (2) (3) (4) (5) (6)

# #a #ab #aA #aAb #aA #aAc #aAcd #aAcB #aAcBe #S
输入 abbcde# bbcde# bcde# bcde# cde# cde#
上一页
下一页
20
5)构造算符优先文法G的优先表的算法
思路:对文法中的每一个产生式的候选式检查,判断句型中相邻符号之间 的关系 来构造优先表; 具体算法: FOR 每条产生式P→X1X2…Xn FOR i=1 TO n-1 IF Xi,Xi+1∈VT,THEN Xi=Xi+1; IF i ≤n-2且Xi,Xi+2∈VT,Xi+1∈VN THEN Xi=Xi+2; IF Xi∈VT,Xi+1∈VN THEN FOR FIRSTVT(Xi+1)中的每个a Xi <. a; NEXT IF Xi∈VN,Xi+1∈VT THEN FOR LASTVT(Xi)中的每个a DO a .> Xi+1; NEXT NEXT NEXT

上一页
下一页
8
例:5.1 P85 文法: E→T|E+T T→F|T*F F→i|(E) 句型:i1*i2+i3其中:短语有i1、i2、i3、i1*i2、 i1*i2+i3 直接短语:i1、i2、i3;句柄:i1 例:5.2 P85 文法如上 E 句型:E+T*F+i 短语:E+T*F+i,E+T*F,T*F,i 直接短语:T*F和i E + 句柄:T*F

《编译原理》习题参考答案(六)

《编译原理》习题参考答案(六)

《编译原理》习题参考答案(六)第五章5.4 为下列类型写类型表达式:(a) 指向实数的指针数组,数组的下标从1到100。

(b) 两位数组(即数组的数组),他的行下标从1到10,列下标从1到20。

(c) 函数,他的定义域是从整数到整数的指针的函数,它的值域是从一个整数和一个字符组成的纪录。

Solution:(a) array ( 1 . . 100 , pointer ( real ) )(b) array ( 1 . . 10 , array ( 1 . . 20 , type ) )(c) ( integer →pointer(integer) )→record((i : integer) * ( c : char )) 假定作为值域的记录类型的两个域分别叫i和c。

5.6 下列文法定以字面常量表的表。

符号的解释和图5.2文法的那些相同,增加了类型list,它表示类型T的元素表。

→ D ; EP→ D ; D | id : TD→ list of T | char | integerTE→ ( L ) | literal | num | id→ E , L | EL写一个类似5.3节中的翻译方案,以确定表达式( E )和表( L )的类型。

P→ D ; ED→ D ; DD→ id : T { addtype ( id.entry , T.type ) }T→ char { T.type := char }T→ integer { T.type := integer }T→ list of T1 { T.type := list ( T1.type ) }E→ literal { E.type := char }E→ num { E.type := integer }E→ id { E.type := lookup ( id.entry ) }E→ ( L ) { E.type := list ( L.type ) }L→E{L.type:=E.type}L→ E , L1 { L.type := if L1.type = E.type then E.typeelse type_error }5.16 对下面的每对表达式,找出最一般的合一代换:(a) α1 → ( α2 →α1 )(b) array ( β1 ) → ( pointer( β1 ) →β2 )(c) γ1 →γ2(d) δ1 →(δ1 →δ2 )Solution:S(α1) = array ( β1 ) S(α2) = pointer ( β1 ) S(β2) = array ( β1 ) (a)(c):S(γ1) = α1 S(γ2) = α2 → α1 (a)(d):S(α1) = S(α2) = S(δ1) = S(δ2) = α (b)(c):S(γ1) = array ( β1 ) S(γ2) = pointer ( β1 ) → β2 (b)(d): 无 (c)(d):S(γ1) = δ1 S(γ2) = δ1 → δ25.17 仿效例5.5,推到下面map 的多态类型: map: ∀ α . ∀ β . ( ( α → β ) * list ( α ) ) → list ( β ) map 的ML 定义是 fun map ( f , l ) = if null ( l ) then nilelse cons ( f ( hd ( l ) ) , map ( f , tl ( l ) ) );在这个函数体中,内部定义的标识符的类型是: null : ∀α . list (α ) → boolean ; nil : ∀α . list (α ) ;cons : ∀α . ( α * list (α ) ) → list (α ) ;hd:∀α . list (α ) →α;∀α . list (α ) → list (α ) ;tl:Solution:行定型断言代换规则(1) f : α( Exp Id )(2) l : β( Exp Id )(3) map : γ( Exp Id )(4) map ( f , l ) : δγ = ( α * β ) →δ(Exp Funcall)(5) null : list (α0) → boolean ( Exp Id ) 和( Type Fresh )(6) null ( l ) : boolean β = list (α0) (Exp Funcall)(7) nil : list (α1) ( Exp Id ) 和( Type Fresh )(8) l : list (α0) 由(2)可得(9) hd : list (α2) →α2( Exp Id ) 和( Type Fresh )(10) hd ( l ) : α0α2 = α0(Exp Funcall)(11) f ( hd ( l ) ) : α3α = α0→α3( Exp Id )(12) f : α0→α3由(1)可得(13) tl : list (α4)→ list (α4) ( Exp Id ) 和( Type Fresh )(14) tl ( l ) : list (α0) α4 = α0(Exp Funcall)(15) map : ((α0→α3)*list(α0))→δ由(3)可得(16) map ( f , tl ( l ) ) : δ(Exp Funcall)(17) cons : α5 * list(α5) → list(α5) ( Exp Id ) 和( Type Fresh ) (18) cons (…) : list (α3) α5 = α3 , δ=list(α3) (Exp Funcall)(19) if : boolean *α6 * α6→α6( Exp Id ) 和( Type Fresh )(20) if (…) : list (α1) α6 = α1 , α3 = α1(Exp Funcall)(21) match : α7 *α7 →α7( Exp Id ) 和( Type Fresh ) (22) match (…) : list (α1) α7 = list (α1) (Exp Funcall)至此有map : ( (α0→α1)*list(α0) )→list(α1)所以map : ∀α . ∀β . ( ( α→β ) * list ( α ) ) → list ( β )5.18 假定类型名link和cell如5.5节那样定义,下面的表达式中,那些结构等价?那些名字等价?(a) link(b) pointer ( cell )(c) pointer ( link )(d) pointer ( record ( ( info : integer ) * ( next : pointer ( cell ) ) ) ) Solution:(a)、(b)、(d)结构等价,无名字等价。

编译原理答案第五章

编译原理答案第五章

练习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的因子。

编译原理-第1~5章习题课答案

编译原理-第1~5章习题课答案

选择题2答案
编译原理的主要目的是将高级语言编写的 程序转换成低级语言编写的程序,以提高 程序的运行效率和可移植性。
编译过程主要包括词法分析、语法分析、 语义分析、中间代码生成、代码优化和目 标代码生成等阶段。
选择题3答案
选择题4答案
词法分析是将源程序分解成一个个的单词 或符号,供语法分析器识别和匹配。
编译原理-第1~5章习题课答案
目录
CONTENTS
• 第一章习题答案 • 第二章习题答案 • 第三章习题答案 • 第四章习题答案 • 第五章习题答案
01 第一章习题答案
CHAPTER
填空题答案
填空题1答案
编译原理是将高级语言编写的程 序转换成低级语言编写的程序的
过程。
填空题2答案
编译过程主要包括词法分析、语法 分析、语义分析、中间代码生成、 代码优化和目标代码生成等阶段。
• 简答题3答案:编译器的输入是源程序,输出是目标程序。源程序是用高级语言编写的程序,目标程序是用低级语言编 写的程序。
02 第二章习题答案
CHAPTER
填空题答案
填空题1答案
编译原理是将高级语言编写的程序转 换成低级语言编写的程序的过程。
02
填空题2答案
编译过程主要包括词法分析、语法分 析、语义分析、中间代码生成、代码 优化和目标代码生成等阶段。
是编译过程的基础。
简答题3答案
编译原理中的语义分析阶段主要 包括类型检查、语义检查和符号 表管理等任务,以确保源程序的
语义正确性。
04 第四章习题答案
CHAPTER
填空题答案
填空题1答案
01
编译原理是将高级语言编写的程序转换成低级语言编写的程序

(完整版)编译原理第五章作业参考答案

(完整版)编译原理第五章作业参考答案

SELECT(F PF/ )=FIRST(P)={(,a,b,^};
SELECT(F/ *F /)={*}; SELECT(F/ ε )=FOLLOW(F/)={(,a,b,^,+,),#};
SELECT(P (E))={(}
SELECT(P a)={a}
SELECT(P b)={b}
SELECT(P ^)={^} 可见,相同左部产生式的
if(CH== ’ aR’E)AD(CH);// 产生式 S a else if(CH== ’ ^ ’ ) READ(C产H)生;//式 S ^ else if(CH== ’产( ’生)式// S (T) {
READ(CH); P_T(); IF (CH= =’ ) ’TH)EN READ(CH) else ERROR } else ERR; } void P_T()// 非终结符 S 的子程序 { if(IsIn(CH,FIRST_SU)) //FIRST_SU 为 T SU 的右部的 FIRST 集合 { P_S(); P_U(); } } void P_U()// 非终结符 U 的子程序 { if(CH== ’ , ’产生)//式 U , SU
3.已知文法 G[S] :
S MH|a
H LSo| ε K dML|ε
L eHf
M K|bLM 判断 G是否是 LL( 1)文法,如果是,构造 LL( 1)分析表。 解: 首先求各非终结符的 FIRST 集合:
FIRST 集合有:
FIRST(E)=FIRST(T)=FIRST(F)=FIRST(P)={(,a,b,^}; FIRST(E / )={+, ε }
FIRST(T)=FIRST(F)=FIRST(P)={(,a,b,^}; FIRST(T / )=FIRST(T) ∪ { ε }={(,a,b,^, ε };

编译原理567

编译原理567

第五章P138.1.解:由中缀表达式翻译成波兰前缀表达式的符号串翻译文法如下:①E→@+E+T ②E→T ③T→@*T*F④T→F ⑤F→(E) ⑥F→a@a⑦F→b@b ⑧F→c@c2.解:a)输入符号串的倒置:①S→@0S0 ②S→@1S1 ③S→1@1④S→0@0c)输入符号串本身:①S→S0@0 ②S→S1@1 ③S→1@1④S→0@03.解:该符号串翻译文法能将输入的符号序列“ENGLISH”翻译成动作序列“@C@HI@N@E@SE”,并执行该动作序列得到输出序列“CHINESE”。

4.解:根据活动序列将动作符号放到文法中适当位置得到该翻译文法为:①<s>→@q a<s>@x <s>@y ②<s>→@x @y b@z5.解:由该符号串翻译文法得到其输入文法为:①<s>→<A>c<B> ②<s>→dcb③<A>→<B>a ④<A>→d ⑤<B>→b由推导:s=><A>c<B>=><A>cb=>dcb 可得到对偶<dcb,xxy>由推导:s=>dcb 可得到对偶<dcb,yxz>由推导:s=><A>c<B>=><A>cb=><B>acb=>bacb可得到对偶<dcb,xyxxy>第六章符号表管理技术P185.4、下面是一个非分程序结构语言的程序段。

画出编译该程序段时将生成的有序符号表。

BLOCKREAL X,Y,Z1,Z2,Z3;INTEGER I,J,K,LASTI;STRING LIST-OF-NAMES;LOGICAL ENTRY-ON,EXIT-OFF;ARRAY REAL VAL(20);ARRAY INTEGER MIN-VAL-IND(20);...END OF BLOCK解:变量名类型维数ENTRY-ON LOGICAL 0EXIT-OFF LOGICAL 0I INTEGER 0J INTEGER 0K INTEGER 0LASTI INTEGER 0LIST-OF-NAMES STRING 0MIN-VAL-IND INTEGER 1VAL REAL 1X REAL 0Y REAL 0Z1 REAL 0Z2 REAL 0Z3 REAL 06、下面是一分程序结构的程序段。

(完整版)编译原理第五章作业参考答案

(完整版)编译原理第五章作业参考答案

第五章自顶向下语法分析方法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中,否则表明出错。

编译原理课后习题答案-清华大学-第二版

编译原理课后习题答案-清华大学-第二版

《编译原理》课后习题答案第二章
第 2 章 PL/0 编译程序的实现
第1题
PL/0 语言允许过程嵌套定义和递归调用,试问它的编译程序如何解决运行时的存储管 理。
答案: PL/0 语言允许过程嵌套定义和递归调用,它的编译程序在运行时采用了栈式动态存储
管理。(数组 CODE 存放的只读目标程序,它在运行时不改变。)运行时的数据区 S 是由 解释程序定义的一维整型数组,解释执行时对数据空间 S 的管理遵循后进先出规则,当每 个过程(包括主程序)被调用时,才分配数据空间,退出过程时,则所分配的数据空间被释放。 应用动态链和静态链的方式分别解决递归调用和非局部变量的引用问题。
(2) 扩充 repeat 语句的语法图为:
EBNF 的语法描述为: 〈 重复语句〉::= repeat〈语句〉{;〈语句〉}until〈条件〉
《编译原理》课后习题答案第三章
第 3 章 文法和语言
第1题
文法 G=({A,B,S},{a,b,c},P,S)其中 P 为: S→Ac|aB A→ab B→bc 写出 L(G[S])的全部元素。
注意:如果问编译程序有哪些主要构成成分,只要回答六部分就可以。如果搞不清楚, 就回答八部分。 第3题
何谓翻译程序、编译程序和解释程序?它们三者之间有何种关系? 答案:
翻译程序是指将用某种语言编写的程序转换成另一种语言形式的程序的程序,如编译程 序和汇编程序等。
编译程序是把用高级语言编写的源程序转换(加工)成与之等价的另一种用低级语言编 写的目标程序的翻译程序。
地址,用以过程执行结束后返回调用过程时的下一条指令继续执行。 在每个过程被调用时在栈顶分配 3 个联系单元,用以存放 SL,DL, RA。
第5题
PL/0 编译程序所产生的目标代码是一种假想栈式计算机的汇编语言,请说明该汇编语 言中下列指令各自的功能和所完成的操作。 (1) INT 0 A (2) OPR 0 0 (3) CAL L A

编译原理第五章答案.

编译原理第五章答案.

第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的句子。

答案:也可由预测分析表中无多重入口判定文法是LL(1)的。

的。

是文法的句子。

可见输入串(a,a)#是文法的句子。

第3题已知文法G[S]:S→MH|aH→LSo|εK→dML|εL→eHfM→K|bLM分析表。

判断G是否是LL(1)文法,如果是,构造LL(1)分析表。

第7题对于一个文法若消除了左递归,提取了左公共因子后是否一定为LL(1)文法?试对下面文法进行改写,并对改写后的文法进行判断。

法进行改写,并对改写后的文法进行判断。

(1)A→baB|εB→Abb|a(2) A→aABe|aB→Bb|d(3) S→Aa|bA→SBB→ab答案:答案:(1)先改写文法为:先改写文法为:0) A→baB1) A→ε→ε2) B→baBbb3) B→bb4) B→a再改写文法为:再改写文法为:0) A→baB1) A→ε→ε2) B→bN3) B→a4) N→aBbb5) N→b文法: A→aABe|a B→Bb|d(2)文法:提取左公共因子和消除左递归后文法变为: 提取左公共因子和消除左递归后文法变为:0) A→a N1) N→A B e2) N→ε3) B→d N14) N1→b N15) N1→ε(3)文法:)文法: S→Aa|b A→SB B→ab种改写:第1种改写:得: 用A的产生式右部代替S的产生式右部的A得:S→SBa|b B→ab消除左递归后文法变为:消除左递归后文法变为:0) S→b N1) N→B a N2) N→ε3) B→a b的。

编译原理课后答案第五章代码优化

编译原理课后答案第五章代码优化
进行代码外提就是将循环中的不变运算外提到循 环入口结点前新设置的循环前置结点中。经检查,找 出的不变运算为B2中的B=J+1。因此,代码外提后的程 序流图如图5-6所示。
第五章 代码优化
A= 0 I= 1
B1
B= J+ 1 B′2
L1: C= B+ I
B2
A= C+ A
if I= 100 g2oto L
第五章 代码优化
所以d必有通路到达M中任一结点ni,而M中任一结 点又可以通过n到达d(n→d为回边),从而M中任意两个 结点之间必有一通路,L中任意两个结点之间亦必有一 通路。此外,由M中结点性质可知:d到M中任一结点ni 的通路上所有结点都应属于M,ni到n的通路上所有结 点也都属于M。因此,L中任意两结点间通路上所有结 点都属于L,也即,L是强连通的。
L1: E= B*B
B3
F= F+ 2
E= E+ F
write(E)
if E> 100 g2oto L
halt B4 L2: F= F- B15 goto1 L
图5-1 程序流图
第五章 代码优化
5.4 基本块的DAG如图5-2所示。若: (1) b在该基本块出口处不活跃; (2) b在该基本块出口处活跃; 请分别给出下列代码经过优化之后的代码: (1) a=b+c (2) b=a-d (3) c=b+c (4) d=a-d
if I= 100 g2oto L
F
T
I= I+ 1 B3 goto 1L
L2: write AB4 halt
图5-5 习题5.8的程序流图
第五章 代码优化
(2) 很容易看出,B3→B2是流图中的一条有向边, 并且有B2 DOM B3,故B3→B2为流图中的一条回边。循 环可通过回边求得,即找出由结点B2、结点B3以及有通 路到达B3但不经过B2的所有结点。所以,由回边组成的 B3→B2循环是{ B2,B3}。

编译原理习题及答案(整理后)

编译原理习题及答案(整理后)

编译原理习题及答案(整理后)第⼀章1、将编译程序分成若⼲个“遍”是为了。

b.使程序的结构更加清晰2、构造编译程序应掌握。

a.源程序b.⽬标语⾔c.编译⽅法3、变量应当。

c.既持有左值⼜持有右值4、编译程序绝⼤多数时间花在上。

d.管理表格5、不可能是⽬标代码。

d.中间代码6、使⽤可以定义⼀个程序的意义。

a.语义规则7、词法分析器的输⼊是。

b.源程序8、中间代码⽣成时所遵循的是- 。

c.语义规则9、编译程序是对。

d.⾼级语⾔的翻译10、语法分析应遵循。

c.构词规则⼆、多项选择题1、编译程序各阶段的⼯作都涉及到。

b.表格管理c.出错处理2、编译程序⼯作时,通常有阶段。

a.词法分析b.语法分析c.中间代码⽣成e.⽬标代码⽣成三、填空题1、解释程序和编译程序的区别在于是否⽣成⽬标程序。

2、编译过程通常可分为5个阶段,分别是词法分析、语法分析中间代码⽣成、代码优化和⽬标代码⽣成。

3、编译程序⼯作过程中,第⼀段输⼊是源程序,最后阶段的输出为标代码⽣成程序。

4、编译程序是指将源程序程序翻译成⽬标语⾔程序的程序。

⼀、单项选择题1、⽂法G:S→xSx|y所识别的语⾔是。

a. xyxb. (xyx)*c. x n yx n(n≥0)d. x*yx*2、⽂法G描述的语⾔L(G)是指。

a. L(G)={α|S+?α , α∈V T*}b. L(G)={α|S*?α, α∈V T*}c. L(G)={α|S*?α,α∈(V T∪V N*)}d. L(G)={α|S+?α, α∈(V T∪V N*)}3、有限状态⾃动机能识别。

a. 上下⽂⽆关⽂法b. 上下⽂有关⽂法c.正规⽂法d. 短语⽂法4、设G为算符优先⽂法,G的任意终结符对a、b有以下关系成⽴。

a. 若f(a)>g(b),则a>bb.若f(a)c. a~b都不⼀定成⽴d. a~b⼀定成⽴5、如果⽂法G是⽆⼆义的,则它的任何句⼦α。

a. 最左推导和最右推导对应的语法树必定相同b. 最左推导和最右推导对应的语法树可能不同c. 最左推导和最右推导必定相同d. 可能存在两个不同的最左推导,但它们对应的语法树相同6、由⽂法的开始符经0步或多步推导产⽣的⽂法符号序列是。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

下一页
7
利用语法分析树找短语、直接短语和句柄
▪ 对于短语、直接短语、句柄的寻找,可以检查语 法树中从根结点开始出发向下,找每一非终结符 的所有叶子结点,将这些结点从左到右组成串, 这些串就是该句型的所有短语,其中相对于叶子 结点的直接父结点的短语为直接短语,在树中最 左的直接短语为该句型的句柄。
▪ 直接短语肯定是某个产生式的右部候选式之一。 ▪ 句柄的“最左”特征使得在移进-归约方法中,它
(3)利用项目集闭包和转移函数构造项目集规范族, 以及根据项目集规范族和转移函数构造LR(0)分析表;
(4)根据项目集规范族、转移函数以及非终结符的 FOLLOW集构造SLR(1)分析表。
上一页
下一页
3
本章教学线索
• 1 自下而上分析基本问题
• 1.1 归约的概念 • 1.2 规范归约 • 1.3“移进—归约”分析法的栈实现
▪ 知识点:算符优先分析、LR(0)和SLR(1)分析表 的构造
▪ 深刻理解:规范归约与最右推导、短语、直接短语、 句柄、素短语
▪ 熟练掌握: (1)给出一句型求短语、直接短语、句柄和素短语; (2)FIRSTVT和LASTVT的计算、算符优先分析表
的 构造及根据算符优先分析表进行句子分析的方法;
上一页
下一页
6
1.2 规范归约
短语、直接短语、句柄
令G是一个文法,S是文法的开始符号,假定αβδ是
文法G的一个句型,如果有:
S
αAδ且A
+
β
则称β是句型αβδ相对于非终结符A的短语。
特别是,如果有:
Aβ,则称β是句型αβδ相对于规则
A→β的直接短语,一个句型的最左直接短语称为该 句型的句柄。
上一页
bbcde#
移进
(3) #ab
bcde# 归约,A→b
(4) #aA
bcde#
移进
(5) #aAb
cde# 归约,A→Ab
(6) #aA
cde#
移进
(7) #aAc
de#
移进
(8) #aAcd
e# 归约,B→d
(9) #aAcB
e#
移进
(10) #aAcBe
# 归约, SaAcBe
(11) #S

接受
旦栈顶形成句柄时,就进行归约。这种归约可能持续多 次,直至栈顶不再呈现句柄为止。然后,继续向栈里移 进符号,重复这个过程,直至最终形成如下格局:
栈 输入 #S #
上一页
下一页
11
例:5.3 文法:SaAcBe A bAb B d 句子:abbcde
步骤

输入
动作
(1) #
abbcde#
移进
(2) #a
2 算符优先分析 • 3 LR分析法 • 4 语法分析器的自动产生工具YACC
上一页
下一页
4
Байду номын сангаас
1.1 归约的概念
G =(VT,VN,S,P),α,β ∈(VT∪VN)*, A→β∈P,αAw αβw。
归约的过程是,已知αβw和产生式A→β,用产生式 A→β左部A替换αβw中的β,得到符号串αAw。
2)i(0≤i < n), i rm i+1(i是i+1经过把句柄替换成相应
产生式左部符号而得到的。)
规范归约是关于的一个最右推导的逆过程。(注意:并不是 所有的归约都是规范,比如算符优先分析就不是规范归约,当然 就不是一个最右推导的逆过程)
如果文法G是无二义的,那么,规范推导(最右推导)的逆过 程必是规范归约(最左归约)。
直接短语:T*F和i 句柄:T*F
E
+
T
F
E+T i
T* F
5.2
上一页
E
E +T
T
F
i3 T*F
F
i2
i1
5.1
下一页
9
•规范归约
最右推导过程 中得到的句型
0是假定的一是个文规法范G的归一约个,句如子果。序称列右满句足型:序列n,n-1,…, 1, 1) n= ,0=S ;(从句子规约到文法的开始符号)
从输入符号串出发,每次从被归约的句型中找到一 个产生式的右部,用其左部替换之,得到新的句型,直 至归约到文法的开始符号。
上一页
下一页
5
例子:文法G的产生式定义为:S→aAcBe A→b A→Ab B→d 输入句子为:abbcde 首先看看最右推导:SaAcBeaAcdeaAbcdeabbcde(使用产生式的顺 序为:S→aAcBe B→d A→Ab A→b)
上一页
下一页
12
本章教学线索
• 1 自下而上分析基本问题 2 算符优先分析
2.1算符优先文法及优先表的构造 2.2 算符优先分析算法 2.3 优先函数 2.4 算符优先分析中的出错处理(自学)
• 3 LR分析法 • 4 语法分析器的自动产生工具YACC
上一页
下一页
13
2.1 算符优先文法及优先表的构造
2.1.1 算符文法的定义 设G是一个文法,如果G中不存在形如A及AαBCβ
的中产不生含式有相(其邻中非A终,结B,符C号∈)V,N,即αG,中 右 部(V不N∪含V具T)有*,相且邻其非 终结符号的产生式,则称G为算符文法。
编译原理电子教案 第五章 语法分析—自下而上的分析
本章的主要内容
▪规范归约与最右推导、短语、直接短语、句柄、素短语 ▪算符优先分析 ▪ LR(0)和SLR(1)分析表的构造
与前面章节的主要联系: •最右推导 •NFA通过子集构造法,构造DFA •文法非终结符的Follow集
上一页
下一页
2
本章要求
始终处于符号栈的栈顶。
上一页
下一页
8
例:5.1 P85 文法:
E→T|E+T T→F|T*F
F→i|(E)
句型:i1*i2+i3其中:短语有i1、i2、i3、i1*i2、 i1*i2+i3 直接短语:i1、i2、i3;句柄:i1 例:5.2 P85 文法如上
句型:E+T*F+i
E
短语:E+T*F+i,E+T*F,T*F,i
βw表示一个规范句型,必定是在β归约之前进行的规范归约 得到的结果, (VT∪VN)*,w VT*。
上一页
下一页
10
1.3 “移进—归约”分析法的栈实现
“移进一归约”分析器使用一个栈和一个存放输入符号串 w的缓冲器。分析器的初始状态为: 栈 输入 # w# 工作过程:自左至右把串w 的符号一一移进栈里,一
步骤:1 2 3 4 5 6 7 8 9 10 动作:进 进 规 进 规 进 进 规 进 规
a b A→b b A→Ab c d B→d e S→aAcBe
e
dB B
b
cc c
c
b A A A AA A A
aaaaa
aa a
aS
自底向上分析面临的基本问题: • 如何在句型中找出可规约串? • 找到的可规约串应该规约到哪一个非终结符?
相关文档
最新文档