580 likes | 686 Views
言語処理系(6). 金子敬一. 練習問題 4.1. リスト構造は以下のように定義される. Λ は,空リスト a は,リスト構造 l 1 , l 2 , ..., l k ( k >0) がリスト構造ならば ( l 1 , l 2 , ... , l k ) もリスト構造 a) リスト構造に対する文脈自由文法を作れ b) ((( a , a ), Λ , ( a )), a ) に対する解析木を書け. 練習問題 4.1. リスト構造は以下のように定義される. Λ は,空リスト a は,リスト構造
E N D
言語処理系(6) 金子敬一
練習問題 4.1 リスト構造は以下のように定義される. • Λは,空リスト • aは,リスト構造 • l1, l2, ..., lk (k>0)がリスト構造ならば (l1, l2, ..., lk)もリスト構造 a) リスト構造に対する文脈自由文法を作れ b) (((a, a), Λ, (a)), a)に対する解析木を書け
練習問題 4.1 リスト構造は以下のように定義される. • Λは,空リスト • aは,リスト構造 • l1, l2, ..., lk (k>0)がリスト構造ならば (l1, l2, ..., lk)もリスト構造 a) リスト構造に対する文脈自由文法を作れ L = Λ | a | ( L’ ) L’=L | L, L’
練習問題 4.1 b)(((a, a), Λ, (a)), a)に対する解析木を書け L , ( L’ ) L’ L Λ L , L’ L ( L’ ) L , L’ ( a L’ L ) ( L’ ) L a L L , L’ a a L , ( L’ ) L’
5 基本的な構文解析技法 5.1 構文解析系 5.2 移動還元構文解析 5.3 演算子順位構文解析 5.4 下降型構文解析 5.5 予測的構文解析系
5.1 構文解析系 • 構文解析系 文脈自由文法G,文字列wに対して wがGの文ならば解析木を返す さもなくば,誤りメッセージを生成する
5.1 構文解析系 • 上昇型構文解析 解析木を葉から根に向かって構成 例.移動還元構文解析 • 入力記号を移動しつつ,スタックへ積む • スタックの上位が生成規則の右辺に対応すると,左辺に置換(還元操作)
5.1 構文解析系 • 下降型構文解析 解析木を根から葉に向かって構成 例.再帰下降型構文解析 • 予測的構文解析系 • LL構文解析系
5.1 構文解析系 • 解析木の表現 • 直接表現:リスト構造による表現など • 間接表現:導出に用いる生成規則列など
左文形式 S ⇒*α lm 5.1 構文解析系 • 左文形式と右文形式 • 最左導出: wAγ⇒wδγ lm
5.1 構文解析系 • 解析木と導出 文wに対する解析木において,最左の非終端記号に対応するノードの子コードのラベルによる置換を繰り返す.
5.1 構文解析系 • 解析木と導出 (1) S→ if C then S (2) S→ if C then S else S (3) S→ a (4) C→ b
5.1 構文解析系 • 解析木と導出 S S C then if C S S then else b if b a a
5.1 構文解析系 • 解析木と導出 S S C then if S ⇒ if C then S
5.1 構文解析系 • 解析木と導出 S S C then if b if C then S⇒ if b then S
5.1 構文解析系 • 解析木と導出 S S C then if C S S then else b if if b then S⇒ if b then if C then S else S
5.1 構文解析系 • 解析木と導出 S S C then if C S S then else b if b if b then if C then S else S⇒ if b then if b then S else S
5.1 構文解析系 • 解析木と導出 S S C then if C S S then else b if b a if b then if b then S else S⇒ if b then if b then a else S
5.1 構文解析系 • 解析木と導出 S S C then if C S S then else b if b a a if b then if b then a else S⇒ if b then if b then a else a
5.2 移動還元構文解析 • 移動と還元 S→ a A c B e A →A b | b B → d a b b c d e 文法 文字列
5.2 移動還元構文解析 • 移動と還元 S→ a A c B e A →A b | b B → d a b b c d e 文法 文字列
5.2 移動還元構文解析 • 移動と還元 S→ a A c B e A →A b | b B → d a b b c d e 文法 A 文字列
5.2 移動還元構文解析 • 移動と還元 S→ a A c B e A →A b | b B → d a b b c d e 文法 A 文字列
5.2 移動還元構文解析 • 移動と還元 S→ a A c B e A →A b | b B → d a b b c d e 文法 A 文字列
5.2 移動還元構文解析 • 移動と還元 S→ a A c B e A →A b | b B → d a b b c d e 文法 A B 文字列
5.2 移動還元構文解析 • 移動と還元 S→ a A c B e A →A b | b B → d a b b c d e 文法 S A B 文字列
A → b A → A b B → d S → a A b B e 5.2 移動還元構文解析 最右導出 • 移動と還元 a b b c d e ⇒ a A b c d e ⇒a A c d e ⇒a A c B e ⇒S
5.2 移動還元構文解析 • 把手 a b b c d e ⇒ a A b c d e ⇒a A c d e ⇒a A c B e ⇒S 文法が曖昧でないならば,その 文法のすべての右文形式は, ちょうど1つの把手をもつ
5.2 移動還元構文解析 E⇒E + E ⇒E +E * E ⇒E +E * id ⇒E +id * id ⇒id +id * id E⇒E * E ⇒E *id ⇒E +E * id ⇒E +id * id ⇒id +id * id • 把手 (1) E→E + E (2) E→E * E (3) E→ ( E ) (4) E→ id
5.2 移動還元構文解析 • 把手の刈取り 把手を対応する左辺で置換する操作
5.2 移動還元構文解析 • 移動還元構文解析のスタックによる実現 スタック 入力バッファ 移動 移動 還元 還元 移動 E E
5.2 移動還元構文解析 • 移動還元構文解析のスタックによる実現 スタック 入力バッファ E 移動 還元 還元
5.2 移動還元構文解析 • 移動還元構文解析のスタックによる実現 スタック 入力バッファ 還元 受理
5.2 移動還元構文解析 • 解析木の構成 スタック 入力バッファ E E E id + id E
5.2 移動還元構文解析 • 解析木の構成 スタック 入力バッファ E E E E id * id + id
5.2 移動還元構文解析 • 解析木の構成 スタック 入力バッファ E E E E E id * id + id
魚偏の漢字 • 鮪 まぐろ • 鰯 いわし • 鯵 あじ • 鰆 さわら • 鰍 かじか • 鰈 かれい • 鯨 くじら • 鯛 たい • 鱈 たら • 鮫 さめ • 鯖 さば • 鰊 にしん • 鰤 ぶり • 鯔 ぼら • 鰻 うなぎ • 鯰 なまず • 鯉 こい • 鮒 ふな
5.3 演算子順位構文解析 • 演算子文法 隣接する非終端記号を持たない文法 効率的な移動還元構文解析系を生成
5.3 演算子順位構文解析 • 演算子文法の例 E→EAE | ( E ) | - E |id A→ + | - | * | / | ^ 演算子文法でない E→E +E | E -E | E *E | E /E | E ^E | ( E ) | - E |id
5.3 演算子順位構文解析 • 順位関係 終端記号間の3種類の関係:≅, ≲, ≳ 定め方には2通り • 演算子の結合性と優先度に基づく • 曖昧さのない文法から機械的に
把手 5.3 演算子順位構文解析 • 演算子順位関係の使用 右分形式の把手の左端を≲で,右端を≳で区切る E + E * E / E + E ≲ ≅ ≳
5.3 演算子順位構文解析 • 演算子順位関係の使用 0)非終端記号をすべて除去 1)左端から走査して最左の≳を見つける 2)次に左端へ走査して,≲を見つける 3)≲と≳で囲まれた部分に,間や両端に高々1個の非終端記号を付加して把手を得る
5.3 演算子順位構文解析 • 結合性と順位からの演算子順位関係 1)優先度q1>q2:q1 ≳ q2 ,q2 ≲ q1 2)優先度q1=q2かつ右結合:q2 ≲ q1 ,q1 ≲ q2 優先度q1=q2かつ左結合:q1 ≳ q2 ,q2 ≳ q1 3)q ≲ id, id ≳ q, q ≲ (, (≲ q, )≳ q, q ≳ ), $≳ q, q ≳ $とする.(≅ ), $≲ (, $≲ id, (≲ (, id≳ $, )≳ $, (≲ id, id≳ ), )≳ )とする
5.3 演算子順位構文解析 • 結合性と順位からの演算子順位関係 2 3 1 1 ^ 右結合的 * / 左結合的 + - 左結合的 1 2 2 1 3 3
5.3 演算子順位構文解析 • 単項演算子の扱い • 2項演算子にないもの:例えば¬に対しては,すべての演算子qに対して,q ≲ ¬とし, ¬の優先順位がqより高ければ,¬ ≳ qとし,低ければ¬ ≲ qとする. • 2項演算子にもある単項演算子は,字句解析系で2項のものと区別する必要
5.3 演算子順位構文解析 • 演算子順位文法 G: 生成規則の右辺がeでない演算子文法 1)aabbgなる右辺,bはeか1つの非終端記号:a ≅ b 2)非終端記号A, aaAbなる右辺,A⇒+gbd, gがeか1つの非終端記号:a ≲ b 3)非終端記号A, aAbbなる右辺, A⇒+gad, dがeか1つの非終端記号:a ≳ b
5.3 演算子順位構文解析 • 演算子順位文法 この規則で生成した順位関係が互いに素である演算子文法
5.3 演算子順位構文解析 • 演算子順位文法 E→E + E | E * E | ( E ) | id 2)非終端記号A, aaAbなる右辺,A⇒+gbd, gがeか1つの非終端記号:a ≲ b E + Eなる右辺,E⇒+E* E:+ ≲ * 3)非終端記号A, aAbbなる右辺, A⇒+gad, dがeか1つの非終端記号:a ≳ b E + Eなる右辺,E⇒+E* E:+ ≳ *