1、编译原理习题课(3),栾 俊 6/7/2019,2019/6/7,,2,3.8(a),(a) 消除3.1的左递归 (b) 在(a)的基础上构造LL(1)分析表,2019/6/7,,3,3.8(a) (续),S - (L)|a L - L,S|S 只有直接左递归 S - (L)|a L - SL L- ,SL|,2019/6/7,,4,3.8(b) (续),S - (L)|a L - SL L- ,SL| FIRST(S) = (, a FIRST(L) = FIRST(S) = (, a FIRST(L) = , FOLLOW(S) = (FIRST(L)-) + FOLLOW(L) + F
2、OLLOW(L) + $ = , ), $ FOLLOW(L) = ) FOLLOW(L) = FOLLOW(L) = ),$,2019/6/7,,5,3.8(b) (续),2019/6/7,,6,3.16,给出接收文法 S - ( L ) | a L - L , S | S 的LR(0)活前缀的DFA;并且在此基础上构造SLR(1)分析表.,2019/6/7,,7,3.16 (续),拓展文法: (1) S - S (2) S - ( L ) (3) S - a (4) L - L , S (5) L - S 初态:I0 = closureS - S =,I0 S - S S - (L) S
3、- a,2019/6/7,,8,3.16 (续),Goto(I0, S) = Goto(I0, () = Goto(I0, a) =,I1 S - S ,I3 S - a,I2 S - ( L) L - L , S L - S S - (L) S - a,2019/6/7,,9,3.16 (续),Goto(I2, L) = Goto(I2, S)=Goto(I2, ()=I2 Goto(I2, a)=I3,I4 S - (L ) L - L , S,I5 L - S ,2019/6/7,,10,3.16 (续),Goto(I4, ) = Goto(I4, ,)=,I7 L - L , S S
4、- (L) S - a,I6 S - (L ) ,2019/6/7,,11,3.16 (续),Goto(I6, S) =Goto(I6, () =I2 Goto(I6, a) =I3,I8 L - L , S ,2019/6/7,,12,3.16 (续),I8 L - L , S ,I0 S - S S - (L) S - a,I1 S - S ,I2 S - ( L) L - L , S L - S S - (L) S - a,I3 S - a,I4 S - (L ) L - L , S,I6 S - (L ) ,S,(,a,L,S,a,(,(,I7 L - L , S S - (L) S
5、- a,S,(,a,I5 L - S ,2019/6/7,,13,3.16 (续),SLR(1)分析表构造1) 若AaI,且goto(I,a)=J,则actionI,a=sJ2)若A I,则actionI,b = r A,bFollow(A)3)若SS I,则actionI,$ = acc4)若goto(I,B)=K,则GOTOI,B=K5)其它为空白/error,2019/6/7,,14,3.16 (续),2019/6/7,,15,3.16 (续),S - ( L ) | a L - L , S | S FOLLOW(S) = $ + FOLLOW(L) = $, ), , FOLLOW(L
6、) = ), ,2019/6/7,,16,3.23,证明下面文法不是SLR(1)文法 S - X X - Ma | bMc | dc | bda M - d,2019/6/7,,17,3.23 (续),S - X X - Ma | bMc | dc | bda M - d 存在移进-规约冲突 如句子dc,当d进栈后,面临c,此时项目X - d c要求移进,而c在FOLLOW(M)中,因此项目M - d 要求规约,2019/6/7,,18,3.26,一个非LR(1)的文法如下: L - MLb | a M - 给出所有有移进-规约冲突的规范LR(1)项目集,2019/6/7,,19,3.26 (
7、续),拓广文法: L - L L - MLb | a M - I0,I0 L - L, $ L - MLb, $ L - a, $ M - , $/a,2019/6/7,,20,3.26 (续),2019/6/7,,21,3.26 (续),I0,I2,I5面临a时存在移进-规约冲突,2019/6/7,,22,3.30,下面哪个不是LR(1)文法?对非LR(1)文法给出所有冲突的LR(1)项目集 S-aAc A-Abb|b S-aAc A-bAb|b,2019/6/7,,23,3.30 (续),第二个不是LR(1)文法 第二个文法在句子的正中心按A-b规约,而只向后看一位是无法判断是否到达句子的中心位置的 存在冲突的项目集:,谢谢!,