文法
EBNF 文法を単純な BNF に拡張し、それb
が端末で<e>
あり、空の文字列であると仮定しましょう。
A -> X
X -> BX
X -> <e>
B -> b
この文法はb
、任意の長さの terminal の文字列を生成します。
LL(1) テーブル
テーブルを作成するには、最初のセットと次のセットを生成する必要があります ( LL(1) 解析テーブルを作成します)。
最初のセット
First(α)
は、文法記号の任意の文字列から派生した文字列を開始する端末のセットですα
。
First(A) : b, <e>
First(X) : b, <e>
First(B) : b
フォローセット
Follow(A)
非終端記号 のすぐ右側に現れる端子 a の集合ですA
。
Follow(A) : $
Follow(X) : $
Follow(B) : b$
テーブル
セットに基づいてテーブルを作成できるようになりました$
。入力マーカーの終了です。
+---+---------+----------+
| | b | $ |
+---+---------+----------+
| A | A -> X | A -> X |
| X | X -> BX | X -> <e> |
| B | B -> b | |
+---+---------+----------+
パーサー アクションは常に、解析スタックの最上位と次の入力シンボルに依存します。
- 解析スタックの上のターミナル:
- 入力記号に一致: スタックをポップし、次の入力記号に進みます
- 一致なし: 解析エラー
- パース スタック上の非ターミナル:
- 解析テーブルにはプロダクションが含まれています: プロダクションをスタックに適用します
- セルが空です: 解析エラー
$
解析スタックの上に:
$
は入力記号です: 入力を受け入れます
$
は入力シンボルではありません: 解析エラー
サンプル解析
入力を分析してみましょうbb
。初期の解析スタックには、開始記号と終了マーカーが含まれていますA $
。
+-------+-------+-----------+
| Stack | Input | Action |
+-------+-------+-----------+
| A $ | bb$ | A -> X |
| X $ | bb$ | X -> BX |
| B X $ | bb$ | B -> b |
| b X $ | bb$ | consume b |
| X $ | b$ | X -> BX |
| B X $ | b$ | B -> b |
| b X $ | b$ | consume b |
| X $ | $ | X -> <e> |
| $ | $ | accept |
+-------+-------+-----------+
結論
ご覧のとおり、フォームのルールはA = B*
問題なく解析できます。結果として得られる入力の具体的な解析ツリーは次のbb
ようになります。
