1、第七章 LR分析法,7.1 LR分析概述 7.2 LR(0)分析 7.3 SLR(1)分析 7.4 LR(1)分析 7.5 LALR(1)分析 7.6 二义性文法在LR分析中的应用,7.1 LR分析概述 LR(K)分析:根据当前分析栈中的符号串和向右顺序查看输入串的K个(K0)符号就可唯一地确定分析器的动作是移进还归约和用哪个产生式归约,因而也就能唯一地确定句柄。LR分析器,总控程序 分析表或分析函数 分析栈,第七章 LR分析法,LR分析器的工作过程:,输入串 #,总控程序,ACTION表,GOTO表,输出,Sn Xn S1 X1 S0 #,SP,第七章 LR分析法,LR分析过程中的四种动作:
2、 GOTOSi,X=Sj: ACTIONSi,a: (1)移进 (2)归约 (3)接受acc (4)报错,第七章 LR分析法,7.2 LR(0) 分析 S aAcBe A b|Ab B d 输入串:abbcde# 最右推导:S aAcBe aAcde aAbcde abbcde,7.2.1 可归前缀和子前缀 S aAcBe1 A b2 A Ab3 B d4 输入串abbcde#的最右推导: S aAcBe1 aAcd4e1aAb3cd4e1 ab2b3cd4e1,规范归约为: ab2b3cd4e1aAb3cd4e1 aAcd4e1aAcBe1 S 可归前缀:ab2aAb3aAcd4aAcBe1
3、,第七章 LR分析法,活前缀: ,a ,ab ,a ,aA ,aAb ,a ,aA ,aAc ,aAcd ,a ,aA ,aAc ,aAcB ,aAcBe 定义7.1 若S A 是文法G中的一个规范推导。如果符号串是的前缀,则称是G的一个活前缀。,*,*,R,R,第七章 LR分析法,7.2.2 识别活前缀的有限自动机 拓广文法为: S S0 S aAcBe1 A b2 A Ab3 B d4 构造识别其活前缀及可归前缀的有限自动机:,句子abbced的可归前缀为:S0ab2aAb3aAcd4aAcBe1,0,1,2,5,9,14,3,6,10,15,7,11,16,12,17,18,4,8,13
4、,19,S,a,b,a,A,b,a,A,c,d,a,A,c,B,e,*,识别活前缀的NFA:,0,1,2,5,9,14,3,6,10,15,7,11,16,12,17,18,4,8,13,19,S,a,b,a,A,b,a,A,c,d,a,A,c,B,e,*,X,识别活前缀的DFA:,X,2,4,6,8,1,3,5,9,7,S,a,b,A,B,b,d,e,c,7.2.3 活前缀及其可归前缀的一般计算方法 定义 7.2 设G=(VN,VT,P,S)是一个上下文无关文法, 对于 A VN有 LC(A)=|S A, V*,V*T 推论:若文法G中有产生式 B A 则有 LC(A) LC(B) 因此,对
5、于示例文法有: LC(S)= S= LC(S)=LC(S) S=S= LC(A)=LC(S) a LC(A) A=Sa+A=a *=a LC(B)=LC(S) aAc B=SaAc=aAc,*,R,第七章 LR分析法,活前缀LR(0)CONTEXT(A ), 即:LR(0)C(A )=LC(A) 因此,对示例文法有:LR(0)C(S S)=SLR(0)C(S aAcBe)=aAcBeLR(0)C(A b)=abLR(0)C(A Ab)=aAbLR(0)C(B d)=aAcd,第七章 LR分析法,例:设文法G为 (0)S E (1)E aA (2)E bB (3)A cA (4)A d (5)B
6、 cB (6)B d,LC(S)= LC(E)=LC(S) LC(A)=LC(E) a LC(A) c LC(B)=LC(E) b LC(B) cS= E= A=a+Ac=ac* B=b+Bc=bc*LR(0)C(S E)=E LR(0)C(E aA)=aA LR(0)C(E bB)=bB LR(0)C(A cA)=ac*cA LR(0)C(A d)=ac*d LR(0)C(B cB)=bc*cB LR(0)C(B d)=bc*d,识别活前缀的NFA:,X,2,4,7,10,14,17,21,1,3,6,9,13,16,20,5,8,11,15,18,22,19,12,a,a,a,E,A,A,
7、b,b,b,b,d,d,c,c,B,B,c,c,c,c,第七章 LR分析法,*,0,2,4,7,1,9,5,8,3,6,11,10,a,A,d,*,E,d,d,d,c,c,c,c,b,A,B,d,d,B,识别活前缀的DFA:,7.2.4 LR(0)项目集规范族的构造 (1)LR(0)项目:在文法G中每个产生式的右部适当位置添加一个圆点构成项目。 如产生式S aAcBe对应有6个项目(右部长度加1) 0 S aAcBe 1 S a AcBe 2 S aA cBe 3 S aAc Be 4 S aAcB e 5 S aAcBe 特别地:A 仅有一个项目A ,第七章 LR分析法,(2)构造识别活前缀
8、的NFA 1.S E 2.S E 3.E aA 4.E a A 5.E aA 6.E bB 7.E b B 8.E bB 9.A cA 10.A c A 11.A cA 12.A d 13.A d 14.B cB 15.B c B 16.B cB 17.B d 18.B d 移进项目:Aa 待约项目: AB 归约项目: A 接受项目: S,(3)LR(0)项目集规范族的构造 CLOSURE(I)定义: a)I的项目均在CLOSURE(I)中 b)若AB 属于CLOSURE(I),则每一形如B 的项目也属于CLOSURE(I) c)重复b)直到不出现新的项目为止.转换函数 GO(I,X)=CLO
9、SURE(J): J=任何形如AX的项目 | AX 属于I,第七章 LR分析法,构造文法G的LR(0)项目集规范族:a)置项目SS为初态集的核,然后对核求闭包CLOSURE(SS)得到初态的项目集。 b)对初态集或其它所构造的项目集应用转换函数GO(I,X)=CLOSURE(J)求出新状态J的项目集。 c)重复b)直到不出现新的项目集为止。,第七章 LR分析法,冲突: a)移进和归约冲突 形如: Aa 与 B 同时存在 b)归约和归约冲突 形如:A 与 B 同时存在LR(0)文法:对一个文法的LR(0)项目集规范族不存在移进-归约冲突,或归约-归约冲突时,称这个文法为LR(0)文法。,第七章
10、LR分析法,(4)LR(0)分析表的构造构造算法: 假设已构造出LR(0)项目集规范族为:C=I0,I1, In,其中Ik为项目集的名字,k为状态名,令包含S S项目的集合 Ik的下标k为分析器的初始状态.a)若项目A a 属于Ik且 转换函数GO(Ik,a )=Ij,当a为终结符时则置ACTIONk,a为 Sj,其动作含意为将终结符a 移进符号栈,状态j 进入状态栈.,b)若项目A属于Ik,则对任何终结符 a和 #号置ACTIONk,a和ACTIONk,#为“rj”,j为在文法G中某产生式A的序号, rj动作的含义是把当前文法符号栈顶的符号串归约为A,并栈指针向下移动| |的长度,非终结符A
11、变为当前面临的符号. c)若GO(Ik,A)=Ij,则置GOTOk,A为“j”,其中A为非终结符,表示当前状态为“k”时,遇文法符号A时状态应转向j,因此A移入文法符号栈,j移入状态栈. d)若项目S S 属于Ik,则置ACTIONk,#为“acc”,表示接受 e)凡不能用上述方法填入的分析表的元素,均应填上“报错标志”.,示例: 0.S E 1.E aA 2.E bB 3.A cA 4.A d 5.B cB 6.B d,I0: S EE aAE bB,I4: Ac A A cAA d,I2: E a AA cAA d,I1: S E,I3: E b BB cBB d,I5: B c BB c
12、BB d,I8: A cA,I10: A d,I6: E aA,I7: E bB,I11: B d,I9: B cB,a,b,E,c,c,c,c,A,A,d,d,d,d,B,B,练习:试对例6.1文法构造LR(0)项目集规范族, 构造其LR(0)分析表,并与表7.1对照.,(5)LR(0)分析器的工作过程: a)若ACTIONS,a=Sj,a为终结符,则把a移入符号栈,j移入状态栈 b)若ACTIONS,a=rj,a为终结符或#号,则用第j个产生式归约,并将两个栈的指针减去k,其中k为第j个产生式右部的符号串长度,这时当前面临符号为第j个产生式左部的非终结符 c)若ACTIONS,a=acc,
13、a应为#号,则为接受,表示分析成功 d)若GOTOS,A=j,A为非终结符,表明前一动作是用关于A的产生式归约的,当前面临非终结符A应移入符号栈,j移入状态栈。对于终结符的GOTOS,a已和ACTIONS,a重合 e)基ACTIONS,a=空白,则转向出错处理,示例:输入串bccd#的LR(0)分析过程,练习:试分析输入串acd#,7.3 SLR(1)分析 引例:实型变量说明文法real ,i i 缩写并拓广为G: (0)S S (1)S rD (2)D D,i (3)D i,I0: S SS rD,I1: S S,I2: Sr DD D, iD i,I3: S rD D D , i,I5:
14、D D, i,I4: D i ,I6:D D, i ,S,r,D,,,i,i,1、解决上述文法的识别活前缀DFA的状态I3冲突:求出归约项目左部的后跟符FOLLOW(S)=# ,则项目S rD 应在遇到#时才应由rD归约为S,因此其SLR(1)分析表为:,2、对于移进-移进、移进-归约冲突的解决假定一个LR(0)规范族中含有如下的项目集II=X b ,A , B 若 FOLLOW(A) FOLLOW(B)= FOLLOW(A) b= FOLLOW(B) a= 则,当在状态I时面临某输入符号为a时,动作可由下规定决策:1)若a=b,则移进2)若a FOLLOW(A),则用产生式A 进行归约3)若
15、a FOLLOW(B),则用产生式B进行归约4)此外,报错 3、SLR(1)文法:对于一个文法的LR(0)项目规范族的某些项目集或LR(0)分析表中所含有的动作冲突能用上述方法解决,则称这个文法是SLR(1)文法,4、构造表达式文法的分析表: 1)构造项目集规范族及识别活前缀的DFA 拓广文法如下: (0) S E (1)E E+T (2)E T (3)T T*F (4)T F (5)F (E) (6)F i,I0:S EE E+TE TT T*FT FF (E)F i,I1:S E E E +T,I3: T F ,I4:F ( E)E E+TE TT T*FT FF (E)F i,I2:E
16、T T T *F,I5: F i,I7:T T * FF (E)F i,I6:E E+ TT T*FT FF (E)F i,I8:F (E )E E + T,I11:F (E) ,I10:T T *F ,I9:E E+T T T *F,E,F,(,T,T,T,i,i,i,i,*,*,(,(,(,F,F,E,),+,+,F,2)在项目集I1,I2, I9中存在冲突,因此计算相关FOLLOW集 FOLLOW(S)=# FOLLOW (E)=+,),# I1中: FOLLOW(S) += I2中: FOLLOW (E) *= I9中: FOLLOW (E) *= 因此,此文法为SLR(1)文法,3)
17、构造SLR(1)分析表,4)改进的SLR(1)分析表的构造(提前发现错误) a)若项目A a 属于Ik且 转换函数GO(Ik,a )=Ij,当a为终结符时则置ACTIONk,a为 Sj b)若项目A属于Ik,则对a为任何终结符或 #号,且满足Afollow(A)时,置ACTIONk,a =rj,j为A在文法G中的序号 c)若GO(Ik,A)=Ij,则置GOTOk,A为“j”,其中A为非终结符 d)若项目S S 属于Ik,则置ACTIONk,#为“acc”,表示接受 e)凡不能用上述方法填入的分析表的元素,均应填上“报错标志”.,对输入串i+i*i#的SLR(1)分析过程,练习:试分别利用SLR
18、(1)和改进的SLR(1)分析表分析输入串(i+i)(i+i)#,体会两者的优劣。,7.4 LR(1)分析,例1文法G: (0)SS (1) SaAd (2) SbAc (3) Saec (4) Sbed (5) Ae,I0: SS I1: SS I2: SaAd SaAd Saec SbAc Ae Saec Sbed I3: SbAc I4: I5: Sbed SaAd Saec Ae Ae I6: I7: I8: SbAc Sbed SaAdAe I9: Saec I10: SbAc I11: Sbed,ACTION GOTOa c e b d # S A 0 S2 S3 1 1 acc
19、2 S5 4 3 S7 6 4 S8 5 r5 r5S9 r5 r5 r5 r5 6 S10 7 r7 r7 r7 r7 r7 S11 r7 8 r1 r1 r1 r1 r1 r1 9 r3 r3 r3 r3 r3 r3 10 r2 r2 r2 r2 r2 r2 11 r4 r4 r4 r4 r4 r4,(0)SS (1) SaAd (2) SbAc (3) Saec (4) Sbed (5) Ae 非 LR(0),非SLR(1),I5: S aec I7: S bed A e A e S=S=aAd=aed S=S=bAc=bec S=S=aec S=S=bed ae是活前缀 be是活前缀a
20、Ac不是规范句型 , bAd不是规范句型不作无效归约 ?信息 在特定的规范推导中,哪些输入符号能跟在句柄之后 GS: 若S = A = r是的前缀,则称r是G的一个活前缀. 哪个项目在什么条件下对某个活前缀有效,R,R,R,R,R,R,R,R,R,R,R,R,*,*,*,*,*,例2 GS: (0) SS (1) SL=R (2) SR (3) L *R (4) Lid (5) RL,I0: S SS L = RS RR LL id L *RI1: S SI2: S L = R R LI3: S R,I4: L *RR LL *RL id I5: L id I6: S L =RR LL *RL
21、 idI7: L *R I8: R L I9: S L=R,I2: S L = R R L,考虑分析表达式 id = id时,在工作到 I2 处已经把第一个 id 归约到 L了, 看到下一个输入 = 要作决策,第一个项目要设置 Action2,= 为S6, 即把赋值的其它部分找到. 但 =也是属于 Follow(R) 的. 第二个项目要用 RL归约.出现 shift-reduce 冲突.若将栈顶的符号序列归约到 R,会有问题!因为不可能有规范句型以 R = 开头 (有以 *R = . 开头的规范句型).,SLR(1)的局限,follow 集包含了在任何句型中跟在 R 后的符号但没有严格地指出在
22、一个特定的推导里哪些符号跟在 R后.所以需要扩充状态以包含更多的信息:follow 集的哪些部分 才是进到该状态最恰当的归约依据.处在状态 2时,试图构建句子有两条路:1.S L = R 或 2.S R L. 如下一符号是 =, 那就不能用第二个选择,必须用第一个,即移进. 只有下一个符号是#时才能归约. 尽管 = 属于 Follow(R) ,那是因为一个 R 可以出现在别的上下文中,在现在这个特定的情况,它不合适,因为在用S R L推导句子时, = 不能跟在R后.,.,讨论例2后有以下结果: 不是LR(0)文法 I2 SL=R RL.中存在移进/归约冲突 SLR能否解决I2中的冲突FOLLO
23、W(R)=#,=与=交不为空 不是SLR(1)文法如早有信息告知: 若用 RL 归约 则形成R= 而 R=不是活前缀,,SLR(1)的局限,在SLR分析中,若项目集Ik含有项目 A .,那么在相应的状态下,只要当前输入符号afollow(A) 集,就确定采用A 进行归约.但在某些情况下,当状态k呈现于栈顶时,栈内的串所构成的活前缀未必允许把归约为A,.因为可能没有一个规范句型含有前缀Aa.即在这种情况下,用A 归约未必有效. . 所以需要扩充状态以包含更多的信息:follow 集的哪些部分 才是进到该状态最恰当的归约依据.必须重新定义项目. LR(1)方法的思路: 若 A .B I 则 B .
24、 I( B 是一产生式) 把FIRST( )中的符号作为用B 归约的搜索符,向前搜索符 .,LR(1)项目( 配置)的一般形式 A . , a a 称作该项目( 配置) 的向前搜索符( lookahead ) 向前搜索符( lookahead )只对圆点在最后的项目起作用A , a .意味着处在栈中是 的相应状态,但只有当下一个输入符是a时才能进行归约. a 是一个终结符,或是输入结束标记# 有多个向前搜索符,比如a,b,c时,可写作 A u, a/b/c,LR(0)项目对某个活前缀有效,定义 项目A 1.2对活前缀r=1是有效的,如果存在一个规范推导S = A =12 若项目A .B对活前缀
25、r=是有效的且B是一个产生式,则项目B.对r=也是有效的. 因为由假定,存在一个规范推导 S = A = B 设 =,则对B有规范推导 S = A=B=B = 于是项目B.对r=也是有效的,LR(1)项目对某个活前缀有效,定义 一个LR(1)项目A .,a对活前缀r=是有效的,如果存在一个规范推导S = A = 其中或的第一个符号为a,或=而a为# 若LR(1)项目A .B,a对活前缀r=是有效的且B是一个产生式,则项目B.,b对r=也是有效的.其中b或者是从推出的第一个终结符,或者= 而b=a,两者结合在一起,即:b FIRST(a),构造LR(1)项目集规范族和G0函数,closure(I
26、)按如下方式构造: (1) I的任何项目属closure(I); (2)若A1B2,aclosure(I),B是一产生式,那么对于FIRST(2a)中的每个终结符b,如果B,b不在closure(I)中,则把它加进去; (3)重复(1)(2),直至closure(I)不再增大。 GO函数: 若I是一个项目集,X是一个文法符号 GO(I, X)= closure(J) 其中 J= 任何形如AX,a的项目A.X,aILR(I)项目规范族C的构造算法类同LR(0)的,只是初始时: C= closure(SS,#);,例1的LR(1)项目集规范族,I0: SS, # I5: S aec,#S aAd,
27、 # A e,d S bAc, # I6: S bAc, # S aec, # I7: S bed, # S bed, # A e,c I1: S S,# I8: S aAd, # I2: S aAd, # I9: S aec, # S aec, # I10: S bAc, # A e, d I11: S bed, # I3: S bAc, # S bed, # Ae,c I4: S aAd, #,规范的LR(1)分析表的构造,假定LR(1)项目集规范族C=I0, I1,,In,令每个项目集Ik的下标k 为分析器的一个状态,G 的LR(1)分析表含有状态0,1,n。 1.令那个含有项目SS ,
28、#的Ik的下标k为状态0(初态).ACTION表和GOTO表可按如下方法构造 2.若项目A,b属于Ik, 那么置ACTIONk, b为“用产生式A进行规约”,简记为“rj”;(假定A为文法G的第j个产生式) 3.若项目Aa,b属于Ik且GO (Ik, a)= Ij,则置ACTIONk, a为“把状态j和符号a移进栈”,简记为“sj”;,4.若项目SS,#属于Ik, 则置ACTIONk, #为“接受”,简记为“acc”; 5.若GO (Ik, A)= Ij, A为非终结符,则置GOTO(k, A)=j; 分析表中凡不能用规则1至5填入信息的空白格均置上“出错标志”。 按上述算法构造的含有ACTI
29、ON和GOTO两部分的分析表,如果每个入口不含多重定义,则称它为文法G的一张规范的LR(1)分析表。具有规范的LR(1)表的文法G称为一个LR(1)文法。,LR(1) 文法满足下面两个条件: 1.如果一个项目集里有项目 A uxv , a , x是终结符,那就不会有项目B u, x 2.项目集里所有归约项目 的向前搜索符不相交,即不能同时含有项目A u, a 和B v , a,LR(K)分析,LR(K)项目 A . , a1 a2 aK a1 a2 aK 向前搜索符串 移进项目 A . a, a1 a2 aK 待约项目 A . B, a1 a2 aK 归约项目 A . , a1 a2 aK ,
30、LR(1)比SLR(1)能力强,例2 (0) SS(1)SL=R (2)SR (3)L *R (4)Lid (5)RL 不能用SLR(1)技术解决,但能用LR(1),I1:SS ,#,I5:Li ,=/#,I7:L*R ,=/#,I8:RL ,=/#,I9:SL=R ,#,I3:SR ,#,I12:Li ,#,I10:RL ,#,I13:L*R ,#,I0: S S,# S L=R,# S R,# L *R,=/# L i,=/# R L,#,I4: L *R,=/#R L,=/# L i,=/#L *R,=/#,I6:S L= R,# R L,# L *R,# L i,#,I11:L * R
31、,# R L,# L *R,# L i,#,I2:S L =R,# R L,#,s,R,=,L,R,i,i,*,i,i,R,L,L,R,L,*,*,*,例2的 LR(1)项目集及转换函数,每个SLR(1)文法都是LR(1)的,一个SLR(1)文法的规范LR分析器比其SLR(1)分析器的状态要多。,例 G(S):S BB BaB B b I0:S.S S .BB B .aB B .b I1:S S. I2:S B.B B.aB B.b I3:Ba.B B.aB B.b I4:BaB. I5: Bb. I6: SBB.,I0:S S,# S BB,# B aB,a/b B b,a/b,I1:S S
32、,#,I2:S BB,# B aB,# B b,#,I5:S BB,#,I6:BaB,# B aB,# B b,#,I3:B aB,a/b B aB,a/bB b,a/b,I4:B b,a/b,I7:B b,#,I9:B aB,#,I8:B aB,a/b,s,B,B,a,b,b,b,B,B,a,a,a,LR(1)项目集规范族和转换函数,b,7.5 LALR(1)分析,LALR在SLR(1)和LR(1)间寻找折衷办法 (状态数目,分析能力),LALR (lookahead LR)合并LR(1)项目集规范族的同心集I36 I47 I89(除搜索符外两个集合是相同的).,I3:B aB,a/b B
33、aB,a/bB b,a/b,I6:B aB,# B aB,# B b,#,I4:B b,a/b,I7:B b,#,I8:B aB,a/b,I9:B aB,#,构造 LALR(1)分析表. 方法1-“brute-force”,1.构造文法G的规范 LR(1) 状态. 2.合并同心集的状态. 3.新 LALR(1) 状态的GO函数是合并的同心集状态的GO函数的并. 4. LALR(1)分析表的ACTION 和 GOTO 登录方法与LR(1)分析表一样. 经上述步骤构造的表若不存在冲突,则称它为G的LALR(1)分析表。 存在这种分析表的文法称为LALR(1)文法。,0 S3 S4 1 2 1 ac
34、c 2 S6 S7 5 3 S3 S4 8 4 r3 r3 5 r1 6 S6 S7 9 7 r3 8 r2 r2 9 r2,LR(1)分析表,0 S3,6 S4,7 1 2 1 acc 2 S3,6 S4,7 5 3,6 S3,6 S4,7 8,9 4,7 r3 r3 r3 5 r1 8,9 r2 r2 r2,LALR(1)分析表,对 输入串ab#用LR(1)分析的过程,1 0 # ab# S3 2 03 #a b# S4 3 034 #ab # 出错,步骤,状态栈,符号栈,输入串,ACTION,GOTO,对输入串ab#用LALR(1)分析的过程,1 0 # ab# S3,6 2 0(3,6
35、) #a b# S4,7 3 0(3,6)(4,7) #ab # r3 (8,9) 4 0(3,6)(8,9) #aB # r2 2 5 02 #B # 出错,步骤,状态栈,符号栈,输入串,ACTION,GOTO,讨 论:,LR(1)项目集不存在动作冲突,合并同心集后会不会产生新的冲突(移进-归约,归约-归约)不会产生新的移进-归约冲突会产生新的归约-归约冲突,LR(1)项目集不存在动作冲突,合并同心集后会不会产生新的冲突(移进-归约,归约-归约),例 S S S aBc | bCc | aCd | bBd B e C e,LR(1) 项目集规范族:,I0: S S, #S aBc, #S b
36、Cc, #S aCd, #S bBd, # I1: S S, # I2: S aBc, #S aCd, #B e, cC e, d I3: S bCc, #S bBd, #C e, cB e, d I4: S aBc, #,I5: S aCd, # I6: B e, cC e, d I7: S bCc, # I8: S bBd, # I9: B e, dC e, c I10: S aBc, # I11: S aCd, # I12: S bCc, # I13: S bBd, #I69: C e , c/dB e , d/c,结论:LR(1)强于LALR(1)强于SLR(1)强于LR(0),7.6
37、 二义性文法在LR分析中的应用,算术表达式的二义文法: E E+E|E*E|(E)|I LR(0)项目集:,I0: EE E E+E E E*E E (E) E i,I2: E ( E) E E+E E E*E E (E) E i,I3: E i ,I4: EE+ E E E+E E E*E E (E) E i,I1: EE E E +E E E *E,I5: EE* E E E+E E E*E E (E) E i,I5: EE* E E E+E E E*E E (E) E i,I6: E (E) E E +E E E *E,I7: E E +E E E +E E E *E,I9: E (E) ,I8: E E *E E E +E E E *E,利用优先关系和结合性解决冲突后的LR分析表:,构造表达式i+i*i#的分析过程并与前面无二义文法对应的LR分析过程比较。,7.7 语法分析程序的自动构造工具YACC,YACC 编译程序,YACC 源程序,y.tab.c,C 编译程序,y.tab.exe,y.tab.c,YACC与LEX联合工作:,yylex,yylex,lex,yyparse,yacc,词法规则,语法规则,单词符号串 (终结符流),输入字符流,语法分析输出,