私は再帰的な適切な解析について学んでおり、アルゴリズムが機能していないと思われるいくつかのシナリオを考え出しています。それらの 1 つは、この単純な文法を考慮すると、次のようになります。
S→E;
E → イド | id + id
次に、文字列id + id;
はこの文法の言語で有効です。しかし、再帰的降下アルゴリズムを実行すると、 から まで降下しS
、E
最初id
に一致する端子である まで降下します。これで入力は になり、一致を試みること+
に戻りましたが、失敗しました。しかし、 のレベルで選択できるルールは他にありません。S
;
S
id;
言語にはとの 2 つの文字列しかなくid + id;
、それぞれに一意の構文木があるため、文法は曖昧ではないと思います。ここでの一般的な問題は、非終端記号が同じプレフィックスを持つプロダクションを持ち、再帰のより深いレベルで一致する選択をする可能性がありますが、より浅いレベルでは無効な入力を作成することです。
左再帰のような再帰的降下の典型的な問題について読んだことがありますが、上記の問題はどこにも見つかりませんでした。これは本当に問題なのですか、それとも何か不足していますか?
Parsing Techniques: A Practical Guide p.182-188
上記のアプローチを単純な再帰的まともなものとして分類し、同じ問題を強調する本から信頼できる回答を見つけました。先読みなしの一般的なケースで常に機能する 2 つの解決策があります (一般に、必要な先読みの長さはプレフィックスの長さとともに増加するため): 継続の使用を必要とする完全な再帰的降下と、幅優先の再帰的降下です。