言語プロセッサ ー第9回目ー 構文解析(続き)
今日の内容 構文解析 LL(1)文法(復習) First集合(復習) Follow集合(今日のポイントの1つ) 構文解析表による構文解析法 予測的構文解析のモデル 構文解析表の作り方 動作 など
LL(1)文法 LL(1)文法のイメージ: A → α|β 確認事項 LL(1)文法のイメージ: A → α|β という規則で、αかβのどちらの書換えを選ぶかを決めるとき、入力の先頭記号1個を見ることにより、バックトラックが起きないような選択が可能な文法。 つまり、適応するべき文法規則を、1文字先読みすれば決定できるということ。
形式文法(復習) 文法 G=( V, N, P, S ), ただし、 V: 終端記号の集合(語彙) 確認事項 文法 G=( V, N, P, S ), ただし、 V: 終端記号の集合(語彙) N: 非終端記号の集合(構文構造記述用語集) P: 書換え規則の集合 S: 開始記号
LL(1)文法の条件 文法への制限 構文解析方法 左再帰性の除去 括りだし(factoring) Top down 再帰呼び出し 確認事項 文法への制限 左再帰性の除去 括りだし(factoring) 構文解析方法 Top down 再帰呼び出し 1文字先読み
文字先読み十分性の条件は? First集合とFollow集合を用いて作成される 構文解析表において,表内のどのセルにも動作が多重に定義されていないこと.
First集合 【定義】 First(α)={a | a ∈ V, α=*=>a… }
First集合 【First集合を求めるアルゴリズム】 以下を、どのFirst集合にも新たに追加するものがなくなるまで繰り返す。 First(aα)={a} if a∈V (Vは終端記号の集合) if( First(Y) /∋ ε) Yは空文字列にならない。 First(Yα)= First(Y) else First(Yα)= (First(Y) ー {ε})∪ First(α) 4. if(X→α) First(X)= First(X) ∪First(α)
Follow集合 【定義】 Follow(X)={a | a ∈ V, S=*=>…Xa… }
Follow集合 【Follow集合を求めるアルゴリズム】 以下を、どのFollow集合にも新たに追加するものがなくなるまで繰り返す。 Follow(S)に$を加える。 規則 A → αBβ (B∈N) に対して、 (ア)First(β)をFollow(B)に加える。 ただし、ε∈First(β) のときはεは加えない。 (イ)ε∈First(β)またはβ=εならば、 Follow(A)をFollow(B)に加える。
First集合とFollow集合 【定義】 1. First(α)={a | a ∈ V, α=*=>a… } 2. Follow(X)={a | a ∈V, S =*=> …Xa… }
First集合とFollow集合 【例】 文法G=(V,N,E,P) P={ E→TE’, E’ →+TE’ | ε T→FT’ F→(E) | i } 教科書p.86より
First(E) = First(T) = First(F) = { (, i } Follow(E) = Follow(E’) = { ), $} Follow(T) = Follow(T’) = { +, ), $} Follow(F) = { +, *, ), $}
構文解析表による構文解析法 予測的構文解析のモデル 構文解析表の作り方 構文解析のアルゴリズム
予測的構文解析のモデル 入力 a + b $ X Y Z $ プログラム 出力 構文解析表 スタック
構文解析表の作り方 入力: 文法G 出力: 構文解析表M 手順: (次のページ参照)
構文解析表作成手順 文法の各規則A→αに対して、ステップ2と3を行う。 各終端記号a∈First(α)に対して、M[A, a]にA→αを記入する。 ε∈First(α)ならば、各終端記号∈Follow(A)に対して、M[A, b]にA→αを記入する。 ε∈First(α)かつ$∈Follow(A)ならば、 M[A, $]にA→αを記入する。 Mの未記入欄にerrorを記入する。
上記のアルゴリズムは任意の文法に対しても適用できるが、文法によってはMの欄に対して複数の規則が書き込まれることがある。 【例】 P = {S →i C t S S’ | a, S’→e S | ε, C→b } ( M[S’, ε] を求めてみよ。) LL(1)文法はこのようなことが起きない文法。
構文解析のアルゴリズム X = a = $ ならば、”構文解析成功” を出力し停止。 X = a =!= $ ならば、スタックからXをpopし、入力ポインタを1つ進める。 a∈Vならば、M[X, a]を調べる。M[X,a]={X→ABC}ならば、C,B,Aの順にスタックにpushし、 X→ABCを実行する。M[X,a]=errorならば、停止。
復習問題
文法 E → E + T | T T → T * F | F F → ( E ) | id 左再帰性を除去しなさい.
(直接)左再帰性除去法 参 考 Aに関する左再帰性を取り除くためにまず, A → Aα1 |Aα2|・・・|Aαm|β1|β2|・・・|βn のようにまとめる. 上記の形を基に以下のように変形する. A → β1A’|β2A’|・・・|βnA’ A’ → α1 A’|α2A’|・・・|αmA’|ε パターンを覚えよう!
新たな文法規則 E → T E’ E’ → + T E’ | ε T → F T’ T’ → * F T’ | ε F → ( E ) | id
FirstとFollowを求めよ. E → T E’ E’ → + T E’ | ε T → F T’ T’ → * F T’ | ε F → ( E ) | id
First & Follow (各自でやってみよう) ここが 正念場!
構文解析表を作成する (各自で作成してみよう)
構文解析表 id + * ( ) ε E E → T E’ E → T E’ E’ E’ → + T E’ E’ →ε T T → F T’ F → id F → ( E )
動作のトレース 入力: id + id * id 落ち着いてトレースしよう!
動作のトレース スタック 入力 出力 $E id+id*id $E’T id+id*id E→TE’ スタック 入力 出力 $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’→ε (以下省略)
以上で構文解析の話は ほぼ終わりです. 引き続き練習を積み重ねてください. 用語を知ること 用語の意味を知り,自分で説明できるように. なぜそのような用語が定義されているのかを考え理解する. 左再帰削除ができるように Factoringができるように Firstやfollowを自分で求められるように 構文解析表が作れるように 構文解析処理をトレースできるように
参考情報 構文解析まで終われば、後は少し楽になります。 構文解析は解析の中でも難関部分で、 今日でも多くの研究がなされてます。 構文解析の次は意味解析(解析の最終段階)。 それ以後は合成の段階になります。
Let’s call it a day! 今日はここまで! インフルエンザやノロウィルスには十分注意しましょう.