第 5 章 语法分析 语法分析是编译的第二阶段;其任务是语法分析是编译的第二阶段;其任务是识别识别和和处理处理比单词更大的语法单位比单词更大的语法单位,如:,如:程序设计语言中程序设计语言中的的表达式表达式、、各种各种说明说明和和语句语句乃至全部乃至全部源程序源程序,,指出指出其中的其中的语法错误;必要时,可生成内部形式,便于语法错误;必要时,可生成内部形式,便于下一阶段处理下一阶段处理 内容提要内容提要: :5.1 5.1 语法分析的基本概念语法分析的基本概念5.2 5.2 递归子程序法递归子程序法5.3 LL(1)5.3 LL(1)分析法分析法5.4 LR()5.4 LR()分析法分析法5.5 5.5 简单优先分析法简单优先分析法语法分析语法分析5.1 语法分析的基本概念5.1.1 语法分析的定义与分类 【【定义定义】】形式上说,语法分析是指对给定的符号形式上说,语法分析是指对给定的符号串(串( ),判定其是否是某文法),判定其是否是某文法G(Z)G(Z)的句子即的句子即Z Z 成立吗成立吗 ? ? => + + Z Z 成立吗成立吗 ? ? => . .+ + 【【分类分类】】语法分析方法通常分两大类:语法分析方法通常分两大类: 1. 1. 自顶向下法自顶向下法((推导法推导法)) 2. 2. 自底向上法自底向上法((归约法归约法)) 从开始符号出发,采用从开始符号出发,采用推导推导运算运算,试图,试图自顶自顶向下向下构造语法树。
构造语法树 从给定的符号串出发,采用从给定的符号串出发,采用归约归约运算运算,试图,试图自底向上自底向上构造语法树构造语法树或或※ ※ 通常采用通常采用“最左推导法最左推导法”※ ※ 通常采用通常采用“最左归约法最左归约法”语法分析语法分析给定:给定: = a*(b+c)= a*(b+c),, 是否是表达式?是否是表达式?(接上页)5.1.2 算法设计分析1【【例例5.15.1】】 G(E) G(E):: E -> T | E+T | E-T E -> T | E+T | E-T T -> F | T*F | T/F T -> F | T*F | T/F F -> i | (E) F -> i | (E) ※ ※ 最左推导最左推导分析过程:分析过程:【【结论结论】】自顶向下分析的关键技术是如何确定具有自顶向下分析的关键技术是如何确定具有相同左部的产生式之相同左部的产生式之侯选者侯选者!!即即 E a*(b+c)E a*(b+c) => + +=>T*F=>T*F =>F*F=>F*F =>a*F=>a*F =>a*(E=>a*(E) )=>a*(E+T=>a*(E+T) )=>a*(T+T=>a*(T+T) )=>a*(F+T=>a*(F+T) )=>a*(b+T=>a*(b+T) )=>a*(b+F=>a*(b+F) )=>a*(b+c=>a*(b+c) )---- ---- 自顶向下法自顶向下法: :E E = => >T T语法分析语法分析※※ 为了清楚每次为了清楚每次归约归约的是什麽?我们观察语法树的的是什麽?我们观察语法树的 = a*(b+c)= a*(b+c)5.1.2 算法设计分析2 E -> T | E+T | E-T E -> T | E+T | E-T T -> F | T*F | T/F T -> F | T*F | T/F F -> i | (E) F -> i | (E) ---- ---- 自底向上法自底向上法a*(b+ca*(b+c) )=>=>. .F*(b+cF*(b+c) )=>=>. .T*(E+cT*(E+c) )=>=>. .T*(b+cT*(b+c) )=>=>. .T*(F+cT*(F+c) )=>=>. .T*(T+cT*(T+c) )=>=>. .T*(E+FT*(E+F) )=>=>. .T*(E+TT*(E+T) )=>=>. .T*(E)T*(E)=>=>. .T*FT*F=>=>. .E E=>=>. .T T=>=>. .+ +E E a*(b+ca*(b+c) )即即【【结论结论】】自底向上分析的关键技术是自底向上分析的关键技术是如何确定如何确定当前句型的句柄!当前句型的句柄!最左归约最左归约分析过程分析过程:: 构造过程:语法分析语法分析 5.2.1 递归子程序法的设计原理: 语法分析的核心技术是语法分析的核心技术是“文法文法”的的机内表示机内表示问题;递归子程序法直接把问题;递归子程序法直接把文法文法变成变成程序。
程序 对每一个对每一个非终结符非终结符,构造一个子程序,用以识,构造一个子程序,用以识别该非终结符所定义的符号串别该非终结符所定义的符号串每个子程序以产生每个子程序以产生式左部非终结符命名式左部非终结符命名,,以产生式右部构造子程序内以产生式右部构造子程序内容例如:设有如下产生式:例如:设有如下产生式: A -> aBeD | bAc | A -> aBeD | bAc | 则有:递归子程序则有:递归子程序 A:A: 递归子程序法属于递归子程序法属于自顶向下语法分析方法自顶向下语法分析方法故又名递归下降法又名递归下降法 设计原理:设计原理:语法分析语法分析y yn n入口入口出口出口a?a?b?b?NEXT(w)NEXT(w)y yNEXT(w) NEXT(w) NEXT(w)NEXT(w)n nc?c?y yn nerr2err2e?e?遇εε时时 B B A A Dyerr1err1nNEXT(w)NEXT(w)A -> aBeD | bAc | A -> aBeD | bAc | 判断当前单词是否是c即w=c?调用子程序A( (接上页接上页) )读单词函数语法分析语法分析5.2.2 递归子程序的构造算法 ⑴ ⑴ 扩展文法扩展文法::※※增设一个产生式,作为主程序:增设一个产生式,作为主程序:Z`->Z Z`->Z ,, ⑵ ⑵ 入出口约定入出口约定:: ※※子程序入口时,其子程序入口时,其首符号首符号已经读来!已经读来!※※子程序出口时,子程序出口时,其其后继符后继符应该读来!应该读来! ⑶ ⑶ 子程序内容设计子程序内容设计::※※遇遇终结符终结符,判定之,判定之 ,确认后读下一单词;,确认后读下一单词;※※遇遇非终结符非终结符, ,调用之调用之, ,返回后不读下一单词;返回后不读下一单词; ※※遇遇空串空串( ( ) ) ,直接出口;,直接出口; 语法分析语法分析【【例例5.25.2】】G(S):G(S):令令 Z -> S , Z -> S , 则则 递归子程序递归子程序: :子程序子程序A开始开始结束结束 #SNEXT(w)err0yn入口入口出口出口 a berr1NEXT(w)A berr2NEXT(w)SNEXT(w)子程序子程序Snnnyyy入口入口 cNEXT(w)出口出口遇遇 时时ny dNEXT(w)err3yn主程序主程序S -> aAb |bS , A -> cd | S -> aAb |bS , A -> cd | 语法分析语法分析 实际上,上述两点可归纳为同一个条件,即:实际上,上述两点可归纳为同一个条件,即:※ ※ 递归子程序要求文法应是:递归子程序要求文法应是: 5.2.3 递归子程序法对文法的要求: 递归子程序是根据文法各产生式的递归子程序是根据文法各产生式的首符号首符号与当前与当前所读所读单词单词进行匹配,以决定进行匹配,以决定候选产生式候选产生式的;这就要求的;这就要求文法:文法: ①① 具有相同左部的各产生式,首符号不同;具有相同左部的各产生式,首符号不同; ② ② 文法不能有左递归!文法不能有左递归!如:如:A -> aA -> a |a|a ( (首符号相同,首符号相同,×)×);; A -> AA -> A | | ( (直接左递归,直接左递归,×)×)。
LL(1)LL(1)文法文法! !(见(见 5.35.3节) 语法分析语法分析5.2.4 5.2.4 递归子程序的递归子程序的构造例构造例:: ⅠⅠ. 消除左递归后的文法消除左递归后的文法1:G`(E) :G`(E) :T -> F T -> F { { ωω2 2 F F } }F -> i | ( E )F -> i | ( E )E -> T E -> T { { ω ω1 1T T } }【【提示提示】】 根据文法变换:根据文法变换:A -> AA -> A | | A -> A -> { { } }【【例例5.35.3】】G(E)G(E):: E -> T | EωE -> T | Eω1 1T T T -> F | Tω T -> F | Tω2 2F F F -> i | (E) F -> i | (E) 其中:其中:ωω1 1(+,-),ω(+,-),ω2 2(*,/),i((*,/),i(变量或常数变量或常数) )语法分析语法分析主程序主程序T -> F T -> F { { ωω2 2 F F } }F -> i | ( E )F -> i | ( E )E -> T E -> T { { ω ω1 1 T T } }子程序子程序E令令 Z -> EZ -> E开始开始结束结束 #ENEXT(w)err0yn入口入口出口出口 NEXT(w)T ωω1 1Tyn入口入口出口出口 NEXT(w)F ωω2 2Fyn子程序子程序T( (接上页接上页) )语法分析语法分析T -> F T -> F { { ωω2 2 F F } }F -> i | ( E )F -> i | ( E )E -> T E -> T { { ω ω1 1 T T } }入口入口出口出口 i (err1NEXT(w)err2NEXT(w)E )yyynnn子程序子程序F( (接上页接上页) )语法分析语法分析Ⅱ. Ⅱ. 消除左递归后的文法消除左递归后的文法2 :2 :G``(E) G``(E) : :T -> F T -> F { { ωω2 2 F F } }F -> i | ( E )F -> i | ( E )E -> T E -> T { { ω ω1 1 T T } }E -> T E`E -> T E`E` -> ωE` -> ω1 1T E` | T E` | T -> F T`T -> F T`T` -> ωT` -> ω2 2F T` | F T` | F -> i | ( E )F -> i | ( E )※※ 文法文法 G`(E)消除花括号后可得:消除花括号后可得:令令 Z -> E Z -> E ,则可构造递归子程序如下:,则可构造递归子程序如下: (主程序(主程序 省略)省略)语法分析语法分析入口入口出口出口TE`子程序子程序E入口入口 ωω1 1NEXT(w)T出口出口遇遇 时时nyE`E`…子程序子程序E`E -> T E`E -> T E`E` -> ωE` -> ω1 1T E` | T E` | T -> F T`T -> F T`T` -> ωT` -> ω2 2F T` | F T` | F -> i | ( E )F -> i | ( E )( (接上页接上页) )语法分析语法分析 1. 1. 什麽是什麽是LL(1)LL(1)分析法?分析法? 5.3.1 LL(1)分析法基本概念 5.3 LL(1)分析法 ※※ LL(1) 分析法的基本要点有三:分析法的基本要点有三: ⑴⑴ 利用一个利用一个分析表分析表,登记如何,登记如何选择产生式选择产生式的知识;的知识; ⑵⑵ 利用一个利用一个分析栈分析栈,记录分析过程;,记录分析过程; ⑶⑶ 此分析法要求文法必须是此分析法要求文法必须是 LL(1)文法文法。
LL(1) LL(1)分析法是指从分析法是指从左左到右扫描到右扫描、、、、最最左左推导推导( (LLLL) )和只查看和只查看一一个当前符号(括号中的个当前符号(括号中的 1 1)之意;)之意; LL(1)LL(1)分析法又称预测分析法,与递归子程序分析法又称预测分析法,与递归子程序法同属于自顶向下确定性语法分析方法法同属于自顶向下确定性语法分析方法; ; 语法分析语法分析 2. LL(1)2. LL(1)分析过程示例分析过程示例 G(Z)G(Z)::Z->dAZZ->dAZ①① | bAc | bAc②② A->aA A->aA③③ | |εε④④ 栈栈 当前符号当前符号 剩余序列剩余序列 栈操作栈操作 ⑴ ⑴ 选择推导产生式后,为什麽要逆序压栈选择推导产生式后,为什麽要逆序压栈? ?⑵ ⑵ 当栈顶为当栈顶为A,A,当前单词为当前单词为c c时,为什么时,为什么选择选择 A A ? ?讨讨论论逆逆序序压压栈栈# ## ## c # c A A# c# c# c # c A A# # c c# # c A c A b b A A a ab ba c #a c # 选择选择 Z ZbAcbAc②②b ba c #a c #匹配匹配 b ba ac #c # 选择选择A AaAaA③③a ac #c #匹配匹配 a a c c# # 选择选择A A ④④c c# #匹配匹配 c c# #正确结束正确结束 Z Z查分查分析表析表※ ※ 对符号串:对符号串: = = bacbac # # 的分析过程:的分析过程:分析表:分析表:语法分析语法分析 ※ 设有文法G(Z), # 栈底标记和结束标记;#栈栈结束结束::② ② 若若 栈顶符栈顶符=a =a 且且 当前符为当前符为a a;; 则则 pop,NEXT(w);pop,NEXT(w);# Z⑴ ⑴ 开始开始::栈栈 ; NEXT(w);;当前符当前符 w= #⑶⑶⑵ ⑵ 重复执行重复执行 ① ①、、②②、、③ ③ ,直到栈中只剩,直到栈中只剩 # # 为止:为止: 即:栈调整:即:栈调整: # … a# …即:栈调整:即:栈调整: # … A# … a a 3. LL(1) 3. LL(1)分析法算法概要分析法算法概要 ① ① 若若 栈顶符栈顶符=A =A 且且 当前符当前符 w=a w=a 且且 有有产生式产生式:: A Aa a ,, 则则 POP,PUSH(aPOP,PUSH(a ) )R R ; ; 逆序压栈!③ ③ 否则,否则,错误处理错误处理!!语法分析语法分析5.3.2 LL(1)文法及其判定1.首符号集合、后继符集合与选择符集合 设设 G(Z)=(VG(Z)=(VN N, V, VT T, Z, P), Z, P),,A->A-> ∈P∈P,则,则 【【注注】】⑴ ⑴ ( ( 可空可空), ), ( ( 不可空不可空) );; ⑵ ⑵ 若若 = = 则则 first(first( )={ })={ };; ⑶ ⑶ 设设 # #为输入串的结束符,则为输入串的结束符,则 #∈follow(Z); #∈follow(Z); =>=>* *≠>≠>* *first(first( )={ t| )={ t| t t…,,t∈Vt∈VT T } } =>=>* *follow(A)={ t| Z follow(A)={ t| Z …AtAt…,,t∈Vt∈VT T } }=>=>* *语法分析语法分析【【注注】】 求求 follow(A) follow(A) 要点:要点: ※ ※ 查所有右部含有查所有右部含有A A的产生式的产生式: B -> : B -> …A A ① ① 若若 不空时不空时 , , 则则 first(first( ) )∈follow(A)∈follow(A) ;; ② ② 若若 取空时取空时 , , 则则 follow(B)follow(B)∈follow(A)∈follow(A) ;; ③ ③ 若若 = = 时时 , , 则则 follow(B)∈follow(A)follow(B)∈follow(A)。
select(①)= first(select(①)= first(dAZdAZ)={d} )={d} select(②)= first(select(②)= first(bcAbcA)={b})={b}select(③)= first(select(③)= first(aAaA)={a} )={a} select(④)= first(select(④)= first( )∪follow(A)= {)∪follow(A)= {b,db,d,,# # } }即:即: B -> B -> …A AG(Z)G(Z):: Z -> dAZ ① | bcA ②Z -> dAZ ① | bcA ② A -> aA ③ | A -> aA ③ | ④ ④【例5.4】 求文法产生式的选择集合:则有:则有: 产生式产生式序号序号语法分析语法分析 ∵ select(①)= {d} ∵ select(①)= {d} ;;2. LL(1)2. LL(1)文法及其判定文法及其判定 LL(1) LL(1)文法可确保文法可确保 递归子程序法递归子程序法 和和 LL(1)LL(1)分分析法析法 的正确运用。
的正确运用例例5.55.5】】 G(Z) G(Z):: Z -> dAZ ① | bcA ②Z -> dAZ ① | bcA ②A -> aA ③ | A -> aA ③ | ④ ④ select(②)= {b} select(②)= {b}select(③)= {a} select(③)= {a} ;;即:即: {d}∩{b}={d}∩{b}= 又又 {a}∩{b,d,#}= {a}∩{b,d,#}= select(④)= {select(④)= {b,db,d,,# }# }∴ G(Z) ∴ G(Z) 是是 LL(1)LL(1)文法语法分析语法分析※ LL(1)分析法示例:【例5.6】 G(Z):Z -> Z b ① | a ② 【【注注】】上述文法可进行等价变换,消除左递归得:上述文法可进行等价变换,消除左递归得: ∵ select(①)={ a }∵ select(①)={ a } select(②)={ a } select(②)={ a }选择集合相交选择集合相交∴ ∴ 具有左递归的文法,一定不是具有左递归的文法,一定不是LL(1)LL(1)文法!文法!∴ G∴ G´(Z)(Z)是是LL(1)LL(1)文法,可以用文法,可以用 LL(1)LL(1)分析法。
分析法∵ select(∵ select(②②)={ b })={ b } select( select(③③)={ # })={ # }选择集合不相交选择集合不相交G G´(Z)(Z):: Z -> aA ①, Z -> aA ①, A -> bA ②| A -> bA ②| ③ ③语法分析语法分析 列: 终结符 | #5.3.3 LL(1)分析器设计(实现)※ ※ 应用时,可用下列函数查表,获取相应产生式:应用时,可用下列函数查表,获取相应产生式: L(L(栈顶符,当前符)栈顶符,当前符)= = 产生式序号产生式序号⑴⑴【【结构设计结构设计】】Ⅰ. LL(1)Ⅰ. LL(1)分析表的构造分析表的构造: : LL(1)LL(1)控制程序控制程序+ +LL(1)LL(1)分析表分析表LL(1)LL(1)分析表是存储分析表是存储文法选择集合的知识表文法选择集合的知识表 行:行: 非终结符非终结符表项:表项:产生式产生式序号 ④ Z # … a A A …①①语法分析语法分析如如 G(Z)G(Z):: Z -> aAb ① | AcA ②Z -> aAb ① | AcA ②∵ select(①)={a}; ∵ select(①)={a}; ∴⑵ ⑵ 【【算法设计算法设计】】 A -> dA ③ | A -> dA ③ | ④ ④i则则 L( A , a ):=L( A , a ):=A -> A -> i⑴ ⑴ 求求文法文法选择集合,确认选择集合,确认 LL(1)LL(1)文法;文法;⑵ ⑵ 依次取依次取产生式产生式::select(③)={d};select(③)={d};select(②)={c,d} ; select(②)={c,d} ; select(④)= {select(④)= {b,c,#};b,c,#};是是 LL(1)LL(1)文法文法, ,LL(1)LL(1)分析表:分析表:不相交不相交不不相相交交若若 a ∈ select( ) a ∈ select( ) i③③②②④④④④ ④ ④ ②② ①①语法分析语法分析NEXT(w)NEXT(w)y yn nerrerrn ny yn nn nerrerr PUSH(#),PUSH(Z) PUSH(#),PUSH(Z) POP(x) POP(x)y y开始开始结束结束x∈Vx∈VT Tn nerrerry yx∈Vx∈VN Nw = #w = #x = wx = wy y查查LL(1)LL(1)分分析析表表: : L L( x ,w )= ?( x ,w )= ? 空?空?Ⅱ. LL(1)Ⅱ. LL(1)分析法控制程序:分析法控制程序:PUSH ( iPUSH ( iR R ))把产生式把产生式 i i 右部逆序压栈右部逆序压栈把栈顶符把栈顶符弹入到变弹入到变量量x x中中! !语法分析语法分析※ LL(1)分析法综合示例:【【例例5.75.7】】 G(E) G(E):: E -> T | E E -> T | E 1 1 T T T -> F | T T -> F | T 2 2 F F F -> i | ( E ) F -> i | ( E ) ※ ※ 此文法含左递归,不是此文法含左递归,不是LL(1)LL(1)文法文法; ;经文法经文法变换(消除左递归)后可得:变换(消除左递归)后可得:G`(E): E -> T EG`(E): E -> T E´ ① ① E E´-> -> 1 1 T ET E´② | ② | ③③ T -> F T T -> F T´④④ T T´-> -> 2 2 F TF T´⑤ | ⑤ | ⑥ ⑥ F -> i ⑦ | ( E ) ⑧ F -> i ⑦ | ( E ) ⑧其中:其中: 1 1( + ,- ) , ( + ,- ) , 2 2 ( * ,/ ) ( * ,/ ) 这是这是LL(1)LL(1)文法吗文法吗? ?语法分析语法分析select(①)=first(TE`)={ select(①)=first(TE`)={ i i, ,( ( } } 1.1.求求G`(E) G`(E) 的的选择集合:选择集合:∵ ∵ 三对选择集合两两不相交,三对选择集合两两不相交,G`(E): E -> T EG`(E): E -> T E´ ① ① E E´-> -> 1 1 T ET E´② | ② | ③ ③ T -> F T T -> F T´④ ④ T T´-> -> 2 2 F TF T´⑤ | ⑤ | ⑥ ⑥ F -> i ⑦ | ( E ) ⑧ F -> i ⑦ | ( E ) ⑧⑵⑵⑶⑶E ->E ->E`->E`->T ->T ->T`->T`->F ->F ->⑴⑴select(②)=first(select(②)=first( 1 1TETE´)={ )={ 1 1 } } select(③)=follow(Eselect(③)=follow(E´)={ )={ ) ), ,# # } } select(④)=first(FT`)={ select(④)=first(FT`)={ i i, ,( ( } } select(⑤)=first(select(⑤)=first( 2 2FTFT´)={ )={ 2 2 } }select(⑥)=follow(T`)={ select(⑥)=follow(T`)={ 1 1 , ,) ), ,# # } } select(⑦)=first(i)={ select(⑦)=first(i)={ i i } } select(⑧)=first((E))={ select(⑧)=first((E))={ ( ( } }∴ G`(E)∴ G`(E)是是 LL(1) LL(1) 文法。
文法 (接上页接上页) )语法分析语法分析 2.构造 LL(1) 分析表: 花括号花括号{}内内是求得的是求得的选择集合!选择集合! ⑧ ⑦ F ⑥⑥ ⑥⑥ ⑤ ⑥ T` ④ ④ T ③ ③ ② E` ① ① E ) ( # 2 1 iT T´-> -> 2 2 FTFT´⑤ ⑤ { { 2 2} } | | ⑥ ⑥ { { 1 1, ,) ), ,# # } }F -> i ⑦ F -> i ⑦ { { i i } } | (E) ⑧ | (E) ⑧ { { ( ( } }E -> TEE -> TE´ ① ① { { i i, ,( ( } }E E´-> -> 1 1 TETE´② ② { { 1 1} }| | ③ ③ { { ) ), ,# # } }T -> FTT -> FT´④ ④ { { i,(i,( } }G`(E):G`(E):( (接上页接上页) )语法分析语法分析※ 符号串 a+b# 的LL(1)分析过程:查分析表: 操 作剩余序列 w x 分析栈# ( + 匹配成功 ) b # +1# E`T1 ②:PUSH(E`T1) b # +E`# E` ⑥ :PUSH( ) + b # +T`# E` T` ⑦ : PUSH(i) + b # a F T`F ( a 匹配成功 ) + b # a i i ④ :PUSH(T`F) + b # a T E` T ① :PUSH(E`T) a+b # a+b # a E# E ④ : PUSH(T`F) b # b T# E` T ok # ## ⑥ :PUSH ( ) # #T` # E` T` ③ :PUSH ( ) #E`# E` ( b 匹配成功) # b i i ⑦ : PUSH(i) # b F T`F# E`# E`T`# E` # E`T`分析表控制程序语法分析语法分析 LR( ) LR( )分析法是指从分析法是指从左左到右到右扫描扫描、最、最左左归约归约( (LRLR) )之意;它属于自底向上分析方法。
之意;它属于自底向上分析方法 常用的算法有常用的算法有LR(0)LR(0)和和LR(1)LR(1)等,其中括号内的等,其中括号内的数数是指不查看是指不查看(0)(0)或只查看或只查看一一个当前符号个当前符号(1)(1),即可,即可确定当前句型的确定当前句型的句柄句柄5.4 LR( )5.4 LR( )分析法分析法⑴ ⑴ 利用一个利用一个分析表分析表,登记,登记选择选择句柄产生式句柄产生式的知识;的知识;⑵ ⑵ 利用一个利用一个分析栈分析栈,记录分析过程;,记录分析过程;⑶⑶【【分析算法分析算法】】依次读取依次读取单词,单词,并进行如下操作:并进行如下操作: 当栈顶出现当栈顶出现句柄句柄时,时,规约规约之,否则之,否则移进移进 5.4.1. LR( )5.4.1. LR( )分析法基本概念分析法基本概念※ LR( ) ※ LR( ) 分析法的基本要点有三:分析法的基本要点有三:1. 1. 什么是什么是LRLR()分析法?()分析法?语法分析语法分析【【例例5.85.8】】 G(Z): Z->aBAd, A->bc| G(Z): Z->aBAd, A->bc|c, B->bB|cc, B->bB|c 2. LR( )2. LR( )分析法分析过程示例:分析法分析过程示例:⑴ ⑴ 符号串符号串 abccdabccd 最左归约过程最左归约过程: :⑵ ⑵ 符号串符号串 abccd abccd 的语法树:的语法树: abccdabccd 的语法树的语法树①①②②③③ a b c c da b c c dB BB BA AZ Z※ ※ 归约过程归约过程的的句柄句柄::句柄句柄次序次序①① c c②②bBbB③③ c c④④aBAdaBAdabccdabccd =>. .abBcdabBcd =>. .aBcdaBcd =>. .aBAdaBAd =>. . Z Z④④语法分析语法分析 句柄产生式句柄产生式 操操 作作 剩余串剩余串 w w 分析栈分析栈 移进移进,NEXT,NEXT d # d # c c# a# a 归约,归约, A -> c A -> c # # d d# a B# a B 移进移进,NEXT,NEXT # # d d# a B# a B 归约,归约, Z -> aBAd Z -> aBAd # ## a B A# a B A OK OK # ## # B -> bB B -> bB B -> c B -> c 移进移进,NEXT,NEXT c d # c d # c c# a# a 移进移进,NEXT ,NEXT b c c d # b c c d # a a# # 归约,归约, d # d # c c # a b# a b 归约,归约, d # d # c c# a b# a b 移进移进,NEXT,NEXT c c d # c c d # b b# # B B B B Z Z A A a a b b c c c c d d句句柄柄( (接上页接上页) )⑶ ⑶ 利用利用分析栈分析栈记录行分析过程:记录行分析过程:【【注注】】 何时栈顶出现何时栈顶出现句柄?句柄?怎样求当前怎样求当前句柄产生式句柄产生式 ??设设 待分析的符号串待分析的符号串: abccd#abccd#语法树语法树语法分析语法分析3. 3. 有限自动机有限自动机用作用作句柄识别器:句柄识别器:② ② 如何确认首次出现的如何确认首次出现的 c c 的父亲是的父亲是 B B, ,而不是而不是 A A ??G(Z): Z -> aBAdG(Z): Z -> aBAd A -> bc | A -> bc | c c B -> bB | c B -> bB | c ※ ※ 句柄句柄一定一定出现于出现于某某一个产生式的一个产生式的右部右部;; ⑴ ⑴ 归约过程中如何确认归约过程中如何确认句柄句柄?? ※ ※ 是否是句柄是否是句柄,还要看,还要看其其所在符号串中的所在符号串中的位置位置。
① ① 怎样判断栈顶出现的怎样判断栈顶出现的句柄句柄不是不是 bcbc, ,而是而是 c c ? ?∴ ∴ 显然是错误的显然是错误的( (从文法中可判定:从文法中可判定:aAaA不能相邻不能相邻!) !) ∵ ∵ 若用若用 bcbc 归约,则有归约,则有 a abcbccd aAcd(cd aAcd( ) ) =>=>. .∵ ∵ 若用若用 A A作父亲,则有作父亲,则有 a abcbccd abAcd(cd abAcd( ) ) =>=>. .∴∴显然是错误的显然是错误的( (从文法中可判定:从文法中可判定:AcAc不能相邻不能相邻! !语语法法树树※ ※ 我们讨论如下两个问题:我们讨论如下两个问题:# #abc cd#abc cd#分析栈分析栈语法分析语法分析① ① 扩展文法,使扩展文法,使文法符号文法符号附有附有位置位置信息:信息: ※ ※ 增设一个产生式增设一个产生式( (如:如:Z`-> ZZ`-> Z ) ),, ※ ※ 带有带有位置位置编编码的码的文法符号文法符号,称为,称为文法出现文法出现。
G`(Z)G`(Z)并把产生式并把产生式右端符号顺序编码,作为右端符号顺序编码,作为位置位置( (状态状态) )信息信息: :【【注注】】 由于由于文法出现文法出现比比文法符号文法符号多了一个位置信息,多了一个位置信息, 在分析时,如果用在分析时,如果用文法出现文法出现代替代替文法符号文法符号,是否有助于,是否有助于句柄句柄的确认呢?的确认呢?⑵ ⑵ 句柄识别器的构造方法句柄识别器的构造方法语法分析语法分析 ② ② 利用利用扩展文法扩展文法构造构造句柄识别器句柄识别器:: ※ ※ 若把若把扩展文法扩展文法中的中的位置号位置号看成看成状态状态,那么,那么就可用就可用有限自动机有限自动机描述描述如下:如下: ① ① 对每个产生式,构造自动机,用以识别自己的符对每个产生式,构造自动机,用以识别自己的符号串;号串; (0,Z)=1;(0,Z)=1; ②② ‘预见预见’ 某个某个非终结符非终结符,也就,也就‘预见预见’ 其所有其所有产产生式的头符号生式的头符号; ;于是各产生式的于是各产生式的子自动机子自动机可可并接并接在一起在一起。
【【表示表示】】: : 0 0状态状态 ‘预见预见’ Z Z 后变换为后变换为 1 1状态状态 !! 设编码设编码‘0 0’作为自动机的作为自动机的开始状态开始状态,,第二个产生式,构造第二个产生式,构造自动机自动机::则则 第一个产生式,构造第一个产生式,构造自动机自动机:: (0,a)=2;(0,a)=2; (2,B)=3;(2,B)=3; (3,A)=4;(3,A)=4; (4,d)=5;(4,d)=5; …语法分析语法分析※ ※ 句柄识别器句柄识别器的自动机构造示例:的自动机构造示例:其中:其中:r(j)r(j) 归约函数归约函数( (即即 按序号为按序号为(j)(j)的的产生式产生式归约!归约!) );;⑴ ⑴ 移进状态:移进状态:⑵ ⑵ 归约状态:归约状态:B -> bB -> b9 9 B B1010 (4)(4)| c| c11 11 (5)(5)Z` -> ZZ` -> Z1 1 (0)(0)Z Z -> a-> a2 2 B B3 3 A A4 4 d d5 5 (1)(1)A -> bA -> b6 6 c c7 7 (2)(2)| | c c8 8 (3)(3)G`(Z`)G`(Z`) 符号说明符号说明 0 0,,2 2,,3 3,,4 4,,6 6,,9 9 ;;① ① 0 01111+ +Z Za aB Bb bb bB Bc cc cA Ad db bc cOKOKr(3r(3) )r(1)r(1)r(2r(2) )r(4)r(4)r(5)r(5)c c②②③③④④⑤⑤⑥⑥⑦⑦⑧⑧⑨⑨⑩⑩ 由由扩展文扩展文法法到到句柄识别句柄识别器器的构造过程的构造过程如右图所示:如右图所示:【【例例5.85.8】】 5 5,,7 7,,8 8,,1010,,1111;; 分析结束分析结束( (OKOK) )。
⑶ ⑶ 接受状态:接受状态: 1 1语法分析语法分析① ① 0 01111+ +Z Za aB Bb bb bB Bc cc cA Ad db bc cOKOKr⑶r⑶r⑴r⑴r⑵r⑵r⑷r⑷r⑸r⑸c c②②③③④④⑤⑤⑥⑥⑦⑦⑧⑧⑨⑨⑩⑩※ ※ 根据根据句柄识别器句柄识别器进行进行LRLR分析过程:分析过程:※ ※ 根据根据句柄识别器句柄识别器,, abccd# abccd# 识别过程:识别过程:(#(#0 0, ,a a) )=>(#=>(#0 0a a2 2b b9 9B B1010, ,c c) )=>(#=>(#0 0a a2 2B B3 3A A4 4, ,d d) )=>(#=>(#0 0a a2 2, ,b b) )=>(#=>(#0 0a a2 2b b9 9, ,c c) )=>(#=>(#0 0a a2 2b b9 9c c1111, ,c c) )=>=>(#(#0 0a a2 2B B3 3, ,c c) )=> => (#(#0 0a a2 2B B3 3c c8 8, ,d d) )=>=>(#(#0 0a a2 2B B3 3A A4 4d d5 5, ,# #) )=>=>( (# #0 0Z Z1 1, ,# #) )=>0k=>0k 句柄识别器句柄识别器又称又称“活前缀图活前缀图”: : 意思是在意思是在最左最左归约归约过程中,识别了过程中,识别了句柄句柄,实际上也就识别了以,实际上也就识别了以句句柄柄为后缀的该句型为后缀的该句型( (规范句型规范句型) )的前部符号串。
的前部符号串注注B -> bB -> b9 9 B B1010 (4)(4)| c| c11 11 (5)(5)Z` -> ZZ` -> Z1 1 (0)(0)Z Z -> a-> a2 2 B B3 3 A A4 4 d d5 5 (1)(1)A -> bA -> b6 6 c c7 7 (2)(2)| | c c8 8 (3)(3)句句柄柄【【例例5.85.8】】文法的文法的句柄识别器句柄识别器: :语法分析语法分析+ +LR(0)LR(0)分析器的基本组成:分析器的基本组成:※LR(0)※LR(0)分析法要求文法应是分析法要求文法应是 LR(0LR(0)文法)文法LR(0)LR(0)分析表分析表 LR(0)LR(0)控制器控制器 ※LR( ※LR(0 0) )中的中的0 0, ,是指是指不必查看当前符号不必查看当前符号就可确就可确认认句柄句柄之意;之意;5.4.2 LR(0)5.4.2 LR(0)分析器设计分析器设计1. 1. LR(0)LR(0)文法文法及其判定及其判定 ① ① 句柄识别器中,句柄识别器中,移移进进和和归约归约不冲突不冲突;即;即 移进和归约不同时发生!移进和归约不同时发生! ※ ※ 满足下述特点的文法称为满足下述特点的文法称为 LR(0)LR(0)文法文法。
例例5.8 5.8 文法,就是文法,就是 LR(0)LR(0)文法,文法,请看:请看:② ② 归约归约时不必查看当前符号;时不必查看当前符号;语法分析语法分析【【算法算法】】 ⑵ ⑵ 根据根据句柄识别器,句柄识别器,填写填写 LR(0)LR(0)分析表:分析表: ① ① 若若 (i,x)=k,x∈(V(i,x)=k,x∈(VN N+V+VT T),),则则 R(i,x):= R(i,x):= xkxk ; ; ② ② 若若 状态状态i i 标记有(标记有(- -,,r(j)),r(j)), 则则 对任何对任何 a ∈(Va ∈(VT T+{#}+{#}),), R(i,a):= R(i,a):= r(j)r(j) ; ; ③ R(1,#):= ③ R(1,#):= OKOK 2. LR(0)2. LR(0)分析表构造分析表构造⑴ ⑴ 扩展文法,扩展文法,构造句柄识别器;构造句柄识别器; LR()LR()分析表分析表是是 LR()LR()分析法的分析法的知识表知识表, ,是是句柄识句柄识别器别器的一种机内的一种机内表示形式:表示形式:状状态态编编码码终结符终结符 + #+ #非终结符非终结符 R(_,_)R(_,_): :0 0 1 1 … a a … # # Z Z …n nakakOKOKZkZkr(j)r(j)r(j)r(j)…语法分析语法分析① ① 0 01111+ +Z Za aB Bb bb bB Bc cc cA Ad db bc cOKOKr⑶r⑶r⑴r⑴r⑵r⑵r⑷r⑷r⑸r⑸c c②②③③④④⑤⑤⑥⑥⑦⑦⑧⑧⑨⑨⑩⑩LR(0)LR(0)分析表分析表※※【【例例5.85.8】】文法文法构造过程:构造过程: 9 9 10 10 Z Z A A 1 1 5 5 0 0 4 4 8 8 d d # # 6 6 7 7 11 11 3 3 2 2 B B c c b b a a B B1010c c1111 b b9 9r r(4)(4)r r(4)(4)r r(4)(4)r r(4)(4)r r(4)(4) Z Z1 1 A A4 4 OK OKr r(1)(1)r r(1)(1)r r(1)(1)r r(1)(1)r r(1)(1) a a2 2d d5 5r r(3)(3)r r(3)(3)r r(3)(3)r r(3)(3)r r(3)(3)r r(5)(5)r r(2)(2) r r(5)(5)r r(2)(2)c c7 7r r(2)(2)r r(2)(2)r r(2)(2)r r(5)(5)r r(5)(5)r r(5)(5)c c8 8 b b6 6 B B3 3 b b9 9c c1111语法分析语法分析3. LR(0)3. LR(0)控制程序设计控制程序设计开始开始PUSH(#0)PUSH(#0)NEXT(w)NEXT(w)查查LR(0)LR(0)分析表分析表R(Xk,w)=?R(Xk,w)=?R=R=空空? ?Y YerrerrR=OKR=OK结束结束R=R=r(j)r(j)R=WiR=WiPUSH WiPUSH Wi 则则 PUSH Ai;PUSH Ai;取取 A -> A -> (j) (j)① POP(① POP( ););② ② 若若 R(Xk,A)=AiR(Xk,A)=Ai Xk Xk 栈顶栈顶文法出现文法出现;;归归约约移移进进LR( )LR( )控制器控制器n n●●语法分析语法分析※ LR(0)※ LR(0)分析法小结示例分析法小结示例G(Z): Z -> aBAdG(Z): Z -> aBAd A -> bc | A -> bc | c c B -> bB | c B -> bB | c【【例例5.85.8】】文法文法: :⑴ ⑴ 扩展文法,使扩展文法,使文法符号文法符号附有附有位置位置信息:信息: B -> bB -> b9 9 B B1010 (4)(4)| c| c11 11 (5)(5)Z` -> ZZ` -> Z1 1 (0)(0)Z Z -> a-> a2 2 B B3 3 A A4 4 d d5 5 (1)(1)A -> bA -> b6 6 c c7 7 (2)(2)| | c c8 8 (3)(3)⑵ ⑵ 由由扩展文法扩展文法构造构造句柄识别器:句柄识别器:① ① 0 01111+ +Z Za aB Bb bb bB Bc cc cA Ad db bc cOKOKr(3r(3) )r(1)r(1)r(2r(2) )r(4)r(4)r(5)r(5)c c②②③③④④⑤⑤⑥⑥⑦⑦⑧⑧⑨⑨⑩⑩语法分析语法分析① ① 0 01111+ +Z Za aB Bb bb bB Bc cc cA Ad db bc cOKOKr⑶r⑶r⑴r⑴r⑵r⑵r⑷r⑷r⑸r⑸c c②②③③④④⑤⑤⑥⑥⑦⑦⑧⑧⑨⑨⑩⑩ 9 9 10 10 Z Z A A 1 1 5 5 0 0 4 4 8 8 d d # # 6 6 7 7 11 11 3 3 2 2 B B c c b b a a B B1010c c1111 b b9 9r r(4)(4)r r(4)(4)r r(4)(4)r r(4)(4)r r(4)(4) Z Z1 1 A A4 4 OK OKr r(1)(1)r r(1)(1)r r(1)(1)r r(1)(1)r r(1)(1) a a2 2d d5 5r r(3)(3)r r(3)(3)r r(3)(3)r r(3)(3)r r(3)(3)r r(5)(5)r r(2)(2) r r(5)(5)r r(2)(2)c c7 7r r(2)(2)r r(2)(2)r r(2)(2)r r(5)(5)r r(5)(5)r r(5)(5)c c8 8 b b6 6 B B3 3 b b9 9c c1111⑶ ⑶ 由句柄识别由句柄识别器构造器构造LR(0)LR(0)分分析表:析表:语法分析语法分析⑷ LR(0)⑷ LR(0)分析法分析法分析过程分析过程示例:示例: 剩余串剩余串 操操 作作 w w 分析栈分析栈#0 a2 #0 a2 b9b9 B10B10 PUSH(c8),NEXT(w) PUSH(c8),NEXT(w) d# d# c c#0 a2#0 a2 REDUCE(3)REDUCE(3) # # d d#0 a2 B3#0 a2 B3 PUSH(d5),NEXT(w) PUSH(d5),NEXT(w) # # d d#0 #0 a2 B3a2 B3 REDUCE(1)REDUCE(1) # ##0 #0 a2 B3 A4a2 B3 A4 OKOK # ##0#0 d# d# d# d# cd# cd# ccd# ccd# bccd# bccd# PUSH(c11),NEXT(w)PUSH(c11),NEXT(w) c c#0 a2#0 a2 PUSH(a2),NEXT(w) PUSH(a2),NEXT(w) a a#0 #0 REDUCE(4)REDUCE(4) c c REDUCE(5)REDUCE(5) c c#0 a2 b9#0 a2 b9 PUSH(b9),NEXT(w) PUSH(b9),NEXT(w) b b#0#0 a2 a2 b9 b9 c11c11 B3 B3 c8c8 A4 A4 d5 d5 Z1 Z1查分析表查分析表查产生式查产生式控制程序控制程序※※符号串:符号串:abccdabccd# #语法分析语法分析※※【【例例5.95.9】】LR(0)LR(0)分析法示例分析法示例1 1::※ ※ 构造下述文法的构造下述文法的LR(0)LR(0)分析表:分析表: G(Z)G(Z):: Z -> aAb , A -> cA | d Z -> aAb , A -> cA | d ① ① ② ③ ④ ② ③ ④ ⑤ ⑥ ⑤ ⑥ ⑦ ⑦0 0+ +Z Za aA Ad db bc cA AOKOKr(1)r(1)r(2r(2) )r(3)r(3)c cd d⑵ ⑵ 构造句柄识别器:构造句柄识别器:⑴ ⑴ 扩展文法扩展文法::G`(Z`) Z`-> ZG`(Z`) Z`-> Z1 1 (0) (0) Z -> a Z -> a2 2 A A3 3 b b4 4 (1)(1) A -> c A -> c5 5 A A6 6 (2)| d (2)| d7 7 (3)(3)语法分析语法分析 ⑶ ⑶ 设计设计LR(0) LR(0) 分分析表:析表:r(3)r(3)r(2)r(2) d7 d7 r(1) r(1) d7 d7 d d Z1 Z1 Z Z A6 A6 A3 A3 A A OK OK 1 1 c5 c5 5 5 a2 a2 0 0 r(1) r(1) (1) (1) r(1) r(1) r(1) r(1) 4 4r(3)r(3)r(2)r(2) # #r(2)r(2)r(2)r(2) r(2) r(2) 6 6r(3)r(3)r(3)r(3) r(3) r(3) 7 7 b4 b4 3 3 c5 c5 2 2 c c b b a a ① ① ② ③ ④ ② ③ ④ ⑤ ⑥ ⑤ ⑥ ⑦ ⑦0 0+ +Z Za aA Ad db bc cA AOKOKr(1r(1) )r(2r(2) )r(3)r(3)c cd d语法分析语法分析※※【【例例5.105.10】】左递归文法的左递归文法的LR(0)LR(0)分析表构造:分析表构造: d d Z Z A A 1 1 5 5 0 0 4 4 # # 6 6 3 3 2 2 c c b b a a ① ① ② ③ ④ ② ③ ④ ⑥ ⑤ ⑥ ⑤ 0 0+ +Z Za aA Ad db bc cOKOKr(1r(1) )r(2r(2) )r(3r(3) )Z`->ZZ`->Z1 1(0);(0); Z ->aZ ->a2 2A A3 3b b4 4(1);(1); A ->AA ->A3 3c c5 5(2)|d(2)|d6 6(3)(3)G`(Z`G`(Z`) )【【注注】】为了使为了使句柄识别句柄识别器器是是确定机确定机,左递归产,左递归产生式生式(2)(2)中的中的A A要与要与(1)(1)中中的的A A编码相同编码相同!?,!?, r r(3)(3) r r(2)(2) r r(1)(1) d d6 6 Z Z1 1 A A3 3 OK OKr r(2)(2) r r(2)(2) r r(2)(2) r r(2)(2) a a2 2r r(1)(1) r r(1)(1) r r(1)(1) r r(1)(1)r r(3)(3) r r(3)(3) r r(3)(3) r r(3)(3) c c5 5 b b4 4 语法分析语法分析※※【【例例5.115.11】】LR(0)LR(0)分析法示例分析法示例1 1※ ※ 构造下述文法的构造下述文法的LR(0)LR(0)分析表:分析表: G(Z) Z -> aAb , A -> Ac | dG(Z) Z -> aAb , A -> Ac | d ⑴ ⑴ 扩展文法:扩展文法:G`(Z`) Z`-> ZG`(Z`) Z`-> Z1 1 (0) (0) Z -> a Z -> a2 2 A A3 3 b b4 4 (1)(1) A -> A A -> A5 5c c6 6 (2)| d(2)| d7 7 (3)(3) ⑵ ⑵ 构造可归前缀图:构造可归前缀图:① ① ② ③ ④ ② ③ ④ ⑤ ⑥ ⑤ ⑥ ⑦ ⑦0 0+ +Z Za aA Ad db bA Ac cOKOKr(1)r(1)r(2r(2) )r(3)r(3)语法分析语法分析( (接上页接上页) ) ∵ ∵ ((2 2,,A)={3,5},A)={3,5}, ∴ ∴ 是个非确定机;是个非确定机; ① ① ② ③ ④ ② ③ ④ ⑥ ⑤ ⑥ ⑤ 0 0+ +Z Za aA Ad db bc cOKOKr(1)r(1)r(2r(2) )r(3)r(3)※ ※ 确定化的可归前缀图:确定化的可归前缀图:① ① ② ③ ④ ② ③ ④ ⑤ ⑥ ⑤ ⑥ ⑦ ⑦0 0+ +Z Za aA Ad db bA Ac cOKOKr(1)r(1)r(2r(2) )r(3)r(3)语法分析语法分析 LR(0) LR(0) 分析表:分析表:r(3)r(3)r(2)r(2)r(1)r(1) d6 d6 d d Z1 Z1 Z Z A3 A3 A A OK OK 1 1r(2)r(2)r(2)r(2)r(2)r(2) r(2) r(2) 5 5 a2 a2 0 0r(1)r(1)r(1) r(1) r(1) r(1) r(1) r(1) 4 4r(3)r(3) # #r(3)r(3)r(3)r(3) r(3) r(3) 6 6 c5 c5 b4 b4 3 3 2 2 c c b b a a ① ① ② ③ ④ ② ③ ④ ⑥ ⑤ ⑥ ⑤ 0 0+ +Z Za aA Ad db bc cOKOKr(1)r(1)r(2r(2) )r(3)r(3)( (接上页接上页) )语法分析语法分析i ir(j),r(kr(j),r(k) )5.4.3 5.4.3 LR(0)LR(0)分析法的扩展分析法的扩展 LR()LR()分析法的关键技术是分析法的关键技术是句柄识别器句柄识别器的设计问题;的设计问题;如果句柄识别器发生了如果句柄识别器发生了冲突冲突:: 此时,此时,LR(0)LR(0)分析法分析法失效失效! ! 需需要改进要改进句柄识别器句柄识别器的的构造方法构造方法,,于是出现了各种不同的于是出现了各种不同的 LR( )LR( )分分析法。
析法 【【注注】】 下面仅通过实例探讨下面仅通过实例探讨 LR(0)LR(0)分析表分析表 的简单扩的简单扩展问题展问题 --- --- 称为称为 SLR(1)SLR(1)分析法i ik kr(j)r(j)x x移进移进/ /归约冲突归约冲突归约归约/ /归归约冲突约冲突或或语法分析语法分析【【例例5.95.9】】 G(Z): Z->aAb G(Z): Z->aAb ;;A->cd|A->cd| ⑴ ⑴ 扩展扩展文法文法,, 构造构造句柄识别器:句柄识别器: Z`-> ZZ`-> Z1 1(0) ; (0) ; Z -> aZ -> a2 2A A3 3b b4 4(1) (1) A -> cA -> c5 5d d6 6(2)|(2)| 7 7(3)(3)G`(Z`)G`(Z`): :※ ※ 经确定化经确定化( (消消ε边) )::※ ※ 句柄识别器句柄识别器出出现冲突现冲突:: ∵ ∵ ②:{c5,r(3),A3}②:{c5,r(3),A3}∴∴ 称为称为 移移进进/ /归约冲突!归约冲突!看到:看到: {b}∩{c}={b}∩{c}= ;;解决办法:解决办法: 求:求:follow(A)=follow(A)={ {b}b}∴ ∴ 若若 w=c w=c 则则 c5 ; c5 ; 若若 w=b w=b 则则 r(3) r(3) 。
※ ※ 通过查看通过查看‘当前单词当前单词’,是否可以解决?为此:,是否可以解决?为此:r(3r(3) )0 0+ +Z Za aA Ab bOKOKr(1r(1) )r(2r(2) )c cr(3r(3) ) ①①②②③③④④⑤⑤d d⑥⑥⑦⑦- -语法分析语法分析Z`->Z(0)Z`->Z(0)Z->aAb(1)Z->aAb(1)A->cd(2) A->cd(2) ->-> (3)(3)SLR(1)SLR(1)分析表分析表b br(3r(3) )SLR(1)SLR(1)句柄识别器:句柄识别器:⑵ ⑵ 扩展扩展句柄识别器,句柄识别器,构造构造SLR(1)SLR(1)分析表分析表r(2)r(2)d6d6 r(1) r(1) Z1 Z1 A3 A3 OK OK a2 a2 r(1) r(1)r(1)r(1) r(1) r(1) r(1) r(1)r(2)r(2)r(2)r(2)r(2)r(2) r(2) r(2) b4 b4c5c5 r(3) r(3)注意与注意与LR(0)LR(0)分析分析表的区别!表的区别!0 0+ +Z Za aA Ab bOKOKr(1r(1) )r(2r(2) )c c①①②②③③④④⑤⑤d d⑥⑥- -※※ 如此可以解决冲如此可以解决冲突的文法,称为突的文法,称为SLR(1)文法文法。
语法分析语法分析S`-> SS`-> S1 1(0) (0) S -> AS -> A2 2a a3 3 ⑴| B⑴| B4 4c c5 5⑵ ⑵ A -> A -> d d6 6 ⑶ ; B-> ⑶ ; B->d d7 7 ⑷⑷【【例例5.105.10】】 G(S): S->Aa|Bc G(S): S->Aa|Bc ;;A->d; B->d ;A->d; B->d ;⑴ ⑴ 扩展扩展文法文法,, 构造构造句柄识别器:句柄识别器: G`(S`)G`(S`): :即即 若若 w=a w=a 则则 r(3) ; r(3) ; 若若 w=c w=c 则则 r(4) r(4) ※ ※ 求:求:follow(A)follow(A)={a}={a};;follow(B)follow(B)={c}={c}0 0+ +S SA Aa ac cOKOKr(1r(1) )r(4)r(4)d dr(3r(3) )r(2r(2) )B B① ① ② ② ④ ④ ⑤ ⑤ ⑥ ⑥ ③ ③ ⑦⑦d d0 0+ +S SA Aa ac cOKOKr(1r(1) ),r(4,r(4) )d dr(3r(3) )r(2r(2) )B B① ① ② ② ④ ④ ⑤ ⑤ ⑥ ⑥ ③ ③ ⑥⑥确定化确定化非确定机非确定机语法分析语法分析S`-> SS`-> S1 1(0) (0) S -> AS -> A2 2a a3 3 ⑴| B⑴| B4 4c c5 5⑵ ⑵ A -> A -> d d6 6 ⑶ ; B-> ⑶ ; B->d d6 6 ⑷⑷⑵ ⑵ 扩展扩展句柄识别器,句柄识别器,构造构造SLR(1)SLR(1)分析表分析表 # # A A B B 1 1 5 5 0 0 4 4 S S 6 6 3 3 2 2 d d c c a a r(2)r(2) r(1) r(1) OK OK A2 A2 B4 B4 r(2)r(2)r(2)r(2) r(2) r(2) S1 S1 d6 d6 c5 c5 r(4)r(4) r(3) r(3)r(1)r(1) r(1) r(1) r(1) r(1) a3 a3注意与注意与LR(0)LR(0)分析表的区分析表的区别!别!SLR(1)SLR(1)分析表分析表※※ 通过查看当前单词,通过查看当前单词,解决冲突:解决冲突:0 0+ +S SA Aa ac cOKOKr(1r(1) )d dr(2r(2) )B B① ① ② ② ④ ④ ⑤ ⑤ ③ ③ ,r(4,r(4) )r(3r(3) )⑥ ⑥ ⑥⑥-SLR(1)SLR(1)句柄识句柄识别器别器a ar⑶r⑶r⑷r⑷c c语法分析语法分析 简单优先简单优先分析法是一种从分析法是一种从左左到右到右扫描扫描、最、最左左归归约约分析法;它属于自底向上分析方法。
分析法;它属于自底向上分析方法 该方法利用该方法利用文法符号文法符号之间的之间的优先关系优先关系来确定待归来确定待归约的句柄约的句柄 ,即可确定当前句型的,即可确定当前句型的句柄句柄5.5 5.5 简单优先分析法简单优先分析法⑴ ⑴ 利用一个利用一个分析表分析表,登记,登记选择选择句柄产生式句柄产生式的知识;的知识;⑵ ⑵ 利用一个利用一个分析栈分析栈,记录分析过程;,记录分析过程;⑶⑶【【分析算法分析算法】】依次读取依次读取单词,单词,并进行如下操作:并进行如下操作: 当栈顶出现当栈顶出现句柄句柄时,时,规约规约之,否则之,否则移进移进 5.5.1. 5.5.1. 简单优先分析法基本概念简单优先分析法基本概念※ ※ 简单优先分析法的基本要点有三:简单优先分析法的基本要点有三:1. 1. 什么是简单优先分析法?什么是简单优先分析法?语法分析语法分析 2. 2. 简单优先分析过程示例简单优先分析过程示例 符号串:符号串: = abbeae #SaAeBSbbaG(S): G(S): S SaAeB|baAeB|b A ASb|eSb|e B BaAaAAe语法分析语法分析 句柄产生式句柄产生式 操操 作作 剩余串剩余串 w w 分析栈分析栈 移进移进,NEXT,NEXT a e # a e # e e# a# a 移进移进,NEXT,NEXT e # e # a a# a A# a A 移进移进,NEXT,NEXT # # e e# a A e# a A e 归约归约 A -> e A -> e # ## aAe a # aAe a 归约归约 B -> aA B -> aA # ## aAe a# aAe a A -> Sb A -> Sb S -> b S -> b 归约归约 e a e # e a e # b b# a# a 移进移进,NEXT ,NEXT b b e a e # b b e a e # a a# # 归约归约 a e # a e # e e # a S # a S 移进移进,NEXT,NEXT e a e # e a e # b b# a # a 移进移进,NEXT,NEXT b e a e # b e a e # b b# # A A A A a a a a b b e e e e句句柄柄( (接上页接上页) )⑶ ⑶ 利用利用分析栈分析栈记录行分析过程:记录行分析过程:【【注注】】 何时栈顶出现何时栈顶出现句柄?句柄?怎样求当前怎样求当前句柄产生式句柄产生式 ??设设 待分析的符号串待分析的符号串: abbeae#abbeae## S# S b b# aAe# aAe # ## B# B句句柄柄 S -> aAeB S -> aAeB 归约归约# # # # S S OKOK语法树语法树语法分析语法分析①①同时归约者为相等关系,记作同时归约者为相等关系,记作 ;;3. 3. 文法符号之间的优先关系文法符号之间的优先关系⑴⑴归约过程中如何确认归约过程中如何确认句柄句柄?? ※ ※ 是否是句柄是否是句柄,还要看其,还要看其所在符号串中的所在符号串中的位置位置。
语语法法树树※※从语法树上,找出优先关系(指相临符号之间)如下: S S b b,,a a A A,,A A e e,,e e B B …如:如:②②左后归约者为小于关系,记作左后归约者为小于关系,记作< <·;; 如:如:a >;; 如:如:b b·>b,>b,b b·>e>e… 当把优先关系纳入待分析的符号串时,有如下关系: # <# <· a a < <· b b ·> > b b ·> e <> e <· a < a <· e e ·> #> # # <# <· a a < <· S b S b ·> > e < e <· a < a <· e e ·> #> # # <# <· a A e < a A e <· a a < <· e e ·> > # # # <# <· a A e a A e < <· a A a A ·> > # # # # < <· a A e B a A e B ·> > # # 结论:一个句型的句柄,位于第一次(自左至右)结论:一个句型的句柄,位于第一次(自左至右)出现在出现在< <· …… ·> >之间的符号串!之间的符号串! 语法分析语法分析※※从文法中获取优先关系从文法中获取优先关系! ! 设设si si ,,sjsj是两个文法符号是两个文法符号; ; 如:如:a Aa A,,A eA e,,e Be B,,S bS b;; ① si sj ① si sj ,当且仅当有,当且仅当有U U…si sj si sj …;; ⑵⑵优先关系的定义优先关系的定义 G(S): G(S): S SaAeB|baAeB|b A ASb|eSb|e B BaAaA② si<② si<·sj sj ,当且仅当有,当且仅当有 U U…siWsiW… ,且,且 W sjW sj…;; => + +如:如:asj >sj ,当且仅当有,当且仅当有 U U…VsjVsj… ,且,且 V V … sisi;; => + +如:如:b b·>b>b,,B B·>b>b,,A A·>b>b,,e e·>b>b。
(3)头符号集合和尾符号集合 设设 A∈VA∈VN N,, si si ,,sjsj是两个文法符号是两个文法符号; ;则则: : FIRSTVT(A)={si| A siFIRSTVT(A)={si| A si……},}, => + +LASTVT(A) = {sj|A LASTVT(A) = {sj|A ……sj}sj} => + +语法分析语法分析【【例例5.125.12】】G(S): G(S): S SaAeB|baAeB|b,,A ASb|eSb|e,,B BaAaA S A B a b e S A ·> B ·> a <· <· <· <· b ·> ·> e <· ·> ·> S A BFIRSTVT a , b S,e,a,b aLASTVT B,b,A,e b , e A , b , e 头符号集合头符号集合尾符号集合尾符号集合优先矩阵优先矩阵表项表项=空空表示两个表示两个符号不可符号不可能相临 语法分析语法分析+ +简单优先分析器的基本组成:简单优先分析器的基本组成:※※优先优先分析法要求文法应是分析法要求文法应是简单优先简单优先文法文法。
优先矩阵分析表优先矩阵分析表 优先分析控制器优先分析控制器 ※ ※分析中只分析中只查看当前符号查看当前符号就可确认就可确认句柄句柄;;5.5.2 5.5.2 简单优先分析器设计简单优先分析器设计1.1.简单优先简单优先文法文法及其判定及其判定 ① ①文法产生式没有相同的右部;文法产生式没有相同的右部; 如如A Aα α ,,B Bα α ,,※ ※ 满足下述特点的文法称为满足下述特点的文法称为简单优先简单优先文法文法例例5.12 5.12 文法,就是文法,就是简单优先简单优先文法,文法,请看:请看:②②文法符号之间至多有一种优先关系!文法符号之间至多有一种优先关系! 语法分析语法分析【【算法算法】】 ①① si sj si sj ,, 当且仅当有当且仅当有U U…si sj si sj …;; ② ② si sj > sj ,, 当且仅当有当且仅当有U U…VsjVsj…,且,且si∈LASTVT(V)si∈LASTVT(V)。
2. 2. 简单优先分析矩阵分析表构造简单优先分析矩阵分析表构造设设 W,V∈VW,V∈VN N,si,si,,sjsj是两个文法符号是两个文法符号; ; 简单优先分简单优先分析表析表是优先分析是优先分析法的知识表法的知识表, ,是是文文法法的一种机内表的一种机内表示形式:示形式:终结符终结符 + +非终结符非终结符+#+# … a a … Z Z #优先关系优先关系符号符号终终结结符符+ +非非终终结结符符+ +# #语法分析语法分析3. 3. 简单优先控制程序设计简单优先控制程序设计开始开始PUSH(#)PUSH(#)NEXT(w)NEXT(w)查优先分析表查优先分析表R(Xk,w)=?R(Xk,w)=? 空空? ?n nerrerr(#S#) 结束结束PUSH WPUSH WPOP(sj)POP(sj),,POP(sj-1)POP(sj-1),,… POP(si)POP(si);;PUSH(A)PUSH(A)①①从从sj(栈顶符)开始,往栈内(栈顶符)开始,往栈内查找,找到第一个使查找,找到第一个使si-1<·si的的si(句柄的头)(句柄的头) ②②用用sisi+1…sj去查文法产生式,去查文法产生式,若有若有Asisi+1…sj,则:,则: Xk Xk:栈顶:栈顶符符;;归归约约移移进进简单优先控制器简单优先控制器y y ·>? ?y yn n语法分析语法分析※※只考虑算符(终结符)之间的优先关系只考虑算符(终结符)之间的优先关系 ((1 1)算符文法)算符文法 设有一文法设有一文法G G,如果,如果G G中没有形如中没有形如A A…QRQR…的产生式,其中的产生式,其中Q Q和和R R为非终结符,则称该文法为非终结符,则称该文法为算符文法(为算符文法(OGOG文法)。
文法) 5.5.3 5.5.3 算符优先分析算符优先分析(2)头符号集合和尾符号集合头符号集合和尾符号集合 设设 a∈Va∈VT T,,P,R∈VP,R∈VN N,, 则则: : FIRSTVT(P)={a| P aFIRSTVT(P)={a| P a…… 或或 P RaP Ra……},}, => + +LASTVT(P) ={a| P LASTVT(P) ={a| P ……a a 或或 P P …… aR}R} => + + => + + => + +语法分析语法分析设设a,b∈Va,b∈VT T,,P,Q,R∈VP,Q,R∈VN N,, ① a b ① a b ,, 当且仅当有当且仅当有 P P…abab… 或或 P P…aQbaQb… ;; (3) 算符优先关系定义算符优先关系定义算符优先关系定义算符优先关系定义② a<② a<·b b ,, 当且仅当有当且仅当有 P P…aRaR… ,且,且R bR b… 或或 R QbR Qb…;; => + +③③ a a·>b >b ,, 当且仅当有当且仅当有 P P…RbRb… ,且,且R R …a a 或或 R R …aQaQ;; => + +(4)算符优先文法算符优先文法 如果算符文法如果算符文法G G中的任何一对终结符中的任何一对终结符a a和和b b之间,仅满之间,仅满足上述一种关系,则足上述一种关系,则G G就是一个算符优先文法(就是一个算符优先文法(OPGOPG)。
=> + + => + +语法分析语法分析5.6 5.6 语法分析方法综合示例语法分析方法综合示例G(Z)G(Z)::Z -> dAZ | bAcZ -> dAZ | bAcA -> aA | c |εA -> aA | c |ε【【例例5.135.13 】】 给定文法如下:给定文法如下:Ⅰ. Ⅰ. 递归子程序法;递归子程序法;Ⅱ. LL(1)Ⅱ. LL(1)分析法;分析法;※ ※ 试分别用下述分析法,对给定的试分别用下述分析法,对给定的符号串符号串进行语法分析:进行语法分析:Ⅲ. LR(0)( Ⅲ. LR(0)( 或或SLRSLR((1 1))) )分析法;分析法;设设 给定的符号串为:给定的符号串为:αα= bac= bac∵ Z => bAc => baAc => ba∵ Z => bAc => baAc => baε c => bacc => bac∴∴ bac bac 是文法是文法 G(Z) G(Z) 的一个句子的一个句子注注语法分析语法分析G(Z)G(Z)::Z->dAZZ->dAZ①① | bAc | bAc②② A->aA A->aA③③ | e | e④④ |εε⑤⑤Ⅰ. Ⅰ. 构造递归子程序法:构造递归子程序法:⒈⒈ 证明证明 G(Z)G(Z)是是 LL(1)LL(1)文法:文法:select(①)= first(select(①)= first(dAZdAZ)={ d } )={ d } ※ ※ 求选择集合:求选择集合:select(②)= first(select(②)= first(bAcbAc)={ b })={ b }select(③)= first(select(③)= first(aAaA)={ a } )={ a } select(④)= first(select(④)= first(c c) ={ e) ={ e } }select(⑤)= follow(A)= {select(⑤)= follow(A)= { d ,b d ,b ,,c }c }⑴⑴⑵⑵∵ ∵ 两组选择集合两组选择集合⑴⑴, ⑵⑵ 皆不相交,皆不相交,∴ ∴ G G((Z Z)是)是 LL(1) LL(1) 文法!文法!即即 递归子程序法可用!!递归子程序法可用!!语法分析语法分析Z子程序子程序主程序主程序⒉⒉ 构造递归子程序构造递归子程序(框图框图)::G(Z)G(Z)::Z->dAZZ->dAZ①① | bAc | bAc②② A->aA A->aA③③ | e | e④④ |εε⑤⑤入口入口 aNEXT(w)出口出口遇遇 时时nyAA子程序子程序 eNEXT(w)yn #NEXT(w)结束结束nyZ开始开始err0入口入口出口出口 derr3NEXT(w)AnnyZA cNEXT(w)y berr2nyNEXT(w)语法分析语法分析⒊⒊ 分析过程示意分析过程示意::入口入口 aNEXT(w)出口出口遇遇 时时nyAA子程序子程序 eNEXT(w)yn主程序主程序 #NEXT(w)结束结束nyZ开始开始err0bac#设设 待分析的符号串:待分析的符号串:入口入口出口出口 derr3NEXT(w)AZ子程序子程序nnyZA cNEXT(w)y berr2nyNEXT(w)b bb ba aa ac cc cc cc c# ## #▼■语法分析语法分析G(Z)G(Z)::Z->dAZZ->dAZ①① | bAc | bAc②② A->aA A->aA③③ | e | e④④ |εε⑤⑤ⅡⅡ. LL(1). LL(1)分析法:分析法:⒈⒈ 证明证明 G(Z)G(Z)是是 LL(1)LL(1)文法:文法:select(①)= first(select(①)= first(dAZdAZ)={ d } )={ d } ※ ※ 求选择集合:求选择集合:select(②)= first(select(②)= first(bAcbAc)={ b })={ b }select(③)= first(select(③)= first(aAaA)={ a } )={ a } select(④)= first(select(④)= first(c c) ={ e) ={ e } }select(⑤)= follow(A)= {select(⑤)= follow(A)= { d ,b d ,b ,,c }c }⑴⑴⑵⑵∵ ∵ 两组选择集合两组选择集合⑴⑴, ⑵⑵ 皆不相交,皆不相交,∴ ∴ G G((Z Z)是)是 LL(1) LL(1) 文法!文法!即即 递归子程序法可用!!递归子程序法可用!!语法分析语法分析 2. 2. 构造构造 LL(1)LL(1)分析表:分析表: LL(1) LL(1) 分析表:分析表:G(Z)G(Z)::Z->dAZZ->dAZ{ d }{ d }①① | bAc | bAc{ b }{ b }②② A->aA A->aA{ a }{ a }③③ | e | e{ e }{ e }④④ |εε{b,c,d}{b,c,d}⑤⑤※ ※ 带有带有选择集合选择集合的文法:的文法: d A Z e c b a # ⑤⑤ ① ① ④ ④ ⑤⑤ ⑤⑤ ③ ③ ② ② 语法分析语法分析 栈栈 当前符号当前符号 剩余序列剩余序列 栈操作栈操作 逆逆序序压压栈栈# ## ## c # c A A# c# c# c # c A A# # c c# # c A c A b b A A a ab ba c #a c #pop,push(cAb)pop,push(cAb)b ba c #a c #pop,nextpop,nexta ac #c # pop,push( pop,push(Aa)Aa)a ac #c #pop,next pop,next c c# #c c# ## # Z Z※ ※ 对符号串:对符号串: = = bacbac # # 的分析过程:的分析过程:⒊ ⒊ 分析过程示意分析过程示意::G(Z)G(Z)::Z->dAZZ->dAZ{ d }{ d }①① | bAc | bAc{ b }{ b }②② A->aA A->aA{ a }{ a }③③ | e | e{ e }{ e }④④ |εε{b,c,d}{b,c,d}⑤⑤ d A Z e c b a # ⑤⑤ ① ① ④ ④ ⑤⑤ ⑤⑤ ③ ③ ② ② pop,push( pop,push( ) ) pop,nextpop,next正确结束正确结束查分查分析表析表语法分析语法分析ⅢⅢ. LR(0)(SLR(1)). LR(0)(SLR(1))分析法:分析法:⒈⒈ 扩展扩展文文法,编码:法,编码:G(Z)G(Z)::Z`-> ZZ`-> Z1 1 0 0 Z ->d Z ->d2 2A A3 3Z Z4 4 ①① | b | b5 5A A6 6c c7 7 ②②A ->aA ->a8 8A A9 9 ③③ | e | e10 10 ④④ |εε11 11 ⑤⑤⒉⒉ 直接构造直接构造SLR(1)分析表:分析表: 9 9 10 10 # # Z Z 1 1 5 5 0 0 4 4 8 8 d d e e 6 6 7 7 3 3 2 2 A A c c b b a a r(3)r(3)r(3)r(3)r(3)r(3)r(3)r(3)r(3)r(3)r(3)r(3)r(4)r(4)r(4)r(4)r(4)r(4)r(4)r(4)r(4)r(4)r(4)r(4)r(2)r(2)r⑴r⑴ A3A3Z1Z1 OK OKA6A6d2d2 b5 b5 r⑴r⑴r⑴r⑴r⑴r⑴r⑴r⑴A9A9e10e10a8a8r(2)r(2)d2d2r(5)r(5)r(2)r(2)e10e10c7c7r(2)r(2)r(2)r(2)r(2)r(2)Z4Z4b5b5r(5)r(5)a8a8r(5)r(5)r⑴r⑴a8a8e10e10r(5)r(5)r(5)r(5)r(5)r(5)r(5)r(5)r(5)r(5)r(5)r(5)Follow(A)={ b,c,d }Follow(A)={ b,c,d }语法分析语法分析⒊ ⒊ 分析过程示意分析过程示意:: 剩余串剩余串 操操 作作 w w 分析栈分析栈※※符号串:符号串:bac bac # ##0 b5#0 b5 A6 A6 REDUCE(2)REDUCE(2) # ##0 b5 A6#0 b5 A6 OKOK # ##0#0 # # # # # # c# c# ac# ac# RUDUCE(5)RUDUCE(5) c c#0 b5#0 b5 PUSH(b5),NEXT(w) PUSH(b5),NEXT(w) b b#0 #0 PUSH(c7),NEXT(w) PUSH(c7),NEXT(w) c c REDUCE(3)REDUCE(3) c c#0 b5 a8#0 b5 a8 PUSH(a8),NEXT(w) PUSH(a8),NEXT(w) a a#0#0 b5 b5 a8 a8 c7 c7 Z1 Z1A9A9LR()LR()分析表分析表语法分析语法分析例例【【5.145.14】】G(E):G(E):E -> E + T | TE -> E + T | TT -> ( E ) | iT -> ( E ) | iE`-> EE`-> E1 1 (0) (0)E -> EE -> E2 2 + +3 3 T T4 4 (1)| (1)| T T5 5(2)(2)T -> (T -> (6 6 E E7 7 ) )8 8(3)| i(3)| i9 9(4)(4)G`(E`G`(E`) )1. 1. 构造句柄识别器:构造句柄识别器:-T Ti i0 0E E①①-OKOKE E②②+③③T T④④-r(1)r(1)T T⑤⑤-r(2)r(2)( (⑥⑥E E⑦⑦) )⑧⑧-r(3)r(3)i i⑨⑨r(4)r(4)E E( (( (i i【【解解】】+语法分析语法分析r(4)r(4)r(4)r(4)r(4)r(4)r(4)r(4)r(4)r(4)r(3)r(3)r(3)r(3)r(3)r(3)r(3)r(3)r(3)r(3))8)8+ +3 3T5T5(6(6i9i9r(2)r(2)r(2)r(2)r(2)r(2)r(2)r(2)r(2)r(2)r(1)r(1)r(1)r(1)r(1)r(1)T4T4(6(6i9i9T5T5 E1 E1(6(6i9i9OKOK+ +3 3r(1)r(1)r(1)r(1) ,2 ,2【【习题习题】】G(E):G(E):E -> E + T | TE -> E + T | TT -> ( E ) | iT -> ( E ) | iTE#)(+i iE`-> EE`-> E1 1 (0) (0)E -> EE -> E2 2 + +3 3 T T4 4 (1)| (1)| T T5 5(2)(2)T -> (T -> (6 6 E E7 7 ) )8 8(3)| i(3)| i9 9(4)(4)G`(E`G`(E`) )令令 {1,2},{2,7} {1,2},{2,7} 分别用分别用 2 2,,7 7 代之;代之;∴∴是是 SLR(1)SLR(1)分析表!分析表!2.2.用用有限自动机确定化有限自动机确定化方法,直接构造方法,直接构造 SLR(1) SLR(1) 分析表:分析表:0 0 E 7 E 79 98 82,72,76 65 54 43 31,21,2注注 2. 2.语法分析语法分析TE#)(+i i3. 3. 用用SLR(1) SLR(1) 分析表,分析表,构造构造确确定的有定的有限自动限自动机机::E2,7E2,7T5T5T4T4T5T5 E1,2 E1,2r(3)r(3)r(3)r(3)r(4)r(4)r(2)r(2)OKOKr(1)r(1)r(4)r(4)r(3)r(3))8)8r(2)r(2)r(1)r(1)r(4)r(4)r(3)r(3)(6(6r(2)r(2)r(1)r(1)(6(6(6(6r(4)r(4)+ +3 3r(2)r(2)r(1)r(1)+ +3 3r(4)r(4)r(3)r(3)i9i9r(2)r(2)r(1)r(1)i9i9i9i90 09 98 82,72,76 65 54 43 31,21,20 0-OKOKE E②②+③③T T④④-r(1)r(1)T T⑤⑤-r(2)r(2)( (⑥⑥E E⑦⑦) )⑧⑧-r(3)r(3)i i⑨⑨r(4)r(4)+ +( (( (i i##T Ti i-{1,2},{2,7}{1,2},{2,7}分别用分别用2 2,,7 7代之代之语法分析语法分析4.4.用用构造项目集合的构造项目集合的方法,构造方法,构造可规约前缀图可规约前缀图::E E’->->·E EE->E->·E+TE+TE->E->·T TT-T-> >·(E)(E)T->T->·i iE EE E’->E->E·E->EE->E·+T+TE->E+E->E+·T TT-T-> >·(E)(E)T->T->·i i+E->E+TE->E+T·T TOKOK# #-r(1r(1) )I I0 0T TE->TE->T·-r(2r(2) )I I1 1I I2 2I I3 3I I4 4T->(T->(·E)E)E-E-> >·E+TE+TE->E->·T TT-T-> >·(E)(E)T->T->·i i( (I I5 5T->(ET->(E·) )E-E->E>E·+T+TE EI I6 6) )T->(E)T->(E)·I I7 7-r(3r(3) )i iT-T->i>i·I I8 8-r(3r(3) )T T( (i i+( (i i…E E…E+E+…E+E+T T…T T…( (…(E(E…(E)(E)…i i文法文法语法分析语法分析a * ( b + c )a * ( b + c )F FT TT TE EF FF FT TE ET TF FE Ea aF Fb bF FT Tc cF FE E+ +T TE E( () )F FT T* *T T语法分析语法分析。