12

私は現在コンパイラについて勉強しています.LR(0)で理解しているように、「シフト/リデュース」または「リデュース/リデュース」の競合が発生する場合がありますが、「シフト/シフト」の競合は不可能です! 「シフト/シフト」競合が発生しないのはなぜですか?

4

1 に答える 1

24

Shift/Reduce の競合は、パーサーがシフト (次の入力トークンを解析スタックの上にプッシュする) か、削減 (一連の端末と非端末を解析スタックからポップする) かを判断できない場合に発生します。削減/削減の競合は、パーサーが削減を認識しているが、どの削減を実行するかを判断できない場合です。

シフト/シフトの競合が発生した場合、パーサーは次のトークンを解析スタックにプッシュする必要があることを認識しますが、その方法を認識しません。トークンを解析スタックにプッシュする方法は 1 つしかないため、通常、この形式の競合は発生しません。

そうは言っても、同じ終端記号でラベル付けされた特定の解析状態から 2 つ以上の遷移が発生するという奇妙な設定がある場合、理論的にはシフト/シフトの競合が存在する可能性があります。その場合の競合は、シフトしてある状態に移動するか、シフトして別の状態に移動するかです。これは、オートマトンをより少ない状態に圧縮しようとして誤って実行した場合、または非決定論的な解析オートマトンを構築しようとした場合に発生する可能性があります。実際には、これは決して起こりません。

お役に立てれば!

于 2012-12-08T18:52:30.187 に答える