2016-06-27 28 views
0

現在、I/O用の特定の関数で変数の依存関係を検索するプロジェクトに取り組んでおり、Pycparserで作業することを選択しました。 私のコードは、現在ほとんど1つのvisitor-classといくつかのノードクラスです。 ASTを走査し、各変数の代入、宣言、入力、出力、If文のノードを作成します。Pycparserで変数の依存関係を解析する

a = b + c/2; 

は、名前のノードを作成します「」、および「B」と「C」の最新のノードに接続します。これらのノードは、その依存関係とは、例えば、保存されているリストの属性を持っています。

私の質問はここからです:出力変数をどのように接続するのかに関する一般的な考え方はありますか?

return b; 

このコードでは、「b」という最新のインスタンスとは別の依存関係についての情報は提供していません。しかし、私が思いつくことができるすべての解決策は、 'b'の以前のノードも追加します。例:

b = 3; 
b = b + 4; 

出力依存関係の両方のbノードが必要ではありません。しかし、複数のノードがIf-ステートメントから取られ、各パス内の最新のものだけが取られていれば、私は複数のノードが必要になります。 漠然とした質問がある場合は、推薦できる変数の依存関係を見つける方法や情報源がありますか?要するに、このプロジェクトが達成すべきことは、出力x(複数の出力がある可能性があります)です。どの入力が依存しているかを知りたいと思っています。これは、他の変数に応じて複数のシナリオになります。異なる依存関係の例:

int function(int a, int b, int c, int d, bool z){ 
    int x; 
    if(z){ 
     x = a + b; 
    } 
    else{ 
     x = c + d; 
    } 

    return x; 

答えて

0

私が達成しようとしてきたことは、私が使っている方法では不可能であることが分かりました。 ASTとPycparserが私に与えることができるのは、変数の値を決定するために使用されるすべての変数です。

私の問題を解決するには、CFG(コントロールフローグラフ)とデータフローの作成を検討する必要があります。しかし、これは別の方法と結果です。

関連する問題