- 実施日: 2007-06-13(水) 1限
- 内容: LL(1)文法(FOLLOW()関数、判定法)、構文解析プログラム
- 配布資料5.3節、5.4節(5.5節は時間の都合で割愛)
講義で使った例(配布資料を作成した後に考えた例なので、資料には載っていません)を再掲します。
S→aAB, A→b|c|ε, B→dこのような文法に対して、終端記号列adの構文解析を考えてみます。最初の文字aを読んで、SをaABに展開します(Sの子節点にa, A, Bを作成して解析木を成長させる)。次の文字dを読んで、Aを展開しようとしますが、A→b|c|εについて、FIRST(b), FIRST(c), FIRST(ε)のいずれにもdは含まれません。では構文解析は失敗なのか…というと、そうではなく、Aをεに展開し、さらにBをdに展開すると、成功します。この例から分かるように、FIRST()関数だけでは、次に出現し得る終端記号を列挙し切れない場合があるわけです。これがFOLLOW()関数を導入する理由です。
FIRST()関数、FOLLOW()関数、LL(1)文法かどうかの判定は、是非自分で手を動かして計算してみて下さい。
次回から意味解析に入ります。
0 件のコメント:
コメントを投稿