Cソースコードにいくつかの変換を実行したいと思います。Linuxで、ソースコードから完全なASTを生成するツールが必要です。これにより、このASTに変換を適用して、Cソースコードに変換し直すことができます。ELSAを試しましたが、コンパイルされません。(私はUbuntu 8.4を使用しています)。誰かがより良いツール/アプリケーションを提案できますか?
11 に答える
clangをお勧めします。ほとんどの gcc 拡張機能を備えたかなり完全な C 実装があり、コードは非常に理解しやすいものです。彼らの C++ 実装は不完全ですが、C コードから AST を生成することのみを考えているのであれば、問題ありません。やりたいことに応じて、clang をライブラリとして使用して AST を直接操作するか、clang をコンソールにダンプさせることができます。
C 用の純粋な Python AST ジェネレーターであるpycparserを参照してください。
AST XML 出力を取得するには、 MarpaX::Languages::C::ASTからcscanを使用してみてください。出力は次のようになります。
xml
<cscan>
<typedef_hash>
<typedef id="GLenum" before="unsigned int" after="" file="/usr/include/GL/gl.h"/>
...
www.antlr.org
当社のDMS ソフトウェア リエンジニアリング ツールキットは、巨大な C システムで使用され、C コードの解析、分析、変換、および再生成を行ってきました。Windows 上で実行され、Wine の下の Linux でも実行されますが、Linux スタイル (GCC) の C コードを処理します。
C ソース コードを往復する機能、つまり、構文解析、ツリーの構築、変換、コンパイル可能な C コードの再生成を強調してもしきれません。コメントとプリティプリントまたは元のプログラマーのインデントを使用します。ここでの他の回答のほとんどは、それを確実に実行できるシステムを示唆しています。
DMS がプログラム変換を実行するように設計されているという事実 (ここでの回答で提案されている他のシステムとは対照的に) も大きな利点です。DMS は、ツリー パターンの一致と書き換えを提供します。これは、一致させたい条件を拡張するために使用される完全な制御とデータ フロー分析でこれを強化します。コンパイラであることを意図したツールはまさにそれであり、OPが要求したように、コンパイラではなく、代わりに変換エンジンであることを説得するのは非常に困難です。
DMS によって生成される AST の例については、 https: //stackoverflow.com/a/2173477/120163を参照してください。
私は、ソースからソースへの変換に関して少量の作業を行ってきましたが、CILがこの作業に非常に強力であることがわかりました。CIL には、静的ソースの分析と変換専用に設計されたフレームワークであるという利点があります。また、醜い GCC 固有の拡張機能をいくらでも使用してコードを処理することもできます (一例として、Linux カーネルを処理するために使用されています)。これは、使用したことがない場合に問題になる可能性があります。
あるいは、clangは比較的簡単にハッキングできるコードベースを持っていると考えられており、C AST を生成するために確実に使用できます。
「ELSA を試しましたが、コンパイルされません。(Ubuntu 8.4 を使用しています)」
scottmcpeak.com/elkhound/ の Elkhound と Elsa のソース コード、バージョン 2005.08.22b は古くなっています (古い C++ スタイルの .h ヘッダー ファイル)。
Elsa は動作しており、Oink の一部です: http://www.cubewano.org/oink/#Gettingthecode Ubuntu 9.10 で動作するようになりました。
gccを取得して、そのカスタムバックエンドを作成するのはどうですか?私はそれをやったことも、gccソースコードに取り組んだこともないので、それがどれほど難しいかはわかりません。