解析ツリーを更新するための効率的なアルゴリズム


14

すでに字句解析されたコードの大きなブロックがあるとしましょう。
文字が1つだけ変更されたとします。私は解析を更新したいと思いますが、変更は全体に比べて非常に小さいため、再度全体を解析しないことが可能かどうかを知りたいのですが、再解析する範囲を決定するアルゴリズムがある場合、およびトークン境界の移動に適切に対処するため。

前もって感謝します!


1
こんにちは、ようこそ!私はこのテーマの専門家ではありませんが、あなたが探しているキーワードはインクリメンタル解析またはインクリメンタルコンパイルです。
MS Dousti

@Sadeqポインターに感謝!いくつかの詳細を含む回答を追加することを検討しますか?それは大歓迎です!
アゴス

回答:


9

@Agosリクエストに従って、コメントを回答に変えました。

まず、私はこの分野にあまり精通していないことを認めなければなりません。それでも、2000年以前にインクリメンタルパーシングにどのアルゴリズムが使用されていたのかについては、「フレンドリーパーサーの構築」および「効率的で柔軟なインクリメンタルパーシング」の論文をご覧になることをお勧めします。

最新の治療法については、次の論文をご覧ください。

詳細:解析/コンパイルには(少なくとも)2つのアプローチがあります。

  • バッチコードのブロック全体が解析されたアプローチ、/コンパイル。
  • 増分文書が最初に解析されたアプローチは、/バッチモードでコンパイルし、変更が検出され、最小の再解析/再コンパイルが適用されます。このアプローチは、解析/コンパイルの速度を向上させるだけでなく、遅延コンパイルに関連するバックグラウンドコンパイルなどのIDEの優れた機能にも役立ちます。(IntelliSenseなどの商用機能についても検索でき ます)。

1

インクリメンタルパーサーが各行の終わりに状態を保存する場合、最後の有効なパーサーの状態から再解析し(最良の場合、例えば、完全解析後、これは変更が始まる行の始まりにすぎません)、解析を終了します修正が終了する行

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