14061114_耿欣
编译原理(do_while改for循环作业)
<for loop>→<for head>↑a,r,f<rest of loop>↓a,r,f <script type="math/tex" id="MathJax-Element-93"> \to _{\uparrow a,r,f} _{\downarrow a,r,f} </script>
<for loop>↑a,r,f→for<id>↑a:=<expr>@initload↑s to<expr>@compare↑r @labgen↑fby<expr> <script type="math/tex" id="MathJax-Element-94"> _{\uparrow a,r,f}\to for _{\uparrow a}:= @initload_{\uparrow s}\ to @compare_{\uparrow r}\ @labgen_{\uparrow f} by </script>
<rest of loop>↓a,r,f→do<stat list>@iterate↓a,r end for @endloop↓f <script type="math/tex" id="MathJax-Element-95"> _{\downarrow a,r,f}\to do @iterate_{\downarrow a,r}\ end\ for\ @endloop_{\downarrow f}</script>
LDA (id)
LOD (expr1)
STN #@initload
LOD (expr2)
loopjudge: #@compare
GE
gotoEndorNot: #@labgen
BRF endlab ##
<statement>
LOD (expr3)
LDA id #@iterate
ADD ##
STO (id) ###
BR loopjudge ####
endlab #@endloop
procedure @compare #
#只生成给循环变量赋初值的指令
procedure @compare:
string r;
r := genlab;
setlab(r);
return r;
end;
procedure @labgen:
string f;
f := genlab;
emit("BRF",f);
setlab(f);
return(f);
end;
procedure @iterate(a,r):
address a;
string r;
emitl("LOD",a);
emit("ADD");
emitl("STO",a);
emilt("BR",r);
end;
procedure @loopjudge(f):
string f;
setlab(f);
end;