2016-05-30 18 views
2

パーザがASTを構築した後、私が知る限り、この構造は「中間レベル」のIR、例えば3つのアドレスコードなどに変換されます。次に、何らかの分析を完了させるために、このIRを制御フローグラフに変換する。私の質問は、別のIRを経ることなくAST表現からCFGへ行くことが可能で、成功した結果を持つCFGを通したデータフロー解析などを実行できるのであれば、ASTからCFGを構築する

答えて

2

最初にスコープを実行して名前解決を行わずにCFGを構築することはできません。

暗黙的な制御転送の「範囲」を決定するには、if-then-else、try-statement、「break文」を含むブロック、return文などの境界を決定する必要があります。スコープはあなたが既にASTで持っている言語のシンタックス構造に従う傾向があるため、一般的にかなり簡単です。

あなたの言語が名前付きエンティティ( "goto")、 "call"への制御転送を許可している場合、識別子がどこに定義されているかを判断するには、スコープ解決も必要です。どのスコープにgotoが含まれているかを知ることなく、どのスコープがターゲットとなっているのかを知ることはできません。

スコープの解像度では、名前解決を実装できます。これにより、名前を定義するスコープに名前を割り当てたり、名前の定義を付けることができます(たとえば、 "goto x"は特定のスコープ内のxを参照しているので、そのスコープ内でxが定義されている行750あなたは今、名前解決(あなたが「後藤X」に、xの定義を調べることができます)、を持っていたら。

あなたは、制御フローグラフを構築することができます。

あなたは使用して、これらの3つすべてを行うことができますアトリビュート文法は本質的にASTを直接計算しているため、AST以外のものは必要ありません。属性計算の詳細についてはat my SO answer describing themをご覧ください。属性計算y ouはツリー全体を歩き回って同等の結果を計算する多くの再帰的手続きを書くことによっても行うことができます。文法が実際にコンパイルされているのはその性質です。

ここでは、some details on how to extract the control flow graph by attribute computation

ひとつ厄介なグリッチを見つけることができるのような計算をしている "後藤@"(GCCがこれを可能にします)。これを行うにはの場合、ラベル変数のデータフローを計算する必要があります(技術的にはCFGを最初に作成する必要があります:-()。) "goto @"は控えめな答えを作ることでデータフローを回避できます

構造化された制御フローしかない言語では、実際にデータフロー解析を直接実装することができます属性文法によって

+0

まずは、あなたが言ったことを理解していると思いますが、スコープとネームの実装について疑問がありますeの解像度。私はそれを各スコープのデータ構造として考え、その内部にその特定のスコープに属する構造を考えます。私はその特定のスコープを抽出することができます。なぜなら、ASTの構造は答えの中で言うからです。多分私は失われていますか? – helloStack

+1

各スコープは抽象的なものであり、任意のセットのプログラム位置から、そのスコープ内で定義された識別子定義のセットへのマッピングです。多くの言語(多分あなたのものではないかもしれません)では、スコープの "プログラムの場所のセット"は常にASTのサブツリーに対応します。そのような言語ではスコープは字句的にネストする傾向があります。( "namespace"構造を持つ言語は、インスタンスの名前空間に対してこの規則を破ります)。そのような言語では、スコープの特定が容易です。彼らは "パラメータリスト"、 "ブロックボディ"のようなツリーノードに対応しています...私はあなたが失われているとは思わない。 –

+0

私が解析している言語はCです。あなたが言っているルールを尊重すると思います。答えをもう一度ありがとう、私をたくさん助けている。 – helloStack

関連する問題