すべてのLR(0)文法はSLR(1)ですが、その逆は必ずしも真である必要はありません。なぜですか?
3356 次
1 に答える
4
基本的に、SLR(1)文法は、対応するLR(0)文法に存在するshift-reduceの競合を解決できます。ウィキペディアのSLRパーサーページの文法例を見てください(これは、より低く、より厳密なレベルで説明されています)。
- S→E
- E→1E
- E→1
LR(0)パーサーがEを解析していて、「1」が次の入力シンボルである場合、Eを認識して縮小するか(ルール3)、次のEを解析するためにシフトすることができます(ルール2)。先を見越すことができないため、LR(0)はどちらを実行するかを決定できません。これは、LR(0)が「1」(文字列の終わりの記号が追加されている)に遭遇したときに処理できる項目を見ると、より明白になります。
- E→1•E$
- E→1•$
1つ目はシフトが必要で、2つ目はリデュースが必要です。
上記の文法を使用すると、SLR(1)文法は、1つの記号を先読みして、実行するアクションを決定できます。Eの後には$のみを続けることができるため、reduceアクションは文字列の最後でのみ有効です。これは2番目の項目に対応し、次の記号が「$」であることがわかります。
LR(0)ではなくSLR(1)である別の文法例については、テキサス大学のCSE5317/4305に関するFegarasのメモを参照してください。
于 2010-11-13T23:33:35.163 に答える