抽象構文ツリーを指数関数未満の時間で解析できませんか?


7

問題の抽象的な説明

私の見たところ、解析解除とは、ASTからトークンストリームを作成することを意味し、再度解析すると、等しいASTが生成される、つまりparse(unparse(AST)) = AST保持されるはずです。

これは、同じASTを生成する有効な解析ツリーを見つけることと同じです。

言語は、eBNFバリアントを使用した、コンテキストフリーのS属性の文法で記述されます。

したがって、アンパーサーは、すべての文法制約が保持されている通過ノードを通過する有効な「パス」を見つける必要があります。これは基本的に、文法生成規則へのASTノードの有効な割り当てを見つけることを意味します。これは一般に制約充足問題(CSP)であり、バックトラックすることにより、解析と同様に解決できます。Oe

幸いなことに、構文解析では、GLRを使用してでこれを行うことができます(またはより適切に文法を制限します)。AST構造は文法生成規則構造に非常に近いので、実行時間が解析よりも悪い実装を見て本当に驚きました。XTextは解析にANTLRを使用し、解析解除にバックトラックを使用しています。O

ご質問

  1. コンテキストフリーのS属性文法は、パーサーとアンパーサーが共有する必要があるすべてのものですか、それとも、たとえば、解析手法/パーサーの実装に制約がありますか?
  2. この問題は一般的にではないと感じています-天才がこれを手伝ってくれるでしょうか?Oe

StackOverflowでこの質問に対する回答を受け取りませんでした。ここで質問することを提案されましたが、私は冗長性が嫌いなので、ここで回答するように頼むことを許してくれるといいのですが。


2
ようこそ!あなたの質問をここに持ってきてくれてうれしいです。適切なプロセスは、ここで移行のための他の質問にフラグを立てることです。後でマージすることができます。Stack Overflowをサーフィンしているときでも、アカウントを関連付けて、ここで投稿を追跡できます。
ラファエル

回答:


3

解析が簡単で線形時間で実行できるバージョンの質問があります。ただし、あなたの質問がこの特定のバージョンの解析解除に関連するものかどうかは完全にはわからないので、最初にそれを見ていきます。

StackOverflowでの質問で、ASTは「AnyObject-> AnyObject-> Vehicle [name = "Car"]」のようになっていると言いました。ASTが「Area-> Highway-> Car」のようになっている場合、つまり、ASTが構築/解析されたときにどのプロダクションが取得されたかがわかると、質問ははるかに簡単になります。通常のコンテキストフリーパーサーでは、(ほとんど)常にこの情報を取得します。破棄することもできますが、(ほぼ)すべての解析ア​​ルゴリズムがこの情報を提供します。

この情報を持っていない場合、S式について何かを知らない限り、指数時間はあなたができる最善の方法だと確信しています。次に問題は、単に「エリア->ハイウェイ->車」のASTを回復することです。その後の解析は簡単です。

この情報があれば、コンテキストフリーの文法を調べて、構文解析を解くことができます。この文法を考えてみましょう:

1: Sa
2: SaSa

この文法のASTは次のようになります SaSaa、入力「aaa」で。このASTの解析は簡単です。ツリーのポストオーダーウォークを実行し、このウォークで見つかったすべてのターミナルを出力します。結果は再び「aaa」になります。

あいまいな文脈自由文法を見ると、状況は少し複雑になります。一方で、物事はまだ簡単です。入力の解析ツリーを選択して上記を実行するだけです。結果から他のすべての解析ツリーを再構築できます。

ただし、明確化ルールがある場合は、何か賢いことをする必要があります。特に、入力「(1 + 2)* 3」は、「1 + 2 * 3」として解析されない可能性があり、オリジナルとは異なります。線形時間でこれを行うことが可能ですLR1 文法(Yaccのように優先順位と結合規則が適用される場合) LR非解析時に解析します。これはあなたの質問の一部ではなかったので、詳細はスキップしますが、それは可能です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.