0

レクサー、構文チェッカー、およびセマンティクスを取得できたので、中間コードの生成に移りたいと思います。問題は、論理式の処理方法がわからないことです。E.true と E.false について読んだことがあります。この例はどこにでもありますが、私はそれを理解していませんでした。

たとえば、次のコードがある場合

if x>y and x<y or x == 1 then
    //super duper code here
    x = x+1    
else
    //super duper wow code here
    y = y+1
endif

結果はこのようなものでなければなりません

1: > x y 3
2: jmp _ _ 9
3: < x y 7
4: jmp _ _ 5
5: == x 1 _
6: jmp _ _ 9
7: + 1 x $1
8: = $1 _ x
9: + 1 y $2
10: = $2 _ y

ただし、実際に if ステートメントの解析を完了するまで、ジャンプのラベルはわかりません。

そのため、クワッドを生成してからバックパッチする必要があります。この投稿の文法でどうすればできますか?

私は本当に混乱しているので、誰かがそれがどうなるか説明できますか.

4

1 に答える 1

1

はい、シンボル/ラベルであるブランチ ターゲットを生成する必要があります。中間言語 (IL) がこれをサポートしている場合は、数値命令の場所を使用しないでください。(数値の中間命令の場所は、最終的なコード生成には役立ちません...最終的な命令のアドレス/オフセットに単純にマップされないためです。)

もう 1 つのヒントは、多くの構造が順次実行を伴い、それにはほとんどのタイプの単純な式が含まれていることです。したがって、IL がこれをサポートしていれば、物事は単純化されます。つまり、ターゲット ラベルがないということは、次の命令に進むことを意味します。これにより、IL シーケンスのコード生成が簡素化されます。

于 2011-12-22T00:43:38.517 に答える