言語処理系(7) 金子敬一
5 基本的な構文解析技法 5.1 構文解析系 5.2 移動還元構文解析 5.3 演算子順位構文解析 5.4 下降型構文解析 5 基本的な構文解析技法 5.1 構文解析系 5.2 移動還元構文解析 5.3 演算子順位構文解析 5.4 下降型構文解析 5.5 予測的構文解析系
5.4 下降型構文解析系 下降型構文解析の例 S → c A d A → a b | a S c a d c A d
5.4 下降型構文解析系 下降型構文解析の例 S → c A d A → a b | a S c a d c A d a b
5.4 下降型構文解析系 下降型構文解析の例 S → c A d A → a b | a S c a d c A d a b
5.4 下降型構文解析系 下降型構文解析の例 S → c A d A → a b | a S c a d c A d a b
5.4 下降型構文解析系 下降型構文解析の例 S → c A d A → a b | a S c a d c A d d a
5.4 下降型構文解析系 下降型構文解析の例 以下の問題点がある: 左再起性を持つ文法では,無限ループに陥る可能性 5.4 下降型構文解析系 下降型構文解析の例 以下の問題点がある: 左再起性を持つ文法では,無限ループに陥る可能性 後戻りが必要なため,大きなオーバヘッドの可能性 代替の試行順序によって受理される言語が異なる可能性
5.4 下降型構文解析系 左再帰性の消去 G:文法,A ⇒ +Aaのとき,G:左再帰的 1)すべてのA生成規則をまとめる 5.4 下降型構文解析系 左再帰性の消去 G:文法,A ⇒ +Aaのとき,G:左再帰的 1)すべてのA生成規則をまとめる A → A a1 | ... | A am | b1 | ... | bn 2)この規則を,以下の生成規則に置換 A → b1 A’ | ... | bn A’ A’ → a1 A’ | ... | am A’ | e
5.4 下降型構文解析系 左再帰性の消去 1)すべてのA生成規則をまとめる 5.4 下降型構文解析系 左再帰性の消去 1)すべてのA生成規則をまとめる A → A a1 | ... | A am | b1 | ... | bn 2)この規則を,以下の生成規則に置換 A → b1 A’ | ... | bn A’ A’ → a1 A’ | ... | am A’ | e E → T E’ E’ → + T E’ | e E → E + T | T
5.4 下降型構文解析系 左再帰性の消去 E → T E’ E’ → + T E’ | e E → E + T | T T → F T’ 5.4 下降型構文解析系 左再帰性の消去 E → T E’ E’ → + T E’ | e T → F T’ T’ → * F T’ | e F → ( E ) | id E → E + T | T T → E + T | T F → ( E ) | id
5.4 下降型構文解析系 左再帰性の消去 Gの非終端記号をA1, A2, ..., Anとする A1の直接左再帰性を除去 A2にA1を代入 5.4 下降型構文解析系 左再帰性の消去 Gの非終端記号をA1, A2, ..., Anとする A1の直接左再帰性を除去 A2にA1を代入 A2の直接左再帰性を除去 A3にA1, A2を代入 A3の直接左再帰性を除去 …
5.4 下降型構文解析系 左再帰性の消去 S → A a | b A → A c | S d | e Sに直接左再帰はない. 5.4 下降型構文解析系 左再帰性の消去 S → A a | b A → A c | S d | e Sに直接左再帰はない. A → A c | A a d | b d | e Aの左再帰性を除去して A → b d’ A’ | e A’ A’ → c A’ | a d A’ | e
5.4 下降型構文解析系 再帰下降型構文解析 再帰的,後戻りなし A → a1 | a2 | ... | an 5.4 下降型構文解析系 再帰下降型構文解析 再帰的,後戻りなし A → a1 | a2 | ... | an なるA規則で,入力記号aの代替が常に1つに決まるならば,後戻りの必要なし
適 5.4 下降型構文解析系 左括り出し 文 → if 条件 then 文 else 文 | while 条件 do 文 5.4 下降型構文解析系 左括り出し 文 → if 条件 then 文 else 文 | while 条件 do 文 | begin 文の並び end | if 条件 then 文 適
適 5.4 下降型構文解析系 左括り出し 文 → if 条件 then 文 else 文 | if 条件 then 文 5.4 下降型構文解析系 左括り出し 文 → if 条件 then 文 else 文 | if 条件 then 文 文 → if 条件 then 文 文’ 文’ → else 文 | e 適
5.4 下降型構文解析系 遷移図 E: E’: T: T’: F: T + F * ( E’ T’ E ) e id E → T E’ 5.4 下降型構文解析系 遷移図 E: E’: T: T’: F: T + F * ( E’ T’ E ) e id E → T E’ E’ → + T E’ | e T → F T’ T’ → * F T’ | e F → ( E ) | id
5.4 下降型構文解析系 遷移図 E: E’: T: T’: F: T + F * ( E’ T’ E ) e id E: T: F: T 5.4 下降型構文解析系 遷移図 E: E’: T: T’: F: T + F * ( E’ T’ E ) e id E: T: F: T F ( e E ) id + *
5.4 下降型構文解析系 遷移図 T e + E: F e * T: ( E ) id F:
ちょっと休憩 (雑談)
たほいや だんぼらぼ 水中に大きな物を投げ入れた時の音。 香川県で段々畑の意。 なでしこに似た花をつける植物。春から夏にかけて海沿いの暖かい斜面に群生する。 ソラユリ科 高山植物のひとつ。 だらしない人。
たほいや おっぱ 小さな木の葉。転じて身分の軽い者のこと。 東北地方で冬に肩に掛ける上衣。 物事の最後。結末。 おおざっぱにまとめること。 南米に生息するカミキリムシ。
たほいや ねぎどの ねぎを育てるための肥沃な土壌。 田んぼにいる虫のこと。 キリギリス・イナゴの異称。 死者をねぎらうための部屋。ねぎどころ。 米沢藩主 上杉鷹山の愛称。
たほいや したひ 鍋などを熱するときの種火。 死体。 鎧のひどうしの下につける衣服。 下火になることの古称 人気が落ちる。 赤く色づくこと。
たほいや ぬじ 色鮮やかな様子。 左官屋の壁を塗る下地のこと。 しったかぶり。 「にじ」の古形。のじ。 所有者のいる土地。
たほいや にこぽん 天から授かる幸い。天運。 にこにこして相手の肩をぽんと叩き、親しそうにうちとけて人を懐柔する態度。 ニコチンとヒロポンの融合語。 調子のよい人。にこりと笑って肩をたたくことから。 物事が新鮮なさま。
休憩おわり
5.5 予測的構文解析系 概要 入力 a + b $ 入力 スタック X 構文解析表 Y プログラム 出力 Z 出力 $ 構 文 5.5 予測的構文解析系 概要 入力 スタック 構文解析表 出力 入力 a + b $ X Y Z $ プログラム 出力 構 文 解析表 M[X,a] スタック 次の動作を決定
5.5 予測的構文解析系 概要 入力 $ $ プログラム 出力 構 文 解析表 受理 M[$,$] スタック
5.5 予測的構文解析系 概要 入力 a + b $ a Y Z $ プログラム 出力 構 文 解析表 M[a,a] スタック
5.5 予測的構文解析系 U 概要 入力 V a + b $ W X Y プログラム Z 出力 $ 構 文 M[X,a] 解析表 スタック 5.5 予測的構文解析系 U V W 概要 入力 a + b $ X Y Z $ プログラム 出力 構 文 解析表 M[X,a] スタック X → U V W
5.5 予測的構文解析系 E → T E’ 動作 E’ → + T E’ | e T → F T’ T’ → * F T’ | e 5.5 予測的構文解析系 E → T E’ E’ → + T E’ | e T → F T’ T’ → * F T’ | e F → ( E ) | id 動作 id + * ( ) $ E E→T E’ E’ E’→+ T E’ E’→e T T→F T’ T’ T’→e T’→* F T’ F F →id F →(E)
5.5 予測的構文解析系 動作 $ E’ T + id * $ E’ T’ F id * $ E’ T’ + id * $ E’ T id 5.5 予測的構文解析系 動作 $ E’ T + id * $ E’ T’ F id * $ E’ T’ + id * $ E’ T id * $ E’ T’ F id + * $ E id + * $ E’ T’ id + * $ E’ T id + * $ E’ + id * id + * ( ) $ E E→T E’ E’ E’→+ T E’ E’→e T T→F T’ T’ T’→e T’→* F T’ F F →id F →(E)
5.5 予測的構文解析系 動作 $ E’ T’ id $ E’ T’ $ $ E’ T’ F id $ E’ $ E’ T’ * id $ 5.5 予測的構文解析系 動作 $ E’ T’ id $ E’ T’ $ $ E’ T’ F id $ E’ $ E’ T’ * id $ E’ T’ id * $ E’ T’ F id * $ E’ T’ F * id id + * ( ) $ E E→T E’ E’ E’→+ T E’ E’→e T T→F T’ T’ T’→e T’→* F T’ F F →id F →(E)
5.5 予測的構文解析系 FIRSTとFOLLOW 任意の文法記号列a, FIRST(a): aから導出可能な文字列の先頭の終端記号の集合 5.5 予測的構文解析系 FIRSTとFOLLOW 任意の文法記号列a, FIRST(a): aから導出可能な文字列の先頭の終端記号の集合 任意の文法記号列A, FOLLOW(A): 文形式においてAのすぐ右に出現しうる終端記号の集合(含む$)
5.5 予測的構文解析系 FIRSTの求め方 X:任意の文法記号,FIRST(X)を以下のように求める 5.5 予測的構文解析系 FIRSTの求め方 X:任意の文法記号,FIRST(X)を以下のように求める 1)X:終端記号,FIRST(X)={X} 2)X:非終端,X→a a, a FIRST(X) 3)X→Y1 Y2 ... Yk, Y1 Y2 ... Yi-1⇒+eならばFIRST(Yi)-{e} FIRST(X) Y1 Y2 ... Yk⇒*eならば, e FIRST(X)
5.5 予測的構文解析系 FOLLOWの求め方 A:任意の非終端記号,FOLLOW(A)を 以下のように求める 5.5 予測的構文解析系 FOLLOWの求め方 A:任意の非終端記号,FOLLOW(A)を 以下のように求める 1)S:出発記号,$ FOLLOW(S) 2)A→a B b, b = e, FIRST(b)-{e} FOLLOW(B) 3)A→a Bまたは, A→a B bかつe FIRST(b), FOLLOW(A) FOLLOW(B)
5.5 予測的構文解析系 構文解析表の構成 1)各生成規則A→aに対し,2,3を実行 5.5 予測的構文解析系 構文解析表の構成 1)各生成規則A→aに対し,2,3を実行 2)各終端記号a FIRST(a)に対して, M[A,a]にA→aを記入 3)e FIRST(a)ならば, 各終端記号b FOLLOW(A)に対して,M[A,b]にA→aを記入.e FIRST(a)かつ$ FOLLOW (A)ならばM[A,b]にA→aを記入 4)空欄にerrorを記入
5.5 予測的構文解析系 LL(1)文法 構文解析表のどの欄も多重定義されていない文法
5.5 予測的構文解析系 任意の終端記号a, aとbのうち高々一方がaで始まる文字列を導出 aとbのうち高々一方が空列を導出 5.5 予測的構文解析系 LL(1)文法の必要十分条件 A → a | bに対して, 任意の終端記号a, aとbのうち高々一方がaで始まる文字列を導出 aとbのうち高々一方が空列を導出 b⇒*eならばaはFOLLOW(A)に含まれる終端記号で始まる文字列を導出しない