编译原理龙书课后部分答案(英文版)

编译原理龙书课后部分答案(英文版)
编译原理龙书课后部分答案(英文版)

1) What is the difference between a compiler and an interpreter?

? A compiler is a program that can read a program in one language - the source language - and translate it into an equivalent program in another language – the target language and report any errors in the source program that it detects during the translation process.

? Interpreter directly executes the operations specified in the source program on inputs supplied by the user.

2) What are the advantages of:

(a) a compiler over an interpreter

a. The machine-language target program produced by a compiler is usually much faster than an interpreter at mapping inputs to outputs.

(b) an interpreter over a compiler?

b. An interpreter can usually give better error diagnostics than a compiler, because it executes the source program statement by statement.

3) What advantages are there to a language-processing system in which the compiler produces assembly language rather than machine language?

The compiler may produce an assembly-language program as its output, because

assembly language is easier to produce as output and is easier to debug.

4.2.3 Design grammars for the following languages:

a) The set of all strings of 0s and 1s such that every 0 is immediately followed by at least 1.

S -> SS | 1 | 01 | ε

4.3.1 The following is a grammar for the regular expressions over symbols a and b only, using + in place of | for unions, to avoid conflict with the use of vertical bar as meta-symbol in grammars:

rexpr -> rexpr + rterm | rterm

rterm -> rterm rfactor | rfactor

rfactor -> rfactor * | rprimary

rprimary -> a | b

a) Left factor this grammar.

rexpr -> rexpr + rterm | rterm

rterm -> rterm rfactor | rfactor

rfactor -> rfactor * | rprimary

rprimary -> a | b

b) Does left factoring make the grammar suitable for top-down parsing?

No, left recursion is still in the grammar.

c) In addition to left factoring, eliminate left recursion from the original grammar.

rexpr -> rterm rexpr?

rexpr? -> + rterm rexpr | ε

rterm -> rfactor rterm?

rterm? -> rfactor rterm | ε

rfactor -> rprimary rfactor?

rfactor? -> * rfactor? | ε

rprimary -> a | b

d) Is the resulting grammar suitable for top-down parsing?

Yes.

Exercise 4.4.1 For each of the following grammars, derive predictive parsers and show the parsing tables. You may left-factor and/or eliminate left-recursion from your grammars first.

A predictive parser may be derived by recursive decent or by the table driven approach. Either way you must also show the predictive parse table.

a) The grammar of exercise 4.2.2(a).

4.2.2 a) S -> 0S1 | 01

This grammar has no left recursion. It could possibly benefit from left factoring. Here is the recursive decent PP code.

s() {

match(…0?);

if (lookahead == …0?)

s();

match(…1?);

}

Or

Left factoring the grammar first:

S -> 0S?

S? -> S1 | 1

s() {

match(…0?); s?();

}

s?() {

if (lookahead == …0?)

s(); match(…1?);

else

match(…1?);

}

Now we will build the PP table

S -> 0S?

S? -> S1 | 1

First(S) = {0}

First(S?) = {0, 1}

Follow(S) = {1, $}

The predictive parsing algorithm on page 227 (fig4.19 and 4.20) can use this table for non-recursive predictive parsing.

b) The grammar of exercise 4.2.2(b).

4.2.2 b) S -> +SS | *SS | a with string +*aaa.

Left factoring does not apply and there is no left recursion to remove.

s() {

if(lookahead == …+?)

match(…+?); s(); s();

else if(lookahead == …*?)

match(…*?); s(); s();

else if(lookahead == …a?)

match(…a?);

else

report(“syntax error”);

}

First(S) = {+, *, a}

Follow(S) = {$, +, *, a}

The predictive parsing algorithm on page 227 (fig4.19 and 4.20) can use this table for non-recursive predictive parsing.

5.1.1 a, b, c: Investigating GraphViz as a solution to presenting trees

5.1.2: Extend the SDD of Fig. 5.4 to handle expressions as in Fig. 5.1:

1.L -> E N

1.L.val = E.syn

2. E -> F E'

1. E.syn = E'.syn

2.E'.inh = F.val

3.E' -> + T Esubone'

1.Esubone'.inh = E'.inh + T.syn

2.E'.syn = Esubone'.syn

4.T -> F T'

1.T'.inh = F.val

2.T.syn = T'.syn

5.T' -> * F Tsubone'

1.Tsubone'.inh = T'.inh * F.val

2.T'.syn = Tsubone'.syn

6.T' -> epsilon

1.T'.syn = T'.inh

7.E' -> epsilon

1.E'.syn = E'.inh

8. F -> digit

1. F.val = digit.lexval

9. F -> ( E )

1. F.val = E.syn

10.E -> T

1. E.syn = T.syn

5.1.3 a, b, c: Investigating GraphViz as a solution to presenting trees

5.2.1: What are all the topological sorts for the dependency graph of Fig. 5.7?

1.1, 2, 3, 4, 5, 6, 7, 8, 9

2.1, 2, 3, 5, 4, 6, 7, 8, 9

3.1, 2, 4, 3, 5, 6, 7, 8, 9

4.1, 3, 2, 4, 5, 6, 7, 8, 9

5.1, 3, 2, 5, 4, 6, 7, 8, 9

6.1, 3, 5, 2, 4, 6, 7, 8, 9

7.2, 1, 3, 4, 5, 6, 7, 8, 9

8.2, 1, 3, 5, 4, 6, 7, 8, 9

9.2, 1, 4, 3, 5, 6, 7, 8, 9

10.2, 4, 1, 3, 5, 6, 7, 8, 9

5.2.2 a, b: Investigating GraphViz as a solution to presenting trees

5.2.3: Suppose that we have a production A -> BCD. Each of the four nonterminals A, B, C, and D have two attributes: s is a synthesized attribute, and i is an inherited attribute. For each of the sets of rules below, tell whether (1) the rules are consistent with an S-attributed definition (2) the rules are consistent with an L-attributed definition, and (3) whether the rules are consistent with any evaluation order at all?

a) A.s = B.i + C.s

1.No--contains inherited attribute

2.Yes--"From above or from the left"

3.Yes--L-attributed so no cycles

b) A.s = B.i + C.s and D.i = A.i + B.s

1.No--contains inherited attributes

2.Yes--"From above or from the left"

3.Yes--L-attributed so no cycles

c) A.s = B.s + D.s

1.Yes--all attributes synthesized

2.Yes--all attributes synthesized

3.Yes--S- and L-attributed, so no cycles

d)

? A.s = D.i

? B.i = A.s + C.s

? C.i = B.s

? D.i = B.i + C.i

1.No--contains inherited attributes

2.No--B.i uses A.s, which depends on D.i, which depends on B.i (cycle)

3.No--Cycle implies no topological sorts (evaluation orders) using the rules

5.3.1: Below is a grammar for expressions involving operator + and integer or floating-point operands. Floating-point numbers are distinguished by having a decimal point.

1. E -> E + T | T

2.T -> num . num | num

a) Give an SDD to determine the type of each term T and expression E.

1. E -> Esubone + T

1. E.type = if (E.type == float || T.type == float) { E.type = float } else

{ E.type = integer }

2. E -> T

1. E.type = T.type

3.T -> numsubone . numsubtwo

1.T.type = float

4.T -> num

1.T.type = integer

b) Extend your SDD of (a) to translate expressions into postfix notation. Use the binary operator intToFloat to turn an integer into an equivalent float.Note: I use character ',' to separate floating point numbers in the resulting postfix notation. Also, the symbol "||" implies concatenation.

1. E -> Esubone + T

1. E.val = Esubone.val || ',' || T.val || '+'

2. E -> T

1. E.val = T.val

3.T -> numsubone . numsubtwo

1.T.val = numsubone.val || '.' || numsubtwo.val

4.T -> num

1.T.val = intToFloat(num.val)

5.3.2 Give an SDD to translate infix expressions with + and * into equivalent expressions without redundant parenthesis. For example, since both operators associate from the left, and * takes precedence over +, ((a*(b+c))*(d)) translates into a*(b+c)*d. Note: symbol "||" implies concatenation.

1.S -> E

1. E.iop = nil

2.S.equation = E.equation

2. E -> Esubone + T

1.Esubone.iop = E.iop

2.T.iop = E.iop

3. E.equation = Esubone.equation || '+' || T.equation

4. E.sop = '+'

3. E -> T

1.T.iop = E.iop

2. E.equation = T.equation

3. E.sop = T.sop

4.T -> Tsubone * F

1.Tsubone.iop = '*'

2. F.iop = '*'

3.T.equation = Tsubone.equation || '*' || F.equation

4.T.sop = '*'

5.T -> F

1. F.iop = T.iop

2.T.equation = F.equation

3.T.sop = F.sop

6. F -> char

1. F.equation = char.lexval

2. F.sop = nil

7. F -> ( E )

1.if (F.iop == '*' && E.sop == '+') { F.equation = '(' || E.equation || ')' }

else { F.equation = E.equation }

2. F.sop = nil

5.3.3: Give an SDD to differentiate expressions such as x * (3*x + x * x) involving the operators + and *, the variable x, and constants. Assume that no simplification occurs, so that, for example, 3*x will be translated into 3*1 + 0*x. Note: symbol "||" implies concatenation. Also, differentiation(x*y) = (x * differentiation(y) + differentiation(x) * y) and differentiation(x+y) = differentiation(x) + differentiation(y).

1.S -> E

1.S.d = E.d

2. E -> T

1. E.d = T.d

2. E.val = T.val

3.T -> F

1.T.d = F.d

2.T.val = F.val

4.T -> Tsubone * F

1.T.d = '(' || Tsubone.val || ") * (" || F.d || ") + (" || Tsubone.d || ") * (" ||

F.val || ')'

2.T.val = Tsubone.val || '*' || F.val

5. E -> Esubone + T

1. E.d = '(' || Esubone.d || ") + (" || T.d || ')'

2. E.val = Esubone.val || '+' || T.val

6. F -> ( E )

1. F.d = E.d

2. F.val = '(' || E.val || ')'

7. F -> char

1. F.d = 1

2. F.val = char.lexval

8. F -> constant

1. F.d = 0

2. F.val = constant.lexval

编译原理龙书答案

P532.8 构建一个语法制导翻译模式,将算术表达式从后缀表示翻译成中缀表示。给出输入95-2*和952*-的注释分析树。(仅供参考一定要保证转换后的中缀表达式与原后缀表达式的优先级相同) 1 后缀算术表达式的文法如下: expr →expr expr + | expr expr – | expr expr * | expr expr / |digit digit →0 | 1 | 2 | 3 | … | 9 2 将后缀表达式翻译成中缀表达式的语法制导定义(文法+语义规则)

4 95-2*和952*-的翻译成后缀形式的语义动作与注释分析树。 expr expr expr * print(‘(‘) print(‘)‘) expr expr - 5 9 digit 2 print(‘-’) ‘9’) print(‘5’) print(‘2’) print(‘*’) 95-2*的深度优先遍历语义动作 expr expr expr - print(‘(‘) print(‘)‘) expr expr digit 2 digit 5 digit 9 print(‘*’) ‘5’) print(‘2’) print(‘9’) print(‘-’) 952*-的深度优先遍历语义动作

expr.t=(9-5)*2 expr=(9-5) expr.t=2 * expr.t=9 expr.t=5 - digit.t=5 5 digit.t=9 9 digit.t=2 2 输入为95-2*的注释分析树 expr.t=(9-5*2) expr.t=5*2 expr.t=9 - expr.t=5 expr.t=2 * digit.t=2 2 digit.t=5 5 digit.t=9 9 输入为952*-的注释分析树

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

精品文档 第二章 P36-6 (1) L G ()1是0~9组成的数字串 (2) 最左推导: N ND NDD NDDD DDDD DDD DD D N ND DD D N ND NDD DDD DD D ??????????????????0010120127334 556568 最右推导: N ND N ND N ND N D N ND N D N ND N ND N D ??????????????????77272712712701274434 886868568 P36-7 G(S) O N O D N S O AO A AD N →→→→→1357924680||||||||||| P36-8 文法: E T E T E T T F T F T F F E i →+-→→|||*|/()| 最左推导: E E T T T F T i T i T F i F F i i F i i i E T T F F F i F i E i E T i T T i F T i i T i i F i i i ?+?+?+?+?+?+?+?+??????+?+?+?+?+?+********()*()*()*()*()*()*() 最右推导: E E T E T F E T i E F i E i i T i i F i i i i i E T F T F F F E F E T F E F F E i F T i F F i F i i i i i ?+?+?+?+?+?+?+?+?????+?+?+?+?+?+?+**********()*()*()*()*()*()*()*() 语法树:/********************************

(完整版)编译原理课后习题答案

第一章 1.典型的编译程序在逻辑功能上由哪几部分组成? 答:编译程序主要由以下几个部分组成:词法分析、语法分析、语义分析、中间代码生成、中间代码优化、目标代码生成、错误处理、表格管理。 2. 实现编译程序的主要方法有哪些? 答:主要有:转换法、移植法、自展法、自动生成法。 3. 将用户使用高级语言编写的程序翻译为可直接执行的机器语言程序有哪几种主要的方式? 答:编译法、解释法。 4. 编译方式和解释方式的根本区别是什么? 答:编译方式:是将源程序经编译得到可执行文件后,就可脱离源程序和编译程序单独执行,所以编译方式的效率高,执行速度快; 解释方式:在执行时,必须源程序和解释程序同时参与才能运行,其不产生可执行程序文件,效率低,执行速度慢。

第二章 1.乔姆斯基文法体系中将文法分为哪几类?文法的分类同程序设计语言的设计与实现关 系如何? 答:1)0型文法、1型文法、2型文法、3型文法。 2) 2. 写一个文法,使其语言是偶整数的集合,每个偶整数不以0为前导。 答: Z→SME | B S→1|2|3|4|5|6|7|8|9 M→ε | D | MD D→0|S B→2|4|6|8 E→0|B 3. 设文法G为: N→ D|ND D→ 0|1|2|3|4|5|6|7|8|9 请给出句子123、301和75431的最右推导和最左推导。 答:N?ND?N3?ND3?N23?D23?123 N?ND?NDD?DDD?1DD?12D?123 N?ND?N1?ND1?N01?D01?301 N?ND?NDD?DDD?3DD?30D?301 N?ND?N1?ND1?N31?ND31?N431?ND431?N5431?D5431?75431 N?ND?NDD?NDDD?NDDDD?DDDDD?7DDDD?75DDD?754DD?7543D?75431 4. 证明文法S→iSeS|iS| i是二义性文法。 答:对于句型iiSeS存在两个不同的最左推导: S?iSeS?iiSes S?iS?iiSeS 所以该文法是二义性文法。 5. 给出描述下面语言的上下文无关文法。 (1)L1={a n b n c i |n>=1,i>=0 } (2)L2={a i b j|j>=i>=1} (3)L3={a n b m c m d n |m,n>=0} 答: (1)S→AB A→aAb | ab B→cB | ε (2)S→ASb |ab

编译原理第第7和第8章作业

第七章作业 练习7.2.5:在一个通过引用传递参数的语言中,有一个函数f(x,y)完成下面的计算:x=x+1;y=y+2;return x+y; 如果将a赋值为3,然后调用f(a,a),那么返回值是什么? 解:执行语句x=x+1,则a=a+1=4, 再执行语句y=y+2,则a=a+2=5, 最后返回x+y,则返回a+a=9。 练习7.2.6:C语言函数f的定义如下: int f(int x,*py,**ppz) { **ppz+=1;*py+=2;x+=3;return x+*py+**ppz; } 变量a是一个指向b的指针;变量b是一个指向c的指针,而c是一个当前值为4的整数变量。如果我们调用f(c,b,a),返回值是什么? 解:先执行语句**ppz+=1,则c=*b=**a=5, 再执行语句*py+=2,则*b=*b+2=7,c=*b=**a=7, 接着执行语句x+=3,则x=4,x=x+3=7,而c=*b=**a=7, 最后执行语句return x+*py+**ppz,则返回7+7+7=21。 练习7.3.2:假使我们使用显示表来实现下图中的函数。请给出对fib0(1)的第一次调用即将返回时的显示表。同时指明那时在栈中的各个活动记录中保存的显示表条目。 计算Fibonacci数的嵌套函数 解:

第八章练习 练习8.2.1:假设所有的变量都存放在内存中,为下面的三地址语句生成代码: 5)两个语句的序列 x=b*c y=a+x 解:生成的代码如下: LD R1, b LD R2, c MUL R1, R1, R2 ST x, R1 LD R2, a ADD R1, R2, R1 ST y, R1 练习8.2.6:确定下列指令序列的代价。 1)LD R0,y LD R1,z ADD R0,R0,R1 ST x,R0 解:2+2+1+2=7 2)LD R0,i MUL R0,R0,8 LD R1,a(R0) ST b,R1 main() fib0(4) 保存的d[2] fib1(4) 保存的d[3] fib2(4) 保存的d[4] fib1(3) 保存的d[3] fib0(2) 保存的d[2] fib1(2) 保存的d[3] fib0(1) 保存的d[2] d[1] d[2] d[3] d[4]

编译原理龙书课后部分答案(英文版)

1) What is the difference between a compiler and an interpreter? A compiler is a program that can read a program in one language - the source language - and translate it into an equivalent program in another language – the target language and report any errors in the source program that it detects during the translation process. Interpreter directly executes the operations specified in the source program on inputs supplied by the user. 2) What are the advantages of: (a) a compiler over an interpreter a. The machine-language target program produced by a compiler is usually much faster than an interpreter at mapping inputs to outputs. (b) an interpreter over a compiler? b. An interpreter can usually give better error diagnostics than a compiler, because it executes the source program statement by statement. 3) What advantages are there to a language-processing system in which the compiler produces assembly language rather than machine language? The compiler may produce an assembly-language program as its output, because assembly language is easier to produce as output and is easier to debug. 4.2.3 Design grammars for the following languages: a) The set of all strings of 0s and 1s such that every 0 is immediately followed by at least 1. S -> SS | 1 | 01 | 4.3.1 The following is a grammar for the regular expressions over symbols a and b only, using + in place of | for unions, to avoid conflict with the use of vertical bar as meta-symbol in grammars: rexpr -> rexpr + rterm | rterm rterm -> rterm rfactor | rfactor rfactor -> rfactor * | rprimary rprimary -> a | b a) Left factor this grammar. rexpr -> rexpr + rterm | rterm rterm -> rterm rfactor | rfactor rfactor -> rfactor * | rprimary rprimary -> a | b

编译原理第4章作业答案

第四章 习题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

编译原理课后答案

第二章 2.3叙述由下列正规式描述的语言 (a) 0(0|1)*0 在字母表{0, 1}上,以0开头和结尾的长度至少是2的01 串 (b) ((ε|0)1*)* 在字母表{0, 1}上,所有的01串,包括空串 (c) (0|1)*0(0|1)(0|1) 在字母表{0, 1}上,倒数第三位是0的01串 (d) 0*10*10*10* 在字母表{0, 1}上,含有3个1的01串 (e) (00|11)*((01|10)(00|11)*(01|10)(00|11)*)* 在字母表{0, 1}上,含有偶数个0和偶数个1的01串 2.4为下列语言写正规定义 C语言的注释,即以 /* 开始和以 */ 结束的任意字符串,但它的任何前缀(本身除外)不以 */ 结尾。 [解答] other → a | b | … other指除了*以外C语言中的其它字符 other1 → a | b | … other1指除了*和/以外C语言中的其它字符 comment → /* other* (* ** other1 other*)* ** */ (f) 由偶数个0和偶数个1构成的所有0和1的串。 [解答]由题目分析可知,一个符号串由0和1组成,则0和1的个数只能有四种情况: x 偶数个0和偶数个1(用状态0表示); x 偶数个0和奇数个1(用状态1表示); x 奇数个0和偶数个1(用状态2表示); x 奇数个0和奇数个1(用状态3表示);所以, x 状态0(偶数个0和偶数个1)读入1,则0和1的数目变为:偶数个0和奇数个1(状态1) x 状态0(偶数个0和偶数个1)读入0,则0和1的数目变为:奇数个0和偶数个1(状态2) x 状态1(偶数个0和奇数个1)读入1,则0和1的数目变为:偶数个0和偶数个1(状态0) x 状态1(偶数个0和奇数个1)读入0,则0和1的数目变为:奇数个0和奇数个1(状态3) x 状态2(奇数个0和偶数个1)读入1,则0和1的数目变为:奇数个0和奇数个1(状态3) x 状态2(奇数个0和偶数个1)读入0,则0和1的数目变为:偶数个0和偶数个1(状态0) x 状态3(奇数个0和奇数个1)读入1,则0和1的数目变为:奇数个0和偶数个1(状态2) x 状态3(奇数个0和奇数个1)读入0,则0和1的数目变为:偶数个0和奇数个1(状态1) 因为,所求为由偶数个0和偶数个1构成的所有0和1的串,故状态0既为初始状态又为终结状态,其状态转换图: 由此可以写出其正规文法为: S0 → 1S1 | 0S2 | ε S1 → 1S0 | 0S3 | 1 S2 → 1S3 | 0S0 | 0 S3 → 1S2 | 0S1 在不考虑S0 →ε产生式的情况下,可以将文法变形为: S0 = 1S1 + 0S2 S1 = 1S0 + 0S3 + 1 S2 = 1S3 + 0S0 + 0 S3 = 1S2 + 0S1 所以: S0 = (00|11) S0 + (01|10) S3 + 11 + 00 (1) S3 = (00|11) S3 + (01|10) S0 + 01 + 10 (2) 解(2)式得: S3 = (00|11)* ((01|10) S0 + (01|10)) 代入(1)式得: S0 = (00|11) S0 + (01|10) (00|11)*((01|10) S0 + (01|10)) + (00|11) => S0 = ((00|11) + (01|10) (00| 11)*(01|10))S0 + (01|10) (00|11)*(01|10) + (00|11) => S0 = ((00|11)|(01|10) (00|11)*(01|10))*((00|1

编译原理 龙书答案

第四章部分习题解答 Aho:《编译原理技术与工具》书中习题 (Aho)4.1 考虑文法 S →( L ) | a L →L, S | S a)列出终结符、非终结符和开始符号 解: 终结符:(、)、a、, 非终结符:S、L 开始符号:S b)给出下列句子的语法树 i)(a, a) ii)(a, (a, a)) iii)(a, ((a, a), (a, a))) c)构造b)中句子的最左推导 i)S?(L)?(L, S) ?(S, S) ?(a, S) ?(a, a) ii)S?(L)?(L, S) ?(S, S) ?(a, S) ?(a, (L)) ?(a, (L, S)) ?(a, (S, S)) ?(a, (a, S) ?(a, (a, a)) iii)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))) d)构造b)中句子的最右推导

i)S?(L)?(L, S) ?(L, a) ?(S, a) ?(a, a) ii)S?(L)?(L, S) ? (L, (L)) ?(L, (L, S)) ?(L, (L, a)) ?(L, (S, a)) ?(L, (a, a)) ?(S, (a, a)) ?(a, (a, a)) iii)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), (S, S))) ?(S, ((a, a), (a, a))) ?(a, ((a, a), (a, a))) e)该文法产生的语言是什么 解:设该文法产生语言(符号串集合)L,则 L = { (A1, A2, …, A n) | n是任意正整数,A i=a,或A i∈L,i是1~n之间的整数} (Aho)4.2考虑文法 S→aSbS | bSaS | ε a)为句子构造两个不同的最左推导,以证明它是二义性的 S?aSbS?abS?abaSbS?ababS?abab S?aSbS?abSaSbS?abaSbS?ababS?abab b)构造abab对应的最右推导 S?aSbS?aSbaSbS?aSbaSb?aSbab?abab S?aSbS?aSb?abSaSb?abSab?abab c)构造abab对应语法树 d)该文法产生什么样的语言? 解:生成的语言:a、b个数相等的a、b串的集合 (Aho)4.3 考虑文法 bexpr→bexpr or bterm | bterm bterm→bterm and bfactor | bfactor bfactor→not bfactor | ( bexpr ) | true | false a)试为句子not ( true or false)构造分析树 解:

编译原理课后习题答案

第1 章 1、编译过程包括哪几个主要阶段及每个 阶段的功能。 答案:编译过程包括词法分析、语法分析、语义分析和中间代码生成、优化、目标代码生成5 个阶段。词法分析的功能是对输入的高级语言源程序进行词法分析,识别其中的单词符号,确定它们的种类,交给语法分析器,即把字符串形式的源程序分解为单词符号串形式。语法分析的功能是在词法分析结果的基础上,运用语言的语法规则,对程序进行语法分析,识别构成程序的各类语法范畴及它们之间的层次关系,并把这种层次关系表达成语法树的形式。词义分析和中间代码生成的功能是在语法分析的基础上,对程序进行语义分析,“理解”其含义,产生出表达程序语义的内部表达形式(中间代码)。优化的功能是按照等价变换的原则,对语义分析器产生的中间代码序列进行等价变换,删除其中多余的操作,对耗时耗空间的代码进行优化,以期最后得到高效的可执行代码。目标代码生成的功能是把优化后的中间代码变换成机器指令代码,得到可在目标机器上执行的机器语言程序。 第2 章 1、写一上下文无关文法G,它能产生配 对的圆括号串(如:(),(()),()(())等,甚至 包括0 对括号) 文法为:S→(L)|LS|L L→S| ε 2 、已知文法G :E→E+T|E-T|T T→T*F|T/F|F F→(E) |i (1)给出i+i*i,i*(i-i)的最左推导,最右推导以及语法树。 (2)i-i+i 哪个算符优先。 【解答】 (1)最左推导:E?E+T?T+T? F+T ? i+T ? i+T*F ? i+F*F ?i+i*F ?i+i*i E?T?T*F? F*F ? i*F ? i*(E) ? i*(E-T) ? i*(T-T) ? i*(F-T) ? i*(i-T) ? i*(i-F) ?i*(i-i) 最右推导:E?E+T?E+T*F? E+T*i ? E+F*i ? E+i*i ? T+i*i ? F+i*i ? i+i*i E?T?T*F? T*(E) ? T*(E-T) ? T*(E-F) ? T*(E-i) ? T*(T-i) ? T*(F-i) ?T*(i-i) ? F*(i-i) ?i*(i-i) i+i*i 以及i*(i-i)的语法树如下所示: (2)i-i+i 的语法树如下图所示。 从上图的语法树可知:“-”的位置位 于“+”的下层,也就是前面两个i 先进 行“-”运算,再与后面的i 进行“+” 运算,所以“-”的优先级高于“+”的 优先级。 3 、文法G: E→ET+|T T→TF*|F F→FP↑|P P→E|i (1)试证明符号串TET+*i↑是G 的一 个句型(要求画出语法树). (2)写出该句型的所有短语,直接短语和句柄. 【解答】(1)采用最右推导: E?T?F? FP↑? Fi↑? Pi↑? Ei↑ ? Ti↑? TF*i↑? TP*i↑? TE*i↑? TET+*i↑ 语法树如下图所示。 从文法G 的起始符号出发,能够推导 出符号串TET+*i↑,所以给定符号串是文法G的句型。 (2) 该句型的短语有: ET+,TET+*,i ,TET+*i↑ 直接短语有:ET+, i 句柄是:ET+ 4、已知文法G:S→iSeS|iS|i ,该文法 是二义文法吗?为什么? 【解答】该文法是二义文法。 因为对于句子iiiei 存在两种不同的最 左推导: 第 1 种推导:S? iSeS? iiSeS? iiieS? iiiei 第2种推导:S?iS?iiSeS?iiieS?iiiei 第3 章 1、用正规式描述下列正规集: (1)C 语言的十六进制整数; (2)以ex 开始或以ex 结束的所有小写字母构成的符号串; (3)十进制的偶数。 【解答】 (1)C 语言十六进制整数以0x 或者0X 开头,所以一般形式应该为(+|-|ε) (0x|0X)AA*,其中前面括号表示符号, 可以有正号、负号,也可以省略(用ε表示)默认是正数,A 表示有资格出现在十六进制整数数位上的数字,AA*表示一位或者多位(一个或者多个数字的

龙书 第四章课后作业答案

P1774.14 为练习4.3的文法构造一个预测语法分析器 bexpr→bexpr or bterm|bterm bterm→bterm and bfactor | bfactor bfactor→not bfactor|(bexpr)|true |false 解1 非递归方法 1)消除左递归 ①bexpr→bterm A ②A→or bterm A ③A→ε ④bterm→bfactor B ⑤B→and bfactor B ⑥B→ε ⑦bfactor→not bfactor ⑧bfactor→(bexpr) ⑨bfactor→true ⑩bfactor→false 2)求first集与follow集 针对以同一非总结符开头的产生式右部求first集如果该非终结符能产生ε则需要求其follow集 ①bexpr→bterm A first(bterm A)= {not,(,true,false} ②A→or bterm A first(or bterm A)={or} ③A→εfollow(A)=follow(bexpr)= {$, )} ④bterm→bfactor B first(bfactor B)={not,(,true,false} ⑤B→and bfactor B first(and bfactor B)={and} ⑥B→εfollow(B)=follow(bterm)=first(A) 因为first(A)= {or , ε} 包含ε 所以follow(B)=follow(bterm) =first(A)∪follow(A)-{ε}={or, $, )} ⑦bfactor→not bfactor first(not bfactor)={not} ⑧bfactor→(bexpr)first((bexpr))={(} ⑨bfactor→true first(true)={true} ⑩bfactor→false first(false)={false} 表中空白处填error,表示调用错误处理程序 4)根据步骤3)编写预测分析程序 下面给出通用的预测分析算法,具体程序留给同学们根据算法自己完善。 repeat

编译原理(清华大学 第2版)课后习题答案

第三章 N=>D=> {0,1,2,3,4,5,6,7,8,9} N=>ND=>NDD L={a |a(0|1|3..|9)n且 n>=1} (0|1|3..|9)n且 n>=1 {ab,} a n b n n>=1 第6题. (1) <表达式> => <项> => <因子> => i (2) <表达式> => <项> => <因子> => (<表达式>) => (<项>) => (<因子>)=>(i) (3) <表达式> => <项> => <项>*<因子> => <因子>*<因子> =i*i (4) <表达式> => <表达式> + <项> => <项>+<项> => <项>*<因子>+<项> => <因子>*<因子>+<项> => <因子>*<因子>+<因子> = i*i+i (5) <表达式> => <表达式>+<项>=><项>+<项> => <因子>+<项>=i+<项> => i+<因子> => i+(<表达式>) => i+(<表达式>+<项>) => i+(<因子>+<因子>) => i+(i+i) (6) <表达式> => <表达式>+<项> => <项>+<项> => <因子>+<项> => i+<项> => i+<项>*<因子> => i+<因子>*<因子> = i+i*i 第7题

第9题 语法树 s s s* s s+a a a 推导: S=>SS*=>SS+S*=>aa+a* 11. 推导:E=>E+T=>E+T*F 语法树: E +T * 短语: T*F E+T*F 直接短语: T*F 句柄: T*F 12.

短语: 直接短语: 句柄: 13.(1)最左推导:S => ABS => aBS =>aSBBS => aBBS => abBS => abbS => abbAa => abbaa 最右推导:S => ABS => ABAa => ABaa => ASBBaa => ASBbaa => ASbbaa => Abbaa => a1b1b2a2a3 (2) 文法:S → ABS S → Aa S →ε A → a B → b (3) 短语:a1 , b1 , b2, a2 , , bb , aa , abbaa, 直接短语: a1 , b1 , b2, a2 , , 句柄:a1 14 (1) S → AB A → aAb | ε B → aBb | ε (2) S → 1S0 S → A A → 0A1 |ε 第四章 1. 1. 构造下列正规式相应的DFA (1)1(0|1)*101 NFA (2) 1(1010*|1(010)*1)*0 NFA

编译原理龙书第六章课后作业答案

6.1 假如有下面的Pascal说明 TYPE atype=ARRAY [0..9,-10..10] OF integer; cell=RECORD a,b:integer END; pcell=↑cell; foo=ARRAY [1..100] OF cell; FUNCTION bar(r:integer;y:cell):pcell; BEGIN……END; 写出atype,cell,pcell,foo和bar的类型表达式。 解答: atype: ARRAY(0..9, ARRAY(-10..10, integer)); cell: RECORD((a× integer)× (b×integer)); pcell: POINTER(cell); 或 : POINTER(RECORD((a ×integer)× (b× integer))); foo: ARRAY(1..100, cell); 或 : ARRAY(1..100, RECORD((a ×integer)× (b× integer))); bar: integer× cell→pcell; 或 : integer× cell→POINTER(RECORD((a×integer) ×(b×integer))); 6.4 假定类型定义如下: TYPE link=↑cell; cell=RECORD info:integer; next: link END; 下面哪些表达式结构等价?哪些名字等价? (1)Link (2)pointer(cell) (3)pointer(Link) (4)pointer(record(info?integer)?(next ? pointer(cell))) 解答:(1)(2)(4)结构等价,无名字等价。

编译原理第三版课后答案

编译原理课后题答案 第二章 P36-6 (1) L G () 1是0~9组成的数字串 (2) 最左推导: 最右推导: P36-7 G(S) P36-8 文法: 最左推导: 最右推导: 语法树:/******************************** *****************/ P36-9 句子iiiei有两个语法树: P36-10 /************** ***************/ P36-11 /*************** L1: L2: L3: L4: ***************/ 第三章习题参考答案P64–7 (1)

最小化: P64–8 (1) (2) (3) P64–12 (a) a a,b a 0

给状态编号: a a a b b b 最小化: a a b b a b (b) 已经确定化了, 进行最小化 最小化: P64 –14 (1) 0 1 0 (2): (|)*010 1 εε 0 0 0 Y Y

最小化: 0 1 1 1 0 0 第四章 P81–1 (1) 按照T,S 的顺序消除左递归 递归子程序: procedure S; begin if sym='a' or sym='^' then abvance else if sym='(' then begin advance;T; if sym=')' then advance; else error; end else error end; procedure T; begin S; T end;

procedure 'T; begin if sym=',' then begin advance; S;'T end end; 其中: sym:是输入串指针IP所指的符号advance:是把IP调至下一个输入符号error:是出错诊察程序 (2) FIRST(S)={a,^,(} FIRST(T)={a,^,(} FIRST('T)={,,ε} FOLLOW(S)={),,,#} FOLLOW(T)={)} FOLLOW('T)={)} 预测分析表 是LL(1)文法 P81–2 文法: (1) FIRST(E)={(,a,b,^} FIRST(E')={+,ε} FIRST(T)={(,a,b,^} FIRST(T')={(,a,b,^,ε} FIRST(F)={(,a,b,^} FIRST(F')={*,ε} FIRST(P)={(,a,b,^} FOLLOW(E)={#,)} FOLLOW(E')={#,)} FOLLOW(T)={+,),#} FOLLOW(T')={+,),#} FOLLOW(F)={(,a,b,^,+,),#} FOLLOW(F')={(,a,b,^,+,),#} FOLLOW(P)={*,(,a,b,^,+,),#} (2)

编译原理 龙书答案

第五章部分习题解答 Aho:《编译原理技术与工具》书中习题 (Aho)5.3 为下面表达式构造有向无环图,标出结点(子表达式)编号,+是左结合的 a + a + (a + a + a + (a + a + a + a)) 解: (Aho)5.5 设计语法制导定义,实现多项式(包含+和*,如x*(3*x+x*x))的求导,结果无需化简,如3*x直接翻译为3*1+0*x即可。(思路:(xy)?=x?y+y?x,(x+y)?=x?+y?) 解: 综合属性diff为求导后的表示形式,val为原多项式表示形式 E→E1 + T { E.val = E1.val || “+” || E.val; E.diff = E1.diff || “+” || E.diff; } | T { E.val = T.val; E.diff = T.diff; } T→T1 * F { T.val = T1.val || “*” || F.val; T.diff = “(” || T1.diff || “*” || F.val || “+” || T1.val || “*” || F.diff || “)”; } | F { T.val = F.val; T.diff = F.diff; } F→( E ) { F.val = “(” || E.val || “)”; F.diff = “(” || E.diff || “)”; } | num { F.val = num.val; F.diff = 0; } | x { F.val = “x”; F.diff = 1; } 此题和后面两题均可编写Lex&Yacc程序进行验证。 (Aho)5.4 设计翻译模式,实现将中缀表达式翻译为无多余括号形式 解:所谓“多余括号”,可以理解为: 本该是表达式E,写成了(E)的形式, 本该是项T,写成了(T)的形式, 本该是因式F,写成了(F)的形式,因此,可写出文法和翻译模式: E→( E1 ) { E.s = E1.s; } | E1 + T { E.s = E1.s || …+? || T.s; } | T { E.s = T.s; } T→( T1 ) { T.s = T1.s; } | T1 + F { T.s = T1.s || …*? || F.s; } | F { T.s = F.s; }

【《岳飞》文言文】《岳飞》阅读习题及答案

【《岳飞》文言文】《岳飞》阅读习题及答案 内容简介:岳飞(1103-1142)字鹏举,汉族。北宋相州汤阴县永和乡孝悌里(今河南省安阳市汤阴县菜园镇程岗村)人。中国历史上著名战略家、军事家、民族英雄、抗金名将。 ①二十四个循环往复的季节里有你恒温的季节。你,一身盔甲,令所有的对手溃不成军,一腔热血,开始了民族的觉醒,但你挡得住面前的攻打,却经不起背后的谋杀,一场场腥风血雨的战争,开始了你人生的另一段征程...... ②一块中原大地般宽厚的脊背,针针见血地负起母亲的叮咛与沉雄的神州:“精忠报国!”可你却万万没想到,报国路竟是如此曲折。你把民族正义建立在生命之上换来的却是昏君与秦桧等小人的咄咄逼人的话语,你忠于谁,谁就决定你的生死。朝赐你的财物,午赐你的宅院,暮赐你美女的人,就不定何时便赐你一死,可你忙于出征,忙于布阵,忙于厮杀,便不曾留心天子的夸奖是一种带回钩的暗器,你醉心于把战表化成捷报,更不曾留意金銮殿不露声色地已勾勒出了风波亭的雏形…… ③阴谋出笼,出皇城,十二道金牌,十二个夜叉——将忠良捉拿,昨天的猎人,今天的猎物———你角色的转换过于险陡,就连看惯沉浮的黄河,事先都是毫无预感。手上铐子,脚上镣子,颈上枷子,最重要的是驮在背上那母亲的叮嘱,如今成了要命的包袱。不归路上,当竖着的性命同一柄横着的利刃勃然相遇时,你才知晓《满江红》的写作,是从校场熟悉的枪尖上起笔而却在一块陌生的磨刀石上结束的。

④亭间是佞贼一个人的狞笑,亭外是天下无数人的痛哭,屠刀下落,宏文顿成断章!被喷的夕阳涂制页页血帆,浪浪跄,船蹀躞,黄河倒抽一口凉气,刹那改道…… ⑤滚烫的座右铭,一下子变成冰凉的墓志铭,幸亏那识字也识大体的岳母先行一步,否则她,这白发人该怎样去哭祭那黑发的儿郎啊?“精忠报国”的每个字,本都该活上一百年,一千年,一万年,可这区区三十八度春秋,已蓦然成为构思之外的残简。 ⑥你千百年前的一腔热血,已化作历史的一把冷汗,莫须有的罪名造奇冤!谁让你满怀抱负,浑身功夫,却赶上了一个有重病而无良药的时代。宫殿里,龙书案后昏庸的半径,量得出民间黑暗的周长,这绝对是悲的情节,善良遇上恶毒依旧善良,恶毒遇上善良益发恶毒。肯于为良知执言的,只有暴死的良知,能够给邪恶张目的,还是活着的邪恶。莫以为前朝才有怪胎,罪恶也并非偶然的宫外孕。 ⑦看历史要细心,看现实要耐心,同为军人,二十九岁的项羽自杀了,三十八的岳飞被杀了,我总梦见影影绰绰的亭上,有蚊虫剔牙,有苍蝇打嗝,醒来不由惊问:风波亭在哪?它是一颗悬于神州大梁的苦胆,让有志有为的卧薪者品味,明目明心,以认清忠奸。千百年过去了,岳飞也殁了,在那个臭气熏天的黑暗社会中,岳飞走了,他带着“精忠报国”的志向却不明不白地去了,只有天知道,他应该从容地面对,因为———他终于自由了,他终于摆脱了无能的昏君和歹毒的小人,带着他的志向正流芳千古呢!而如今的我们正沐浴在正义的光环下享受着岳飞将军用生命换来的那份自由啊!

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

目录 P36-6 (2) P36-7 (2) P36-8 (2) P36-9 (3) P36-10 (3) P36-11 (3) P64–7 (4) P64–8 (5) P64–12 (5) P64–14 (7) P81–1 (8) P81–2 (9) P81–3 (12) P133–1 (12) P133–2 (12) P133–3 (14) P134–5 (15) P164–5 (19) P164–7 (19) P217–1 (19) P217–3 (20) P218–4 (20) P218–5 (21) P218–6 (22) P218–7 (22) P219–12 (22) P270–9 (24)

P36-6 (1) L G ()1是0~9组成的数字串 (2) 最左推导: N ND NDD NDDD DDDD DDD DD D N ND DD D N ND NDD DDD DD D ??????????????????0010120127334 556568 最右推导: N ND N ND N ND N D N ND N D N ND N ND N D ??????????????????77272712712701274434 886868568 P36-7 G(S) O N O D N S O AO A AD N →→→→→1357924680||||||||||| P36-8 文法: E T E T E T T F T F T F F E i →+-→→|||*|/()| 最左推导: E E T T T F T i T i T F i F F i i F i i i E T T F F F i F i E i E T i T T i F T i i T i i F i i i ?+?+?+?+?+?+?+?+??????+?+?+?+?+?+********()*()*()*()*()*()*() 最右推导: E E T E T F E T i E F i E i i T i i F i i i i i E T F T F F F E F E T F E F F E i F T i F F i F i i i i i ?+?+?+?+?+?+?+?+?????+?+?+?+?+?+?+**********()*()*()*()*()*()*()*() 语法树:/********************************

相关文档
最新文档