| 显示江开系统湖南大学-计算机科学与技术所有答案 |
|
2.已知文法
AaAd|aAb|ε
分别构造LR(0)分析表和SLR(1)分析,并判断该文法是否是LR(0)文法,是否SLR(1)文法。
|
答案是:解:增加一个非终结符S/后,产生原文法的增广文法有:
S/A
AaAd|aAb|ε
下面构造它的LR(0)项目集规范族为:
a b d # A
I0:
S/•A
A•aAd
A•aAb
A• I2:
Aa•Ad
Aa•Ab
A•aAd
A•aAb
A• I1:
S/A•
I1:
S/A• acc
I2:
Aa•Ad
Aa•Ab
A•aAd
A•aAb
A• I2 I3:
AaA•d
AaA•b
I3:
AaA•d
AaA•b I4:
AaAb• I5:
AaAd•
I4:
AaAb•
I5:
AaAd•
从上表可看出,状态I0和I2存在移进-归约冲突,该文法不是LR(0)文法。
对于I0来说有
FOLLOW(A)∩{a}={b,d,#}∩{a}=Φ
所以在I0状态下面临输入符号为a时移进,为b,d,#时归约,为其他时报错。
对于I2来说有也有与I0完全相同的结论。
这就是说,以上的移进-归约冲突是可以解决的,因此该文法是SLR(1)文法。其他SLR(1)分析表为:
下面构造它的SLR(1)项目集规范族为:
文法的SLR(1)分析表
状态 ACTION GOTO
a b d # A
0 S2 r1 r2 r3 1
1 acc
2 S2 r1 r2 r3 3
3 S4 S5
4 r2 r2 r2 r2
5 r1 r1 r1 r1
|
|
对文法G[S]
Sa|∧|(T)
TT,S|S
(1)对文法G进行改写消去左递归,然后对每个非终结符写出不带回溯的递归子程序。
(2)经改写后的文法是否是LL(1)的?给出它的预测分析表。
|
答案是:解:(1)由于有TT,S的产生式,所以消除该产生式的左递归,有新的文法G/[S]:
Sa|∧|(T)
TSU
U,SU|ε
(2)判断文法G/[S]是否为LL(1)文法。
各非终结符的FIRST集合如下:
FIRST(S)={a,∧,(}
FIRST(T)=FIRST(S)={a,∧,(}
FIRST(U)={,,ε}
各非终结符的FOLLOW集合如下:
FOLLOW(S)={#} ∪ FIRST(U) ∪ FOLLOW(T) ∪ FOLLOW(U)={#,,,)}
FOLLOW(T)={)}
FOLLOW(U)=FOLLOW(T)={)}
每个产生式的SELECT集合如下:
SELECT(Sa)={a}
SELECT(S∧)={∧}
SELECT(S(T))={(}
SELECT(TSU)=FIRST(S)={a,∧,(}
SELECT(U,SU)={,}
SELECT(Uε)=FOLLOW(U)={)}
可见,相同左部产生式的SELECT集的交集均为空,所以文法G/[S]是LL(1)文法。
文法G/[S]的预测分析表如下:
a ∧ ( ) , #
S a ∧ (T)
T SU SU SU
U ε ,SU
|
|
程序的执行方式主要有哪几种?请各举1例。
|
答案是:答:解释执行,如:Basic;
编译执行,如:C;
混合型,如:JAVA。
|
|
将下面的算术表达式翻译成四元式。
|
答案是:2+(3+(4+5))
(+,4,5,t1)
(+,3,t1,t2)
(+,2,t2,t3)
|
|
已知表达式文法G(E):
E → E+T|T
T → T*F | F
F → (E) | i
试设计属性文法计算表达式的值。(设值属性为val,i在词法分析的值存在其lexval属性中)
|
答案是:解:
语法规则 语义规则
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 → i F.val=i.lexval
|
|
编译程序的工作一般分为五个阶段:
|
答案是:(1)词法分析:对源程序字符流进行扫描和分解,识别出一个个单词符号。
(2)语法分析:在词法分析的基础上,根据语言的语法规则把单词符号串分解成各类语法单位。
(3)语义分析和中间代码产生:检查源程序的语义错误(如:变量是否定义、类型是否正确等),并收集代码生成阶段要用到的类型信息。对各类不同语法范畴按语言的语义进行初步翻译。
(4)优化:对于前阶段产生的中间代码进行加工变换,以期在最后阶段产生更高效的目标代码。
(5)目标代码产生:把中间代码变换成特定机器上的目标代码。
|
|
标识符的正则表达式为 。
|
答案是:letter(letter|digit)*
|
|
表达式-a+b*(c-d)对应的逆波兰式是 。
|
答案是:a-bcd*+
|
|
写出你所了解的两种中间语言表达: 和 。
|
答案是:三地址码
|
|
是编程语言结构的任意特性。其典型例子有:变量的数据类型和表达式的值。
|
答案是:属性
|
|
LR(0)文法不一定是SLR(1)文法。
|
答案是:对
|
|
. LL(1)文法都不是二义性的。
|
答案是:对
|
|
LEX是用来生成词法分析程序的程序。
|
答案是:对
|
|
可识别语言的一个上下文无关文法G(S):S->aSc|ε
|
答案是:错
|
|
简单算术表达式文法中值是继承属性。
|
答案是:错
|
|
连接编译器的前端和后端的接口是: ( )
A.TINY语言 B. 中间语言 C.上下文无关语言 D. 中间语言
|
答案是:B
|
|
高级语言编译程序常用的语法分析方法中,递归下降分析法属于_____ 分析方法。
可选项有;
A. 自左至右 B.自上而下 C.自下而上 D.自右向左
|
答案是:B
|
|
正则式的“|”读作______。
A.并且 B或者 C.连接 D.闭包
8、E->TE.
E.->+TE.|ε
T->FT.
T.->*FT.|ε
F-> (E)|id
FOLLOW(F)=______,FI
|
答案是:B
|
|
.在状态转换图中,结点代表____,用圆圈表示。
A.输入缓冲区 B.向前搜索 C.状态 D.字符串
|
答案是:C
|
|
一个句型的最左直接短语称为该句型的_______。
A.句型 B.短语 C.简单短语 D.句柄
|
答案是:D
|
|
设有文法G[S]:S::=S*S|S+S|(S)|a,该文法_______二义性文法。
A.是 B.不是 C.无法判断 D.可能
|
答案是:A
|
|
字母表是 {0, 1},写出以01 结尾的所有串的正规式是( )。
A. (0|1)*01 B.0*1*01 C.1*0*01 D. (01)*
|
答案是:A
|
|
一个语言的文法是_____。
A.惟一的 B.不惟一的 C.个数有限的
|
答案是:B
|
|
在使用高级语言编程时,首先可通过编译程序发现源程序的全部______错误和部分语义错误。
A.语法 B.语义 C. 语用 D.运行
|
答案是:A
|
|
规范归约是最 归约。
|
答案是:左
|
|
x+y>3可依次翻译成四元式( )和( )。
|
答案是:(+, x, y, t1) (>, t1, 3, t2)
|
|
. 自下而上语法分析方法的基本思想是:从 出发,不断进行 ,最终得到文法的开始符号。
|
答案是:输入串 归约
|
|
文法S->ibtSeS|ibtS|a不是二义性文法。
|
答案是:错
|
|
三地址码和DAG都是中间代码。
|
答案是:对
|
|
编译器所生成的目标代码都是直接可以在硬件上运行的机器语言。
|
答案是:错
|
|
在带进制数文法中,值属性val是继承属性。
|
答案是:错
|
|
可以描述一个语言的文法不是唯一的。
|
答案是:对
|
|
LL(1)分析中“移进-归约”中使用( )完成分析。
A.哈希表 B. 队列 C. 线性表 D. 显式栈
|
答案是:D
|
|
以下四个LR(0)项目中( )是一个移进项目。(A,B,S’是非终结符,S’是文法的开始符号,b是终结符)
A. S’α• B. Aα• C. Aα•bβ D. Aα•Bβ
|
答案是:C
|
|
表达式-a+b*(-c+d)的逆波兰式是( )。
A. ab+-cd+-* B. a-b+c-d*+ C.a-b+c-d+* D.a-bc-d+*+
|
答案是:D
|
|
把可重定位代码变成可执行代码的工作是由( )完成的。
A. 编译器 B. 预处理器 C.装配/连接器 D. 汇编器
|
答案是:C
|
|
综合属性的依赖关系在语法树表现为( )。
A. 从父节点向子节点 B. 从子节点向父节点
C.从左兄弟指向右兄弟 D. 从右兄弟指向左兄弟
|
答案是:B
|
|
以下说法中正确的是( )。
A.不是每个正则表达式e都有等价的NFA M,满足L(e)= L(M)。
B.对于任何一个NFA M,都存在一个DFA M’,满足L(M)= L(M’)。
C.DFA的弧上标记只含输入字母表中的
|
答案是:B
|
|
. LR(0)文法的充要条件是( )。
A. 对应的LR(0)项目DFA中每个项目都没有移进-归约冲突;
B. 对应的LR(0)项目DFA中每个项目都没有归约-归约冲突;
C.A和B
D.都不是
|
答案是:C
|
|
下面文法生成的语言是:( )
stmt-seq → stmt ; s t m t - s e q | s t m t
stmt → s
A.L(G) = { s, s;s, s;s;s, ...} B.L(G
|
答案是:A
|
|
文法AaB
Bb属于乔姆斯基层次的( )文法。
A.上下文有关 B. 上下文无关 C.正则 D.0型
|
答案是:C
|
|
编译器的( )阶段将记号流转换成语法树。
A. 语法分析 B. 语义分析 C. 代码生成 D. 词法分析
|
答案是:A
|
|
试将布尔表达式a
|
答案是:100: if a |
|
.令文法G为:
ND| ND
D0|1|…|9
(1) 该文法的语言是什么?(2) 给出句子456的最左推导。
|
答案是:答:(1)该文法生成的语言是正整数。
(2)N=>ND=>NDD=>DDD=>4DD=>45D=>456
|
|
(10分)已知文法
E→(L)|a
L→L,E|E
1)构造该文法的LR(0)项目DFA;
2)构造其SLR(1)分析表,并判断该文法是否SLR(1)文法。
|
答案是:解:
(1)为这个文法构造LR(0)项目的DFA.
其扩充文法为:
E’→E
E→(L)|a
L→L,E|E
改文法LR(0)项的DFA是:
(2)构造SLR(1)分析表
First(E’)={ (,a ); Follow(E’)={ $ };
First(E)={ (,a ); Follow(E)={ $,),’,’ };
First(L)={ (,a ); Follow(L)={ ),’,’ };
则SLR(1)分析表如下:
状态 输入 GOTO
( ) , a $ E L
0 S2 S4 1
1 接受
2 S2 S4 8 3
3 S5 S6
4 R(E→a) R(E→a) R(E→a)
5 R(E→(L)) R(E→(L)) R(E→(L))
6 S2 S4 7
7 R(L→L,E) R(L→L,E)
8 R(L→E) R(L→E)
由于每个表项最多只有一个动作,所以该文法是SLR(1)文法。
|
|
(1)画出字符串abc的相关依赖图;
(2)假设S.u的初始值为5,属性计算完成后,S.v的值为多少?
|
答案是:答:a .语法树与相关图为:
属性等式的序列为:①③④①②①
b .等式完成后,S.v的值为18
|
|
1.(10分)计算文法G(E)的每个非终结符的FIRST和FOLLOW集合,并判断该文法是否是LL(1)的,请说明理由。
|
答案是:G(E):
E → E+T|T
T → T*F | F
F → (E) | i
FIRST(E)= FIRST(T) = FIRST(F)={(,i}
FOLLOW(E)={#,+, )}
FOLLOW(T)={#,+, ),*}
FOLLOW(F)={#,+, ),*}
因为FIRST(E+T)∩ FIRST(E+T)={ (,i }≠Φ,所以该文法不是LL(1)文法。
|
|
1.简述前端和后端,并说明为什么要区分前端和后端。
|
答案是:答:编译前端:与源语言有关,如词法分析,语法分析,语义分析与中间代码产生,与机器无关的优化。
编译后端:与目标机有关,与目标机有关的优化,目标代码产生。
区分前端和后端的目的是为了减少对内存容量的要求,使程序逻辑结构清晰; 优化更充分,有利于移植。
|
|
表达式a-b*(c+d)对应的逆波兰式是 。
|
答案是:abcd+*-
|
|
程序设计语言中名字的作用域一般遵循 的原则,即若有多个同名定义,该名字的引用应对应于与其引用最近的那个声明。
|
答案是:最近嵌套
|
|
自上而下语法分析方法的基本思想是:从文法的 出发,不断进行 ,最终得到输入串。
|
答案是:开始符号, 推导
|
|
若文法G的某个句子存在两棵以上的语法树,则称该文法是 文法。
|
答案是:二义性
|
|
存在这样的语言,它们能被确定的有穷自动机识别,但不能用正则表达式表示。 ( )
|
答案是:错
|
|
三元式和四元式都是三地址码的实现形式。
|
答案是:对
|
|
在构造递归下降伪代码时,将非终结符A翻译为一个匹配过程match(A)
|
答案是:错
|
|
在类型声明文法中,类型属性type是继承属性。
|
答案是:对
|
|
一个LR(0)文法一定是SLR(1)文法。
|
答案是:对
|
|
文法A->aAb|ab生成的语言是( )。
A. {ab} B.{aAb} C. {anbn|n≥1} D.{anbn|n≥0}
|
答案是:C
|
|
编译程序中的语义分析器接受以( )为单位的输入,并产生信息供以后各阶段使用。
A. 语法树 B.子程序 C.单词 D.语句
|
答案是:A
|
|
正则式的“*”读作( )。
A. 并且 B.连接 C.正则闭包 D.闭包
|
答案是:D
|
|
目前为:
1/5
页
首页 上页 下页 尾页
|