言語処理系(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 a L ( , L’ ) L’ L , L’ L ( L’ L a , L’ a ) 5 基本的な構文解析技法 5.1 5.2 5.3 5.4 5.5 構文解析系 移動還元構文解析 演算子順位構文解析 下降型構文解析 予測的構文解析系 5.1 構文解析系 • 構文解析系 文脈自由文法G,文字列wに対して wがGの文ならば解析木を返す さもなくば,誤りメッセージを生成する 5.1 構文解析系 • 上昇型構文解析 解析木を葉から根に向かって構成 例.移動還元構文解析 −入力記号を移動しつつ,スタックへ積む −スタックの上位が生成規則の右辺に対応す ると,左辺に置換(還元操作) 5.1 構文解析系 • 下降型構文解析 解析木を根から葉に向かって構成 例.再帰下降型構文解析 −予測的構文解析系 −LL構文解析系 5.1 構文解析系 • 解析木の表現 −直接表現:リスト構造による表現など −間接表現:導出に用いる生成規則列など 5.1 構文解析系 • 左文形式と右文形式 −最左導出: wAγ ⇒ wδγ lm * S ⇒α 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 if C then S b if C then S b a else S a 5.1 構文解析系 • 解析木と導出 S if C then S S ⇒ if C then S 5.1 構文解析系 • 解析木と導出 S if C then S b if C then S ⇒ if b then S 5.1 構文解析系 • 解析木と導出 S if C then S b if C then S else S if b then S ⇒ if b then if C then S else S 5.1 構文解析系 • 解析木と導出 S if C then S b if C then S b else S if b then if C then S else S ⇒ if b then if b then S else S 5.1 構文解析系 • 解析木と導出 S if C then S b if C then S b a else S if b then if b then S else S ⇒ if b then if b then a else S 5.1 構文解析系 • 解析木と導出 S if C then S b if C then S b a else S 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 c d e a b 文字列 5.2 移動還元構文解析 • 移動と還元 S → a A c B e A → A b | b B → d 文法 A b c d e a b 文字列 5.2 移動還元構文解析 • 移動と還元 S → a A c B e A → A b | b B → d 文法 A b c d e a b 文字列 5.2 移動還元構文解析 • 移動と還元 S → a A c B e A → A b | b B → d 文法 A b c d B e a b 文字列 5.2 移動還元構文解析 • 移動と還元 S → a A c B e A → A b | b B → d 文法 S b A b c d B e a 文字列 5.2 移動還元構文解析 最右導出 • 移動と還元 a b ⇒ a ⇒ a ⇒ a ⇒ S b c A b A c A c d e c d e d e B e A → b A → A b B → d S → a A b B e 5.2 移動還元構文解析 •把手 a b ⇒ a ⇒ a ⇒ a ⇒ S b c A b A c A c d e c d e d e B e 文法が曖昧でないならば,その 文法のすべての右文形式は, ちょうど1つの把手をもつ 5.2 移動還元構文解析 •把手 (1) E (2) E (3) E (4) E → → → → E + E E * E ( E ) id E ⇒ ⇒ ⇒ ⇒ ⇒ E ⇒ ⇒ ⇒ ⇒ ⇒ E + E E +E * E E + E * id E + id * id id + id * id E * E E * id E + E * id E + id * id id + id * id 5.2 移動還元構文解析 •把手の刈取り 把手を対応する左辺で置換する操作 右文形式 id + id * id 把手 id E + id * id E + E * id E + E * E id id E * E E → id E → id E → E * E E + E E + E E → E + E E 還元用生成規則 E → id 5.2 移動還元構文解析 •移動還元構文解析のスタックによる実現 スタック 入力バッファ id id E + id E + id * 還元 移動 id $ 5.2 移動還元構文解析 •移動還元構文解析のスタックによる実現 スタック 入力バッファ id E id + id * * E + E 移動 還元 id $ 5.2 移動還元構文解析 •移動還元構文解析のスタックによる実現 スタック 入力バッファ E id + id * * E + E 受理 還元 id $ 5.2 移動還元構文解析 •解析木の構成 スタック 入力バッファ id + id * id E + id E E id E + id id $ 5.2 移動還元構文解析 •解析木の構成 スタック 入力バッファ id id E + id * id $ * E + E E id E E + id * id 5.2 移動還元構文解析 •解析木の構成 スタック 入力バッファ id E + * id * E $ E E E + id E id E E + id * id ちょっと休憩 (雑談) 魚偏の漢字 • 鮪 まぐろ • 鯨 くじら • 鰤 ぶり • 鰯 いわし • 鯛 たい • 鯔 ぼら • 鯵 あじ • 鱈 たら • 鰻 うなぎ • 鰆 さわら • 鮫 さめ • 鯰 なまず • 鰍 かじか • 鯖 さば • 鯉 こい • 鰈 かれい • 鰊 にしん • 鮒 ふな 休憩おわり 5.3 演算子順位構文解析 • 演算子文法 隣接する非終端記号を持たない文法 効率的な移動還元構文解析系を生成 5.3 演算子順位構文解析 • 演算子文法の例 演算子文法でない E → E A E | ( 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 演算子順位構文解析 • 結合性と順位からの演算子順位関係 + - * / ^ id ( ) $ + > > < < < < > > - > > < < < < < > > * / 左結合的 * > > > > < < < > > / 2 1 1 1 2 < > > > > < < < > > + - 左結合的 ^ > > 1> > 2< < < > > id > > > > > > > ( < < < < ) > > 3 < > > > $ < < < < < ^ 右結合的 < 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:+ ≳ * 5.3 演算子順位構文解析 + * ( ) id $ + > < < > < > * > > < > < > ( < < < = < ) > > > > id > > > > $ < < • 演算子順位文法 E → E + T | T E → T + F | F F → ( E )| id < < 5.3 演算子順位構文解析 • 演算子順位構文解析アルゴリズム LEADING()およびTRAILING()については省略 5.3 演算子順位構文解析 • 演算子順位構文解析アルゴリズム repeat forever begin if スタックが$ and 入力が$ then 受理してbreak; aをスタック最上段の終端記号, b入力記号; if a ≲ b or a ≅ b then bをスタックに else if a ≳ b then /* 還元動作 */ repeat スタックからおろす until (スタックの最上段の終端記号) ≲ (最後にスタックからおろした終端記号) else 誤り訂正ルーチンを呼び出す end 5.3 演算子順位構文解析 • 演算子順位構文解析アルゴリズム id $ ≲ + id $ 5.3 演算子順位構文解析 • 演算子順位構文解析アルゴリズム $ id E + ≳ ≲ id $ 5.3 演算子順位構文解析 • 演算子順位構文解析アルゴリズム $ + E ≳ ≲ id $ 5.3 演算子順位構文解析 • 演算子順位構文解析アルゴリズム $ E + id E $ ≳ ≲ 5.3 演算子順位構文解析 • 順位関数 全終端記号間の表を持つのは重い 順位関数
© Copyright 2025 ExpyDoc