言語処理系(6)

58
言言言言言(6) 言言言

Upload: joshua-fischer

Post on 30-Dec-2015

27 views

Category:

Documents


0 download

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 Presentation

TRANSCRIPT

Page 1: 言語処理系(6)

言語処理系(6)

金子敬一

Page 2: 言語処理系(6)

練習問題 4.1

リスト構造は以下のように定義される.• Λ は,空リスト• a は,リスト構造• l1, l2, ..., lk (k>0) がリスト構造ならば

(l1, l2, ..., lk) もリスト構造

a) リスト構造に対する文脈自由文法を作れb) (((a, a), Λ, (a)), a) に対する解

析木を書け

Page 3: 言語処理系(6)

練習問題 4.1

リスト構造は以下のように定義される.• Λ は,空リスト• a は,リスト構造• l1, l2, ..., lk (k>0) がリスト構造ならば

(l1, l2, ..., lk) もリスト構造

a) リスト構造に対する文脈自由文法を作れL = Λ | a | ( L’ )L’ = L | L, L’

Page 4: 言語処理系(6)

練習問題 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

Page 5: 言語処理系(6)

5 基本的な構文解析技法

5.1 構文解析系5.2 移動還元構文解析5.3 演算子順位構文解析5.4 下降型構文解析5.5 予測的構文解析系

Page 6: 言語処理系(6)

5.1 構文解析系• 構文解析系

文脈自由文法G,文字列wに対して

wがGの文ならば解析木を返す 

さもなくば,誤りメッセージを生成する

Page 7: 言語処理系(6)

5.1 構文解析系• 上昇型構文解析

解析木を葉から根に向かって構成

例.移動還元構文解析−入力記号を移動しつつ,スタックへ積む

−スタックの上位が生成規則の右辺に対応すると,左辺に置換(還元操作)

Page 8: 言語処理系(6)

5.1 構文解析系• 下降型構文解析

解析木を根から葉に向かって構成

例.再帰下降型構文解析−予測的構文解析系

−LL構文解析系

Page 9: 言語処理系(6)

5.1 構文解析系• 解析木の表現

−直接表現:リスト構造による表現など

−間接表現:導出に用いる生成規則列など

Page 10: 言語処理系(6)

5.1 構文解析系• 左文形式と右文形式

−最左導出:

wAγ  ⇒  wδγ

lm

S ⇒*αlm

左文形式

Page 11: 言語処理系(6)

5.1 構文解析系• 解析木と導出

文wに対する解析木において,最左の非終端記号に対応するノードの子コードのラベルによる置換を繰り返す.

Page 12: 言語処理系(6)

5.1 構文解析系• 解析木と導出

(1) S → if C then S

(2) S → if C then S else S

(3) S → a

(4) C → b

Page 13: 言語処理系(6)

5.1 構文解析系

• 解析木と導出

S

Cif then S

Cif then S

b a

b else S

a

Page 14: 言語処理系(6)

5.1 構文解析系

• 解析木と導出

S

Cif then S

S if ⇒ C then S

Page 15: 言語処理系(6)

5.1 構文解析系

• 解析木と導出

S

Cif then S

b

if C then S ⇒ if b then S

Page 16: 言語処理系(6)

5.1 構文解析系

• 解析木と導出

S

Cif then S

Cif then Sb else S

if b then S ⇒ if b then if C then S else S

Page 17: 言語処理系(6)

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

Page 18: 言語処理系(6)

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

Page 19: 言語処理系(6)

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

Page 20: 言語処理系(6)

5.2 移動還元構文解析

• 移動と還元

S → a A c B eA →   A b | bB → d

a b b c d e

文法

文字列

Page 21: 言語処理系(6)

5.2 移動還元構文解析

• 移動と還元

S → a A c B eA →   A b | bB → d

a b b c d e

文法

文字列

Page 22: 言語処理系(6)

5.2 移動還元構文解析

• 移動と還元

S → a A c B eA →   A b | bB → d

a b b c d e

文法

文字列A

Page 23: 言語処理系(6)

5.2 移動還元構文解析

• 移動と還元

S → a A c B eA →   A b | bB → d

a b b c d e

文法

文字列A

Page 24: 言語処理系(6)

5.2 移動還元構文解析

• 移動と還元

S → a A c B eA →   A b | bB → d

a b b c d e

文法

文字列A

Page 25: 言語処理系(6)

5.2 移動還元構文解析

• 移動と還元

S → a A c B eA →   A b | bB → d

a b b c d e

文法

文字列A B

Page 26: 言語処理系(6)

5.2 移動還元構文解析

• 移動と還元

S → a A c B eA →   A b | bB → d

a b b c d e

文法

文字列A BS

Page 27: 言語処理系(6)

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

最右導出

Page 28: 言語処理系(6)

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つの把手をもつ

Page 29: 言語処理系(6)

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

Page 30: 言語処理系(6)

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

Page 31: 言語処理系(6)

5.2 移動還元構文解析

id

+

id

•移動還元構文解析のスタックによる実現

id + id * id $

スタック

入力バッファ

移動還元E

移動移動E 還元

Page 32: 言語処理系(6)

5.2 移動還元構文解析

id

*

E

+

E

•移動還元構文解析のスタックによる実現

id + id * id $

スタック

入力バッファ

還元移動還元

E

Page 33: 言語処理系(6)

5.2 移動還元構文解析

E

*

E

+

E

•移動還元構文解析のスタックによる実現

id + id * id $

スタック

入力バッファ

還元受理

Page 34: 言語処理系(6)

5.2 移動還元構文解析

id

+

id

•解析木の構成

id + id * id $

スタック

入力バッファ

E

E

id

E

+ id

E

Page 35: 言語処理系(6)

5.2 移動還元構文解析

id

*

E

+

E

•解析木の構成

id + id * id $

スタック

入力バッファ

E

id

E

+ id

E

* id

E

Page 36: 言語処理系(6)

5.2 移動還元構文解析

E

*

E

+

E

•解析木の構成

id + id * id $

スタック

入力バッファ

id

E

+ id

E

* id

E

EE

Page 37: 言語処理系(6)

ちょっと休憩(雑談)

Page 38: 言語処理系(6)

魚偏の漢字• 鮪 まぐろ• 鰯 いわし• 鯵 あじ• 鰆 さわら• 鰍 かじか• 鰈 かれい

• 鯨 くじら• 鯛 たい• 鱈 たら• 鮫 さめ• 鯖 さば• 鰊 にしん

• 鰤 ぶり• 鯔 ぼら• 鰻 うなぎ• 鯰 なまず• 鯉 こい• 鮒 ふな

Page 39: 言語処理系(6)

休憩おわり

Page 40: 言語処理系(6)

5.3 演算子順位構文解析

• 演算子文法

隣接する非終端記号を持たない文法

効率的な移動還元構文解析系を生成

Page 41: 言語処理系(6)

5.3 演算子順位構文解析

• 演算子文法の例

E → E A E | ( E ) | - E |  id

A → + | - | * | / | ^ 演算子文法でない

E → E + E | E - E | E * E | E / E | E ^ E | ( E ) | - E |   id

Page 42: 言語処理系(6)

5.3 演算子順位構文解析

• 順位関係

終端記号間の3種類の関係:≅, , ≲ ≳定め方には2通り

−演算子の結合性と優先度に基づく

−曖昧さのない文法から機械的に

Page 43: 言語処理系(6)

5.3 演算子順位構文解析

• 演算子順位関係の使用

右分形式の把手の左端を≲で,右端を≳で区切る

E + E * E / E + E

≳≲ ≅

把手

Page 44: 言語処理系(6)

5.3 演算子順位構文解析

• 演算子順位関係の使用

0)非終端記号をすべて除去

1)左端から走査して最左の≳を見つける

2)次に左端へ走査して,≲を見つける

 3)≲と≳で囲まれた部分に,間や両端に高々1個の非終端記号を付加して把手を得る

Page 45: 言語処理系(6)

• 結合性と順位からの演算子順位関係

5.3 演算子順位構文解析

1)優先度:≳:≲

2)優先度::::::≲:≲

優先度::::::≳:≳

3)≲  id, id ≳ , ≲ (, ( ≲ , ) ≳ , ≳ ),

$ ≳ , ≳ $とする. ( ≅ ), $ ≲ (, $ ≲ id, ( ≲(, id ≳ $, ) ≳ $, ( ≲ id, id ≳ ), ) ≳ )とする

Page 46: 言語処理系(6)

• 結合性と順位からの演算子順位関係

5.3 演算子順位構文解析

^ 右結合的

* / 左結合的

+ - 左結合的

+ - * / ^ id ( ) $

+ > > < < < < < > >

- > > < < < < < > >

* > > > > < < < > >

/ > > > > < < < > >

^ > > > > < < < > >

id > > > > > > >

( < < < < < < < =

) > > > > > > >

$ < < < < < < <

2 11 2

12

Page 47: 言語処理系(6)

• 単項演算子の扱い

− 2項演算子にないもの:例えば¬に対しては,すべての演算子に対して,≲ ¬とし, ¬の優先順位が:::::::¬ ≳ :::::::¬ ≲ :::: :::::::::::::::::::::::::::::::::::

5.3 演算子順位構文解析

Page 48: 言語処理系(6)

• 演算子順位文法G: 生成規則の右辺が::::::::::ab:::::::::::::::a ≅ b

2)非終端記号A, aA:::::⇒+b:::::::::::a ≲ b

3)非終端記号A, Ab::::⇒+a:::::::::::a ≳ b

5.3 演算子順位構文解析

Page 49: 言語処理系(6)

• 演算子順位文法この規則で生成した順位関係が互いに素である演算子文法

5.3 演算子順位構文解析

Page 50: 言語処理系(6)

• 演算子順位文法

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なる右辺,⇒+ * :+ ≳ *

Page 51: 言語処理系(6)

• 演算子順位文法

5.3 演算子順位構文解析

E → E + T | T

E →   T + F | F

F → ( E )| id

+ * ( ) id $

+ > < < > < >

* > > < > < >

( < < < = <

) > > > >

id > > > >

$ < < < <

Page 52: 言語処理系(6)

• 演算子順位構文解析アルゴリズム

5.3 演算子順位構文解析

LEADING() および TRAILING() については省略

Page 53: 言語処理系(6)

• 演算子順位構文解析アルゴリズム

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

Page 54: 言語処理系(6)

• 演算子順位構文解析アルゴリズム

5.3 演算子順位構文解析

id + id $$

Page 55: 言語処理系(6)

≲≲≳

• 演算子順位構文解析アルゴリズム

5.3 演算子順位構文解析

id + id $$ E

Page 56: 言語処理系(6)

≳≲

• 演算子順位構文解析アルゴリズム

5.3 演算子順位構文解析

E + id $$

Page 57: 言語処理系(6)

≲≳

• 演算子順位構文解析アルゴリズム

5.3 演算子順位構文解析

E $$ + idE

Page 58: 言語処理系(6)

• 順位関数全終端記号間の表を持つのは重い

 順位関数

5.3 演算子順位構文解析