左回帰はパーサーを無限ループにします。それでは、正しい再帰ではなぜ同じことは起こりませんか?なぜ右回帰パーサーが無限ループしないのですか?
0
A
答えて
1
再帰的降下パーサーでは、A -> B C | D
のような文法規則は、現在の位置でBを解析しようとすると、Bが終了した位置でCを解析しようとすると実装されます。いずれかが失敗した場合は、現在の位置でDを解析しようとします。
CがA(右回帰)に等しい場合、それは問題ありません。つまり、Bが成功した場合、Bの後ろの位置でAを解析しようとします。つまり、最初にBを解析し、Aを新しい位置で再試行するか、Dを試してみることを意味します。
しかし、BがA(左回帰)に等しい場合、それは非常に問題です。今、Aを解析するので、まず現在の位置でAを解析しようとします。現在の位置でAを解析しようとします...無限になります。私たちは決してポジションを進めず、A(自分自身を試し続けている)を除いて決して何も試していないので、私たちが終了するかも知れないポイントには決して行きません。
¹フルバックトラッキングを仮定します。それ以外の場合は、BやCがトークンを消費した場合には、Dを試行せずに失敗する可能性があります(先読みしたトークン以上のトークンですが、この話題はありません)。
関連する問題
- 1. なぜwhileループが無限ですか?
- 2. NodeJS - 無限ループが無限にならないのはなぜですか?
- 3. 無限ループ - なぜですか?
- 4. cinストリーム無限ループ、なぜですか?
- 5. なぜ(;;){...}は無限ループですか?
- 6. なぜループが無限ループするのですか?
- 7. JavaScript:Whileループが無限ループするのはなぜですか?
- 8. なぜgetattr()で無限再帰を取得しますが、__dict __ []では無限に再帰しますか?
- 9. なぜsetIntervalが無限ループになるのですか
- 10. なぜこのJava再帰メソッドは無限ループを作成していないのですか?
- 11. コードが無限ループに入る、わからないなぜ
- 12. なぜこれが無限ループにならないのですか?
- 13. なぜこの無限ループが発生するのですか?
- 14. 文字配列 - forループが無限でないのはなぜですか?
- 15. なぜこのJavaScriptは無限にループしていますか?
- 16. なぜ、ループしている間に無限ループするのですか?
- 17. なぜJavaScriptのループが無限大ですか?
- 18. forループが無限に動くのはなぜですか?
- 19. なぜdo-whileループが無限にあるのですか?
- 20. ハッピー/無限ループのネストされたパーサー?
- 21. なぜ無限ループが発生しますか?
- 22. なぜthis forループが無限ですか?
- 23. なぜitertoolsの無限ループから脱出できないのですか?
- 24. Pythonの無限ループに無限回帰を使用するのは罪でしょうか?
- 25. C:トップダウンマージソート - なぜ無限再帰ですか?
- 26. なぜこのコードが無限ループに入りますか?
- 27. Java - 無限再帰的ループ
- 28. 私のプログラムは無限ループするのはなぜですか?
- 29. forループが無限ループに変わるのはなぜですか?
- 30. なぜプログラムは無限ループするのですか?
コードを提供してください –
@EdvinTenovim Shraddhaは、現在のところ、コンパイラの構築教科書/コース/チュートリアル/何でも使っていますが、文法の中で左回帰が無限になると読んだら – sepp2k
@EdvinTenovimこれは、パーサの型に関する理論的な質問です。実際のコードとは関係ありません。 – EJP