(8)stmts
stmts逻辑上代表一个语句块或一组语句块,对应的生成式和在节点中使用的type如下:
stmts --> NUL| type-->0
stmt stmts| type-->1
if(expr) { stmts} stmts| type-->2
if(expr) {stmts} else {stmts} stmts| type-->3
while(expr) { stmts} stmts| type-->4
接下来给出生成后端代码的代码:
public void genCode() {
if(type==1)
{
st.genCode();
stmts1.genCode();
}
else if(type==2)
{
condition.genCode();
Code code=new Code(0x18);
BackendClassManager.tFunc.codes.add(code);
stmts1.genCode();
code.Operands.add(String.valueOf(BackendClassManager.tFunc.codes.size()));
stmts3.genCode();
}
else if(type==3)
{
condition.genCode();
Code code=new Code(0x18);
code.Opcode=0x18;
BackendClassManager.tFunc.codes.add(code);
stmts1.genCode();
Code code1=new Code(0x01);
code1.Operands.add(String.valueOf(0));
BackendClassManager.tFunc.codes.add(code1);
Code code2=new Code(0x18);
BackendClassManager.tFunc.codes.add(code2);
code.Operands.add(String.valueOf(BackendClassManager.tFunc.codes.size()));
stmts2.genCode();
code2.Operands.add(String.valueOf(BackendClassManager.tFunc.codes.size()));
stmts3.genCode();
}
else if(type==4)
{
ArrayList<Code> albreak=new ArrayList<Code>();
ArrayList<Code> alcontinue=new ArrayList<Code>();
BackendClassManager.loopbreak.add(albreak);
BackendClassManager.loopcontinue.add(alcontinue);//循环入口,首先判断expr
int pos=BackendClassManager.tFunc.codes.size();
condition.genCode();
//跳转指令
Code code=new Code(0x18);
BackendClassManager.tFunc.codes.add(code);
//循环体
stmts1.genCode();
// code.Operands.add(String.valueOf(end));//表达式回填
Code code1=new Code(0x01);
code1.Operands.add(String.valueOf(0));
BackendClassManager.tFunc.codes.add(code1);//压入0
Code code2=new Code(0x18);
code2.Operands.add(String.valueOf(pos));
BackendClassManager.tFunc.codes.add(code2);//跳转到循环入口
int end=BackendClassManager.tFunc.codes.size();
code.Operands.add(String.valueOf(end));//表达式回填
for(Code c:albreak)
{
c.Operands.add(String.valueOf(end));
}
for(