编译原理试题Word文档下载推荐.docx
- 文档编号:13183161
- 上传时间:2022-10-07
- 格式:DOCX
- 页数:15
- 大小:80.93KB
编译原理试题Word文档下载推荐.docx
《编译原理试题Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《编译原理试题Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
T-->
(E){T.p:
=E.p}
id{T.p:
=mkleaf(id,id.entry)}
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→Eprint(E.val)(L的虚属性)
E→E1+TE.val:
=E1.val+T.val
E→TE.val:
=T.val
T→T1*FT.val:
=T1.val*F.val
T→FT.val:
=F.val
F→(E)F.val:
=E.val
F→digitF.val:
=digit.lexval
lexval是单词digit的属性
例3给出对输入串6-33*5+4的分析树与属性计算
【解】3*5+4的分析树与属性计算
例4定义一个说明语句的属性文法
【解】说明语句的文法
D→TL
T→int
T→real
L→L1,id
L→id
要解决的问题:
记录标识符的类型和类型信息传递
方法:
引进属性type,和in,用T.type记录类型信息,并传给L.in,
说明语句的属性文法如下:
D→TLL.in:
=T.type
T→intT.type:
=‘integer’
T→realT.type:
=‘real’
L→L1,idL1.in:
=L.in
addtype(id.entry,L.in)
L→idaddtype(id.entry,L.in)
entry单词id的属性
addtype在符号表中为变量填加类型信息
例5给出输入串realid1,id2,id3的分析树和属性计算
例6设下列文法生成变量的类型说明
D→idL
L→,idL|:
T
T→integer|real
试构造一个翻译模式,把每个标识符的类型存入符号表。
【解】解题思路
这是一个对说明语句进行语义分析的题目,不需要产生代码,但要求把每个标识符的类型填入符号表中。
解答
对D,L,T设置综合属性type。
过程addtype(id,type)用来把标识符id及其类型type填入到符号表中。
翻译模式如下:
D→idL {addtype(id.entry,L.type)}
L→,idL1{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
=0
L→L1,S
L.h:
=L1.h+S.h
L→S
=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:
S
L→{S.d:
=L.d}
S
例8下列文法对整型常数和实型常数施用加法运算符“+”生成表达式;
当两个整型数相加时,结果仍为整型数,否则,结果为实型数:
E→E+T|T
T→num.num|num
(1)试给出确定每个子表达式结果类型的属性文法。
(2)扩充
(1)的属性文法,使之把表达式翻译成后缀形式,同时也能确定结果的类型。
应该注意使用一元运算符inttoreal把整型数转换成实型数,以便使后缀形如加法运算符的两个操作数具有相同的类型。
确定每个子表达式结果类型的属性文法是比较容易定义的。
关键是如何扩充此属性文法,使之把表达式翻译成后缀形式。
我们将不在name或num.num向T归约的时候输出该运算对象,而是把运算对象的输出放在T或E+T向E归约的时候。
这是因为考虑输出类型转换算符inttoreal的动作可能在E+T归约的时候进行,如果这时两个运算对象都在前面name或num.num向T归约的时候已输出,需要为第1个运算对象输出类型转换算符时就已经为时太晚。
还要注意的是,在E+T向E归约时,该加法运算的第1个运算对象已经输出。
所以E→E+T的语义规则不需要有输出E运算对象的动作。
(1)为文法符号E和T配以综合属性type,用来表示它们的类型。
类型值分别用int和real来表示。
确定每个子表达式结果类型的属性文法如下:
E→E1+T
{T.type:
=ifE1.type=intandT.type=intthenintelsereal
E→T
{E.type:
T→num.num
T.type:
=real
T→num
=int
(2)下面属性文法将表达式的后缀表示打印输出,其中lexeme属性表示单词的拼写。
ifE1.type=realandT.type=intthen
begin
E.type:
=real;
print(T.lexeme);
print(‘inttoreal’);
end
elseifE1.type=intandT.type=realthen
elsebegin
E.type:
=E1.type;
print(T.lexeme);
end
print(‘+’);
=T.type;
T.lexeme:
=num1.lexeme||“.”||num2.lexeme
=int;
=num.lexeme;
例9将下列语句翻译为逆波兰表示(后缀式)、三元式和四元表示:
a:
=(b+c)*e+(b+c)/f
把中缀式转换为后缀式的简单方法:
按中缀式中各运算符的优先规则,从最先执行的部分开始写,一层层套。
如a≤b+c∧a>d∨a+b≠e,先把b+c写为bc+;
然后把a≤套上去,成为abc+≤;
再把a>d表示为ad>;
然后把∧套上去,成为abc+≤ad>∧,依此类推。
四元式由4个部分组成:
算符op、第1和第2运算量arg1和arg2,以及运算结果result。
运算量和运算结果有时指用户自定义的变量,有时指编译程序引进的临时变量。
如果op是一个算术或逻辑算符,则result总是一个新引进的临时变量,用于存放运算结果。
三元式只需3个域:
op、arg1和arg2。
与四元式相比,三元式避免了临时变量的填入,而是通过计算这个临时变量的语句的位置来引用这个临时变量。
我们很容易把一个算术表达式或一个赋值句表示为四元式序列或三元式序列。
逆波兰表示为:
bc+e*bc+f/+:
=
三元式序列为:
(1)(+,b,c)
(2)(*,
(1),e)
(3)(+,b,c)
(4)(/,(3),f)
(5)(+,
(2),(4))
(6)(:
=,a,(5))
四元式序列为:
(1)(+,b,c,T1)
(2)(*,T1,e,T2)
(3)(+,b,c,T3)
(4)(/,T3,f,T4)
(5)(+,T2,T4,T5)
=,T5,-,a)
例10利用回填技术把语句
whilea>
0orb>
0do
ifc>
0andd<
0thenx:
=y+1;
翻译为三地址代码。
把表达式或赋值语句翻译为三地址代码是容易理解的,如x:
=y*z+1翻译为:
T1:
=y*z
T2:
=T1+1
x:
=T2
while语句和if语句的翻译涉及到布尔表达式,我们一并讨论。
产生布尔表达式三地址代码的语义规则如表7.1所示。
按表1的定义,每个形如ArelopB的表达式(其中relop为任一关系运算符)将被翻译为如下形式的两条转移指令:
ifArelopBgoto…
goto…
因此,假定表达式的待确定的真假出口已分别为Ltrue和Lfalse,则a>
0将被翻译为:
ifa>
0gotoLtrue
gotoL1
L1:
ifb>
gotoLfalse
而c>
0and
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 试题