言語プロセッサ ー第7回目ー

38
言言言言言言言 言言 言言言 言言言言言言 言言言言言言言言言言言言言 言言 言言 構構構構 構構構 ()

description

構文解析(続き). 言語プロセッサ ー第7回目ー. 東京工科大学 コンピュータサイエンス学部 亀田 弘之. 今日の内容. 構文解析 LL(1) 文法(復習) First 集合(復習) Follow 集合(復習) 構文解析表による構文解析法 予測的構文解析のモデル 構文解析表の作り方 動作 など. 今日でマスターしてしまおう!. LL ( 1 )文法. 最終確認事項. LL(1) 文法 のイメージ: A → α | β - PowerPoint PPT Presentation

Transcript of 言語プロセッサ ー第7回目ー

Page 1: 言語プロセッサ ー第7回目ー

言語プロセッサー第7回目ー

東京工科大学コンピュータサイエンス学部

亀田 弘之

構文解析(続き)

Page 2: 言語プロセッサ ー第7回目ー

今日の内容

• 構文解析– LL(1) 文法(復習)– First 集合(復習)– Follow 集合(復習)– 構文解析表による構文解析法– 予測的構文解析のモデル– 構文解析表の作り方– 動作 など

2言語プロセッサ 2012 ( 東京工科大学 )

今日でマスターしてしまおう!

Page 3: 言語プロセッサ ー第7回目ー

LL (1)文法

• LL(1)文法のイメージ:A → α | β

という規則で、 α か β のどちらの書き換えを選ぶかを決めるとき、入力の先頭記号1個を見ることにより、バックトラックが起きないような選択が可能な文法。つまり、適応するべき文法規則を、1文字先読みすれば決定できるということ。

最終確認事項最終確認事項

高速処理には大切な性質です。3言語プロセッサ 2012 ( 東京工科大

学 )

Page 4: 言語プロセッサ ー第7回目ー

形式文法(復習 )

文法 G=( N, V, S, P ),

ただし、– N: 非終端記号の集合(構文構造記述用語集)– V: 終端記号の集合(語彙 )– S: 開始記号– P: 書換え規則の集合

確認事項 ( 常識 )確認事項 ( 常識 )

4言語プロセッサ 2012 ( 東京工科大学 )

Page 5: 言語プロセッサ ー第7回目ー

1. 文法における制限• 左再帰性の除去

(左再帰の書き換え規則を変形により削除する。無限ループの回避を目的としている。)

• 括りだし (factoring)

(バックトラックの回避を目的としている。)

2. 構文解析方法• Top down• 再帰呼び出し• 1文字先読み

LL (1)文法の条件 再確認事項再確認事項

5言語プロセッサ 2012 ( 東京工科大学 )

Page 6: 言語プロセッサ ー第7回目ー

1文字先読み十分性の条件は?

• First集合と Follow集合を用いて作成される構文解析表において,表内のどのセルにも動作が多重に定義されていないこと.( 詳細は後述します。 )

6言語プロセッサ 2012 ( 東京工科大学 )

確認事項確認事項

Page 7: 言語プロセッサ ー第7回目ー

First 集合

【定義】First(α)={a | a V=(Vn∈ ∪Vt)*, α=*=>a… }

ただし、 α=*=>ε ならば、 ε First(α)∈

【意味】  文字列 α から導出される文字列の

先頭 ( 最左端 ) に現れる終端記号の集合。

7言語プロセッサ 2012 ( 東京工科大学 )

最終確認事項最終確認事項

Page 8: 言語プロセッサ ー第7回目ー

First 集合【 First 集合を求めるアルゴリズム】 以下を、どの First 集合にも新たに追加す

るものがなくなるまで繰り返す。1. First(ε)={ε}

2. First(aα)={a} if a V∈   ( Vは終端記号の集合)

3. if( First(Y) / ε)∋   Yは空文字列にならない。First(Yα)= First(Y)

elseFirst(Yα)= (First(Y) ー {ε}) First(α)∪

4. if(X→α) First(X)= First(X) First(α)∪ 8言語プロセッサ 2012 ( 東京工科大学 )

最終確認事項最終確認事項

Page 9: 言語プロセッサ ー第7回目ー

Follow 集合

【定義】Follow(X)={a | a V, S=*=>…∈ Xa… }

【意味】X の直後に現れる可能性のある終端記号の集合

9言語プロセッサ 2012 ( 東京工科大学 )

最終確認事項最終確認事項

Page 10: 言語プロセッサ ー第7回目ー

Follow 集合【 Follow 集合を求めるアルゴリズム】 以下を、どの Follow 集合にも新たに追

加するものがなくなるまで繰り返す。

1. Follow(S) に $ を加える。2. 規則 A → αBβ (B N) ∈ に対して、

(ア) First(β) を Follow(B) に加える。 ただし、 ε First(β) ∈ のときは ε は加えない。

(イ) ε First(β)∈ または β=ε ならば、 Follow(A) を Follow(B) に加える。

10言語プロセッサ 2012 ( 東京工科大学 )

最終確認事項最終確認事項

Page 11: 言語プロセッサ ー第7回目ー

First 集合と Follow 集合

【定義】1. First(α)={a | a V, α=*=>a… }∈

ただし、 α=*=>ε ならば、 ε First(α)∈

2. Follow(X)={a | a V, S =*=> …Xa… }∈

11言語プロセッサ 2012 ( 東京工科大学 )

再確認事項再確認事項

Page 12: 言語プロセッサ ー第7回目ー

演習

• 次の文法を考える。E → E + T | T

T → T * F | F

F → ( E ) | id

言語プロセッサ 2012 ( 東京工科大学 )

12

First集合と Follow集合を求めてみよう!First集合と Follow集合を求めてみよう!

Page 13: 言語プロセッサ ー第7回目ー

まず、何をしますか?

1. 左再帰性がないかどうかを確認する。 ・どうやって確認する?

2. 左再帰性があれば、それを除去する。   ・どうやって除去する?

言語プロセッサ 2012 ( 東京工科大学 )

13

Page 14: 言語プロセッサ ー第7回目ー

First 集合と Follow 集合

【例】文法 G=(V,N,E,P)

P={ E→TE’,

E’ →+TE’ | ε

T→FT’

T’ →*FT’ | ε

F→(E) | i }

教科書 p.86 より教科書 p.86 より14言語プロセッサ 2012 ( 東京工科大学 )

確認演習確認演習

Page 15: 言語プロセッサ ー第7回目ー

• First(E) = First(T) = First(F) = { (, i }

• First(E’) = { +, ε}

• First(T’) = { *, ε}

• Follow(E) = Follow(E’) = { ), $}

• Follow(T) = Follow(T’) = { +, ), $}

• Follow(F) = { +, *, ), $}

15言語プロセッサ 2012 ( 東京工科大学 )

確認事項確認事項

Page 16: 言語プロセッサ ー第7回目ー

構文解析表による構文解析法

• 予測的構文解析のモデル• 構文解析表の作り方• 構文解析のアルゴリズム

16言語プロセッサ 2012 ( 東京工科大学 )

Page 17: 言語プロセッサ ー第7回目ー

予測的構文解析のモデル

XYZ$

a + b $

構文解析表

出力

スタック

入力

プログラム

17言語プロセッサ 2012 ( 東京工科大学 )

Page 18: 言語プロセッサ ー第7回目ー

構文解析表の作り方

• 入力: 文法 G

• 出力: 構文解析表 M

• 手順: (次のページ参照)

18言語プロセッサ 2012 ( 東京工科大学 )

Page 19: 言語プロセッサ ー第7回目ー

構文解析表作成手順

1. 文法の各規則 A→α に対して、ステップ2と3を行う。

2. 各終端記号 a First(α)∈ に対して、 M[A, a]に A→α を記入する。

3. ε First(α)∈ ならば、各終端記号 b∈Follow(A)に対して、 M[A, b] に A→α を記入する。 ε First(α)∈ かつ $ Follow(A)∈ ならば、 M[A, $] に A→α を記入する。

4. M の未記入欄に error を記入する。

19言語プロセッサ 2012 ( 東京工科大学 )

Page 20: 言語プロセッサ ー第7回目ー

• 上記のアルゴリズムは任意の文法に対しても適用できるが、文法によっては M の欄に対して複数の規則が書き込まれることがある。【例】

P = {S →i C t S S’ | a, S’→e S | ε,

C→b }

( M[S’, ε] を求めてみよ。 )• LL(1) 文法はこのようなことが起きない文法。

20言語プロセッサ 2012 ( 東京工科大学 )

Page 21: 言語プロセッサ ー第7回目ー

構文解析のアルゴリズム

1. X = a = $ ならば、”構文解析成功” を出力し停止。

2. X = a =!= $ ならば、スタックから X をpop し、入力ポインタを1つ進める。

3. a V∈ ならば、 M[X, a] を調べる。 M[X,a]={X→ABC} ならば、 C,B,Aの順にスタックに push し、 X→ABCを実行する。 M[X,a]=error ならば、停止。

21言語プロセッサ 2012 ( 東京工科大学 )

Page 22: 言語プロセッサ ー第7回目ー

復習(確認)問題

22言語プロセッサ 2012 ( 東京工科大学 )

Page 23: 言語プロセッサ ー第7回目ー

文法

• E → E + T | T

• T → T * F | F

• F → ( E ) | id

左再帰性を除去しなさい.

23言語プロセッサ 2012 ( 東京工科大学 )

Page 24: 言語プロセッサ ー第7回目ー

(直接)左再帰性除去法

1. A に関する左再帰性を取り除くためにまず,A → Aα1 |Aα2| ・・・ |Aαm|β1|β2| ・・・ |βn

のようにまとめる.2. 上記の形を基に以下のように変形する.

A → β1A’|β2A’| ・・・ |βnA’A’ → α1 A’|α2A’| ・・・ |αmA’|ε

参 考

パターンを覚えよ

う!

24言語プロセッサ 2012 ( 東京工科大学 )

Page 25: 言語プロセッサ ー第7回目ー

新たな文法規則

• E → T E’

• E’ → + T E’ | ε

• T → F T’

• T’ → * F T’ | ε

• F → ( E ) | id

25言語プロセッサ 2012 ( 東京工科大学 )

Page 26: 言語プロセッサ ー第7回目ー

First と Follow を求めよ.

• E → T E’

• E’ → + T E’ | ε

• T → F T’

• T’ → * F T’ | ε

• F → ( E ) | id

26言語プロセッサ 2012 ( 東京工科大学 )

Page 27: 言語プロセッサ ー第7回目ー

First  &  Follow

• (もう一度自力でやってみよう)

ここが正念場!

27言語プロセッサ 2012 ( 東京工科大学 )

Page 28: 言語プロセッサ ー第7回目ー

構文解析表を作成する

• (各自で作成できるようになろう!)

28言語プロセッサ 2012 ( 東京工科大学 )

Page 29: 言語プロセッサ ー第7回目ー

構文解析表

id + * ( ) $

E

E’

T

T’

F

29言語プロセッサ 2012 ( 東京工科大学 )

Page 30: 言語プロセッサ ー第7回目ー

構文解析表

id + * ( ) $

E E → T E’ E → T E’

E’ E’ → + T E’ E’ →ε E’ →ε

T T → F T’ T → F T’

T’ T’ →ε T’ → * F T’ T’ →ε T’ →ε

F F → id F → ( E )

30言語プロセッサ 2012 ( 東京工科大学 )

Page 31: 言語プロセッサ ー第7回目ー

動作手順

• 予測的構文解析系は、入力、スタック、構文解析表および出力からなる。

• 入力には構文解析対象の文字列があり、末尾に記号$が添えられている。

• スタックには底を示す記号$が入っている。初期状態では開始記号が入っている。

• 構文解析表は配列 M[A,a] と書け、A は非終端記号、 a は終端記号か$である。

言語プロセッサ 2012 ( 東京工科大学 )

31

Page 32: 言語プロセッサ ー第7回目ー

1. スタックから記号を1つポップする。それを X とする。また現在の入力記号の先頭を a とする。

2. X=a=$ ならば、処理は正常終了。3. X=a≠$ ならば、スタックから X をポッ

プし、入力ポインタを1つ進める。4. X が非終端記号ならば、 M[A,a] を調べる

言語プロセッサ 2012 ( 東京工科大学 )

32

Page 33: 言語プロセッサ ー第7回目ー

5. M[A,a] = { X → UVW } ならば、スタックの X を WVU(U が最上位 ) に書き換える。出力としてこの書き換え規則を印字する。

6. M[A,a]=error ならば回復ルーチンを起動する。

言語プロセッサ 2012 ( 東京工科大学 )

33

Page 34: 言語プロセッサ ー第7回目ー

動作のトレース

• 入力: id + id * id

落ち着いてトレースしよう!

34言語プロセッサ 2012 ( 東京工科大学 )

Page 35: 言語プロセッサ ー第7回目ー

動作のトレース

スタック 入力 出力$E id+id*id$E’T id+id*id E→TE’$E’T’F id+id*id T→FT’$E’T’id id+id*id F→id$E’T’ +id*id$E’ +id*id T’→ε  

(以下省略)

35言語プロセッサ 2012 ( 東京工科大学 )

Page 36: 言語プロセッサ ー第7回目ー

以上で構文解析の話しの概要はほぼ終わりです.

• 引き続き練習を積み重ねてください.– 用語を知ること– 用語の意味を知り,自分で説明できるように.– なぜそのような用語が定義されているのかを考え理

解する.– 左再帰削除ができるように– Factoring ができるように– First 集合や Follow 集合を自分で求められるように– 構文解析表が作れるように– 構文解析処理をトレースできるように

36言語プロセッサ 2012 ( 東京工科大学 )

Page 37: 言語プロセッサ ー第7回目ー

参考情報

1. 構文解析まで終われば、後は少し楽になります。

2. 構文解析は解析の中でも難関部分で、今日でも多くの研究がなされてます。

3. 構文解析の次は意味解析(解析の最終段階)。

4. それ以後は合成の段階になります。5. 来週はここまでの総合演習をやります。

37言語プロセッサ 2012 ( 東京工科大学 )

Page 38: 言語プロセッサ ー第7回目ー

Let’s call it a day!今日はここまで!

寒くなったので健康には十分注意しましょう.

38言語プロセッサ 2012 ( 東京工科大学 )