私は単純な (C に似た) 言語用のコンパイラのコード生成セクションを書いている最中です。「if」ステートメントに問題があります。GCC が行うように、条件の各部分に対応するジャンプ命令を生成したいと思います。ブール式の構造を保持する構造は、抽象構文ツリーです。
ここまでで、比較と論理および論理否定に対応するラベルを生成する関数を作成しました。ただし、この関数を論理的にも機能させようとすると、大きな問題が発生します。
次のような簡単なステートメントの場合
if (25 < 19) then
print 99
statements
コードを次のようにしたいと思います。
cmp 25, 19
jge label0
label1:
print 99
label0:
statements
(そして、私の関数はこの単純な例に似たものを表示します)。
否定を処理するときは、これらの条件のテストを否定するだけです (上記の jge を jl に変換します)。論理積の場合は、単純な方法で、左右の結合に対応するコードを順番に生成するだけです。しかし、OR に関しては、多くの困難な問題に直面しています。if (または次の else 分岐) if the condition failsの後のステートメントにジャンプする代わりに、他のすべてのケースと同様に、OR のオペランドのいずれかが保持されている場合は、コードが存在する実際の場所にジャンプする必要があります。次に、2 つの OR がある場合、AST はバイナリ ノードと関数 who を使用して OR を表すため、状況はさらに悪化します。翻訳しようとする選択した中間表現は、この AST を使用します。
誰でもこの問題について助けてもらえますか? 「Engineering a Compiler」にも相談してみましたが、そこから役立つものを見つけることができませんでした。