编译原理作业集-第六章-修订(精选.)
第六章属性文法和语法制导翻译
本章要点
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指示,假设综合属性刚好在每次归约前计算的。假定产生式为A XYZ,相应的语义规则为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→addop T {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. 32224441
b. 34242421
c. 12424243
d. 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. 下面语义规则:
T→T1*F T?val:=T1?val*F?val
,改写成翻译模式为:。
5. S-属性文法中的每个文法符号,只含有________属性。
6. 与树遍历的属性计算方法不同,一遍扫描的处理方法是在语法分析的同时计算属性值,而不是语法分析构造语法树之后进行属性计算。________________可用于一遍扫描的自上而下分析,而________________则适合于一遍扫描的自下而上分析。
7. 已知表达式文法的一条语法规则E→E1+T,对每个文法符号引入nptr属性,可以写出为该文法建立抽象语法树的、对应于这条规则的语义规则为:。
8. 在S-属性文法的基础上,LR分析器可以改造为一个翻译器,在对输入串进行语法分析的同时。
9. 通过在基础文法中新引入非终结符M,加入形式为____________的新的产生式,可以使嵌入的语义动作出现在产生式的末尾。
10. 属性计算规则中只能使用相应产生式中的文法符号的属性,这有助于在产生式范围内“封装”属性的依赖性。然而,出现在产生式左边的和出现在产生式右边的不由所给的产生式的属性计算规则进行计算,它们由其他产生式的属性规则计算或者由属性计算器的参数提供。
11. 语义规则可能产生副作用(如产生代码),也可能不是变元的严格函数(入某个规则给出可用的下一个数据单元的地址)。这样的语义规则通常写成。
12. 我们可以用一个来跟踪一个标识符,看它是出现在赋值号的左边还是右边,以确定是需要这个标识符的地址还是值。
13. 在自下而上语法分析中,若一个产生式匹配输入串成功,或者,在自下而上分析中,当一个产生式被用于进行归约时,,完成相关的语义分析和代码产生工作。
14. S-属性文法自下而上计算属性时,在分析栈中使用一个附加的域val来存放综合属性值。文法符号是隐含在state中而不是存储在栈中。当把文法符号放入栈中时,那么当第i个state 对应符号为A时,val[i]中就存放。
15. 对于一个属性文法,?A→X1X2…X n∈P, 其每个语义规则中的每个属性都是一个综合属性;或者,X j(1≤j ≤ n)是一个继承属性,这个继承属性仅依赖于:
①
②
则,该属性文法是L-属性文法。
二.答案
1. 综合,继承;
2. 循环依赖关系;
3. 一遍扫描,产生式,语法分析;
4. T→T1*F {T?val:=T1?val*F?val};6. L-属性文法,S-属性文法;7. E?nptr :=mknode(′+′,E1 ? nptr,T ?nptr);8. 对属性进行计算;9. M→ε;10. 继承属性,综合属性;11. 过程调用或过程段;12. 继承属性;
13. 此产生式相应的语义规则就被计算;14. 语法树中与结点A对应的属性值;15. 产生式中X j的左边符号X1,X2,…X j-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,…,c k)的语义规则,这里f是一个函数:
(1)若b是A的一个属性,且c1,c2,…,c k是产生式右边文法符号的属性,则称b 是A的综合属性;
(2)若b是产生式右边某个文法符号的一个继承属性,且c1,c2,…,c k是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的值。写出属性文法,根据该属性文法建立一棵带注释的分析树,并在该分析树上用箭头标出属性计算次序。
产生式语义规则
L→En print(E.Val)
E→E1+T E.Val=E1.Val+T.Val
E →T E.Val=T.V al
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
2. 已知上下文无关文法:
E→E+T
E→E-T
E→T
T→(E)
T→id
T→num
已知表达式((a)+(b))。不对文法进行修改,写出为表达式建立抽象语法树的属性文法;并画
出带注释的语法分析树来描绘抽象语法树的构造。
产生式语义规则
E→E1+T E.nptr:=mknode(‘+’,E1.nptr,T.nptr)
E → E1-T E.nptr :=mknode(‘-’,E1.nptr,T.nptr)
E → T E.nptr :=T.nptr
T →(E) T.nptr :=E.nptr
T → id T.nptr :=mkleaf(id,id.entry)
T → num 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. 答案:翻译文法
E→E1+T {E.val:=E1.val+T.val}
E→E1-T {E.val:=E1.val-T.val}
E→T {E.val:=T.val}
T→(E) {T.val:=E.val}
T→num {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)
THEN E.expr=E1.expr||'+'||deletep(T.expr)
ELSE E.expr:=E1.expr||'+'||T.expr;
E.add:=true;
E.pmark:=false;
E → T if(T.pmark==true)
THEN E.expr:=deletep(T.expr)
ELSE E.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)
THEN BEGIN
F.expr:=E.expr;
F.add:=false;
F.pmark:=false;
END
ELSE BEGIN
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)语法制导定义如下:
(2)语法制导定义如下:
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
二进制数串101.101的语法树及自下而上翻译过程,归约时执行语义规则。
S.v= 5.625(=5+5/8)
L.v= 5 ; . L.v=5;
L.v=2 ; B.v=1
L.v=2; B.v=1
L.v=1; B.v=0
L.v= 1 ; B.v=0 B.v=1 B.v=1 1
1
1
1
(2)分析:设B.c 是B 的综合属性,是B 产生的位对最终值的贡献。要求出B.c ,必须求出B 产生位的权,设B.i 。B.i 的求法请参看下面的图示:
另外,设L.fi为继承因子,L.fs为综合因子,语法制导定义如下:
产生式语义规则
S → L L.i:=1; L.fi:=2; L.fs:=1; S.val:=L.val;
S → L1.L2L1.i=1; L1.fi=2; L1.fs:=1;
L2.i=2-1; L2.fi=1; L2.fs:=2-1; S.val:=L1.val+L2.val;
L → B L.s:=L.i; B.i:=L.s; L.val:=B.c;
L → L1B L1.i:=L.i*L1.fi; L.s:=L1.s*L1.fs; B.i:=L.s;
L.val:=L1.val+B.c;
B → 0 B.c:=0;
B → 1 B.c:=B.i;
若把文法改写成如下形式,则语法制导定义会更清楚:S → L.R | L
L → LB | B
R → Rb | B
B → 0 | 1
产生式语义规则
S → L L.i:=1; S.val:=L.val;
S → L.R L.i=1; R.i=2-1; S.val:=L.val+R.val;
L → L1B B.i:=L.i; L1.i:=L.i*2; L.val:=L1.val+B.c;
7. 已知变量声明语句的上下文无关文法:
D→TL T→int T→real L→L 1,id L→id
定义一个继承属性来完成类型信息的传递,已知输入串real id1,id2,id3,给出带注释的语法分析树,画出属性依赖图,并给出属性计算过程。 7. 答案:
D 1addtype 过程 引入虚属性
L.attr:=addtype(L.in, id.entry)
8.
已知变量声明语句的上下文无关文法:
D→TL
T→int
T→rea l
L→L1,id
L→id
定义一个综合属性来完成类型信息的传递,已知输入串real id1,id2,id3,给出带注释的语法分析树,画出属性依赖图,并给出属性计算过程。
8. 答案:
9. 下面文法产生的表达式是对整型和实型常数应用算符+形成的。当两个整数相加时,结果为整数,否则为实数。
E→E+T | T
T→num.num | num
(1)给出语法制导定义确定每个子表达式的类型,并消除属性文法的左递归;
(2)扩充(1)中的语法制导定义把表达式翻译成前缀形式,并且决定类型。试用一元运算符inttoreal把整型值转换为相等的实型值,以使得前缀表达式中两个运算对象是同类型的。并消除文法左递归。
9. 答案:(1)
(2)
注:R.ipf是R
10. 给出一个检查同一个标识符不在标识符表中出现两次的翻译模式。
10. 答案:设计两个函数lookup(name)和enter(name,type)。lookup(name)查找符号表,若查到,则返回name在符号表中的地址;否则返回NULL。enter(name,type)在符号表中建立name 的符号表项,并填写上name的类型type。翻译模式如下:
D →T {L.in:=T.type} L
L → {L1.in:=L.in}
L1,id {if(lookup(https://www.360docs.net/doc/d47752543.html,))
then error
else enter(https://www.360docs.net/doc/d47752543.html,,L.in)}
L → id {if(lookup(https://www.360docs.net/doc/d47752543.html,))
then error
else enter(https://www.360docs.net/doc/d47752543.html,,L.in)}
T → int {T.type:=int}
T → real {T.type:=real}
11. 假设说明是由下列文法产生的:
D→id L
L→,id L|:T
T→ingeger |real
(1)建立一个翻译模式,把每一个标识符的类型加入到符号表中。
(2)从(1)中的翻译模式构造一个预翻译程序。
11.答案:(1) 翻译模式如下:
D → id L {addtype(id.entry,L.type)}
L → , id L1 {L.type:=L1.type; addtype(id.entry,L.type)}
L → : T {L.type:=T.type}
T → integer {T.type:=integer}
T → real {T.type:=real}
(2) 预测翻译程序由如下过程组成:
PROCEDURE D;
V AR L.type:(integer,real);
id.entry:^id-entry;
BEGIN
id.entry:=id.lexval;
match(id);
L.type:=L;
addtype(id.entry,L.type)
END;
FUNCTION L:(integer,real);
V AR L.type,L1.type:(integer,real);
id.entry:^id-entry;
BEGIN
if(lookahead==',')
THEN BEGIN
match(',');
match(id);
id.entry:=id.lexval;
L1.type:=L;
L.type:=L1.type;
addtype(id.entry,L.type);
END
ELSE BEGIN
match(':');
L.type:=T;
END;
return(L.type);
END;
FUNCTION T:(integer,real);
V AR T.type:(integer,real);
BEGIN
if(lookahead=='integer')
THEN BEGIN
match(integer);
T.type:=id.lexval
END
ELSE
if(lookahead=='real')
THEN BEGIN
match(real);
T.type:=id.lexval;
END;
ELSE ERROR;
return (T.type);
END;
12.
下面的文法是上表中上下文无关文法的无二义性形式,其中的花括号{}只用于把盒子分组,并将在翻译过程中被消除。
S→L
L→LB|B
B→B sub F|F
F→{L}|text
(1)用上面的文法修改上表中的语法制导定义。
(2)把(1)中的语法制导定义转化成翻译模式。
(3)消除翻译模式中的左递归。
12. (1) 对于F1 sub F2 sub F3,其最左推导和分析树如下:
S => L
=> B
=> B sub F3
=> B sub F2 sub F3
=> F1 sub F2 Sub F3
显然,F3.ps:=shrink(F2.ps);
F2.ps:=shrink(F1.ps);
为此,为B
产生式语义规则
S → L L.ps:=10; S.ht:=L.ht;
L → B B.ps:=L.ps; L.ht:=B.ht;
L → L1B L1.ps:=L.ps; B.ps:=L.ps; L.ht:=max(L1.ht,B.ht);
B → B1 sub F B1.ps:=B.ps; F.ps:=shrink(B1.pt);
B.ht:=disp(B1.ht,F.ht);
B.pt:=F.ps;
B → F F.ps:=B.ps; B.ht:=F.ht;
B.pt:=B.ps;
F → {L} L.ps:=F.ps; F.ht:=L.ht;
F → text F.ht:=text.h*F.ps
(2) 翻译模式如下:
S → {L.ps:=10} L {S.ht:=L.ht}
L → {B.ps:=L.ps} B {L.ht:=B.ht}
L → {L1.ps:=L.ps} L1 {B.ps:=L.ps} B {L.ht:=max(L1.ht,B.ht)}
B →{B1.ps:=B.ps} B1 sub {F.ps:=shrink(B1.pt)} F {B.ht:=disp(B1.ht,F.ht);
B.pt:=F.ps}
B → {F.ps:=B.ps} F {B.ht:=F.ht; B.pt:=B.ps}
F → {L.ps:=F.ps} {L}{F.ht:=L.ht}
F → text {F.ht:=text.h*F.ps}
(3)S → {L.ps:=10; L.iht:=0} L {S.ht:=L.ht}
L → {B.ps:=L.ps} B {L.ht:=max(L.iht,B.ht)}
L → {B.ps:=L.ps} B {L1.iht:=max(L.iht,B.ht); L1.ps:=L.ps} L1 {L.ht:=L1.ht}
B → {F.ps:=B.ps} F sub {B1.ps:=shrink(B.ps)} B1 {B.ht:=disp(F.ht,B1.ht)}
B → {F.ps:=B.ps} F {B.ht:=F.ht}
F → {L.ps:=F.ps} {L} {F.ht:=L.ht}
F → text {F.ht:=text.h*F.ps}
13. 自定向下翻译模式中,有下面翻译模式:
A→A1Y {A.a:=g(A1.a,Y.y)}
A→X {A.a:=f(X.x)}
该翻译模式消除左递归后变为:
A→X { R.i:=f(X.x) }
R { A.a:=R.s }
R→Y { R1.i:=g(R.i,Y.y) }
R1 { R.s:=R1.s }
R→ε{ R.s:=R.i }
下面要求扩充上面消除左递归的转换,使上面的翻译模式中的非终结符号A允许:(1)由复写规则决定的继承属性。
(2)继承属性。
13. 答案:
(a) 假设基础文法含左递归的翻译模式如下:
A → {A1.i:=A.i} A1 {Y.i:=A.i} Y {A.a:=g(A1.a,Y.y)}
A → {X.i:=A.i} X {A.a:=f(X.x)}
消除基础文法左递归后的翻译模式如下:
A → {X.i:=A.i} X {R.i:=f(X.x); R.yi:=A.i} R {A.a:=R.s}
R → {Y.i:=R.yi} Y {R1.i:=g(R.i,Y.y); R1.yi:=R.yi} R1 {R.s:=R1.s}
R →ε {R.s:=R.i}
属性R.yi用于传递A.i给Y。
(b) 设基础文法含左递归的翻译模式如下:
A-> {A1.i:=h1(A.i)} A1 {y.i:=h2(A.i)} Y {A.a:=g(A1.a,Y.y)}
A → {X.i:=h3(A.i)} X {A.a:=f(X.x)}
考虑XY1Y2Y1,其继承属性的计算如下:
消除基础文法中的左递归后,基础文法为:
A → XR
R →YR | ε
继承属性的计算如下图所示:
编译原理第一章习题解答(可编辑修改word版)
第一章习题解答 2.编译程序有哪些主要构成成分?各自的主要功能是什么? 编译程序的主要构成成分有:词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序、表格管理程序及出错处理程序。 (1)词法分析程序:从左到右扫描源程序,识别单词及其有关属性; (2)语法分析程序:分析源程序的结构, 判别它是否为相应程序设计语言中的一个合法程序; (3)语义分析程序:审查源程序有无语义错误,为代码生成阶段收集类型信息; (4)中间代码生成程序:将源程序变成一种内部表示形式; (5)代码优化程序:对前阶段产生的中间代码进行变换或进行改造,使生成的目标代码更为高效; (6)目标代码生成程序:把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码; (7)表格管理程序:保存编译过程中的各种信息; (8)出错处理程序:若编译过程中发现源程序存在错误,则报告错误的性质和错误发生的地点,有些还可以自动校正错误。 3.什么是解释程序?它与编译程序的主要不同是什么? 解释程序接受某个语言的程序并立即运行这个源程序。它的工作模式是一个个的获取、分析并执行源程序语句,一旦第一个语句分析结束,源程序便开始运行并且生成结果,它特别适合程序员交互方式的工作情况。 而编译程序是一个语言处理程序,它把一个高级语言程序翻译成某个机器的汇编或二进制代码程序,这个二进制代码程序再机器上运行以生成结果。 它们的主要不同在于:解释程序是边解释边执行,解释程序运行结束即可得到该程序的运行结果,而编译程序只是把源程序翻译成汇编或者二进制程序,这个程序再执行才能得到程序的运行结果。(当然还有其他不同,比如存储组织方式不同)
编译原理56章作业答案
第五章 练习5.1.1: 对于图5-1中的SDD,给出下列表达式对应的注释语法分析树: 1)(3+4)*(5+6)n 练习5.2.4: 这个文法生成了含“小数点”的二进制数: S->L.L|L L->LB|B B->0|1 设计一个L属性的SDD来计算S.val,即输入串的十进制数值。比如,串101.101应该被翻译为十进制的5.625。提示:使用一个继承属性L.side来指明一个二进制位在小数点的哪一边。 答: 元文法消除左递归后可得到文法: S->L.L|L L->BL’ L’->BL’|ε B->0|1 使用继承属性L.side指明一个二进制位数在小数点的哪一边,2表示左边,1表示右边 使用继承属性m记录B的幂次 非终结符号L和L’具有继承属性inh、side、m和综合属性syn
练习5.3.1:下面是涉及运算符+和整数或浮点运算分量的表达式文法。区分浮点数的方法是看它有无小数点。 E-〉E+T|T T-〉num.num|num 1)给出一个SDD来确定每个项T和表达式E的类型 2)扩展(1)中得到的SDD,使得它可以把表达式转换成为后缀表达式。使用一个单目运算符intToFloat把一个整数转换为相等的浮点数 答: 练习5.4.4:为下面的产生式写出一个和例5.10类似的L属性SDD。这里的每个产生式表
示一个常见的C语言中的那样的控制流结构。你可能需要生成一个三地址语句来跳转到某个标号L,此时你可以生成语句goto L 1)S->if (C) S1 else S2 2)S->do S1 while (C) 3)S->’{’ L ‘}’; L -> LS|ε 请注意,列表中的任何语句都可以包含一条从它的内部跳转到下一个语句的跳转指令,因此简单地为各个语句按序生成代码是不够的。 第六章 练习6.1.1:为下面的表达式构造DAG ((x+y)-((x+y)*(x-y)))+((x+y)*(x-y)) 答:DAG如下
编译原理作业答案
编译原理作业答案 Document serial number【UU89WT-UU98YT-UU8CB-UUUT-UUT108】
《编译原理》第一次作业参考答案 一、下列正则表达式定义了什么语言(用尽可能简短的自然语言描述) 1.b*(ab*ab*)* 所有含有偶数个a的由a和b组成的字符串. 2.c*a(a|c)*b(a|b|c)* | c*b(b|c)*a(a|b|c)* 答案一:所有至少含有1个a和1个b的由a,b和c组成的字符串. 答案二:所有含有子序列ab或子序列ba的由a,b和c组成的字符串. 说明:答案一要比答案二更好,因为用自然语言描述是为了便于和非专业的人员交 流,而非专业人员很可能不知道什么是“子序列”,所以相比较而言,答案一要更 “自然”. 二、设字母表∑={a,b},用正则表达式(只使用a,b,?,|,*,+,)描述下列语言: 1.不包含子串ab的所有字符串. b*a* 2.不包含子串abb的所有字符串. b*(ab)* 3.不包含子序列abb的所有字符串. b*a*ba* 注意:关于子串(substring)和子序列(subsequence)的区别可以参考课本第119页方框中的内容. ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ 《编译原理》第二次作业参考答案
一、考虑以下NFA: 1.这一NFA接受什么语言(用自然语言描述) 所有只含有字母a和b,并且a出现偶数次或b出现偶数次的字符串. 2.构造接受同一语言的DFA. 答案一(直接构造通常得到这一答案): 答案二(由NFA构造DFA得到这一答案): 二、正则语言补运算
编译原理第4章作业答案
编译原理第4章作业 答案 本页仅作为文档封面,使用时可以删除 This document is for reference only-rar21year.March
第四章 习题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’)={),$} ③构建预测分析表
编译原理作业
编译原理作业 P7:1.1;1.2自编2.1;2.2自编2.3;2.4自编2.5自编3.1 自编3.2自编3.3;3.4P100.4.1;4.2自编4.3;4.4自编5.1 自编5.2自编7.1;7.2 自编8.1 P7:1.1 P7;1.2 自编2.1 文法G[S]:S→xSx│y所识别的语言是。 a. xyx b. (xyx)* c. x n yx n(n≥0) d. x*yx* 【解答】 自编2.2 令文法G[N]为 G[N]: N→D∣ND D→0∣1∣2∣3∣4∣5∣6∣7∣8∣9 (1) G[N]的语言L(G)是什么? (2) 给出句子0127、34和568的最左推导和最右推导。 【解答】 自编2.3 对于文法G[S]: S→(L)∣aS∣a L→L, S∣S (1) 画出句型(S,(a))的语法树; (2) 写出上述句型的所有短语、直接短语、句柄。 【解答】 自编2.4 已知文法G[S]为S→SaS∣ε,试证明文法G[S]为二义文法。 【解答】 自编2.5 按指定类型,给出语言的文法。 (1) L={a i b j│j>i≥1}的上下文无关文法; (2) 字母表∑={a,b}上的同时只有奇数个a和奇数个b的所有串的集合的正规文法;
自编3.1 什么是扫描器?扫描器的功能是什么? 自编3.2 结合自动机证明:正规式(ab)*a与正规式a(ba)*是否等价?给出分析过程。 自编3.3 已知自动机DFA如图3-4所示 图3-4 DFA 写出其对应的语言,分别用正规文法和自然语言描述。 【解答】 自编3.4 设有L(G)={a2n+1b2m a2p+1| n≥0,p≥0,m≥1}。 (1) 给出描述该语言的正规表达式; (2) 构造识别该语言的确定有限自动机(可直接用状态图形式给出)。【解答】 P100:4.1 P100;4.2 自编4.3 在算符优先分析法中,为什么要在找到最左素短语的尾时才返回来确定其对应的头,能否按扫描顺序先找到头后再找到对应的尾,为什么? 【解答】 自编4.4 设有文法G[S]: S→a|b|(A) A→SdA|S (1) 构造算符优先关系表;
编译原理第1章
第一章编译概述 2.典型的编译程序可划分为几部分?各部分的主要功能是什么?每部分都是必不可少的吗? 答:编译程序主要由词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序、信息表管理程序、错误检查处理程序组成。 各部分的主要功能如下: 词法分析程序又称扫描器。进行词法分析时,依次读入源程序中的每个字符,依据语言的构词规则,识别出一个个具有独立意义的最小语法单元,即“单词”,并用某个单词符号来表示每个单词的词性是标识符、分界符还是数; 语法分析程序的功能是:对词法分析的结果,根据语言规则,将一个个单词符号组成语言的各种语法类; 语义分析的功能是确定源程序的语义是否正确; 中间代码生成程序的功能是将源程序生成一种更易于产生、易于翻译成目标程序的中间代码; 代码优化程序的功能是将中间代码中重复和冗余部分进行优化,提高目标程序的执行效率; 目标代码生成程序的功能是将中间代码生成特定机器上的机器语言代码; 符号表管理程序的功能是记录源程序中出现的标识符,并收集每个标识符的各种属性信息; 错误处理程序的功能是应对在编译各个阶段中出现的错误做适当的处理,从而使编译能够继续进行。 编译程序的每部分都是必不可少的。 3.解释方式和编译方式的区别是什么? 答:解释方式最终并不生成目标程序,这是编译方式与解释方式的根本区别。解释方式很适合于程序调试,易于查错,在程序执行中可以修改程序,但与编译方式相比,执行效率太低。 4.论述多遍扫描编译程序的优缺点? 答:优点:(1)可以减少内存容量的需求,分遍后,以遍为单位分别调用编译的各个子程序,各遍程序可以相互覆盖;(2)可使各遍的编译程序相互独立,结构清晰;(3)能够进行充分的优化,产生高质量的目标程序;(4)可将编译程序分为“前端”和“后端”,有利于编译程序的移植。 缺点是每遍都要读符号、送符号,增加了许多重复性工作,降低了编译效率。
编译原理 第一章 习题解答
第一章习题解答 2.编译程序有哪些主要构成成分?各自的主要功能是什么? 编译程序的主要构成成分有:词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序、表格管理程序及出错处理程序。 (1)词法分析程序:从左到右扫描源程序,识别单词及其有关属性; (2)语法分析程序:分析源程序的结构, 判别它是否为相应程序设计语言中的一个合法程序; (3)语义分析程序:审查源程序有无语义错误,为代码生成阶段收集类型信息; (4)中间代码生成程序:将源程序变成一种内部表示形式; (5)代码优化程序:对前阶段产生的中间代码进行变换或进行改造,使生成的目标代码更为高效; (6)目标代码生成程序:把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码; (7)表格管理程序:保存编译过程中的各种信息; (8)出错处理程序:若编译过程中发现源程序存在错误,则报告错误的性质和错误发生的地点,有些还可以自动校正错误。 3.什么是解释程序?它与编译程序的主要不同是什么? 解释程序接受某个语言的程序并立即运行这个源程序。它的工作模式是一个个的获取、分析并执行源程序语句,一旦第一个语句分析结束,源程序便开始运行并且生成结果,它特别适合程序员交互方式的工作情况。 而编译程序是一个语言处理程序,它把一个高级语言程序翻译成某个机器的汇编或二进制代码程序,这个二进制代码程序再机器上运行以生成结果。 它们的主要不同在于:解释程序是边解释边执行,解释程序运行结束即可得到该程序的运行结果,而编译程序只是把源程序翻译成汇编或者二进制程序,这个程序再执行才能得到程序的运行结果。(当然还有其他不同,比如存储组织方式不同)
编译原理作业答案
《编译原理》第一次作业参考答案 一、下列正则表达式定义了什么语言(用尽可能简短的自然语言描述)? 1.b*(ab*ab*)* 所有含有偶数个a的由a和b组成的字符串. 2.c*a(a|c)*b(a|b|c)* | c*b(b|c)*a(a|b|c)* 答案一:所有至少含有1个a和1个b的由a,b和c组成的字符串. 答案二:所有含有子序列ab或子序列ba的由a,b和c组成的字符串. 说明:答案一要比答案二更好,因为用自然语言描述是为了便于和非专业的人员交流,而非专业人员很可能不知道什么是“子序列”,所以相比较而言,答案一要更“自然”. 二、设字母表∑={a,b},用正则表达式(只使用a,b, ,|,*,+,?)描述下列语言: 1.不包含子串ab的所有字符串. b*a* 2.不包含子串abb的所有字符串. b*(ab?)* 3.不包含子序列abb的所有字符串. b*a*b?a* 注意:关于子串(substring)和子序列(subsequence)的区别可以参考课本第119页方框中的内容. ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ 《编译原理》第二次作业参考答案 一、考虑以下NFA: 1.这一NFA接受什么语言(用自然语言描述)? 所有只含有字母a和b,并且a出现偶数次或b出现偶数次的字符串. 2.构造接受同一语言的DFA. 答案一(直接构造通常得到这一答案):
答案二(由NFA构造DFA得到这一答案): 二、正则语言补运算 3.画出一个DFA,该DFA恰好识别所有不含011子串的所有二进制串. 1.画出一个DFA,该DFA恰好识别所有不含011子串的所有二进制串.
编译原理课后习题答案+清华大学出版社第二版
第 1 章引论 第1 题 解释下列术语: (1)编译程序 (2)源程序 (3)目标程序 (4)编译程序的前端 (5)后端 (6)遍 答案: (1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。 (2)源程序:源语言编写的程序称为源程序。 (3)目标程序:目标语言书写的程序称为目标程序。 (4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶 段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符 号表管理等工作。 (5)后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。 (6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。 第2 题 一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。 答案: 一个典型的编译程序通常包含8个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。其各部分的主要功能简述如下。 词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。 语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。 语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。 中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式的中间语言代码,如三元式或四元式。 中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。
编译原理作业集-第七章
第七章语义分析和中间代码产生 本章要点 1. 中间语言,各种常见中间语言形式; 2. 说明语句、赋值语句、布尔表达式、控制语句等的翻译; 3. 过程调用的处理; 4. 类型检查; 本章目标 掌握和理解中间语言,各种常见中间语言形式;各种语句到中间语言的翻译;以及类型检查等内容。 本章重点 1.中间代码的几种形式,它们之间的相互转换:四元式、三元式、逆波兰表示; 3.赋值语句、算术表达式、布尔表达式的翻译及其中间代码格式; 4.各种控制流语句的翻译及其中间代码格式; 5.过程调用的中间代码格式; 6.类型检查; 本章难点 1. 各种语句的翻译; 2. 类型系统和类型检查; 作业题 一、单项选择题: 1. 布尔表达式计算时可以采用某种优化措施,比如A and B用if-then-else可解释为_______。 a. if A then true else B; b. if A then B else false; c. if A then false else true; d. if A then true else false; 2. 为了便于优化处理,三地址代码可以表示成________。 a. 三元式 b. 四元式 c. 后缀式 d. 间接三元式 3. 使用三元式是为了________:
a. 便于代码优化处理 b. 避免把临时变量填入符号表 c. 节省存储代码的空间 d. 提高访问代码的速度 4. 表达式-a+b*(-c+d)的逆波兰式是________。 a. ab+-cd+-*; b. a-b+c-d+*; c. a-b+c-d+*; d. a-bc-d+*+; 5. 赋值语句x:=-(a+b)/(c-d)-(a+b*c)的逆波兰式表示是_______。 a. xab+cd-/-bc*a+-:=;a. xab+/cd-bc*a+--:=;a. xab+-cd-/abc*+-:=;a. xab+cd-/abc*+--:=; 6. 在一棵语法树中结点的继承属性和综合属性之间的相互依赖关系可以由________来描述。 a. 抽象语法树; b. 语法规则; c. 依赖图; d. 三地址代码; 7. 按照教材中的约定,三地址语句if x relop y then L表示成四元式为。 a. (relop,x,y,L); b. (relop,L,x,y); c. (relop,x,L,y); d. (L,x,y,relop); 8. 在编译程序中,不是常见的中间语言形式。 a.波兰式; b. 三元式; c. 四元式; d. 抽象语法树; 9. 在编译程序中安排中间代码生成的目的是________。 a. 便于提高编译效率; b. 便于提高分析的正确性; c. 便于代码优化和目标程序的移植; d.便于提高编译速度; 10. 按照教材中的约定,下面不是类型表达式: a. boolean; b. type-error; c. real; d. DAG; 11. 一个Pascal函数 function f ( a, b:char ) :↑integer; …… 其作用域类型是: a. char×integer; b. char×char; c. char×pointer(integer); d. integer×integer; 12. 因为标识符可用于多种情况,比如常量标识符、变量标识符、过程标识符等等。因此,在符号表中为了给出各个符号的标志,常给标识符引入一个属性kind,然后在相应产生式的语义动作中添加给kind属性赋值的语句。比如,在在产生式D id:T的语义动作中添加赋值语句id.kind= 。 a. V AR; b. CONSTANT; c. PROC; d. FUNC; 13. 下面情况下,编译器需要创建一张新的符号表。 a. 过程调用语句; b. 标号说明语句; c. 数组说明语句; d.记录说明语句; 14. 函数function f(a,b:char):↑integer;… 所以f函数的类型表达式为: a. char×char→pointer(integer); b. char×char→pointer; c. char×char→integer; d. char×char→integer (pointer) 15. 如果一个语言的编译器能保证编译通过的程序,在运行时不会出现类型错误,则称该语言是。 a. 静态的; b. 强类型的; c. 动态的; d. 良类型的; 一.答案:1. b;2. d;3. b;4. d;5. c;6. c.;7. a;8. a;9. c;10. d;11. b;12. a;13. d; 14. a;15. b;
编译原理作业参考答案
第1章引言 1、解释下列各词 源语言:编写源程序的语言(基本符号,关键字),各种程序设计语言都可以作为源语言。 源程序: 用接近自然语言(数学语言)的源语言(基本符号,关键字)编写的程序,它是翻译程序处理的对象。 目标程序: 目标程序是源程序经过翻译程序加工最后得到的程序。目标程序 (结果程序)一般可由计算机直接执行。 低级语言:机器语言和汇编语言。 高级语言:是人们根据描述实际问题的需要而设计的一个记号系统。如同自然语言(接近数学语言和工程语言)一样,语言的基本单位是语句,由符号组和一组用来组织它们成为有确定意义的组合规则。 翻译程序: 能够把某一种语言程序(源语言程序)改变成另一种语言程序(目 标语言程序),后者与前者在逻辑上是等价的。其中包括:编译程序,解释程序,汇编程序。 编译程序: 把输入的源程序翻译成等价的目标程序(汇编语言或机器语言), 然后再执行目标程序(先编译后执行),执行翻译工作的程序称为编译程序。 解释程序: 以该语言写的源程序作为输入,但不产生目标程序。按源程序中语句动态顺序逐句的边解释边执行的过程,完成翻译工作的程序称为解释程序。 2、什么叫“遍” 指对源程序或源程序的中间形式(如单词,中间代码)从头到尾扫描一次,并作相应的加工处理,称为一遍。
3、简述编译程序的基本过程的任务。 编译程序的工作是指从输入源程序开始到输出目标程序为止的整个过程,整个过程可以划分5个阶段。 词法分析:输入源程序,进行词法分析,输出单词符号。 语法分析:在词法分析的基础上,根据语言的语法规则把单词符号串分解成各类语法单位,并判断输入串是否构成语法正确的“程序”。 中间代码生成:按照语义规则把语法分析器归约(或推导)出的语法单位翻译成一定形式的中间代码。 优化:对中间代码进行优化处理。 目标代码生成:把中间代码翻译成目标语言程序。 4、编译程序与解释程序的区别 编译程序生成目标程序后,再执行目标程序;然而解释程序不生成目标程序,边解释边执行。 5、有人认为编译程序的五个组成部分缺一不可,这种看法正确吗 编译程序的5个阶段中,词法分析,语法分析,语义分析和代码生成生成是必须完成的。而中间代码生成和代码优化并不是必不可少的。优化的目的是为了提高目标程序的质量,没有这一部分工作,仍然能够得到目标代码。 6、编译程序的分类 目前基本分为:诊断编译程序,优化编译程序,交叉编译程序,可变目标编译程序。
编译原理课程作业
编译原理课程作业 一、单选题 1. (4分)文法G所描述的语言是______的集合。 A. 文法G的字符表V中所有符号组成的符号串 B. 文法G的字符表V的闭包V*中的所有符号串 C. 由文法的识别符号推出的所有符号串 D. 由文法的识别符号推出的所有终结符号串 得分:0 知识点:第六章 收起解析 答案 D 解析 第六章属性文法 2. (4分)在LR 分析法中,分析栈中存放的状态是识别规范句型_____的DFA 状态。 A. 句柄 B. 前缀 C. 活前缀 D. LR(0) 项目 得分:0 知识点:第五章 收起解析 答案 C 解析 第五章LR分析法 3. (4分)下面关于解释程序的描述正确的是____. (1) 解释程序的特点是处理程序时不产生目标代码(2) 解释程序适用于COBOL 和FORTRAN 语言(3) 解释程序是为打开编译程序技术的僵局而开发的 A. (1)(2) B. (1) C. (1)(2)(3) D. (2)(3) 得分:0 知识点:第一章 收起解析 答案 B 解析 第一章绪论
4. (4分)动态存储分配可采用的分配方案是()。 A. 队式存储分配 B. 栈式存储分配 C. 线性存储分配 D. 链式存储分配 得分:0 知识点:第八章 收起解析 答案 B 解析 第八章存储空间组织 5. (4分)正规式M 1 和M 2 等价是指_____。 A. M1和M2的状态数相等 B. M1和M2的有向边条数相等 C. M1和M2所识别的语言集相等 D. M1和M2状态数和有向边条数相等 得分:0 知识点:第三章 收起解析 答案 C 解析 第三章正规文法 6. (4分)编写一个计算机高级语言的源程序后,到正式上机运行一般要经过____这几步. (1) 编辑(2) 编译(3) 连接(4) 运行 A. (1)(2)(3)(4) B. (1)(2)(3) C. (1)(3) D. (1)(4) 得分:0 知识点:第一章 收起解析 答案 B 解析 第一章绪论 7. (4分)文法G 产生的()的全体是该文法描述的语言。 A. 句型 B. 终结符集
编译原理习题及答案(整理后)
第一章 1、将编译程序分成若干个“遍”是为了。 b.使程序的结构更加清晰 2、构造编译程序应掌握。 a.源程序b.目标语言 c.编译方法 3、变量应当。 c.既持有左值又持有右值 4、编译程序绝大多数时间花在上。 d.管理表格 5、不可能是目标代码。 d.中间代码 6、使用可以定义一个程序的意义。 a.语义规则 7、词法分析器的输入是。 b.源程序 8、中间代码生成时所遵循的是- 。 c.语义规则 9、编译程序是对。 d.高级语言的翻译 10、语法分析应遵循。 c.构词规则 二、多项选择题 1、编译程序各阶段的工作都涉及到。 b.表格管理c.出错处理 2、编译程序工作时,通常有阶段。 a.词法分析b.语法分析c.中间代码生成e.目标代码生成 三、填空题 1、解释程序和编译程序的区别在于是否生成目标程序。 2、编译过程通常可分为5个阶段,分别是词法分析、语法分析中间代码生成、代码优化和目标代码生成。 3、编译程序工作过程中,第一段输入是源程序,最后阶段的输出为标代码生成程序。 4、编译程序是指将源程序程序翻译成目标语言程序的程序。
一、单项选择题 1、文法G:S→xSx|y所识别的语言是。 a. xyx b. (xyx)* c. x n yx n(n≥0) d. x*yx* 2、文法G描述的语言L(G)是指。 a. L(G)={α|S+?α , α∈V T*} b. L(G)={α|S*?α, α∈V T*} c. L(G)={α|S*?α,α∈(V T∪V N*)} d. L(G)={α|S+?α, α∈(V T∪V N*)} 3、有限状态自动机能识别。 a. 上下文无关文法 b. 上下文有关文法 c.正规文法 d. 短语文法 4、设G为算符优先文法,G的任意终结符对a、b有以下关系成立。 a. 若f(a)>g(b),则a>b b.若f(a) 《编译原理》课后习题答案第一章 第 1 章引论 第 1 题 解释下列术语: (1)编译程序 (2)源程序 (3)目标程序 (4)编译程序的前端 (5)后端 (6)遍 答案: (1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。 (2)源程序:源语言编写的程序称为源程序。 (3)目标程序:目标语言书写的程序称为目标程序。 (4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶 段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符 号表管理等工作。 (5)后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。 (6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。 第 2 题 一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程 序的总体结构图。 答案: 一个典型的编译程序通常包含 8 个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。其各部分的主要功能简述如下。 词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机表达形式。 语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。 语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。 中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式 的中间语言代码,如三元式或四元式。 中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。 目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。 表格管理程序:负责建立、填写和查找等一系列表格工作。表格的作用是记录源程序的 各类信息和编译各阶段的进展情况,编译的每个阶段所需信息多数都从表格中读取,产生的中间结果都记录在相应的表格中。可以说整个编译过程就是造表、查表的工作过程。需要指出的是,这里的“表格管理程序”并不意味着它就是一个独立的表格管理模块,而是指编译程序具有的表格管理功能。 错误处理程序:处理和校正源程序中存在的词法、语法和语义错误。当编译程序发现源 《编译原理》习题答案: 第一次: P14 2、何谓源程序、目标程序、翻译程序、汇编程序、编译程序和解释程序?它们之间可能有何种关系? 答:被翻译的程序称为源程序; 翻译出来的程序称为目标程序或目标代码; 将汇编语言和高级语言编写的程序翻译成等价的机器语言,实现此功能的程序称为翻译程序; 把汇编语言写的源程序翻译成机器语言的目标程序称为汇编程序; 解释程序不是直接将高级语言的源程序翻译成目标程序后再执行,而是一个个语句读入源程序,即边解释边执行; 编译程序是将高级语言写的源程序翻译成目标语言的程序。 关系:汇编程序、解释程序和编译程序都是翻译程序,具体见P4 图 1.3。 P14 3、编译程序是由哪些部分组成?试述各部分的功能? 答:编译程序主要由8个部分组成:(1)词法分析程序;(2)语法分析程序;(3)语义分析程序;(4)中间代码生成;(5)代码优化程序;(6)目标代码生成程序;(7)错误检查和处理程序;(8)信息表管理程序。具体功能见P7-9。 P14 4、语法分析和语义分析有什么不同?试举例说明。 答:语法分析是将单词流分析如何组成句子而句子又如何组成程序,看句子乃至程序是否符合语法规则,例如:对变量 x:= y 符合语法规则就通过。语义分析是对语句意义进行检查,如赋值语句中x与y类型要一致,否则语法分析正确,语义分析则错误。 P15 5、编译程序分遍由哪些因素决定? 答:计算机存储容量大小;编译程序功能强弱;源语言繁简;目标程序优化程度;设计和实现编译程序时使用工具的先进程度以及参加人员多少和素质等等。 补充: 1、为什么要对单词进行内部编码?其原则是什么?对标识符是如何进行内部编码的? 答:内部编码从“源字符串”中识别单词并确定单词的类型和值;原则:长度统一,即刻画了单词本身,也刻画了它所具有的属性,以供其它部分分析使用。对于标识符编码,先判断出该单词是标识符,然后在类别编码中写入相关信息,以表示为标识符,再根据具体标识符的含义编码该单词的值。 补充: 2、赋值语句: A:= 5 * C的语法和语义指的是什么? 答:语法分析将检查该语句是否符合赋值语句规则,语义是指将 5 * C 的结果赋值为 A 。 第一次作业答案: 3.12 词法单元描述 3.3.5 b)a*b*……z* c) /\*([^*”]|\*[^/]|\”([^”]*)\”)*\*/ h)b*(a|ab)* 3.7.3d F转G错误,F跳转后的状态子集应包含9 第二次作业答案: 4.2.2 最左推导 S->SS S->S*S S->(S)*S S->(S+S)*S S->(a+S)*S S->(a+a)*S S->(a+a)*a Parse tree: 最右推导: S->SS S->S*a S->(S)*a S->(S+S)*a S->(S+a)*a S->(a+a)*a 无二义性,只能画出一棵语法树。 4.3.2 提取左公因子: S->SS’|(S)|a S’->+S|S|* 消除左递归: S->(S)A|aA , A->BA|?B->S|+S|* FIRST(S) = { a , ( } FIRST(A) = {* , a , ( , + , ?} FIRST(B) = {* , a , ( , +} FOLLOW(S) = { ( , ) , a , * , + , $} LL1 parse table: 转换表如下: match stack input action S$ (a+a)*a$ (S)A$ (a+a)*a$ S->(S)A ( S)A$ a+a)*a$ match( ( aA)A$ a+a)*a$ S->aA (a A)A$ +a)*a$ match a (a BA)A$ +a)*a$ A->BA (a +SA)A$ +a)*a$ B->+S (a+ SA)A$ a)*a$ match + (a+ aAA)A$ a)*a$ S->aA (a+a AA)A$ )*a$ match a (a+a A)A$ )*a$ A->? (a+a )A$ )*a$ A->? (a+a) A$ *a$ match ) (a+a) BA$ *a$ A->BA (a+a) *A$ *a$ B->* (a+a)* A$ a$ match * (a+a)* BA$ a$ A->BA (a+a)* SA$ a$ B- >S (a+a)* aAA$ a$ S->aA (a+a)*a AA$ $ match a (a+a)*a $ $ A->? 编译原理独立作业 2009.5 一、简答题 1、 构造一个文法使其生成的语言是不允许0打头的偶正整数集合。 2、文法][E G :T T E T E E -+→,F F T F T T /*→,i E F )(→,构造句型i T T T *+-的 语法树,并指出该句型的短语、直接短语、句柄、素短语和最左素短语。 3、 某LL(1)文法的预测分析表如下,请在下述分析过程表中填入输入串( a , a )$ 的分 析过程。 4、 文法][S G :R L S =→,R S →,R L *→,i L →,L R →,求增广文法中LR(1) 项目集的初态项目集I 0。 5、文法][S G :G G S S ;→,()G G t H →,) (S a H →,求出各非终结符的FISTVT 和LASTVT 集合。 二、分析题: 1、构造自动机,使得它能识别字母表{0,1}上以00结尾的符号串,将构造的自动机确定化,并写出相应的正规文法。 2、文法][S G :RT eT S → εDR T → εdR R → bd a D →,写出每个非终结符的FIRST 集和FOLLOW 集,并判断该文法是否为LL(1)文法。 3、若有文法][S G :AB S → εaBa A → εb A b B → (1)试证明该文法是SLR(1) 文法,并构造SLR(1)分析表。 (2)给出输入串aa # 的分析过程。 参考答案 一、简答题 1、构造一个文法使其生成的语言是不允许0打头的偶正整数集合。 8|6|4|2|ABC Z → 9|8|7|6|5|4|3|2|1→A ε |0|B AB B → |8|6|4|2|0→C 2、文法][E G :T T E T E E -+→,F F T F T T /*→,i E F )(→,构造句型i T T T *+-的 语法树,并指出该句型的短语、直接短语、句柄、素短语和最左素短语。 短语:T ,T-T ,i ,T*i ,T-T+T*i 直接短语:T , i 句柄: T 素短语(P72):T-T,i 最左素短语:T-T 3 某LL(1)文法的预测分析表如下,请在下述分析过程表中填入输入串( a , a )$ 的 分析过程。 (P68 ) 分析过程表: 例1设有文法G[S]: S →a|(T )| T →T,S|S (1) 试给出句子(a,a,a)的最左推导。 (2) 试给出句子(a,a,a)的分析树 (3) 试给出句子(a,a,a)的最右推导和最右推导的逆过程(即最左规约)的每一步的句柄。 【解】(1) (a,a,a)的最左推导 S=>(T) =>(T,S) =>( T,S,S) =>( S,S,S) =>(a,S,S) =>(a,a,S) =>(a,a,a) (2)(a,a,a)的分析树 S ( T ) T , S S a T , S a (3) (a,a,a)最右推导 最左规约每一步的句柄 S=>(T) 句柄为:(T) =>(T,S) 句柄为:T,S =>(T,a) 句柄为:a =>(T,S,a) 句柄为:T,S =>(T,a,a) 句柄为:第一个a =>(S,a,a) 句柄为:S =>(a,a,a) 句柄为:第一个a 例2已知文法G[Z]: Z →0U|1V U →1Z|1 V →0Z|0 (1) 请写出此文法描述的只含有4个符号的全部句子。 (2) G [Z]产生的语言是什么? (3) 该文法在Chomsky 文法分类中属于几型文法? 【解】(1)0101,0110,1010, 1001 (2)分析G[Z]所推导出的句子的特点:由Z 开始的推导不外乎图1所示的四种情形。 图 1文法G[Z]可能的几种推导 Z 1 U Z U Z 1 Z 1 V Z 1 V 由Z 推导出10或01后就终止或进入递归,而Z 的每次递归将推导出相同的符号串:10或 01。所以 G[Z]产生的语言L(G[Z])={x|x∈(10|01)+ } (3)该文法属于3型文法。 例3 已知文法G=({A,B,C},{a,b,c},P,A), P由以下产生式组成: A→abc A→aBbc Bb→bB Bc→Cbcc bC→Cb aC→aaB aC→aa 此文法所表示的语言是什么? 【解】 分析文法的规则: 每使用一次Bc→Cbcc,b、c的个数各增加一个; 每使用一次aC→aaB或aC→aa, a的个数就增加一个; 产生式Bb→bB、 bC→Cb起连接转换作用。 由于A是开始符号,由产生式A→abc推导得到终结符号串abc;由产生式A→aBbc推导得到B后,每当使用产生式Bb→bB、Bc→Cbcc、bC→Cb、aC→aaB就会递归调用B一次,所产生的a、b、c的个数分别增加一个,因此推导所得的终结符号串为abc、aabbcc、aaabbbccc、…所以文法描述的语言为{ a n b n c n|n>0}. 例4 构造描述语言L(G[S])={(n)n|n≥0} 的文法。 【解】(1)找出语言的一些典型句子: n=0 ε n=1 ( ) n=2 (()) … 所以, L(G[S])={ ε、( ) (())、((()))、…} (2)分析句子的特点: 只含有(和),(和)的个数相同且对称, 句子中所含的符号数可无限, 句子的个数可无限。 (3)凑规则:由 S→ε|() 得到ε|(),由 A→ (S) 得到 (()),(()) 是在()的两边再加上一对()得到,((()))是在(())的两边再加上一对()得到,…所以将上述产生式合并为S→(S) |ε。 (4)得到文法 G[S]: S→(S) |ε (5)检验:语言所有的句子均可由文法G[S]推导出来, 文法G[S]推导出来的所有终结符号串均为语言的句子. 例5 构造描述语言L(G[S])={a m b n |n>m>0} 的文法。 【解】找出语言的一些典型句子:abb、abbb、…、aabbb、aabbbb、…,语言的句子的特点是仅含有a、b, a在b的左边,b的个数大于a的个数,a的个数至少是1。 单独生成c k, k>1 可用产生式 C→c |Cc 句子中要求b的个数大于a的个数,所以得到文法:编译原理第二版课后习答案
编译原理习题答案
编译原理作业答案最终版
编译原理独立作业
编译原理第一章练习和答案