問題の抽象的な説明
私の見たところ、解析解除とは、ASTからトークンストリームを作成することを意味し、再度解析すると、等しいASTが生成される、つまりparse(unparse(AST)) = AST
保持されるはずです。
これは、同じASTを生成する有効な解析ツリーを見つけることと同じです。
言語は、eBNFバリアントを使用した、コンテキストフリーのS属性の文法で記述されます。
したがって、アンパーサーは、すべての文法制約が保持されている通過ノードを通過する有効な「パス」を見つける必要があります。これは基本的に、文法生成規則へのASTノードの有効な割り当てを見つけることを意味します。これは一般に制約充足問題(CSP)であり、バックトラックすることにより、解析と同様に解決できます。
幸いなことに、構文解析では、GLRを使用してでこれを行うことができます(またはより適切に文法を制限します)。AST構造は文法生成規則構造に非常に近いので、実行時間が解析よりも悪い実装を見て本当に驚きました。XTextは解析にANTLRを使用し、解析解除にバックトラックを使用しています。
ご質問
- コンテキストフリーのS属性文法は、パーサーとアンパーサーが共有する必要があるすべてのものですか、それとも、たとえば、解析手法/パーサーの実装に制約がありますか?
- この問題は一般的にではないと感じています-天才がこれを手伝ってくれるでしょうか?
StackOverflowでこの質問に対する回答を受け取りませんでした。ここで質問することを提案されましたが、私は冗長性が嫌いなので、ここで回答するように頼むことを許してくれるといいのですが。