编译原理试题

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

中间语言与语法制导翻译

重点与难点

重点:语法制导翻译的基本思想,属性文法,翻译模式,说明语句的翻译方案。

三地址码,各种语句的目标代码结构、属性文法与翻译模式。

难点:属性的意义,对综合属性,继承属性,固有属性的理解,属性计算,怎么通过属性来表达翻译。布尔表达式的翻译,对各种语句的目标代码结构、属性文法与翻译模式的理解。基本要求

掌握语法制导翻译的基本思想,属性文法,综合属性,继承属性,固有属性,属性计算,S_属性文法,L_属性文法,说明语句的翻译方案,翻译模式、属性文法的实现掌握中间语言与语义分析的基本概念;熟练掌握语法(结构)树、三地址代码、赋值与控制语句的翻译、说明语句的翻译;掌握组合数据说明的翻译、过程调用翻译。

例题解析

例1 给定文法 E --> T { R.i := T.p }

R { E.p := R.s }

R --> addop

T { R1.i := mknode( addop.val, R.i, T.p ) }

R { R.s := R1.s }

R --> { R.s := R1.s }

T --> ( E ) { T.p := E.p }

T --> id { T.p := mkleaf( id, id.entry ) }

T --> num { T.p := mkleaf( num, num.val ) }

(1) 指出文法中的各非终结符具有哪些综合属性和哪些继承属性

⑵画出按本翻译模式处理表达式 a + 20 + ( b - 10 ) 时所生成的语法树

【解】

(1)E的综合属性 p,R的继承属性i,综合属性s;T的综合属性p

(2) 处理表达式 a + 20 + ( b - 10 ) 时所生成的语法树如下

+

(ID, a) +

(NUM, 20

) -

( ID, b) (NUM, 10)

例2 定义一个计算器的属性文法,完成一个输入表达式值的计算和显示,

【解】计算器的文法

L → E

E → E1 + T | T

T → T1 * F | F

F → ( E ) | digit

引进属性val ,计算器的属性文法:

L → E print( E.val )(L 的虚属性)

E → E1 + T E.val := E1.val + T.val

E → T E.val := T.val

T → T1 * F T.val := T1.val * F.val

T → F T.val := F.val

F → ( E ) F.val := E.val

F → digit F.val := digit.lexval

lexval 是单词 digit 的属性

例3给出对输入串6-3 3*5+4 的分析树与属性计算

【解】3*5+4 的分析树与属性计算

例4定义一个说明语句的属性文法

【解】说明语句的文法

D → T L

T → int

T → real

L → L1,id

L → id

要解决的问题:记录标识符的类型和类型信息传递

方法:引进属性type,和in,用T.type记录类型信息,并传给L.in,

说明语句的属性文法如下:

D → T L L.in := T.type

T → int T.type := ‘integer’

T → real T.type := ‘real’

L → L1,id L1.in := L.in

addtype( id.entry, L.in )

L → id addtype( id.entry, L.in )

entry 单词 id 的属性

addtype 在符号表中为变量填加类型信息

例5 给出输入串real id1,id2,id3 的分析树和属性计算

例6 设下列文法生成变量的类型说明

D → id L

L → , id L | : T

T → integer | real

试构造一个翻译模式,把每个标识符的类型存入符号表。

【解】解题思路

这是一个对说明语句进行语义分析的题目,不需要产生代码,但要求把每个标识符的类型填入符号表中。

解答

对D,L,T设置综合属性type。过程addtype(id,type)用来把标识符id及其类型type 填入到符号表中。

翻译模式如下:

D → id L {addtype(id.entry,L.type)}

L → ,id L1 {addtype(id.entry,L1.type);L.type:=L1.type;}

L → : T {L.type:=T.type}

T → integer {T.type:=interger}

T → real {T.type:=real}

例7文法G的产生式如下:

S → (L) | a

L → L , S | S

(1)试写出一个语法制导定义,它输出配对括号个数;

(2)写一个翻译方案,打印每个a的嵌套深度。如((a),a),打印2,1。

【解】解题思路

本题包括两部分,第1部分要求写语法制导定义,第2部分要求写翻译方案。语法制导定义(或属性文法)可以看作是关于语言翻译的高级规范说明,其中隐去实现细节,使用户从明确说明翻译顺序的工作中解脱出来。翻译方案(也称翻译模式)给出了使用语义规则进行计算的次序,把某些实现细节表示出来。读者从下面解答中可体会两者的区别。

解答

为S、L引入属性h,代表配对括号个数。语法制导定义如下:

产生式语义规则

S → (L) S.h:=L.h+1

S → a S.h:=0

L → L1 , S L.h:=L1.h+S.h

L → S L.h:=S.h

S’→S print(S.h)

(2)为S、L引入d,代表a的嵌套深度。翻译方案如下:

S’→{S.d:=0;}S

S →‘(’{L.d:=S.d+1;}

L

‘)’

S →a{print(S.d);}

L → {L1.d:=L.d;}

L1

{S.d:=L.d;}

S

L → {S.d:=L.d}

S

例8下列文法对整型常数和实型常数施用加法运算符“+”生成表达式;当两个整型数相加时,结果仍为整型数,否则,结果为实型数:

E → E+T | T

T → num.num | num

(1)试给出确定每个子表达式结果类型的属性文法。

(2)扩充(1)的属性文法,使之把表达式翻译成后缀形式,同时也能确定结果的类型。应该注意使用一元运算符inttoreal把整型数转换成实型数,以便使后缀形如加法运算符的两个操作数具有相同的类型。

【解】解题思路

确定每个子表达式结果类型的属性文法是比较容易定义的。关键是如何扩充此属性文

相关文档
最新文档