6 1 3 初始分划得:终态组{2,5},非终态组{0,1,3,46} Π0:{2,5},{0,1,3,4,6}
对{0,1,3,4,6}进行审查: {1,4}输入b到达{2,5},而{0,3,6}输入b到达{3,4,6},故得到新分划{1,4},{0,3,6} Π1:{2,5},{1,4},{0,3,6}
对{0,3,6}进行审查: {0}经过b到达{2},{3,6}经过b到达{3,6},故得到新分划{0},{3,6} Π3:得到最后划分{0},{1,4},{2,5},{3,6}
重新命名,以A,B,C,D分别代替{0},{1,4},{2,5},{3,6},其中A为始态,C为终态,可得到最小DFA如下:
2、自顶向下方法 (一) 设文法G(E):
E→ E + T | T T→ T * F | F F→ i | ( E )
(1) 判断是否为LL(1)文法. (2) 构造文法的预测分析表. 解:详见P93-96例题。
(1) 由于文法中含有左递归,所以必须先消除左递归,使文法变为:
E→TE`
E`→+TE`|ε T→FT`
T`→*FT`|ε F→ i | ( E ) FIRST集合如下:
FIRST(E)={(,i} FIRST(E`)={+,ε} FIRST(T)={(,i} FIRST(T`)={*,ε} FIRST(F)={(,i} FOLLOW集合如下:
FOLLOW(E)={),#} FOLLOW(E`)={),#} FOLLOW(T)={+,),#} FOLLOW(T`)={+,),#} FOLLOW(F)={+,*,),#}
各产生式的SELECT集合如下: SELECT(E→TE`)={(,i} SELECT(E`→+TE`)={+} SELECT(E`→|ε)={),#} SELECT(T→FT`)={(,i} SELECT(T`→*FT`)={*} SELECT(T`→|ε)={+,),#} SELECT(F→ i)={i } SELECT(F→ ( E ))={(}
由上可知有相同左部产生式的SELECT集合的交集为空,故文法是LL(1)文法。 (2)构造文法的预测分析表如下:
E E` T T` F i →TE` →FT` → i + →+TE` →ε * →*FT` ( →TE` →FT` → ( E ) ) →ε →ε # →ε →ε (二) P101 6.(4) 改写下面文法为LL(1)文法,井对每个LL(1)文法构造相应的预测分析表。
解:
3、自底向上方法 已知文法G(E):
[0] S'→ E [1] E→ E + T
[2] E→ T
[3] T→ T * F [4] T→ F [5] F→ ( E ) [6] F→ i (1) 证明该文法是SLR(1)文法.
(2) 若已给出下面的SLR(1)分析表,试分析句子(i + ( * i ))#输入串出错的位置。
状态 0 1 2 3 4 5 6 7 8 9 10 11 ACTION i S5 S5 S5 S5 + S6 r2 r4 r6 S6 r1 r3 r5 * S7 r4 r6 S7 r3 r5 ( S4 S4 S4 S4 ) r2 r4 r6 S11 r1 r3 r5 # acc r2 r4 r6 r1 r3 r5 E 1 8 GOTO T 2 2 9 F 3 3 3 10 3、解:(1):
先分析LR(0)项目:
由上可见:
I1 ,I2 ,I9 存在移进—归约冲突. 分析FOLLOW集: 因为: 对I1 FOLLOW(S’)={ # }∩{ + }= ф
对I2 FOLLOW(E)={ +, #, ) }∩{* }= ф 对I9 FOLLOW(E)={ +, #, ) }∩{* }= ф
所以是SLR(1)文法。 (2): STEP 1 2 3 4 5 6 7 8 S 0 04 045 043 042 048 0486 04864 X # # ( # (i # (F # (T # (E # (E+ # (E+ ( ( i + ( * i ) # ( i + ( * i ) # i + ( * i ) # + ( * i ) # + ( * i ) # + ( * i ) # + ( * i ) # ( * i ) # * i ) # action S4 S5 r6 r4 r2 S6 S4 error goto 3 2 8
4、(一) 给出语句 if a+b > b+c*d then while x*y>3 do x:=x-a*b else while b+c*d>10 do b:=b-(x*y+5) 相应的三地址代码.
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) t1=a+b t2=c*d t3=b+t2 if t1>t3 goto (6) goto (14) t4=x*y if t4>3 goto (9) goto (13) t5=a*b t6=x-t5 x=t6 (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) goto (6) goto (23) t7=c*d t8=b+t7 if t8>10 goto (18) goto (23) t9=x*y t10=t9+5 t11=b-t10 b=t11 goto (14)
(二) While a>0 ∨ b<0 do Begin
X:=X+1;
if a>0 then a:=a-1 else b:=b+1 End;
翻译成四元式序列. (10分) ? 解:
(1) (j>,a,0,5) (2) (j,_,_,3) (3) (j<,b,0,5) (4) (j,_,_,15) (5) (+,x,1,T1) (6) (:= ,T1,_,x) (7) (j>,a,0,9) (8) (j,_,_,12) (9) (-,a,1,T2) (10) (:= ,T2,_,a) (11) (j,_,_,1) (12) (+,b,1, T3) (13) (:= ,T3,_,b) (14) (j,_,_,1) (15)
5、(一)设有基本块(10分) T1:=2
T2:=10∕T1 T3:=S-R T4:=S+R