编译原理作业集第六章修订.docx
《编译原理作业集第六章修订.docx》由会员分享,可在线阅读,更多相关《编译原理作业集第六章修订.docx(29页珍藏版)》请在冰豆网上搜索。
编译原理作业集第六章修订
第六章属性文法和语法制导翻译
本章要点
1.属性文法,基于属性文法的处理方法;
2.S-属性文法的自下而上计算;
3.L-属性文法的自顶向下翻译;
4.自下而上计算继承属性;
本章目标
掌握和理解属性方法、基于属性文法的处理方法、S-属性文法和自下而上计算、L-属性文法和自顶向下翻译、自下而上计算继承属性等内容。
本章重点
1.语法制导翻译基本思想。
2.语义规则的两种描述方法:
语法制导的定义和翻译方案。
语法制导的定义没有指明语义规则的计算次序,而翻译方案显式给出语义规则(或叫语义动作)的计算次序和位置。
3.基于属性文法的处理方法,综合属性定义(S属性定义)和L属性定义。
4.设计简单问题的语法制导定义和翻译方案,这是本章的重点和难点。
这种设计可看成是一种程序设计,是一种事件驱动形式的程序设计,因此它比一般的编程要难得多。
这里的事件是句子中各种语法结构的识别。
5.语义规则的三种计算方法:
分析树方法、基于规则的方法和忽略规则的方法。
6.S属性的自下而上计算(边语法分析边属性计算,忽略规则的方法)。
7.L属性的自上而下计算(边语法分析边属性计算,忽略规则的方法)。
8.递归计算(先语法分析后属性计算,基于规则的方法)。
本章难点
1.设计简单问题的语法制导定义和翻译方案;
作业题
一、单项选择题:
1.文法开始符号的所有________作为属性计算前的初始值。
a.综合属性b.继承属性c.继承属性和综合属性d.都不是
2.对应于产生式A→XY继承属性Y.y的属性计算,可能正确的语义规则是________。
a.A.a:
=f(X.x,Y.y);b.)Y.y:
=f(A.a,Y.y);c.Y.y:
=f(X.x);d.A.a:
=f(Y.y);
3.描述文法符号语义的属性有两种,一种称为____,另一种称为_____。
a.L-属性b.R-属性c.综合属性d.继承属性
4.出现在产生式________和出现在产生式________不由所给的产生式的属性计算规则进行计算,而是由其他产生式的属性规则计算或者由属性计算器的参数提供。
a.左边的继承属性;b.左边的综合属性;c.右边的综合属性;d.右边的继承属性
5.描述文法符号语义的属性,综合属性值的计算依赖于分析树中它的的属性值;
a.父结点b.子结点c.兄弟结点d.父结点与子结点e.父结点与兄弟结点
6.描述文法符号语义的属性,继承属性值的计算依赖于分析树中它的______的属性值。
a.父结点b.子结点c.兄弟结点d.父结点与子结点e.父结点与兄弟结点
7.一般来说,对出现在产生式右边的和出现在产生式左边的都必须提供一个计算规则。
a.综合属性,b.继承属性,c.L-属性,d.R-属性
8.考虑非终结符A、B和C,其中A有一个继承属性a和一个综合属性b,B有综合属性c,C有继承属性d。
产生式A→BC可能的属性计算规则中,属性要在其它地方计算,不是在本产生式的属性计算规则中计算的。
a.C.d和A.b;b.A.a和A.b;c.A.a和B.c;d.C.d和A.a
9.通常使用的方法在每一个结点处使用语义规则计算综合属性的值。
a.自顶向下,b.自底向上,c.从左到右,d.从右到左;
10.S-属性文法的计算中,设当前的栈顶由指针top指示,假设综合属性刚好在每次归约前计算的。
假定产生式为AXYZ,相应的语义规则为A.a:
=f(X.x,Y.y,Z.z)。
在把XYZ归约成A以前,属性Z.z的值放在val[top]中,Y.y的值放在val[top-1]中,X.x的值放在val[top-2]中。
归约以后,A的状态存放在中(即X的位置)。
综合属性A.a的值存放在中。
a.state[top],val[top];b.state[top-1],val[top-1];
c.state[top-2],val[top-2];d.state[top-3],val[top-3];
11.一个简单的翻译模式
E→TR
R→addopT{print(addop.lexeme)}R1|ε
T→num{print(num.val)}
addop→+|-
该文法的作用是。
a.把一个带加号和减号的前缀表达式翻译成相应的后缀表达式
b.把一个带加号和减号的后缀表达式翻译成相应的前缀表达式
c.把一个带加号和减号的后缀表达式翻译成相应的中缀表达式;
d.把一个带加号和减号的中缀表达式翻译成相应的后缀表达式;
12.有一语法制导翻译如下所示:
(第8章)
S→bAb{print“1”}
A→(B{print“2”}
A→a{print“3”}
B→Aa){print“4”}
若输入序列为b(((aa)a)a)b,则采用自下而上的分析方法,则输出是。
a.32224441b.34242421
c.12424243d.34442212
13.在属性文法中,终结符只具有属性。
a.传递b.继承c.抽象d.综合
14.设,有以下左递归翻译模式
A→A1Y{A.a:
=g(A1.a,Y.y)}
A→X{A.a:
=f(X.x)}
它的每一个文法符号都有一个综合属性,用相应的小写字母表示,g和f是任意函数。
消除左递归,再考虑语义动作,翻译模式变为:
A→X{R.i:
=f(X.x)}
R{A.a:
=R.s}
R→Y{R1.i:
=g(R.i,Y.y)}
R1
R→ε
a.{R.s:
=R1.s},{R.s:
=R.i};b.{R.s:
=R.i},{R.s:
=R1.s};
c.{R.s:
=R1.i},{R.s:
=R.s};d.{R.s:
=R.s},{R.s:
=R1.i};
15.________________可用于一遍扫描的自上而下分析,而________________则适合于一遍扫描的自下而上分析。
a.S-属性文法,L-属性文法;b.继承属性文法,综合属性文法;
c.L-属性文法,S-属性文法;d.综合属性文法,继承属性文法;
一.答案:
1.b;2.c;3.c,d;4.a,c;5.b;6.e;7.b,a;8.c;9.b;10.a;11.d;12.b;13.d;14.a;15.c;
二、填空题:
1.________属性用于“自下而上”传递信息;而________属性用于“自上而下”传递信息。
2.如果一属性文法不存在属性之间的________,那么称该文法为良定义的。
3.按照________________的编译程序模型来理解语法制导翻译方法,所谓的语法制导翻译,直观上说,就是为文法中每个_____________配上一组语义规则,并在________________的同时执行这些语义规则。
4.下面语义规则:
TT1*FTval:
=T1val*Fval
,改写成翻译模式为:
。
5.S-属性文法中的每个文法符号,只含有________属性。
6.与树遍历的属性计算方法不同,一遍扫描的处理方法是在语法分析的同时计算属性值,而不是语法分析构造语法树之后进行属性计算。
________________可用于一遍扫描的自上而下分析,而________________则适合于一遍扫描的自下而上分析。
7.已知表达式文法的一条语法规则EE1+T,对每个文法符号引入nptr属性,可以写出为该文法建立抽象语法树的、对应于这条规则的语义规则为:
。
8.在S-属性文法的基础上,LR分析器可以改造为一个翻译器,在对输入串进行语法分析的同时。
9.通过在基础文法中新引入非终结符M,加入形式为____________的新的产生式,可以使嵌入的语义动作出现在产生式的末尾。
10.属性计算规则中只能使用相应产生式中的文法符号的属性,这有助于在产生式范围内“封装”属性的依赖性。
然而,出现在产生式左边的和出现在产生式右边的
不由所给的产生式的属性计算规则进行计算,它们由其他产生式的属性规则计算或者由属性计算器的参数提供。
11.语义规则可能产生副作用(如产生代码),也可能不是变元的严格函数(入某个规则给出可用的下一个数据单元的地址)。
这样的语义规则通常写成。
12.我们可以用一个来跟踪一个标识符,看它是出现在赋值号的左边还是右边,以确定是需要这个标识符的地址还是值。
13.在自下而上语法分析中,若一个产生式匹配输入串成功,或者,在自下而上分析中,当一个产生式被用于进行归约时,,完成相关的语义分析和代码产生工作。
14.S-属性文法自下而上计算属性时,在分析栈中使用一个附加的域val来存放综合属性值。
文法符号是隐含在state中而不是存储在栈中。
当把文法符号放入栈中时,那么当第i个state对应符号为A时,val[i]中就存放。
15.对于一个属性文法,A→X1X2…XnP,其每个语义规则中的每个属性都是一个综合属性;或者,Xj(1jn)是一个继承属性,这个继承属性仅依赖于:
①
②
则,该属性文法是L-属性文法。
二.答案
1.综合,继承;2.循环依赖关系;3.一遍扫描,产生式,语法分析;4.TT1*F{Tval:
=T1val*Fval};6.L-属性文法,S-属性文法;7.Enptr:
=mknode(´+´,E1nptr,Tnptr);8.对属性进行计算;9.M→;10.继承属性,综合属性;11.过程调用或过程段;12.继承属性;13.此产生式相应的语义规则就被计算;14.语法树中与结点A对应的属性值;15.产生式中Xj的左边符号X1,X2,…Xj-1的属性;A的继承属性。
三、判断题:
1.非终结符只有综合属性,由词法分析器提供。
()
2.S—属性文法一定是L—属性文法。
()
3.只含有综合属性的属性文法是S-属性文法。
()
4.只含有继承属性的属性文法称为-L属性文法。
()
5.语法制导翻译可以基于语法分析树,也可以基于抽象语法树,两种情况所采用的基本方法是一样的。
()
6.翻译模式既适于自顶向下分析,又适于自底向上分析。
()
7.用于自顶向下分析的翻译模式,其基础文法中不能含有左递归。
()
8.在基础文法中增加标记非终结符不会导致新的语法分析冲突。
()
9.对L-属性文法,不用显式构造语法树就可以实现翻译。
()
10.在翻译模式中,和文法符号相关的属性和语义规则(语义动作),用花括号括起来,插入到产生式右部或左部的合适位置上。
()
11.语法制导定义中文法符号的一个属性,既可以是综合属性,同时又可以是继承属性。
()
12.在抽象语法树中,操作符和关键字都不作为叶子结点出现,而是把它们作为内部结点。
()
13.一般来说,语法制导翻译是基于语法分析树的,基于抽象语法树无法进行语法制导翻译。
()
14.在必要的时候引进标记非终结符,可以实现LR分析过程中对L-属性文法进行计算。
虽然任何LL
(1)文法也是LR
(1)文法,但是,当标记非终结符加入到LL
(1)文法时可能会引起分析冲突。
()
15.尽管把和文法符号相关的属性和语义动作用花括号括起来插入到了产生式右部的合适位置上,翻译模式还是不能给出使用语义规则进行计算的顺序。
三.答案:
1.×;2.;3.;4.×;5.;6.;7.;8.×;9.;10.×;11.×;12.;13.×;14.×;15.×;
四、名词解释:
1.属性,属性文法,综合属性,继承属性;
2.语法制导翻译法;
3.属性依赖图;
4.S-属性文法,L-属性文法;
5.翻译模式;
四.答案:
1.为每个文法符号(终结符或非终结符)所配备的、代表与文法符号相关信息的“值”,称为文法符号的属性。
在上下文无关文法的基础上,给每个文法符号配备相关属性,并对每个产生式配备一组称为语义规则的属性计算规则,所形成的文法称属性文法。
在一个属性文法中,对应于每个产生式A→都有一套与之相关的形式为b:
=f(c1,c2,…,ck)的语义规则,这里f是一个函数:
(1)若b是A的一个属性,且c1,c2,…,ck是产生式右边文法符号的属性,则称b是A的综合属性;
(2)若b是产生式右边某个文法符号的一个继承属性,且c1,c2,…,ck是A或者产生式右边任何文法符号的属性,则称若b是该文法符号的继承属性。
2.基于属性文法的处理过程,首先对单词符号进行语法分析,构造语法分析树,然后根据需要遍历语法树并在语法树的各结点处按语义规则进行计算。
这种由源程序的语法结构所驱动的翻译方法称语法制导翻译法。
3.把一棵语法树中的结点的继承属性和综合属性之间的相互依赖关系用一个有向图来描述,这个有向图称为属性依赖图。
4.仅仅使用综合属性的属性文法称为S-属性文法。
如果一个属性文法,其每个语义规则中文法符号的每个属性,或者是综合属性,或者是一个仅依赖于该文法符号左边符号(包括箭头左边的那个非终结符)的继承属性,则称该熟悉该属性文法是L-属性文法。
5.对于一个上下文无关文法的产生式,把和文法符号相关的属性和语义规则,用花括号{}括起来插入到产生式右部的合适位置上,从而得到语法制导翻译的另一种描述形式,称为翻译模式。
五、简答题:
1.一般情况下,为什么语义分析部分仅产生中间代码?
2.什么是语法制导翻译?
为什么把这种方法叫语法制导翻译?
3.给定一个L-属性文法,建立翻译模式要满足哪些条件?
4.什么叫基于属性文法的处理方法?
5.如何从翻译模式中去掉嵌入在产生式中间的动作?
五.答案:
1.一般情况下,语义分析部分仅产生中间代码,其原因是:
(1)可使难点分解,分别解决;
(2)可对语义分析产生的中间代码进行优化,以产生高效率的目标代码;
(3)语义分析通常与机器无关,目标代码往往与机器有关。
把语义分析与目标代码生成分开,可让一个语义分析程序适用于多个目标代码生成程序。
2.所谓语法制导翻译,是指在语法规则的指导下,通过语义规则,完成对输入符号串的翻译。
由于使用属性文法时把语法规则和语义规则分开,但在使用语法规则进行推导或归约的同时又使用这些语义规则来指导翻译与最终产生目标代码,所以称为语法制导翻译。
3.当只需要综合属性的时候,为每一个语义规则建立一个包含赋值的动作,并把这个动作放在相应的产生式右边的末尾。
如果既有综合属性又有继承属性,在建立翻译模式时要满足三个条件:
(1)产生式右边的符号的继承属性必须在这个符号以前的动作中计算出来;
(2)一个动作不能引用这个动作右边的符号的综合属性;
(3)产生式左边非终结符的综合属性只有在它所引用的所有属性都计算出来以后才能计算,计算这种属性的动作通常放在产生式右端的末尾。
六、应用题:
1.欲打印表达式(4*7+1)*2的值。
写出属性文法,根据该属性文法建立一棵带注释的分析树,并在该分析树上用箭头标出属性计算次序。
答案:
1.
产生式
语义规则
LEn
print(E.Val)
EE1+T
E.Val=E1.Val+T.Val
ET
E.Val=T.Val
TT1*F
T.Val=T1.Val+F.Val
TF
T.Val=F.Val
F(E)
F.Val=E.Val
Fdigit
F.Val=digit.lexVal
2.已知上下文无关文法:
E→E+T
E→E-T
E→T
T→(E)
T→id
T→num
已知表达式((a)+(b))。
不对文法进行修改,写出为表达式建立抽象语法树的属性文法;并画出带注释的语法分析树来描绘抽象语法树的构造。
2.答案:
产生式
语义规则
EE1+T
E.nptr:
=mknode(‘+’,E1.nptr,T.nptr)
EE1-T
E.nptr:
=mknode(‘-’,E1.nptr,T.nptr)
ET
E.nptr:
=T.nptr
T(E)
T.nptr:
=E.nptr
Tid
T.nptr:
=mkleaf(id,id.entry)
Tnum
T.nptr:
=mkleaf(num,num.val)
根据该语法制导定义建立表达式((a)+(b))的分析树和抽象语法树:
3.已知上下文无关文法:
E→E+T
E→E-T
E→T
T→(E)
T→id
T→num
已知表达式((a)+(b))。
采用自顶向下的翻译模式,写出构造抽象语法树的、消除了左递归的翻译模式,并画出带注释的语法分析树来描绘抽象语法树的构造。
3.答案:
翻译文法
EE1+T{E.val:
=E1.val+T.val}
EE1-T{E.val:
=E1.val-T.val}
ET{E.val:
=T.val}
T(E){T.val:
=E.val}
Tnum{T.val:
=num.val}
消除左递归的翻译文法:
E→T{R.i:
=T.val}
R{E.val:
=R.s}
R→+
T{R1.i:
=R.i+T.val}
R1{R.s:
=R1.s}
R→-
T{R1.i:
=R.i-T.val}
R1{R.s:
=R1.s}
R→ε{R.s:
=R.i}
T→(
E
){T.val:
=E.val}
T→num{T.val:
=num.val}
4.试给出把中缀表达式转换成没有多余括号的中缀表达式的语法制导定义。
例如,由于+和*都是左结合的,((a*(b+c))*(d))可以写成a*(b+c)*d。
4.答案;
设置下面的函数和属性:
expr1||expr2:
把表达式expr2拼写在表达式expr1后面。
deletp(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)
THENE.expr=E1.expr||'+'||deletep(T.expr)
ELSEE.expr:
=E1.expr||'+'||T.expr;
E.add:
=true;
E.pmark:
=false;
E→T
if(T.pmark==true)
THENE.expr:
=deletep(T.expr)
ELSEE.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)
THENBEGIN
F.expr:
=E.expr;
F.add:
=false;
F.pmark:
=false;
END
ELSEBEGIN
F.expr:
='('||E.expr||')';
F.add:
=true;
F.pmark:
=true;
END;
F→id
F.expr:
=id.lexval;
F.add:
=false;
F.pmark:
=false;
5.下面文法产生的表达式是对整型和实型常数应用算符+形成的。
当两个整数相加时,结果为整数,否则为实数。
E→E+T|T
T→num.num|num
(1)给出语法制导定义确定每个子表达式的类型
(2)扩充
(1)中的语法制导定义把表达式翻译成前缀形式,并且决定类型。
试用一元运算符inttoreal把整型值转换为相等的实型值,以使得前缀表达式中两个运算对象是同类型的。
5.答案:
(1)语法制导定义如下:
产生式
语义规则
E→E1+T
if(E1.type==int)AND(T.type==int)
THENE.type:
=int
ELSEE.type:
=real;
E→T
E.type:
=T.type;
T→num
T.type:
=int;
T→num.num
T.type:
=real;
(2)语法制导定义如下:
产生式
语义规则
E→E1+T
if(E1.type==int)AND(T.type==int)
THENE.type:
=int
ELSEBEGIN
E.type:
=real;
if(E1.type==int)AND(T.type==real)
THENE1.pf:
='inttoreal'||E1.pf
ELSEif(E1.type==real)AND(T.type==int)
THENT.pf:
='inttoreal'||T.pf
END;
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.num
T.type:
=real;T.pf:
=real.lexval;
6.令综合属性val给出在下面的文法中的S产生的二进制数的值(如,对于输入101.101,S.val=5.625);
S→L.L|L
L→LB|B
B→0|1
(1)试用各有关综合属性决定S.val;
(2)试用一个语法制导定义来决定S.val,在这个定义中仅有B的综合属性,设为c,它给出由B生的位对于最后的数值的分担额。
例如,在101.101中的第一位和最后一位对于值5.625的分担额分别为4和0.125。
6.答案;
题意是要求把二进制数串(可以带小数点)翻译为等值的十进制数值。
用综合属性S.val,L.val,B.val表示S,L和B的十进制值。
综合属性S.val,L.val,B.val表示S,L和B的十进制值,综合属性L.length计二进制数串的位数,用L2.val/2L2.length得到小数部分的十进制值。
(1)用综合属性决定s.val的语法制导定义:
产生式
语义规则
S→L
S.val:
=L.val;
S→L1.L2
S.val:
=L1.val+L2.val/2L2.length
L→B
L.val:
=B.val;L.length:
=1
L→L1B
L.val:
=L1.val*2+B.val;
L.length:
=L1.length+1;