0

私は非常に単純な文法を持っています:

E->E+T|T
T->T*F|F
F->(E)|id

そして、unar操作をサポートするように拡張したいと思います(私見、これは正しい文法ですが、文法、パーサー、レクサーなどでは本当のn00bであるため、間違っている可能性があります):

E->E+T|T
T->T*F|F
F->+F|(E)|id

本当の問題は、解析テーブルを更新しようとしているときに発生します。 ここに画像の説明を入力

問題は、単項演算のサポートを提供するためにこのテーブルをどのように編集すればよいか (記述された文法に基づいて) ですか?

PSとにかく、LR(k)(またはLALR)パーサーを使用してJava(または他のオブジェクト指向言語)で算術式を解析するのを手伝ってくれてとても感謝しています^_^

PS2。この場合、パーサージェネレーターは適していません。

4

1 に答える 1

1

解析テーブルを調整する方法を理解するには、各状態の LR 項目セットが何であるかを知り、文法に追加すると項目セットがどのように変化するかを理解する必要があります。状態の項目セットの新しい部分解析項目ごとに、解析テーブルの追加アクション。たとえば、状態 7 では、元のアイテム セット (F -> + Fルールを追加する前) は次のとおりでした。

T -> T * . F
F -> . ( E )
F -> . id

(この場合、先読みは問題にならないので無視していますが、一般的な LR(k) では、それを追跡する必要があります。)

したがって、新しいルールは itemF -> . + Fを追加します。これにより、状態 7 ( の入力でシフト) の新しいアクションが与えられます+。これにより、テーブルにまったく新しい状態が与えられます。

于 2011-11-09T22:39:38.767 に答える