500 likes | 751 Vues
上昇型構文解析. LR(0) LR(1). 復習. シフト状態,還元状態. ルールの番号 [簡単のため,括弧なしとする]. (0) S→ E$ (1) E→ E+T (2) E→ T (3) T→ T*F (4) T→ F (5) F→ a. LR(0)閉包全体. I0={S→・E$ E→・E+T E→・T T→・T*F T→・F F→・ a } I1={S→E・$ E→E・+T } I2={E→T・ T→T・*F }
E N D
上昇型構文解析 LR(0) LR(1)
復習 シフト状態,還元状態
ルールの番号[簡単のため,括弧なしとする] ルールの番号[簡単のため,括弧なしとする] (0) S→E$ (1) E→E+T (2) E→T (3) T→T*F (4) T→F (5) F→a
LR(0)閉包全体 I0={S→・E$ E→・E+T E→・T T→・T*F T→・F F→・a } I1={S→E・$ E→E・+T } I2={E→T・ T→T・*F } I3={T→F・ } I4={F→a・ } I5={E→E+・T T→・T*F T→・F F→・a } I6={E→E+T・ T→T・*F } I7={T→T*・F F→・a } I8={T→T*F・ } I9={S→E$・ :受理} + T E F * * T F F $ a a a
いままでの解析過程を考慮=現在の解析状態 いままでの解析過程を考慮=現在の解析状態 • 生成規則の例:E→E+T • 現在の解析状態を・を用いて表現する • E→・E+T • E→E・+T • E→E+・T • E→E+T・ 次に進む=シフト状態 オートマトンにより状態を決定 ルールを適用=還元状態 右辺を取り除いて,左辺を入れる
SLR(1) 構文解析表 状態0で次の終端記号がaならば,状態4に行け 状態0でFが来れば, 状態3に行け FOLLOW(E)={+,$} FOLLOW(E)={+,$} ルール3で還元
a+a$ 解析過程 スタックの様子 0 0a4→0F3→0T2→0E1 残り入力 a+a$ +a$ 状態0で入力aならS4 状態4で入力+ならR5=> ルール5:F→a aを取り除きFを入れ, SLR(1)表より,状態0で入力Fならgoto3 ゆえに,0F3 となる
FOLLOWを考える LR(0) LR(1)
文法規則 (0)S→E$ (1)E→T+T (2)E→T (3)T→a a+a を解析する 仮定: (1)上昇型解析 (2)番号の大きい規則から順番に適用する. 解析状況を (スタック内容,入力残り) として記述する. 上昇型構文解析:FOLLOW考慮せず
解析過程:バックトラックあり 最後に規則(E→T)を適用した所を シフトに変更 • ($,a+a$)→($a,+a$)→($T,+a$)→($E,+a$)→($E+,a$)→($E+a,$)→($E+T,$)→($E+E,$)→($E+E$,ε)=解析失敗=バックトラック • ($,a+a$)→($a,+a$)→($T,+a$)→($E,+a$)→($E+,a$)→($E+a,$)→($E+T,$)→($E+T$,ε)=解析失敗=バックトラック • ($,a+a$)→($a,+a$)→($T,+a$)→($E,+a$)→($E+,a$)→($E+a,$)→($E+a$,ε)=解析失敗=バックトラック • ($,a+a$)→($a,+a$)→($T,+a$)→($T+,a$)→($T+a,$)→($T+T,$)→($E,$)→($E$,ε)→($S,ε)=受理 最後に規則(T→a)を適用した所を シフトに変更 最後に規則(E→T)を適用した所を シフトに変更
文法規則 (0)S→E$ (1)E→T+T (2)E→T (3)T→a a+a を解析する 規則(1)が適用できるときは,規則(3)より先に適用する. FOLLOW(E)={ $ } 規則(1),(2)は後ろが$の時のみ,適用する. 上昇型構文解析:いままでの解析過程を考慮+FOLLOW考慮
解析過程:バックトラックなし 後ろが+ ↓ E→Tを適用しない=シフト • ($,a+a$)→($a,+a$)→($T,+a$)→($T+,a$)→($T+a,$) • →($T+T,$)→($E,$)→($E$,ε)→($S,ε)=受理 後ろが$ ↓ E→T+Tを適用する=還元
先読みによりバックトラックをなくす • S→E$ • E→E+T|T • T→T*F|F • F→a • 右辺のTに着目すると • E→T • T→T*F • 一つ右を見ればどれを使えばいいか判定できる 右が+または$ FOLLOW(E)={+,$} 右が* FOLLOW(T)={*,+,$}
いままでの解析過程を考慮=現在の解析状態 いままでの解析過程を考慮=現在の解析状態 • 生成規則の例:E→E+T • 現在の解析状態を・を用いて表現する • E→・E+T • E→E・+T • E→E+・T • E→E+T・ 次に進む=シフト状態 ルールを適用=還元状態
★ シフト状態? 還元状態?正しいのは? ①E→・E+T 還元状態 ②E→E・+T シフト状態 ③T→T+・T 還元状態 ④T→F・ シフト状態 ⑤T→E+T・ シフト状態 ⑥正解なし
状態の閉包 • 文法G1 (0)S→E$(1)E→E+T (2)E→T (3)T→T*F (4)T→F (5)F→a S→・E$ E→・E+T E→・T T→・T*F T→・F F→・a 閉包(closure)
S→E$,E→T+T,E→T,T→a S→・E$ E→・T+T E→・T T→・a S→E・$ S→E$・ $ E T E→T・+T E→T・ $ a 訂正 + T→a・ a E→T+・T T→・a FOLLOW(E)={ $}と Tの後ろ={ +}の 共通集合は空 ⇒ 後ろのトークンで決定できる T どちらもシフト状態 ↓ シフト E→T+T・
例:()なし算術式の文法規則 (0)S→E$ (1)E→E+T (2)E→T (3)T→T*F (4)T→F (5)F→a
LR(0)閉包全体 I0={S→・E$ E→・E+T E→・T T→・T*F T→・F F→・a } I1={S→E・$ E→E・+T } I2={E→T・ T→T・*F } I3={T→F・ } I4={F→a・ } I5={E→E+・T T→・T*F T→・F F→・a } I6={E→E+T・ T→T・*F } I7={T→T*・F F→・a } I8={T→T*F・ } I9={S→E$・ :受理} + T E F * * T F F $ a a a
★ オートマトン→構文解析表 • (2)E→TFOLLOW(E)={ + , $ } • I2={ E→T・ , T→T・*F } • I7={ T→T*・F , F→・a } *
構文解析表 FOLLOW(E)={+,$} FOLLOW(E)={+,$}
スタックの様子 0 0a4→0F3→0T2→0E1 0E1+5 0E1+5a4→0E1+5F3→0E1+5T6 0E1+5T6*7 0E1+5T6*7a4→0E1+5T6*7F8 →0E1+5T6→0E1→受理 残り入力 a+a*a$ +a*a$ a*a$ *a$ a$ $ a+a*a$ 解析過程
コード生成 • 還元時にコード生成 • 逆ポーランドになっている • E→aPUSHa番地 • E→E+EADD • <ASSGN>→<Left>"="<exp>⇒ASSGN • ; REMOVE
解析過程とコード a + a I0→I4⇒I3⇒I2⇒I1→I5→I4 ⇒ I3 ⇒ I2 → $ $a $F $T $E $E+ $E+a $E+F $E+T push a push a * a $ →I7 → I4 ⇒ I8 ⇒ I6 ⇒ I1 → I9 $E+T* $E+T*a $E+T*F $E+T $E 受理 push a multi add 還元時にコード生成
文法のクラス SLR(1) LALR(1) LR(1)
LR(0)項:FOLLOWを考えない 入力を読み込み,解析(移動,還元)が ・の位置まで進んでいることを表す + E→E・+T E→E+・T + を読み込むと ・ が + の右に移動する (シフト,スタックに入れる) • 規則 E→E+T • 項=解析状況 E→E・+T
項集合の閉包 S→・E$ F→(・E) E→・E+T E→・T E→・E+T E→・T ( T→・T*F T→・F T→・T*F T→・F F→・m F→・(E) F→・m F→・(E) • 規則: • S→E$, • E→E+T,E→T • T→T*F,T→F, • F→m,F→(E)
構文解析表の作成:移動 E→T+・T 状態1 + E→T・+T T→T・*F 状態0 状態0で 入力の先頭が+ならば +をstackにいれ(sift) 状態1 に移動 * T→T*・T 状態2
構文解析表の作成:還元 規則3 E→T+T FOLLOW(E)={+,$} E→T+T・ 状態0で 入力の先頭が+または$ならば 規則3で還元 (スタック:規則3の右辺を取り除く 規則3の左辺を入れる) 状態0
構文解析表の作成:不都合1 規則3 E→m T→m 規則5 E→m・ T→m・ 状態1 状態1で 入力の先頭が+ならば 規則3で還元? 規則5で還元? 表が作れない⇒不都合 FOLLOW(E)={+,$} FOLLOW(T)={+,*}
構文解析表の作成:不都合2 規則4:E→m FOLLOW(E)={+,*} E→m・ T→T・*F 状態0 状態0で 入力の先頭が*ならば 状態2に移動? 規則4で還元? 表が作れない⇒不都合 * T→T*・T 状態2
LR(1)項,FOLLOW? • S→E$,E→T+T,T→m S→・E, $ E→・T+T,$ T→・m, + • S→E$,E→E+T S→・E, $ E→・E+T,$ E→・E+T,+ S→・E, $ E→・E+T,$/+
★LR(0)オートマトンとFOLLOW • LR(0)オートマトン:FOLLOWを考えずに,移動のみに注目したオートマトン • *LR(0)で不都合な状態がないとき,文法はLR(0) • FOLLOW集合:非終端記号の直後に現れる可能性のある終端記号の集合 • LR(0)の不都合な状態をFOLLOWで解決⇒SLR(1)
G1:S→E$,E→T+T,T→m S→・E$ E→・T+T T→・m S→E・$ S→E$・ E $ T 移動のみ E→T・+T 受理 m 移動のみ 移動のみ 移動のみ + T→m・ E→T+・T T→・m E→T+T・ m T 1還元のみ 1還元のみ LR(0)オートマトンで不都合な状態なし
G2:S→E$,E→T+T,E→T,T→m S→・E$ E→・T+T E→・T T→・m S→E・$ S→E$・ $ E T 移動のみ E→T・+T E→T・ 受理 m 移動のみ 移動のみ 移動と還元=不都合な状態 + T→m・ E→T+・T T→・m m FOLLOW(E)={$}と Tの後ろ={+}の 共通集合は空 ⇒ OK 1還元のみ T E→T+T・ 1還元のみ FOLLOWで解決可能=SLR(1)
G3:S→E$,E→T+T,E→m,T→m S→E$・ S→・E$ E→・T+T E→・m T→・m S→E・$ $ E T E→T+T・ E→T・+T m + E→T+・T T→・m T E→m・ T→m・ 2還元あり= 不都合な状態 m T→m・ FOLLOW(E)={$} FOLLOW(T)={+,$} FOLLOWの共通集合が空集合でない= 不都合な状態をFOLLOWで解決できない⇒SLR(1)でない
★LR(1)オートマトン • LR(1)オートマトン:各規則にFOLLOWを考えて,移動のみに注目したオートマトン • 不都合な状態なし=文法がLR(1) • LALR(1)オートマトン:LR(1)オートマトンでFOLLOWを無視したとき同じ項集合を合併する • 不都合な状態なし=文法がLALR(1)
G3:S→E$,E→T+T,E→m,T→m S→E・,$ S→・E, $ E→・T+T,$ E→・m, $ T→・m, + E E→T+T・,$ T T E→T+・T,$ T→・m, $ E→T・+T,$ + m E→m・,$ T→m・,+ m T→m・,$ FOLLOWの共通集合が空 ⇒不都合でない LR(1)で不都合な状態なし⇒LR(1)である
G3:S→E$,E→T+T,E→m,T→m S→・E, $ E→・T+T,$ E→・m, $ T→・m, + S→E・,$ E E→T+T・,$ T T E→T+・T,$ T→・m, $ E→T・+T,$ + m E→m・,$ T→m・,+ m T→m・,$ LR(1)オートマトンでFOLLOWを考えないで同じ項集合がない ⇒ LALR(1)である
G4:S→E$,S→+X$,E→T+,X→E,X→T=,E→m,T→mG4:S→E$,S→+X$,E→T+,X→E,X→T=,E→m,T→m S→E・,$ S→+X・,$ X→T=・,$ S→・E, $ S→・+X,$ E→・T=,$ E→・m, $ T→・m, + E X S→+・X,$ X→・E, $ X→・T=,$ E→・m, $ T→・m, = + X→T・=,$ = E m T E→m・,$ T→m・,= m E→m・,$ T→m・,+ T X→E・,$ E→T・+,$ + E→T+・,$ 合併すれば E→m・, $ T→m・, +/= FOLLOW抜きで同じ項集合を合併しても不都合にならない⇒ LALR(1) である,もちろんLR(1)である
G5:S→E$,S→+X$,E→T=,X→E=,X→T,E→m,T→mG5:S→E$,S→+X$,E→T=,X→E=,X→T,E→m,T→m S→E・,$ S→+X・,$ X→E=・,$ S→・E, $ S→・+X,$ E→・T=,$ E→・m, $ T→・m, = E X S→+・X,$ X→・E=,$ X→・T, $ E→・m, = T→・m, $ + X→E・=,$ = E T m E→m・,= T→m・,$ m E→m・,$ T→m・,= T X→T・,$ E→T・=,$ = E→T=・,$ FOLLOW抜きで同じ項集合を合併すると不都合になる⇒ LALR(1) でない,LR(1)である
G6:S→E$,E→E+a,E→T+T,E→m,T→m a + E→E+a・,$ S→E・, $ E→E・+a,$ E→E+・a,$ S→・E, $ E→・E+a, $ E→・T+T,$ E→・m, +/$ T→・m, + E T T→m・,$ E→T+・T,$ T→・m, $ m m E→T・+T,$ + E→m・,+/$ T→m・,+ T E→T+T・,$ FOLLOWの共通集合が空でない ⇒LR(1)でない LR(1)で不都合な状態あり⇒LR(1)でない
課題10.1 SLR(1)構文解析 • 文法規則が下記であるとき,LR(0)オートマトンを構成し,構文解析表し,(a+a)*(a+a)を受理する過程を示しなさい. (0)S→E$ (1)E→E+T (2)E→T (3)T→T*F (4)T→F (5)F→a (6)F→(E)
課題10.2 LR(1)構文解析 • LR(1)構文解析のうち, SLR(1),LALR(1),LR(1) 構文解析可能性について述べなさい. • 下記のクラスの文法の例を示しなさい. 理由もつけて. ●SLR(1)の文法 ●LALR(1)であるが,SLR(1)でない文法 ●LR(1)であるが,LALR(1)でない文法
小テスト 正しいのはどれ?
問1 シフト状態? 還元状態? ①T→・T+T 還元状態 ②T→T・+T シフト状態 ③E→E+・T 還元状態 ④E→T・ シフト状態 ⑤T→E+T・ シフト状態 ⑥正解なし
問2 LR(1)S→E$,E→T+T,E→m,T→m ①S→E・,+ S→・E, $ E→・T+T,$ E→・m, $ T→・m, + E T ②E→T+・T,$ m ③E→m・, $ T→m・, $ m T ⑤E→m・,$ T→m・,+ ④E→T+T・,$ ⑥正解なし
問3 オートマトン→構文解析表 ルール(1)E→E+TFOLLOW(E)={ + , $ } I6={E→E+T・ , T→T・*F } I7={ T→T*・F , F→・a } * ⑥正解なし
問4 SLR(1) ? ①LR(0)+FOLLOW ②LR(1)+FOLLOW ③SLR(0)+FOLLOW ④LR(0) ⑤LR(1) ⑥正解なし
問5 LALR(1) ? ①LR(0)+FOLLOW ②LR(1)+FOLLOW ③LR(1)-同じ項集合は纏める ④LR(0)-同じ項集合は纏める ⑤LR(1)だけ ⑥正解なし