1

私はこの文法を持っています

S->S+S|SS|(S)|S*|a

S+S本当に混乱しているので、この文法から左再帰を排除する方法を知りたいです...

4

2 に答える 2

2

与えられた文法を単純化できるかどうか見てみましょう。

S -> S*|S+S|SS|(S)|a

次のように書くことができます。

S -> S*|SQ|SS|B|a
Q -> +S
B -> (S)

これで、おなじみの領域で左再帰を排除できます。

S  ->  BS'|aS'
S' ->  *S'|QS'|SS'|e
Q  ->  +S
B  ->  (S)

e はイプシロン/ラムダであることに注意してください。

左再帰を削除したので、Q と B はもう必要ありません。

S  ->  (S)S'|aS'
S' ->  *S'|+SS'|SS'|e

これは、左再帰の消去を扱うときに便利です

于 2012-12-25T19:46:35.113 に答える