1

ハロー、

Lex/Yacc プログラミングのヘルプが必要です。多くのステートメントの入力に対する構文解析用のコンパイラを作成しました。今、私は特別な問題を抱えています。

入力の場合、コンパイラは正しい出力を提供します。どのステートメントが使用されているか、定数演算子または jmp インストラクターがどのラベルに使用されているか、今度はそう書く必要があります。if ステートメントが来たら、最初のコマンド (else の前) if の割り当てが yes の場合は、最後までジャンプする必要があります。else の後のコマンドは必要ないため、この jmp の後に 2 番目のコマンドを発行する必要があります。例で示しますが、私の言いたいことがわかるかもしれません。

入力アドレス 出力

if(x==0)        10   if(x==0)
Wait 5          20   WAIT 5
else            30   JMP 50
Wait 1          40   WAIT 1
end             50   END

そのようです。私にはアイデアがあります。おそらく、次のような特別なifステートメントでそれを行うことができます

IF exp jmp_stmt_end stmt_seq END

入力に ​​if ステートメントが指定されている場合、コンパイラーはステートメントの終わりを認識し、私のコンパイラーの jmp_stmt のように ( http://bitbucket.org/matrix/changed-tinyからファイルをダウンロードする必要があります)、ジャンプするだけである必要があります。最後まで。私の問題を理解していただければ幸いです。ありがとうございます。

4

1 に答える 1

3

これを 2 段階の出力で行います。最初のパスでは、ジャンプ ターゲットがラベルによってエンコードされる各出力ステートメントのリストを生成し、2 番目のパスでは、このリストを使用して実際の出力を生成します。このようなもの:

1 つを渡す:

Number Label Satatement
10           if(x==0)
20           WAIT 5
30           JMP (A)
40           WAIT 1
50       A   END
于 2010-05-18T10:54:46.600 に答える