模拟试卷答案模拟试卷A一、二、int realid , $D D →TL D →TL T T →int T →real L L →id RRR →, 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 := 1b := 2if w <= x goto L2 (1)e := bgoto L2 (2)L1: goto L3 (3)L2: c := 3b := 4c := 6 (4)L3: if y <= z goto L4 (5)goto L5 (6)L4: g := g + 1h := 8goto L1 (7)L5: h := 9 (8)(3)结点5、7和3构成一个循环,其中5是入口结点。
模拟试卷C一、D → T L ;T → int | floatL → 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. valS → L S. val := L. valL → L1 B L. val := L1. val⨯2 + B. valL → B L. val := B. valR → B R1R. val := (R1. val + B. val)/2R → B R. val := B. val/2B → 0 B. val := 0B → 1 B. val := 1四、对于函数f1,局部变量x声明的作用域是整个函数体,导致在函数体中不可能访问形式参数x。
由于这是一个合法的C语言函数,因此编译器给出警告错误。
对于函数f2,由于局部变量x的作用域只是函数体的一部分,不会出现上述问题,因而编译器不报错。
五、Exp的属性uses表示它引用的变量集合。
Program的useless和no_initial分别表示程序的无用赋值变量集合和未置初值变量集合。
Program → StmtList es_out:=∅;eless := eless;Program.no_initial := es_in;StmtList → Stmt es_out := es_out;es_out := es_in;es_in := es_ineless := eless ⋃ eless;StmtList → Stmt es_out := es_out;es_in := es_in;eless := elessStmt →id := Exp; eless :=if id.lexeme∈es_out then∅else{id.lexeme};es_in := if id.lexeme∈es_outthen (es_out–{id.lexeme})⋃es else es_out Stmt →read (id ); eless:=if id.lexeme∈es_out then∅else{id.lexeme};es_in := es_out – {id.lexeme}Stmt →write ( Exp ); eless := ∅, es_in := es_out ⋃ esExp →id es:= {id.lexeme}Exp →lit es:= ∅Exp → Exp1 OP es:= es ⋃ es模拟试卷D一、由正规式b*(abb*)*(a| ε)定义的语言是字母表{a, b}上不含子串aa的所有串的集合。
最简DFA如下:二、先给出接受该文法活前缀的DFA如下:I0和I3都只有移进项目,肯定不会引起冲突;I2和I4都无移进项目并仅含一个归约项目,也肯定不会引起冲突;在I1中,E'的后继符号只有$,同第2个项目的展望符号“+”不一样,因此I1也肯定不会引起冲突。
由此可以断定该文法是SLR(1)的。
三、Program →StmtStmt →id := Exp{ Stmt.MayDef := {} ;Stmt.MayUse:= Exp.MayUse}Stmt →read (id ){ Stmt.MayUse := φ ; Stmt.MayDef := {} }Stmt →write ( Exp ){ Stmt.MayDef := φ ; Stmt.MayUse:= Exp.MayUse }Stmt →Stmt1 ; Stmt2{ Stmt.MayUse := Stmt1.MayUse ⋃ Stmt2.MayUse ;Stmt.MayDef := Stmt1.MayDef ⋃ Stmt2.MayDef}Stmt →if ( Exp ) then begin Stmt1end else begin Stmt2end{ Stmt.MayUse := Stmt1.MayUse ⋃ Stmt2.MayUse⋃ Exp.MayUse;Stmt.MayDef := Stmt1.MayDef ⋃ Stmt2.MayDef}Stmt →while ( Exp ) do begin Stmt1end{ Stmt.MayUse := Stmt1.MayUse ⋃ Exp.MayUse;Stmt.MayDef := Stmt1.MayDef }Exp →id { Exp.MayUse := {} }Exp →lit { Exp.MayUse := φ }Exp →Exp1 OP Exp2{ Exp.MayUse := Exp1.MayUse⋃Exp2.MayUse}四、给非终结符E一个综合属性v,其值可取lvalue或rvalue,分别表示E是左值表达式和右值表达式,那么语法制导定义如下(无输出则表示无错):E'→ EE → E1 + E2 E.v := rvalueE → ( E1 ) E.v := E1.vE → E1 ++ if E1.v = rvalue then printf(“invalid lvalue in increment”);E.v := rvalueE →id E.v := lvalueE →num E.v := rvalue五、结构类型b的size 是8,以保证它作为数组元素的类型时,数组元素之间不用再考虑对齐问题。