Chapter 4.4 Bottom-Up Parsing自底向上的分析 4.4.1 OVERVIEW OF BOTTOM-UP PARSING 自底向上分析概述 4.4.2 FINITE AUTOMATA OF LR(0) ITEMS AND LR(0) PARSING LR(0)项的有穷自动机与LR(0) 分析 4.4.3 SLR(1) Parsing SLR(1)分析 4.4.4 General LR(1) and LALR(1) Parsing 一般的LR(1)和LALR(1)分析 4.4.1 OVERVIEW OF BOTTOM-UP PARSING 自底向上分析概述 ●自底向上分析的一般形式: $ … … $ StartSymbol ● Inputstring$ … … $ accept A bottom-up parser has two possible actions (besides "accept") 1. Shift(移进) a terminal from the front of the input to the top of the stack. 2. Reduce(归约) a string α at the top of the stack to a nonterminal A, given the BNF choice A→α. ● example 1)已知G: S→(S) S∣ε,请应用自底向上分析方法解() L(G)? 解: (1)拓广文法 S' → S S → (S)S|ε (2)分析过程 S’=>S =>(S)S =>(S) =>( ) [S' → S] [S→(S)S] [S→ε] [S→ε] 分析栈 输入 动作 1$ 2 $( 3 $(S 4 $(S) 5 $(S)S 6 $S 7 $S’ () $ )$ )$ $ $ $ $ 移进 S→ε规约 移进 S→ε规约 S → (S)S规约 S’→ S规约 接受 ● example 2)已知G: E→E + n | n ,请应用自底向上分析方法解n+n L(G)? 解: (1)拓广文法 E’→E E→E + n | n (2)分析过程 E’=>E [E' → E] =>E+n [E→E+n] =>n+n [E→n] 分析栈 输入 动作 1$ 2 $n 3 $E 4 $E+ 5 $E+n 6 $E 7 $E’ n+n$ +n$ +n$ n$ $ $ $ 移进 E→n规约 移进 移进 E→E+n规约 E’→E规约 接受 ● example 3)已知文法G[S],请应用自底向上分析方法判断accd L(G)? S aA A cA | d 解: (1)拓广文法 S’→S S aA A cA | d (2)有穷自动机 c S’S. s S start S’→S S.aA s0 a Ac.A A.cA A.d s2 c Sa.A A.cA A.d s1 A d AcA. s4 d Ad. s3 A SaA. s5 解: (1)拓广文法 (2)有穷自动机 S’S. s S’→S S aA A cA | d start (3)分析过程 分析栈 1 $s0 2 $ s0as1 3 $ s0as1cs2 4 $ s0as1cs2cs2 5 $s0as1cs2cs2ds3 6 $s0as1cs2cs2As4 7 $ s0as1cs2As4 8 $ s0as1As5 9 $ s0 S 10 $ S’ S S’.S S.aA s0 Ac.A A.cA A.d s2 c c a 输入 accd$ ccd$ cd$ d$ $ $ $ $ $ $ Sa.A A.cA A.d s1 A d d A 动作 shift shift shift shift reduce Ad reduce AcA reduce AcA reduce SaA reduce S’S accept AcA. s4 Ad. s3 SaA. s5 ● 相关术语 1) the right sentential form 右句型 S’=>S =>(S)S =>(S) => ( ) 推导中的终结符和非终结符的每个中间串称为右句型。 2) 右句型的可行前缀 viable prefix(活前缀) 当前栈和输入串之间发生了间隔,例E || +n, E+ || n,…, 在每 种情况下,分析栈的符号序列被称为右句型的可行前缀。 ∴E, E+, E+n都是右句型E+n的可行前缀。 3) The handle of the right sentential form 右句型的句柄 这个串,在右句子格式中发生的位置以及用来规约它的产 生式被称为右句型的句柄。 4.4.2 FINITE AUTOMATA OF LR(0) ITEMS AND LR(0) PARSING LR(0)项的有穷自动机与LR(0) 分析 4.4.2.1 LR(0) ITEMS 1) LR(0) ITEMS LR(0)项 LR(0)项 a production choice with a distinguished position in its right-hand side. Example if A → αis a production choice, and if β and Y are any two strings of symbols (including the empty string s) such that βγ = α, then A→ β·γis an LR(0) item. ● example 1)已知G,求其项目。 S' → S S → (S)S|ε 2)已知G,求其项目。 E’→E E→E + n | n 解: This grammar has three production choices and eight items: S' → ·S S' → S· S → ·(S)S S → (·S)S S → (S·)S S → (S)·S S → (S)S· S→· 解: This grammar has three production choices and eight items: E’→·E E’→E· E→·E + n E→E· + n E→E +· n E→E + n· E→·n E→n· ● 相关术语 1) 项目 在文法产生式右部某个位置标有‘.’ 的产生式,称为文 法的一个LR(0)项目 。 形如 A . 的项目称为初始项目; 形如 A . 的项目称为归约项目(完整项目); 形如 A . B 的项目称为待约项目(基本项目) B∈N; 形如 A . a 的项目称为移进项目(基本项目) a∈T。 2) 有效项目 :伽马 :艾塔 项目A1.2对活前缀 = 1 是有效的 (存在规范推导 S =>*Aw => 12w)。 若项目 A1.B2 对活前缀 = 1 是有效的,且 B 是产生式,则项目 B . 对活前缀 = 1 也是有效的。 ● 相关术语 3)有效项目集,项目集规范族 文法G的某个活前缀的所有有效项目组成的集合,称为 活前缀的LR(0)有效项目集。 文法G的所有有效项目集组成的集合,称为G的LR(0)项 目集规范族。 ● 相关术语 4)项目闭包 设I是文法G的一个LR(0)项目集合,I的项目闭包 closure(I)定义如下: (1) I closure(I)。 (2) 若项目A . B closure(I),且 B 是G的产生 式,则项目B . closure(I)。 (3) closure(I)仅包含上述两条规则确定的LR(0)项目。 5)转移函数 若I是文法G的一个LR(0)项目集,X是G中的文法符号。 go(I, X) = closure(J) 其中J ={AX . | A . XI } 称函数go(I, X)为转移函数。 项目A X . 称为项目A . X后继。 ● 相关术语 6) 识别G的句柄的自动机 若文法G = ( VT, VN, S, P),则识别G的句柄的自动机为 DFA M = ( = VTVN, Q = G的LR(0)项目集规范族, q0 = closure( {S.S} ), F = 所有含归约项目的有效项目集组成的集合, = go(I,X) )。 4.4.2.2 Finite Automata of Items 项目的有穷自动机 ● LR(0)项的NFA的转换 A→α·Xη A→α·Xη X ε X→β A→αX · η X→·β ● example 1)已知G,求其DFA。 S' → S S → (S)S|ε 解: S' → ·S S' → S· S → ·(S)S S → (·S)S S → (S·)S S → (S)·S S → (S)S· S→· eight items S'→·S ε S S'→S· ε S→·(S)S S→(S)S· S→ · NFA eight states ( ε S→(·S)S ε S S→(S·)S ε ε ) S S→(S)·S S'→·S ε S S'→S· ε S→·(S)S S→(S)S· S→ · NFA ( ε S→(·S)S ε S S→(S·)S ε ) S S→(S)·S ε DFA ( S'→·S S→·(S)S S→ · 0 ( S→(·S)S S→·(S)S S→ · 2 S S'→S· S ( S→(S·)S 3 ) S→(S)·S S S→·(S)S S→(S)S· 5 S→ · 4 1 ● example 2)已知G,求其DFA 。 E’→E E→E + n | n eight items 解: E’→·E NFA E’→E· E→·E + n eight states E→E· + n E→E +· n E→E + n· E→·E DFA E→E· E'→·E ε E→·E+n E E'→E· ε ε E→·n n E→n· E ε n + E→E·+n E→E+·n E→E+n· E'→·E E'→E· E→·E+n E E→E· +n 1 E→·n 0 + n n E→E+·n E→E+n· E→n· 2 3 4 例:已知拓广文法G[S],求其LR(0)的分析表。 S S S aA | bB A cA | d B cB | d 解: (1)识别文法活前缀的DFA S start S.S S.aA S.bB 0 a b SS. 1 A Sa.A A.cA A.d 2 核心项 闭包项 SaA. 4 Sb.B B.cB B.d 3 所有的闭包项都是初始项 c d B c d Ac.A 5 A.cA A AcA. 10 A.d c d Ad. 6 SbB. 7 Bc.B 8 B.cB B BcB. 11 B.d c d Bd. 9 SaA. 4 (1)识别文法活前缀的DFA S SS. 1 A c start S.S S.aA S.bB 0 (2)LR(0)分析表 状态 a 0 1 2 3 4 5 6 7 8 9 10 11 action b c d goto $ s2 s3 S A B 1 a b Sa.A A.cA A.d d r1 r1 r4 r4 r2 r2 r6 r6 r3 r3 r5 r5 s5 s8 r1 s5 r4 r2 s8 r6 r3 r5 s6 s9 r1 s6 r4 r2 s9 r6 r3 r5 c Bc.B 8 B B.cB B.d r1 10 r4 r2 11 c d 9 BcB. 11 7 r6 r3 r5 SbB. 7 Bd. 4 6 B 3 d acc c d Ad. 2 Sb.B B.cB B.d Ac.A 5 A A.cA A.d 0 SS 1 SaA 2 SbB 3 AcA 4 Ad 5 BcB 6 Bd AcA. 10 ● LR分析器的结构和工作过程 输入 a1 ... ai ... an $ 栈 sm Xm sm-1 Xm-1 ... s0 LR 驱动程序 action goto 输出 分析表 ● The LR (0) parsing algorithm LR分析算法 Let s be the current state (at the top of the parsing stack).Then actions are defined as follows: 1. If state s contains any item of the form A → α·Xβ, where X is a terminal. Then the action is to shift the current input token on to the stack. If this token is X. and state s contains item A → α·Xβ, then the new state to be pushed on the stack is the state containing the item A → α·Xβ. If this token is not X for some item in state s of the form just described, an error is declared. 2. If state s contains any complete item (an item of the form A→γ·), then the action is to reduce by the rule A → γ·. (唯一性) A reduction by the rule S` → S, where s is the start state, is equivalent to acceptance, provided the input is empty, and error if the input is not empty. ● LR分析算法 输入:一个输入串w和文法G的一张LR分析表M。 输出:若w L(G),输出w的一个自底向上的分析; 否则,输出一个出错表示。 方法:分别置放s0到栈中和w$到输入缓冲器中; 置ip指向w$的第一个符号; repeat forever begin 令s是栈顶状态且a是ip所指向的符号 if action[s,a] = shift s then begin 将a和s先后压入栈内; 使ip指向输入串中的下一个符号; end else if action[s,a] = reduce A then begin 从栈顶弹出2*||个符号; 令s是当前栈顶状态; 把A和goto[s,A]先后入栈; 输出产生式A end else if action[s,a] = accept then return else error( ) end ● example 例:已知文法G[S],求其LR(0)的分析表 S A | B, A -> aAb | c, B -> aBd | d 解: (1)拓广文法 S’->S S->A S->B A->aAb A->c B->aBd B->d 1) S' →.S 2) S'→S. 3) S→.A 4) S→A . 5) S→.B 6) S→B. 7) A→.aAb 8) A→a.Ab 9) A→aA.b 10) A→aAb . 11) A→.c 12) A→c. 13) B→.aBd 14) B→a.Bd 15) B→aB.d 16) B→aBd . 17)B→.d 18) B→d. (2)识别文法的活前缀的 DFA S ’S S A S B A aAb A c B aBd Bd 0 S A B S B 3 A c. 6 A aAb. 8 b 5 c B d. S A 2 a c d S ’S 1 d A a.Ab B a.Bd A aAb A c B aBd Bd 4 A B A aA.b B aB.d 7 9 d a B aBd. 10 (2)LR(0)分析表 a action b c d s4 s5 s6 状态 0 1 2 3 4 5 6 7 8 9 10 r1 r2 S4 R4 r6 goto $ S A B 1 2 acc r1 r2 s6 r4 r6 r1 r1 r1 r2 r2 r2 s5 r4 r4 r4 r6 r6 r6 s8 R3 r3 r3 r3 r3 s10 r5 r5 r5 r5 r5 3 7 9 ● example 例:已知文法G[A],求其LR(0)的分析表,并判断((a))∈L(G)? A (A) |a 解: (1)拓广文法 (2)识别文法活前缀的DFA (3)LR(0)分析表 (4)分析过程 4.4.3 SLR(1) Parsing SLR(1)分析 ● The SLR(1) parsing algorithm Let s be the current state (at the top of the parsing stack). Then. actions are defined as follows: 1. If state s contains any item of form A → α·Xβ,where X is a terminal, and X is the next token in the input string, then the action is to shift the current input token onto the stack, and the new state to be pushed on the stack is the state containing the item A → α·Xβ. 2 If state s contains the complete item A → γ·, and the next token in the inupt string is in Follow(A), then the action is to reduce by the rule A → γ. A reduction by the rule S' →S, where s is the start state, is equivalent to acceptance; this will happen only if the next input token is $. In all other cases, the new state is computed as follows. Remove the siring Y and all of its corresponding states from the parsing stack. Correspondingly, back up in the DFA to the state from which the construction of γ began. By construction, this state must contain an item of the form B → α·Aβ. Push A onto the stack, and push the state containing the item B → αA·β. 3. If the next input token is such that neither of the above two cases applies, an error is declared . ● Conditions A grammar is an SLR(l) grammar if the application of the above SLR( 1 ) parsing rules results in no ambiguity. In particular, a grammar is SLR( 1) if and only if, for any state s, the following two conditions are satisfied: 1. For any item A → α·Xβin s with X a terminal, there is no complete item B → γ. in s with X in Follow(B). 2. For any two complete items A → α· and B →β· in s, Follow(A) ∩ Follow(B) is empty. ● SLR(1)分析 若有效项目集中存在冲突动作: I = { X . b, A . , B . } 将b移进栈 将归约为A 将归约为B 设当前输入符号为a, 1. 若a = b, 则移进; 2. 若aFollow(A), 则用A 进行归约; 3. 若aFollow(B), 则用B 进行归约; 4. 其余情况报错. ● SLR分析算法 输入:一个拓广文法G 输出:对于G的分析表的action 子表和goto子表 方法: 1. 构造G的LR(0)项目集规范族。 2. 对于状态Ii的分析动作如下: (a) 若A . aB Ii且 go (Ii ,a)= Ij action[i,a] = shift j (b) 若A . Ii, 对于所有a Follow(A) action[i,a] = reduce A , A S (c) 若SS. Ii, action[i, $]= accept 3. 若go(Ii, A) = Ij, AVN , 则 goto[i,A] = j 4. 分析表其余位置为error SLR(SLR(1))算法:如果文法G按上述算法构造出的分析表 不存在冲突动作,则称G为SLR文法。类似地,不难定义 LR(0)文法。 问题. 如何定义LR(0)文法? 若将上述算法的2(b)步中的aFollow(A)改为aVT{$}, 则由此修改后的算法所定义的文法,称为LR(0)文法。 ● example 例:已知文法G[E],并用SLR(1)方法分析id*id+id∈L(G[E]) ? EE+T | T TT*F | F F (E) | id 解: (1)拓广文法 G的拓广文法G[E]: (0) E E (4) TF (1) EE+T (5) F (E) (2) ET (6) F id (3) TT*F (2)识别文法的活前缀的 DFA (3)SLR(1)分析表 (4)分析过程 (2)识别文法的活前缀的 DFA I T E E+ T I9 E E+ T 6 I1 T T*F + T T*F E’E T F F I * E E+T ( 3 F (E) F id I7 id E I0 I4 F ( E) I5 I8 E E+T T E ’E I2 E F (E ) + ( E T E E+T I6 T T*F F E E+T E T T F I3 F (E) id T T*F ) I5 ( F id T F I11 F (E) F (E) F I3 F id T F I5 id id T I2 I10 F id F E T I7 T T* F T T* F T T*F * F (E) ( F id G:(0) E E (1) EE+T I4 (2) ET (3) TT*F (4) TF (5) F (E) (6) F id (2)识别文法的活前缀的 DFA E+ T I9 I1 I6 E E+ T T E T T*F + T T*F E’E T F F I * ( E E+T 3 F (E) I7 F id id I0 I4 F ( E) E I5 E E+T I8 T E ’E E T I2 E F (E ) + ( I6 T T*F E E+T E E+T F T F I3 E T F (E) id ) T T*F F id I5 ( T F F (E) I11 F (E) F I3 T F F id id I5 id I10 T I2 F id F T T* F I7 E T T T* F * F (E) T T*F ( F id I4 I1:E´E E E+T I2: E T I9: E E+T T T *F T T *F I={X b , A , B } 若{b}FOLLOW(A) FOLLOW(B)= 则,面对当前读入符号a,状态I的解决方法: 1. 若a=b,则移进。 2. 若a≠b, 且a FOLLOW(A),则用A 进行归约。 3. 若a≠b, 且a FOLLOW(B),则用B进行归约。 4. 此外,报错。 这种解决方法是比较简单的,因此称作SLR 分析,由此构造的分析表,称作SLR分析表。 对于表达式文法的例子,FOLLOW集如下: G: (0) E E (4) TF (1) EE+T (5) F (E) (2) ET (6) F id (3) TT*F I1:{ E’E EE+T} I2:{ET T T *F} I9:{E E+T T T *F} E‘ E T F FOLLOW集 $ $,),+ $,),+,* $,),+,* I1:FOLLOW(E’)∩{+}=Φ I2: FOLLOW(E)∩{*}=Φ I9: FOLLOW(E)∩{*}=Φ ∴可用SLR(1)方法实现 Follow(E)={$, +,)} (3)SLR分析表 ACTION + * 0 ( ) S4 GOTO id $ S5 1 S6 2 R2 S7 R2 R2 3 R4 R4 R4 R4 S4 R6 T F 1 2 3 8 2 3 9 3 ACC 4 5 E R6 S5 R6 R6 6 S4 S5 7 S4 S5 10 8 S6 S11 9 R1 S7 R1 R1 10 R3 R3 R3 R3 11 R5 R5 R5 R5 (4) id*id+id的LR分析过程 分析栈 (1) 0 (2) 0id5 (3) 0F3 (4) 0T2 (5) 0T2*7 (6) 0T2*7id5 (7) 0T2*7F10 (8) 0T2 (9) 0E1 (10) 0E1+6 (11) 0E1+6id5 (12) 0E1+6F3 (13) 0E1+6T9 (14) 0E1 输入串 动作 id*id+id$ *id+id$ *id+id$ *id+id$ id+id$ +id$ +id$ +id$ +id$ id$ $ $ $ $ shift reduce by Fid reduce by TF shift shift reduce by Fid reduce by TT*F reduce by ET shift shift reduce by Fid reduce by TF reduce by EE+T accept ● example 例:已知文法G[E],求其SLR(1)的分析表,并判断n+n∈L(G)? E→E + n | n 解: (1)拓广文法 (2)识别文法活前缀的DFA (3)SLR(1)分析表 (4)分析过程 ● example 例:已知文法G[S],求其SLR(1)的分析表,并判断( )( )∈L(G)? S → (S)S|ε 解: (1)拓广文法 (2)识别文法活前缀的DFA (3)SLR(1)分析表 (4)分析过程 4.4.4 General LR(1) and LALR(1) Parsing 一般的LR(1)和LALR(1)分析 ● Definition of LR(1) transitions (part 1).Given an LR(1) item [A→α·Xγ,a], where X is any symbol (terminal or nonterminal ), there is a transition on X to the item [A→ αX·γ,a] (part 2). Given an LR(1) item [A→α·Bγ,a], where B is a nonterminal, there areε-transitions to items [B→·β,b] for every production B →βand for every token b in First(γa). ● example 例:已知文法G[S],求其LR(1)的分析表,并判断 id:=id∈L(G)? S → id | V := E V→ id E→V|n 解: (1)拓广文法 (2)识别文法活前缀的DFA (3)LR(1)分析表 (4)分析过程 解: (1) 拓广文法 S’ → S S → id S → V := E V→ id E→V E→n (2) 识别文法活前缀的DFA 0 S S’ → .S ,$ start S → .id ,$ S → .V := E ,$ V→ .id ,:= SS. ,$ 1 id Sid. ,$ 2 V Vid. ,:= S→V:=.E,$ := E→.V ,$ E→.n ,$ S→V. :=E,$ V→ .id,$ 3 4 S→V:=E.,$ 5 E V E→V. ,$ 6 n E→n. ,$ 7 id V→id. ,$ 8 0 S S’ → .S ,$ start S → .id ,$ S → .V := E ,$ V→ .id ,:= SS. ,$ 1 S→V:=E.,$ 5 id Sid. ,$ 2 V Vid. ,:= S→V:=.E,$ := E→.V ,$ E→.n ,$ S→V. :=E,$ V→ .id,$ 3 4 E V E→V. ,$ 6 n E→n. ,$ 7 id V→id. ,$ 8 (3) LR(1)分析表 0 1 2 3 4 5 6 7 8 id S2 Action := n $ S 1 V 3 E ACC R1 R3 S4 S8 goto S7 S6 R2 R4 R5 R3 6 5 0 S’ → S 1 S → id 2 S → V := E 3 V→ id 4E→V 5E→n 0 1 2 3 4 5 6 7 8 id S2 Action := n $ S7 S6 R2 R4 R5 R3 (4) id:=id的LR分析过程 分析栈 (1) 0 (2) 0id2 (3) 0V3 (4) 0V3:=4 (5) 0V3:=4id8 (6) 0V3:=4V6 (7) 0V3:=4E5 (8) 0S1 S 1 V 3 E ACC R1 R3 S4 S8 goto 输入串 id:=id $ :=id $ :=id $ id $ $ $ $ $ 6 5 0 S’ → S 1 S → id 2 S → V := E 3 V→ id 4E→V 5E→n 动作 shift reduce by V → id shift shift reduce by V → id reduce by E → V reduce by S → V := E accept ● example 例:已知文法G[A],求其LR(1)的分析表,并判断((a))∈L(G)? A (A) |a 解: (1)拓广文法 (2)识别文法活前缀的DFA (3)LR(1)分析表 (4)分析过程 解: (1) 拓广文法 A’ A A (A) |a (2) 识别文法活前缀的DFA 1 start A.A ,$ A.(A),$ A.a ,$ 0 A AA. ,$ A(.A),$ A.(A) ,) a A.a ,) A(A .),$ 2 A A(.A) ,) A.(A) ,) a A.a ,) ( Aa. ,$ 4 3 Aa. ,) A(A) .,$ 5 ( a ) A ( 6 A(A .),) 7 8 ) A(A) .,) 9 1 start A.A ,$ A.(A),$ A.a ,$ 0 A 4 ) 7 A(A .),$ A(A) .,$ AA. ,$ A(.A),$ A.(A) ,) a A.a ,) 2 A A(.A) ,) A.(A) ,) a A.a ,) ( 5 ( Aa. ,$ 3 A a Aa. ,) 6 ( A(A .),) 8 ) A(A) .,) 9 (3) LR(1)分析表 0 1 2 3 4 5 6 7 8 9 ( S2 Action ) a S3 $ goto A 1 ACC S5 S6 4 R2 S7 S5 S6 8 R2 R1 S9 R1 0 AA 1 A(A) 2 Aa 0 AA 1 A(A) 2 Aa (4) ((a))的LR 分析过程 分析栈 (1) 0 (2) 0(2 (3) 0(2(5 (4) 0(2(5a6 (5) 0(2(5A8 (6) 0(2(5A8)9 (7) 0(2A4 (8) 0(2A4)7 (9) 0A1 0 1 2 3 4 5 6 7 8 9 ( S2 Action ) a S3 $ goto A 1 ACC S5 S6 4 R2 S7 S5 S6 8 R2 R1 S9 R1 输入串 ((a)) $ (a)) $ a)) $ )) $ ))$ )$ )$ $ $ 动作 shift shift shift reduce by Aa shift reduce by A(A) shift reduce by A(A) accept ● example 例:已知文法G[S],求其LR(1)的分析表,并判断cdcd∈L(G)? SCC CcC|d 解: (1)拓广文法 (2)识别文法活前缀的DFA (3)LR(1)分析表 (4)分析过程 ● Definition of LALR(1) transitions FIRST PRINCIPLE OF LALR(1) PARSING The core of a state of the DFA of LR(l) items is a state of the DFA of LR(0)-items. ◆ SECOND PRINCIPLE OF LALR(1) PARSING Given two states s1 and s2 of the DFA of LR(l) items that have the same core, suppose there is a transition on the symbol X from s1 to a state t1. Then there is also a transition on X from state s2 to a state t2, and the states t1 and t2 have the same core. ◆ ● 相关术语 1)同心项 如果两个LR(1)项目集去掉搜索符之后是相同的,则称 这两个项目集具有相同的心。 2)核 对于初始状态I0,有效项目[S.S, $]称为I0的核;而对 于非初始状态,则其中 “点不在最左端”的有效项目 称为它的核。 在LR(1)项目集规范族中, LALR分析法合并同心 项以减少状态的数目;在存储LR(1)有效项目集时,仅 存储其中的核。 由于同心项的合并,使项目的搜索符与活前缀的对 应关系不唯一,降低了分析器的识别能力。 ● example 例:已知文法G[S’],求其LR(1)的分析表 SS SaAd | bBd | aBe | bAe Ac Bc 解: (1)拓广文法 (2)识别文法活前缀的DFA (3)LR(1)分析表 (4)分析过程 解:识别文法活前缀的DFA I0 : I2:(I0 a) S.S $ Sa.Ad S.aAd $ Sa.Be S.bBd $ A.c S.aBe $ B.c S.bAe $ I3:(I0 b) I1:(I0 S) Sb.Bd SS. $ Sb.Ae A.c B.c $ $ d e $ $ e d I4:(I2 A) SaA.d I5:(I2 B) SaB.e I6:(I2 c) Ac. Bc. I7:(I3 B) SbB.d I8:(I3 A) SbA.e 若将同心项I6和I9合并,则得到项目集 I69: Ac. d/e Bc. d/e 该项目集含“归约-归约”冲突。 I9:(I3 c) Ac. Bc. I10:(I4 d) SaAd. I11:(I4 e) SaBe. I12:(I7 d) SbBd. I13:(I8 e) SbAe. $ $ d e $ $ 合并同心项 I69: Ac. d/e Bc. d/e 因此,文法G是LR(1)文法,但不是LALR文法。 e d $ $ $ $ ● LALR(1)分析表的原理性构造方法 构造LR(1)项目集族, 如果它不存在冲突, 就把同心集 合并在一起。若合并后不存在归约-归约冲突,则按这个 集族构造文法LALR(1)分析表。 ● 算法: LALR分析表的构造 输入:拓广文法G' 输出:对于G'的LALR(1)分析表 方法:1. 构造文法的LR(1)项目集族C={I0, I1, …, In} 2.合并C中的同心集,得到C'={J0, J1, …, Jm} 3. 从C'出发构造action表: (a) 若[A . a,b] Ji且 go (Ji ,a)= Jj 置action[i,a] = shift j (b) 若[A. ,a] Ji,置action[i,a] = r A , A S (c) 若[SS., $] Ji,置action[i, $]= accept 4. 若go(Ik, A) = Jj, AVN , 则 goto[k,A] = j 5. 分析表其余位置为error ● example 例:已知文法G[S],求其LALR(1)的分析表 SCC CcC|d 解: (1)拓广文法 (2)识别文法活前缀的DFA (3)LALR(1)分析表 (4)分析过程 ● example 例:已知文法G[S],文法G是LALR(1)文法吗?若是则构造分析 表的分析表 S L = R | R L *R | i R L Chapter 4.4 Bottom-Up Parsing自底向上的分析 4.4.1 OVERVIEW OF BOTTOM-UP PARSING 自底向上分析概述 4.4.2 FINIT AUTOMATA OF LR(0) ITEMS AND LR(0) PARSING LR(0)项的有穷自动机与LR(0) 分析 4.4.3 SLR(1) Parsing SLR(1)分析 4.4.4 General LR(1) and LALR(1) Parsing 一般的LR(1)和LALR(1)分析 END Chapter 4 Syntax Analysis语法分析 4.1 语法分析器的作用 4.2 上下文无关文法 4.3 自顶向下语法分析 4.4 自底向上语法分析 END ● 作业 编译原理: 4.1 4.2 4.3 4.33 4.34 4.35 4.37 4.39 请将作业压缩成一个文件发送! 发送的文件名:班级名学号姓名章节名作业.rar 例:计科070105×××第5章作业.rar 发送地址: buctCompiler@163.com ● 上机程序要求 input 源程序 input 上下文 无关文法 程序1 output output LL或LR 分析表 程序2 语法 分析 程序 语法树或其他形式