visualstudioでPL0コンパイラを編集しています。pl'0で新しくswich文を使用できるようにしようと思いコンパイラ編集しています。現在は、switchの値とcaseの値の一致しているかの比較方法と不一致だった場合にそのcaseのところを実行しない方法がわからずに困っています。わかる方いらっしゃいましたら教えていただきたいです。
出典 : 中田育男氏のホームページ > コンパイラ > PL0'コンパイラのソースリスト
http://www.k.hosei.ac.jp/~nakata/oCompiler/PL0compiler/prog_proc1.html
http://www.k.hosei.ac.jp/~nakata/oCompiler/PL0compiler/compile.c
case Switch: token = nextToken(); expression(); statement(); backP = genCodeV(jpc, 0); if (token.kind == Case) { if ( == ) { /*caseの値がswitchの値と一致しているかの判定*/ a++; /*caseの値が一致したことを示しdefaultが動かないためのもの*/ statement(); if (token.kind == Break) { /*breakがあったら終了*/ return; } else { /*breakがない場合はcaseの値一致関係なしに実行*/ token = checkGet(token, Case); expression(); token = nextToken(); statement(); } } else { backPatch(backP); } } if (a == 0) { /*caseが全部一致しなかったときにdefautを実行*/ token = checkGet(token, Default); statement(); } return;
なお、こちらはcompile.cのstatement()関数に追加した部分です。
また、token.kindでswitch,case,break,defaultは使用できるようにgetSource.h、getSource.cに定義しています。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
実際に実行するプログラム例
function multiply(x,y) var a,b,c; begin a:=x; b:=y; c:=0; switch a+1 begin case 1; c:=a-b; break; case 2; c:=a+b; case 3; c:=a*a; default c:=b*b; end; return c; end; const m=2,n=1; var x,y; begin x:=m; y:=n; write x; write y; writeln; write multiply(x,y); writeln end.
switch文の動きとしてはC言語と同様にしたく、caseの値が一致したら中身を実行し、breakがあるところまで実行。case句すべての値が一致しなかった場合のみdefaultのところを実行する。
分かる方いらっしゃいましたら教えていただきたいです。
あなたの回答
tips
プレビュー