2010-12-19 24 views
6

私は、JavaCCで既に生成されたAbstract-Syntax-Treeからコントロールフローグラフを構築するためにLEParserCfgVisitorクラスを実装する方法を理解しようとしています。 。私は既に存在するツールがあることを知っていますが、私はコンパイラの最終版の準備にそれをしようとしています。Javaを使用して訪問者パターンを持つASTからコントロールフローグラフを作成

私は、グラフをメモリに保持するデータ構造を持つ必要があることを知っています。そして、各ノードのIN、OUT、GEN、KILLなどの属性を制御フローを実行できるように保持したい後で分析する。

私の主な問題は、ブロック、ループ、等々の性質に応じて、それぞれのブロック間に右端を持つように、異なるブロックをどのように接続するかを考えていないということです。私は訪問者を構築するのに役立つ明示的なアルゴリズムを見つけました。

ここは私の空の訪問者です。

public class LEParserCfgVisitor implements LEParserVisitor 
{ 
    public Object visit(SimpleNode node, Object data) { return data; } 

    public Object visit(ASTProgram node, Object data) { 
    data = node.childrenAccept(this, data); 
    return data; 
    } 

    public Object visit(ASTBlock node, Object data) { 
    } 

    public Object visit(ASTStmt node, Object data) { 
    } 

    public Object visit(ASTAssignStmt node, Object data) { 
    } 

    public Object visit(ASTIOStmt node, Object data) { 
    } 

    public Object visit(ASTIfStmt node, Object data) { 
    } 

    public Object visit(ASTWhileStmt node, Object data) { 
    } 

    public Object visit(ASTExpr node, Object data) { 
    } 

    public Object visit(ASTAddExpr node, Object data) { 
    } 

    public Object visit(ASTFactExpr node, Object data) { 
    } 

    public Object visit(ASTMultExpr node, Object data) { 
    } 

    public Object visit(ASTPowerExpr node, Object data) { 
    } 

    public Object visit(ASTUnaryExpr node, Object data) { 
    } 

    public Object visit(ASTBasicExpr node, Object data) { 
    } 

    public Object visit(ASTFctExpr node, Object data) { 
    } 

    public Object visit(ASTRealValue node, Object data) { 
    } 

    public Object visit(ASTIntValue node, Object data) { 
    } 

    public Object visit(ASTIdentifier node, Object data) { 
    } 
} 

は誰もが私に手を与えることができます(^ - 、...、X +、)あなたはそれをしながら、基本的な操作、場合のように、基本的な関連リンク言語表現に取り組んで見ることができますか?

ありがとうございます!

答えて

11

データフロー(gen/kill/use/def)について推論するには、まず制御フローグラフが必要です。

各ツリーノード(各特定のノードビジター内など)でノードを作成するには、そのノードが表すグラフを作成します。そのグラフのエントリーポイントの円弧と出口円弧を親の「ビジター」に渡します。あなたが親に情報を渡す必要があるため、純粋に独立したvistorは動作しません。 [訪問者によって設定され、親によって検査される各ノードに入口/出口アークスロットを追加することができる]

一部のノード(例えば、「assignststmt」)は、ASTを参照するアクションノードを作成する割り当て(フローチャートでは「矩形」と考える)。気にする部分グラフアークはありません。いくつかのノード(例えば、ifの場合)は、条件分岐ノード(条件式のASTノードを参照する)を作成し(フローチャートでは「diamond」と考える)、フロー結合ノードを作成し、その条件分岐ノードと、thenおよびelse節(エントリと終了アークだけで表される)のサブグラフと、フロー結合ノードを組み合わせることによって、サブグラフを作成します。次に、この複合サブグラフへの入口と出口のアークを親に渡します。

このスキームは、構造化された制御フローで機能します。構造化されていない制御フロー(例えば、 "GOTO x")では、グラフの構造化部分を最初に構築し、生成された制御フローをラベルに関連付け、GOTOアクションをパッチングして関連付けられたラベル。

例外を気にすることを忘れないでください。それらもGOTOであるが、一般に、構造化された制御フローグラフの一段高い点にある。これらはしばしば、最も内側の例外ハンドラノードをツリーのに渡すことによって処理されます。今あなたの訪問者はを見ることが必要ツリーは、最新の例外ハンドラを見てください。

生成されたvistorsを使用するより洗練されたスキームは、http://en.wikipedia.org/wiki/Attribute_grammar">属性文法と呼ばれ、基本的にすべての情報フローを管理します。この場合は、エントリ/出口/例外フローアーク)をパラメータと結果としてツリー内で上下に移動します。これを行うには属性文法ツールが必要ですが、依然としてノード構築ロジックを指定する必要があります。我々は属性文法と本質的には上記の制御フローグラフ構築をDMS Software Reengineering Toolkitを用いて多くの言語のための汎用制御フロー解析機能を提供しています。

コントロールフローグラフを作成したら、コントロールフローグラフを歩いて説明したタイプのデータフローソルバーを実装できます。 CFノードが指し示すASTを再訪問して、未使用/未使用のdef情報を収集する必要があります。

構造化制御フローの場合、ASTノードを使用して制御フローノードを表し、データフローを直接計算することができます。

一般的なプロセスの詳細はhereです。

関連する問題