Transcript Document

言語処理系(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 演算子順位構文解析
• 順位関数
全終端記号間の表を持つのは重い
順位関数