「LL法」の版間の差分
削除された内容 追加された内容
m ロボットによる 変更: ru:LL-анализатор |
m カッコと表組みのスタイルを修正 |
||
1行目:
'''LL法'''または'''LL構文解析器'''とは、[[文脈自由文法]]のサブセットのための[[トップダウン構文解析|トップダウン]][[構文解析器]]の一種である。入力文字列を左
以下では、表を使った構文解析を解説する。他の手法として手でコードを書く[[再帰下降構文解析]]もある(ただし、再帰下降構文解析のコードを自動生成する [[ANTLR]] のようなツールもある)。
40行目:
この文法の構文解析表は次のようになる:
:{|
!
! S
|
|
! F
|
▲| -
|}
91 ⟶ 90行目:
== LL(1)構文解析表の作成 ==
構文解析表を作成するためには、非終端記号 'A' がスタックのトップにあり、記号 'a' が入力バッファの先頭にある場合に適用すべき文法規則を決定しなければならない。''A'' → ''w'' という形式の規則が存在し、''w'' という文字列の先頭に 'a' がありうる場合は簡単である。このため、文字列 ''w'' の先頭になりうる終端記号の集合
# 各 '''Fi'''(''w''<sub>''i''</sub>) と '''Fi'''(''A''<sub>''i''</sub>) を空集合で初期化する。
# 各規則 ''A''<sub>''i''</sub> → ''w''<sub>i</sub> について、''Fi''(''w''<sub>''i''</sub>) を '''Fi'''(''A''<sub>''i''</sub>) に追加する。ここで、''Fi'' は以下のように定義される:
101 ⟶ 100行目:
# ステップ2と3を全 '''Fi''' 集合が変化しなくなるまで繰り返す。
残念なことに、First-set だけでは構文解析表は完成しない。これは、規則の右側の ''w'' が空文字列で書き換えられる可能性があるためである。従って構文解析器はεが'''Fi'''(''w'')に含まれるとき、規則 ''A'' → ''w'' を使い ''A'' の後に続く可能性のある記号を考慮しなければならない。つまり ''A'' に続く記号の集合
# 各 '''Fo'''(''A''<sub>''i''</sub>) を空集合で初期化する。
# ''A''<sub>''j''</sub> → ''wA<sub>i</sub>w' '' という形式の規則がある場合、
#* 終端記号 ''a'' が ''Fi''(''w' ''
#* ε が ''Fi''(''w' '') に含まれるなら、'''Fo'''(''A''<sub>''j''</sub>) を '''Fo'''(''A''<sub>''i''</sub>) に追加する。
# ステップ2を全ての '''Fo''' 集合が変化しなくなるまで繰り返す。
|