编译原理模拟试卷答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
模拟试卷答案
模拟试卷A
一、
二、
int real
id , $
D D →TL D →TL T T →int T →real L L →id R
R
R →, id R R → ε
三、
(1)状态转换图如下:
(2)合并同心项目集(I 4和I 11,I 5和I 12,I 7和I 13,I 8和I 10)后没有动作冲突。
*
四、语法制导的定义如下:
S → E print(S.loop);
E →while E1do E2 E.loop := max(E1.loop, E2.loop) +1;
E →id := E E.loop := E1.loop;
E → E1 + E2 E.loop := max(E1.loop, E2.loop);
E →id E.loop := 0;
E → (E1) E.loop := E1.loop;
五、程序流图
(1)计算各基本块的到达-定值集IN[B]。公式为:
IN[B] = ∪ OUT[P]
P∈P[B]
OUT[B] = GEN[B] ∪ ( IN[B] - KILL[B] )
基本块GEN[B] 位向量KILL[B] 位向量B1{ d1, d2 } 11000000 { d3, d4, d6 } 00110100 B2{ d3, d4 } 00110000 { d1, d2, d6 } 11000100 B3{ d6 } 00000100 { d1, d4 } 10010000 B4{ } 00000000 { } 00000000
(2)求各基本块中各变量引用点的ud 链:
假设在程序中某点u 引用了变量a ,则把能到达u 的a 的所有定值点,称为a 在引用点u 的引用-定值链(简称ud 链)。可以利用到达-定值信息来计算各个变量在任何引用点的ud 链。
由图9.6(1)的程序流图可知,I 的引用点是d3、d5和d6,J 的引用点是d3和d8。
B2中I 和J 的引用点d3前面没有对I 和J 的定值点,其ud 链在IN[B2]={ d1, d2, d3, d6 }中,所以I 在引用点d3的ud 链是{ d1, d6 };J 在引用点d3的ud 链是{ d2, d3 }。
在B2中I 的引用点d5前面有I 的定值点d4,且在d4定值后到达d5,所以I 在引用点d5的ud 链是{ d4 }。
B3中I 的引用点d6前面没有I 的定值点,其ud 链是IN[B3]中I 的所有定值点,所以是{ d4 }。
B4中J 的引用点d8前面没有对J 的定值点,其ud 链是IN[B4]中J 的所有定值点。已知IN[B4] = { d3, d4 },所以,J 的引用点d8的ud 链是{ d3 }。
模拟试卷B
一、该正规式描述的语言是,所有不含子串001的0和1的串。 二、
(1)先给出接受该文法活前缀的DFA 如下:
表中没有多重定义的条目,因此该文法是SLR(1)的。 (
2)只有文法
E → M E + id | id M → ε
不是LR(1)文法。因为对于句子id +id +…+id 来说,分析器在面临第一个id 时需要做的空归约次数和句子中+id 的个数一样多,而此时句子中+id 的个数是未知的。 三、
E → E 1 *E 2{if E 1.sign = E 2.sign then E .sign := POS else E .sign := NEG } E → +E 1 { E .sign := E 1.sign }
E → -E 1 {if E 1.sign = POS then E .sign := NEG else E .sign := POS} E → unsigned _integer {E .sign := POS}
四、
由于实参表达式是反序进入活动记录,而局部变量是顺序在活动记录中分配。 五、 (1)
(2)
b := 1
b := 2
if w <= x goto L2 (1)
e := b
goto L2 (2)
L1: goto L3 (3)
L2: c := 3
b := 4
c := 6 (4)
L3: if y <= z goto L4 (5)
goto L5 (6)
L4: g := g + 1
h := 8
goto L1 (7)
L5: h := 9 (8)
(3)结点5、7和3构成一个循环,其中5是入口结点。
模拟试卷C
一、
D → T L ;
T → int | float
L → L, id | id
二、
消除左递归后的文法如下:
B → 1 B'
B'→ 0 B' | 1 B' | ε
相应的翻译方案如下:
B → 1 {B'.i := 1 }B'{B.val := B'.val}
B'→0 {B'1.i := B'.i⨯ 2 } B'1 {B'.val := B'1.val}
| 1 {B'1.i := B'.i⨯ 2 +1} B'1 {B'.val := B'1.val}
| ε {B'.val := B'.i}
三、
S → L . R S. val := L. val + R. val
S → L S. val := L. val
L → L1 B L. val := L1. val⨯2 + B. val
L → B L. val := B. val
R → B R1R. val := (R1. val + B. val)/2
R → B R. val := B. val/2