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

合集下载

编译原理陈意云课后答案.ppt

编译原理陈意云课后答案.ppt

5
3.2
• 考虑文法 S -> aSbS|bSaS|ε (a) 为句子abab构造两个不同的最左推导, 以说明此文法二义 (b) 为abab构造对应的最右推导 (c) 为abab构造对应的分析树 (d) 这个文法产生的语言是什么
2019/3/22
luanj@
6
3.2 (续)
luanj@ 9
2019/3/22
3.4 (续)
• 该文法没有体现运算符 |、*、() 、并置的优 先级,因而是二义的。
R=>R|R=> a|R =>a|R*=>a|b* R=>R*=>R|R*=>a|R*=>a|b*
• E -> E’|’T | T T -> TF | F F -> F* | (E) | a | b
• (1) S=>aSbS=>abS=>abaSbS=>ababS=>abab (2) S=>aSbS=>abSaSbS=>abaSbS=>ababS=>abab • S=>aSbS=>aSb=>abSaSb=> abSab =>abab (2)
S a S ε b a S ε (1) 描述的语言是a,b数目相等的串 S b S ε S
S
( L S a L , ( L S a
2019/3/22 luanj@ 3
) S L , ) S a
3.1 (续) - (a,((a,a),(a,a)))
S =>(L) =>(L,S) =>(S,S) =>(a,S) =>(a,(L)) =>(a,(L,S)) =>(a,(S,S)) =>(a,((L),S)) =>(a,((L,S),S)) =>(a,((S,S),S)) =>(a,((a,S),S)) =>(a,((a,a),S)) =>(a,((a,a),(L))) =>(a,((a,a),(L,S))) =>(a,((a,a),(S,S))) =>(a,((a,a),(a,S))) =>(a,((a,a),(a,a))) S =>(L) =>(L,S) =>(L,(L)) =>(L,(L,S)) =>(L,(L,(L))) =>(L,(L,(L,S))) =>(L,(L,(L,a))) =>(L,(L,(S,a))) =>(L,(L,(a,a))) =>(L,(S,(a,a))) =>(L,((L),(a,a))) =>(L,((L,S),(a,a))) =>(L,((L,a),(a,a))) =>(L,((S,a),(a,a))) =>(L,((a,a),(a,a))) =>(S,((a,a),(a,a))) =>(a,((a,a),(a,a)))

编译原理课后答案-第二版

编译原理课后答案-第二版

第三章1、L(G[S])={ abc }2、L(G[N])={ n位整数或空字符串| n>0 }3、G[E]:E—>E+D | E-D | DD—>0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 94、L(G[Z])={ a n b n | n>0 }5、(1) 考虑不包括“0”的情况G[S]:S—>0S | ABC | 2 | 4| 6 | 8A—>1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9B—>AB | 0B | εC—>0 | 2 | 4 | 6 | 8考虑包括“0”的情况:G[S]:S—>AB | CB—>AB | CA—>0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9C—>0 | 2 | 4 | 6 | 8(2)方法1:G[S]:S—> ABC | 2 | 4 | 6 | 8A—>1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9B—>AB | 0B | εC—>0 | 2 | 4 | 6 | 8方法2:G[S]:S—>AB | CB—> AB | 0B | C | 0A—> 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9C—>2 | 4 | 6 | 86、设<表达式>为E,<项>为T,<因子>为F,注:推导过程不能省略,以下均为最左推导(1) E => T => F => i(4) E => E+T => T+T => T*F+T => F*F+T => i*F+T => i*i+T => i*i+F => i*i+i(6) E => E+T => T+T => F+T => i+T => i+T*F => i+F*F => i+i*F => i+i*I7、<表达式><表达式>*<表达式><表达式>+<表达式>i i i<表达式><表达式>+<表达式>i <表达式>*<表达式>i i8、是有二义性的,因为句子abc 有两棵语法树(或称有两个最左推导或有两个最右推导)最左推导1:S => Ac => abc 最左推导2:S => aB => abc 9、(1)(2) 该文法描述了变量a 和运算符+、*组成的逆波兰表达式10、(1) 该文法描述了各种成对圆括号的语法结构(2) 是有二义性的,因为该文法的句子()()存在两种不同的最左推导: 最左推导1:S => S(S)S => (S)S => ()S => ()S(S)S => ()(S)S => ()()S => ()()最左推导2:S => S(S)S => S(S)S(S)S => (S)S(S)S=> ()S(S)S => ()(S)S => ()()S => ()()11、(1) 因为从文法的开始符E 出发可推导出E+T*F ,推导过程如下:E => E+T =>E+T*F ,所以E+T*F 是句型。

编译原理陈意云版答案

编译原理陈意云版答案

编译原理陈意云版答案一. 引言编译原理是计算机科学中的一门重要课程,它研究的是将高级语言源代码转换为机器能够理解和执行的目标代码的方法和技术。

编译原理的学习对于理解计算机系统的运行原理和提高程序开发效率具有重要意义。

本文将以陈意云版的答案作为参考,向大家介绍编译原理的相关知识。

二. 词法分析词法分析是编译的第一个阶段,它将源代码分解成一个个单词(Token)。

在陈意云版中,常用的词法分析方法有正则表达式和有限自动机。

正则表达式可以方便地描述语言的词法规则,而有限自动机可以用于实现对输入的扫描和匹配。

词法分析器还可以将未识别的字符输入报告为错误。

三. 语法分析语法分析是编译的第二个阶段,它将词法分析器产生的Token序列转化为语法树。

在陈意云版中,常用的语法分析方法是上下文无关文法和递归下降分析。

上下文无关文法用于描述语言的语法规则,而递归下降分析是一种自顶向下的语法分析方法。

语法分析器还可以检查语法错误,并生成错误报告。

四. 语义分析语义分析是编译的第三个阶段,它对语法树进行语义检查和语义处理。

在陈意云版中,常用的语义分析方法有类型检查和符号表管理。

类型检查用于检查表达式和语句中的类型错误,而符号表管理用于管理变量和函数的定义和引用。

语义分析器还可以生成中间代码。

五. 中间代码生成中间代码生成是编译的第四个阶段,它将源代码转化为一种中间形式的代码。

在陈意云版中,常用的中间代码形式有三地址码和虚拟机代码。

中间代码是一种介于源代码和目标代码之间的形式,它可以方便地进行优化和生成目标代码。

六. 代码优化代码优化是编译的第五个阶段,它对中间代码进行优化,以提高程序的执行效率和减少代码的大小。

在陈意云版中,常用的代码优化技术有常量传播、公共子表达式消除和循环优化等。

代码优化器可以根据优化规则对中间代码进行优化,并生成优化后的中间代码。

七. 目标代码生成目标代码生成是编译的最后一个阶段,它将中间代码转化为目标代码。

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

《编译原理》课后习题答案第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)的。

编译原理课后答案 (5)

编译原理课后答案 (5)

拓广文法的LR(1)项目集规范族及Go函数如下:
I1 I0 S’ S, $ S Aa, $ S bAc, $ S Bc, $ S bBa, $ A d, a B d, c B S A b d S’ S , $ I2 S A a, $ S b Ac, $ S b Ba, $ A d, c B d, a A d , a I10 B d , c I11 S B c, $
S→SS+•,+/*/a/$ $
S→SS*•,+/*/a/$
DFA A:
x. 4.7.4 Ex
说明 明下面文法是 是LALR(1),但 但不是SLR文法 法。 S → Aa | bAc b | dc | bd a A → d 解:拓广文法: (0) S’ → →S (1) S → → Aa (2) S → bAc (3 3) S → dc (4) S → → bda (5) A → d
《编译 译技术》第 5 次作 作业 参考 考答案 Ex x.4.7.1
对文 文法进行拓 拓广后得到: (0) S’→S (1) S→SS+
a) S0 S1 1
S’→ S•, $ S→S•S+, $/a S→S•S*, $/a S→•SS+, +/*/a S→•SS*, +/*/a S→•a, +/* */a
广文法的LR(1)项目集规范 范族及Go函数 数如下: 拓广
I0 S’ S, $ S Aa, $ S bAc, $ S dc, $ S bda, $ A d, a
S A b d
I1 S’ S , $ S A a, $ S b Ac, $ I4 A S b da, $ A d, c d S d c, $ A d , a I9 c I2 I3 S Aa , $ I5 S bA c, $ S bd a, $ A d , c S dc , $ I10 c I6 S bAc , $ a I8 S bda , $

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

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

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

上一页
下一页
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

编译原理(第2版)陈意云张昱编著课后答案

编译原理(第2版)陈意云张昱编著课后答案

8
(b) 对于句子abab构造两个相应的最右推导.
S aSbS aSb abSaSb abSab abab
rm
rm
rm
rm
rm
S aSbS aSbaSbS aSbaSb aSbab abab
rm
rm
rm
rm
rm
(c)对于句子abab构造两个相应的分析树.
S
S
aSbS
(b) 句子a|aa的两种最左推导. 句子aa*的两种最左推导.
R
R
R
R
R
*
(c)消除二义性
R R ‘|’ S | S S ST | T T U* | U U (R) | a | b
aR
*
R
R
a
a
a
28
4.5 dangling-else文法: stmt if expr then stmt | matched-stmt
tcodenumlexval冶膝嘉篮瞄畅耽找捕案赶骂恭凶魏承弹特选虽丰仁宇汀刺蚁疵夷铁蟹暑牡编译原理第2版陈意云张昱编著课后答案编译原理第2版陈意云张昱编著课后答案stcetcetcttcetcttcnumnumttcnumnum俗铸涣甩呕灿樱涨巾陆蕾胯涣吁飞猜放渭溢惕想诊祭冕捌责境楔烦贴玛耀编译原理第2版陈意云张昱编著课后答案编译原理第2版陈意云张昱编著课后答案55s
( bexpr ) bexpr or bterm bterm bfactor bfactor false
11
true
(c) 试说明此文法产生的语言是全体布尔表达式.
12
练习: 长度为n的字符串, 分别有多少个 前缀, 后缀, 子串, 真前缀, 子序列 ? 前缀: n+1 后缀: n+1 子串: 1+ n+(n-1)+...+1 = 1+n(n+1)/2 真前缀: n 子序列: 1+Cn1+Cn2+Cn3+...+Cnn = 2n
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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, ); }
2011-3-28 luanj@ 11
7.7
• 修改图7.11的语法制导定义,为栈机器产生代码。
E → E1 or E2 E → not E1 E → ( E1 ) E → id1 relop id2 E → E1 and E2 { E.place := newtemp; emit (E.place, ‘:=’, E1.place, ‘or’, E2.place) } { E.place := newtemp; emit (E.place, ‘:=’, E1.place, ‘and’, E2.place) } { E.place := E1.place } { E.place := newtemp; emit (E.place, ‘:=’, ‘not’, E1.place) } { E.place := newtemp; emit (‘if’, id1.place, relop.op, id2.place,‘goto’, nextstat+3 ); emit (E.place, ‘:=’, ‘0’ ); emit (‘goto’, nextstat + 2 ); emit (E.place, ‘:=’, ‘1’ ) } { E.place := newtemp; emit (E.place, ‘:=’, ‘1’ ) } { E.place := newtemp; emit (E.place, ‘:=’, ‘0’ ) }
编译原理习题课(5) 编译原理习题课(5)
栾 俊 luanj@ 3/28/2011
7.1
• 把算术表达式 –(a+b)*(c+d)+(a+b-c) 翻译成: (a) 语法树 (b) 有向无环图 (c) 后缀表示 (d) 三地址代码
2011-3-28
luanj@
E → true E → false • 指令解释 指令解释: or: 将栈顶和次栈顶值取出 进行或操作 将结果压栈 将栈顶和次栈顶值取出, 进行或操作,将结果压栈 and: 将栈顶和次栈顶值取出 进行与操作 将结果压栈 将栈顶和次栈顶值取出, 进行与操作,将结果压栈 not: 将栈顶值取出 进行非操作 将结果压栈 将栈顶值取出, 进行非操作,将结果压栈 push name: 将name的值压栈 的值压栈 relop op:将栈顶和次栈顶值取出 判断他们的 关系 将结果压栈 将栈顶和次栈顶值取出, 关系,将结果压栈 将栈顶和次栈顶值取出 判断他们的op关系
2011-3-28 luanj@ 4
7.2
• 把C程序 main(){ int i; int a[10]; while(i <= 10) a[i] = 0; } 的可执行语句翻译成: (a) 语法树 (b) 后缀表示 (c) 三地址代码
2011-3-28 luanj@ 5
2011-3-28 luanj@ 13
7.8
• 表7.4的语法制导定义把E-> id1< id2翻译成 一对语句 if id1<id2 goto ... goto ... 可以用一个语句 if id1>=id2 goto... 来代替,当E是真时执行后继代码。修改表 7.4的语法制导定义,使之产生这种性质的 代码。
2011-3-28
luanj@
9
7.5
• 算符θ作用于表达式e1,e2,...,ek的前缀形式 是θp1p2...pk,其中pi是ei的前缀形式。 (a) 写出a*-(b+c)的前缀形式。 (c) 给出把表达式翻成前缀形式的语法制导 定义。
2011-3-28
luanj@
E → id1 relop id2
E → true E → false
2011-3-28
luanj@
16
7.9
• 下面的C语言程序 main(){ int i, j; while((i || j) && (j > 5)){ i = j; } } 在x86/Linux机器上编译生成的汇编代码如下: 在该汇编代码中有关的指令后加注释,将源程序中的操作 和生成的汇编代码对应起来,以判断确实是用短路计算来 完成布尔表达式计算的。
2011-3-28
luanj@
17
7.9 (续) 题目 (续
… .text .align 4 .gloபைடு நூலகம்l main .type main,@function main: pushl %ebp movl %esp, %ebp subl $8, %esp nop .p2align 4,,7 .L2: cmpl $0, -4(%ebp) jne .L6 cmpl $0, -8(%ebp) jne .L6 jmp .L5 .p2align 4,,7
luanj@ 15
E → E1 and E2
2011-3-28
7.6 (续) 续表 (续
E → not E1 E1.true := E.false; E1.false := E.true; E.code := E1.code E1.true := E.true; E1.false := E.false; E.code := E1.code E.code := gen(‘if’, id1.place, relop.op, id2.place, ‘goto’, E.true) || gen(‘goto’, E.false) [修改为 E.code := gen('if', id1.place, not(relop.op) , 修改为: 修改为 id2.place, 'goto', E.false))] E.code := gen(‘goto’, E.true) E.code := gen(‘goto’, E.false) E → (E1 )
2
7.1 (续) (续
• (a) 语法树
+ + + -
• (b) 有向无环图
+ +
* + + a
c b +
*
+
a
b c
d
a
b
c
d
3
2011-3-28
luanj@
7.1 (续) (续
• (c) 后缀表示 ab+cd+*-ab+c++ • (d) 三地址代码 t1 := a + b t2 := c + d t3 := t1 * t2 t4 := -t3 t5 := t1 + c t6 := t4 + t5
E → true E → false
2011-3-28
luanj@
12
7.7 (续) (续
• E → E1 or E2 E → E1 and E2 E → not E1 E → ( E1 ) E → id1 relop id2 { emit (‘or’) } { emit (‘and’) } { emit (‘not’) } {} { emit(‘push ‘ || ); emit(‘push ’ || ); emit (‘relop ’ || relop.op) } { emit ( ‘1’ ) } { emit ( ‘0’ ) }
7.2 (续) (续
• (a) • (b) 语法树 后缀表示
<= while
= 10 array a i
i 10 <= a i array 0 = while
i 0
2011-3-28
luanj@
6
7.2 (续) (续
• (c) 三地址代码 1: if i <= 10 goto 3 2: goto 5 3: a[i] := 0; 4: goto 1 5: return 0
2011-3-28 luanj@ 14
7.6
• 假转方式 产生式
E → E1 or E2
相关文档
最新文档