4

C コードを取り、いくつかの関数の上にプラグマを配置できるツールを作成する必要があります。このようなタスクを実行するのに最も簡単なコンパイラ フレームワークはどれですか。また、例を挙げていただければ幸いです。

4

3 に答える 3

2

これを確実に行うには、完全な C フロント エンドと、解析されたコードを変更する機能が必要です。

C フロント エンドを備えたDMS Software Reengineering Toolkitを使用すると、おそらくやりたいことを実行できます。DMS は、手続き型または表面的な構文変換として、解析、AST の構築、およびソース テキストのカスタム変換を実行できます。

マクロとプリプロセッサ ディレクティブにはいくつかの問題があります。これらを解析して保持する場合、多くの場合そうすることができますが、「構造化」されていないディレクティブが拡張されます。保持とは、シンボル テーブルを取得しないことを意味します。すべてのディレクティブを展開すると、解析後に C コンパイラが生成するのと同じ内容のシンボル テーブルを取得できます。

OP の特定のタスクについては、次のようなソースからソースへの変換を書きたいと考えています。

 rule decorate_function_definition_with_pragma(fh:function_head, b: block): declaration -> declaration
       =  " \fh \b " ->
          " \fh 
            #pragma  my_pragma 
            \b "
         if some_condiiton(fh);

ここで、「my_pragma」は基本的に必要なプラグマ テキストに置き換えられます。some_condition は、プラグマを挿入する一致した function_headers をフィルター処理するカスタム述語です。

パターンは構文ツリーと一致するため、sed や正規表現のように一致することはありません。これの秘訣は、パターン変数が C フロント エンドの文法規則を参照していることです。function_head 型のパターン変数は、function_head 文法規則が満たすことができるツリーにのみ一致できます。

遭遇した関数定義ごとに 1 回だけこの変換を実行するには、簡単な制御ロジックが必要です。

于 2012-06-09T18:05:01.543 に答える
0

You can use regular expressions to search for the function definition.

http://en.wikipedia.org/wiki/Regular_expression

于 2012-06-09T13:07:45.937 に答える
0

lex/flex または yacc/bison を見てください。

すばらしい記事: http://www.ibm.com/developerworks/aix/tutorials/au-lexyacc/index.html

于 2012-06-09T12:36:52.887 に答える