7

コードの分析と操作を行う趣味のプロジェクトのアイデアがあります。このプロジェクトでは、特定のソース ファイルの具体的な構文ツリーと抽象的な構文ツリーの両方が必要になります。さらに、2 つのツリー間の双方向参照が役立ちます。文法を書き写して独自のレクサーとパーサーを構築する作業は避けたいと思います。

具体的または抽象的な構文ツリーを記述するための標準形式はありますか? 広く使用されているツール チェーンは、これらの形式への出力をサポートしていますか?

特定のターゲット プログラミング言語を念頭に置いているわけではありません。プロトタイプには一般的なものを使用できますが、Python、C#、Javascript、または C/C++ など、私がよく知っているものを使用したいと思います。

ツールまたはライブラリを介してソース ファイルを実行し、両方のツリーを取得する機能が必要です。理想的な世界では、このツールをユーザーが編集しているコードで実行し、エラーを許容することが実用的です。繰り返しますが、私は単にプロトタイプを開発しようとしているだけなので、これらの要件はかなり緩いです。

ありがとう!

4

3 に答える 3

4

研究コミュニティは、あるプログラム分析ツールから別のプログラム分析ツールに情報を移動する際に、グラフ交換が正しいことであると判断しました。http://www.gupro.de/GXLを参照

最近では、OMG が抽象構文ツリーを交換するための標準を定義しました。http://www.omg.org/spec/ASTM/1.0/Beta1/を参照

この問題は何度も何度も解決されているようです。何年にもわたって作成された 6 つの「ツール バス」の提案があり、そのすべてがこの問題を解決しましたが、業界を追い越した人はいません。問題は、a) あらゆる種類のネスト可能な表記 [LISP のような括弧、XML のような...] を使用して AST を表現するのは簡単であるため、人々は独自のソリューションを簡単に展開できること、および b) あるツールが AST を別のツールと交換することです。 、両者はASTノードが何を意味するかについて本質的に同意する必要があります。しかし、ほとんどの AST は、各ツールで使用される特定の文法/解析テクノロジから偶然に派生したものであり、ほとんどの場合、ツール間で意見の相違があります。そのため、AST を意味のある形で交換するツールはほとんど見たことがありません。

あなたが趣味のことをしているなら、私は Lisp のようなツリーのエンコーディングに固執します。各ノードは次の形式です: ( ... ) 生成が簡単で、読みやすい。

私は、プログラムを操作するための専門的なツールに取り組んでいます。AST を出力した場合は、上記を実行します。ほとんどの場合、個々の AST は実際に見るには複雑すぎるため、AST 全体を出力することはほとんどなく、せいぜいノードと数個の子の深さだけです。私たちのツールはASTを誰とも交換しません(上記の理由を参照してください:)が、メモリ内にASTをうまく構築し、分析または変換の理由で気まぐれなことを行い、それを削除するだけです(どこにも送信する必要はありません)または、ツリーから元の言語テキストを再生成します。[後者は、解析防止または「プリティプリンティング」技術が必要であることを意味します]

于 2009-06-21T09:37:16.767 に答える
3

私たちのプロジェクトでは、UML で AST メタモデルを定義し、ANTLR (Java) を使用してモデルを作成しました。また、解析後に ANTLR からのトークン情報を維持しますが、モデルに加えられた変更で基礎となるテキスト ファイルを更新することはまだ試みていません。

これには恐ろしいオーバーヘッドがあります (Eclipse UML2/EMF などのインフラストラクチャで) が、私たちの目標はとにかくモデルベース/駆動型開発 (MDD、MDA) に高レベルのツールを使用することなので、各レベルで使用することにしました。 .

私たちの学生の 1 人がかつてOpenArchitectureWareで遊んで、Eclipse ベースの生成されたエディターから変更を構文ツリー (上記の UML モデルとは関係ありません) に自動的に戻すことができたと思いますが、これについての詳細はわかりません。

ANTLR のツリー文法も参照してください。

于 2009-02-17T09:49:58.447 に答える
1

特定の標準が期待されますが、より汎用的な標準も適切な場合があります。Ira Baxter はすでにGXLについて言及しており、RDFも追加される可能性がありますが、それには適切なオントロジーが必要であり、構文よりもセマンティックを重視しています。まだ調査するオプションがあるかもしれません。

特定の標準については、Ira Baxter がすでにASTMについて言及しています。もう 1 つの標準は、特定の種類のプログラミング言語 (論理言語) を対象としていますが、 ISO-IEC 24707 2007として知られるセマンティック/コンセプチュアル グラフの標準です

それ自体は標準ではありませんが、それに関する論文: Towards Portable Source Code Representations Using XML .

私は効果的に使用されている基準を知りません (この分野では、常にどこでも自家製の料理です)、私はこのトピックにも興味があります.

于 2014-07-16T20:31:30.223 に答える