1

私は C のような言語用のコンパイラを開発している最中で、セマンティック分析とコード生成の段階でいくつかの問題を抱えています。私の質問は次のとおりです。1) if ステートメントの場合、構文は次のとおりです。

if (expression) then
statement1;
statement2;
else
statement3;
end if;

さて、私のターゲット コードでは、go to ステートメントを含む 3 アドレス コードでなければなりません。

look something like:
if (Rx)  // Rx is the register where the expression is evaluated and stored
go to X1 //for if part
X2 // for else part;

さて、私の質問は、「go to」ステートメントのアドレスをどのように生成するのですか?

2) この質問はセマンティック分析に関するものです。単一の関数のシンボル テーブルを作成して使用することができました。関数呼び出し用のシンボル テーブルを作成するために使用すべきアプローチは何ですか? 言い換えれば、異なる語彙レベルに対して?これには、何らかの形で複数のツリーが必要であることを知っています。1 つの関数に対して 1 つのツリー。しかし、プログラムの途中から別のツリーを指すにはどうすればよいのでしょうか?

私は初心者なので、提案や考えがあれば大歓迎です。

4

2 に答える 2

1

コンパイラがコードを生成する方法とタイミングによって異なります。

コンパイラがコードを順番に (コードの最初の行から最後の行まで) 生成する場合、ジャンプ先の場所を記憶し (それらをテーブルに格納し)、パッチを適用するしかありません。すべてが生成された後のコード。

コンパイラがコードをボトムアップ (最も内側のステートメントから最も外側のステートメントへ) に生成し、基盤となるマシン (物理または仮想) が相対ジャンプをサポートしている場合、コードを生成するときに相対ジャンプを単純に生成できます。例えば。

次のコードがあるとします。

if (condition) then
   someexpressionsA
else
   someexpressionsB
endif;

ボトムアップ コンパイルとは、コードが次のように生成されることを意味します。

  • 最初に someexpressionsA のコード
  • 次に someexpressionsB のコード
  • 次に、if-then-else-endif ステートメントのコード

コンパイラーが、codeblockA (B についても同じ) と呼ばれる someexpressionsA のコードを生成したとします。次に、if-then-else-endif ステートメントのコードは次のように記述できます (疑似コード)。

  • 状態を確認
  • 条件が false の場合、sizeof(codeblockA+1) 命令をさらにジャンプします
  • コードブロックA
  • sizeof(codeblockB) をさらにジャンプ
  • コードブロックB

条件に複数の条件 (and、or、...) が含まれていると、ややこしくなるかもしれませんが、上記の例から始めることができます。

于 2011-02-16T11:01:07.147 に答える
0

シンボリック ラベルを解決する「アセンブラー」パスを使用せずに、すぐにコードを生成しますか? この場合、すべてのラベルと分岐命令のテーブルを作成し、すべてのラベルが生成されたらコードをバックパッチする必要があります。

于 2011-02-16T10:41:10.960 に答える