言語処理系(6)
DESCRIPTION
言語処理系(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 は,リスト構造 - PowerPoint PPT PresentationTRANSCRIPT
言語処理系(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’
a
L’ )
L , L’
( L’ ) L , L’
( L’ ) L , L’
L , L’ Λ L
a 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
Cif then S
Cif then S
b a
b else S
a
5.1 構文解析系
• 解析木と導出
S
Cif then S
S if ⇒ C then S
5.1 構文解析系
• 解析木と導出
S
Cif then S
b
if C then S ⇒ if b then S
5.1 構文解析系
• 解析木と導出
S
Cif then S
Cif then Sb else S
if b then S ⇒ if b then if C then S else S
5.1 構文解析系
• 解析木と導出
S
Cif then S
Cif then S
b
b else S
if b then if C then S else S ⇒ if b then if b then S else S
5.1 構文解析系
• 解析木と導出
S
Cif then S
Cif then S
b a
b else S
if b then if b then S else S ⇒ if b then if b then a else S
5.1 構文解析系
• 解析木と導出
S
Cif then S
Cif then S
b a
b else S
if b then if b then a else S ⇒ if b then if b then a else a
a
5.2 移動還元構文解析
• 移動と還元
S → a A c B eA → A b | bB → d
a b b c d e
文法
文字列
5.2 移動還元構文解析
• 移動と還元
S → a A c B eA → A b | bB → d
a b b c d e
文法
文字列
5.2 移動還元構文解析
• 移動と還元
S → a A c B eA → A b | bB → d
a b b c d e
文法
文字列A
5.2 移動還元構文解析
• 移動と還元
S → a A c B eA → A b | bB → d
a b b c d e
文法
文字列A
5.2 移動還元構文解析
• 移動と還元
S → a A c B eA → A b | bB → d
a b b c d e
文法
文字列A
5.2 移動還元構文解析
• 移動と還元
S → a A c B eA → A b | bB → d
a b b c d e
文法
文字列A B
5.2 移動還元構文解析
• 移動と還元
S → a A c B eA → A b | bB → d
a b b c d e
文法
文字列A BS
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
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 文法が曖昧でないならば,その文法のすべての右文形式は,ちょうど1つの把手をもつ
5.2 移動還元構文解析
•把手
(1) E → E + E(2) E → E * E(3) E → ( E )(4) E → id
E ⇒ E + E ⇒ E + E * E ⇒ E + E * id ⇒ E + id * id ⇒ id + id * idE ⇒ E * E ⇒ E * id ⇒ E + E * id ⇒ E + id * id ⇒ id + id * id
5.2 移動還元構文解析•把手の刈取り
把手を対応する左辺で置換する操作
右文形式 把手 還元用生成規則id + id * id id E → id
E + id * id id E → id
E + E * id id E → id
E + E * E E * E E → E * E
E + E E + E E → E + E
E
5.2 移動還元構文解析
id
+
id
•移動還元構文解析のスタックによる実現
id + id * id $
スタック
入力バッファ
移動還元E
移動移動E 還元
5.2 移動還元構文解析
id
*
E
+
E
•移動還元構文解析のスタックによる実現
id + id * id $
スタック
入力バッファ
還元移動還元
E
5.2 移動還元構文解析
E
*
E
+
E
•移動還元構文解析のスタックによる実現
id + id * id $
スタック
入力バッファ
還元受理
5.2 移動還元構文解析
id
+
id
•解析木の構成
id + id * id $
スタック
入力バッファ
E
E
id
E
+ id
E
5.2 移動還元構文解析
id
*
E
+
E
•解析木の構成
id + id * id $
スタック
入力バッファ
E
id
E
+ id
E
* id
E
5.2 移動還元構文解析
E
*
E
+
E
•解析木の構成
id + id * id $
スタック
入力バッファ
id
E
+ id
E
* id
E
EE
ちょっと休憩(雑談)
魚偏の漢字• 鮪 まぐろ• 鰯 いわし• 鯵 あじ• 鰆 さわら• 鰍 かじか• 鰈 かれい
• 鯨 くじら• 鯛 たい• 鱈 たら• 鮫 さめ• 鯖 さば• 鰊 にしん
• 鰤 ぶり• 鯔 ぼら• 鰻 うなぎ• 鯰 なまず• 鯉 こい• 鮒 ふな
休憩おわり
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)優先度:≳:≲
2)優先度::::::≲:≲
優先度::::::≳:≳
3)≲ id, id ≳ , ≲ (, ( ≲ , ) ≳ , ≳ ),
$ ≳ , ≳ $とする. ( ≅ ), $ ≲ (, $ ≲ id, ( ≲(, id ≳ $, ) ≳ $, ( ≲ id, id ≳ ), ) ≳ )とする
• 結合性と順位からの演算子順位関係
5.3 演算子順位構文解析
^ 右結合的
* / 左結合的
+ - 左結合的
+ - * / ^ id ( ) $
+ > > < < < < < > >
- > > < < < < < > >
* > > > > < < < > >
/ > > > > < < < > >
^ > > > > < < < > >
id > > > > > > >
( < < < < < < < =
) > > > > > > >
$ < < < < < < <
2 11 2
1
12
3
3
3
• 単項演算子の扱い
− 2項演算子にないもの:例えば¬に対しては,すべての演算子に対して,≲ ¬とし, ¬の優先順位が:::::::¬ ≳ :::::::¬ ≲ :::: :::::::::::::::::::::::::::::::::::
5.3 演算子順位構文解析
• 演算子順位文法G: 生成規則の右辺が::::::::::ab:::::::::::::::a ≅ b
2)非終端記号A, aA:::::⇒+b:::::::::::a ≲ b
3)非終端記号A, Ab::::⇒+a:::::::::::a ≳ b
5.3 演算子順位構文解析
• 演算子順位文法この規則で生成した順位関係が互いに素である演算子文法
5.3 演算子順位構文解析
• 演算子順位文法
5.3 演算子順位構文解析
E → E + E | E * E | ( E ) | id
2)非終端記号A, aA:::::⇒+b:::::::::::a ≲ b
E + Eなる右辺,⇒+ * :+ ≲ *3)非終端記号A, Ab::::⇒+a:::::::::::a ≳ b
E + Eなる右辺,⇒+ * :+ ≳ *
• 演算子順位文法
5.3 演算子順位構文解析
E → E + T | T
E → T + F | F
F → ( E )| id
+ * ( ) id $
+ > < < > < >
* > > < > < >
( < < < = <
) > > > >
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 + id $$ E
≳≲
• 演算子順位構文解析アルゴリズム
5.3 演算子順位構文解析
E + id $$
≲≳
• 演算子順位構文解析アルゴリズム
5.3 演算子順位構文解析
E $$ + idE
• 順位関数全終端記号間の表を持つのは重い
順位関数
5.3 演算子順位構文解析