主に学習目的で、適切な再帰パーサーをハードコーディングしていますが、いくつかの問題に遭遇しました。
例として、CSS3 文法からのこの短い抜粋を使用します。
simple_selector = type_selector | universal;
type_selector = [ namespace_prefix ]? element_name;
namespace_prefix = [ IDENT | '*' ]? '|';
element_name = IDENT;
universal = [ namespace_prefix ]? '*';
まず、とnamespace_prefix
の両方のオプション部分であることに気付きませんでした。これは、プロダクションに一致する入力が盲目的に考慮されていたため、入力が与えられたときに常に失敗することにつながりました。type_selector
universal
type_selector
*|*
namespace_prefix
まともな再帰は簡単ですが、プロダクションに落ち着く前に(より適切な言葉がないため)多くの探索的再帰を行う必要があるというのが私の理解です。そこで、ブール値を返すようにプロダクションのシグネチャを変更しました。このようにして、特定のプロダクションが成功したかどうかを簡単に判断できました。
リンクされたリストのデータ構造を使用して任意の先読みをサポートし、このリストを簡単にスライスして生産を試み、生産が成功しない場合は出発点に戻ることができます。ただし、プロダクションを試している間、可変状態を渡し、ドキュメント オブジェクト モデルを構築しようとしています。制作が成功するかどうかはわからないので、うまくいきません。制作がうまくいかない場合は、どうにかして行った変更を元に戻す必要があります。
私の質問はこれです。抽象構文ツリーを中間表現として使用し、そこから移動する必要がありますか? これは、この問題を回避するために一般的に行うことですか? 問題は主にドキュメント オブジェクト モデルが再帰に適したツリー データ構造ではないことにあると思われるためです。