/*条件处理*/ int condition(bool* fsys,int* ptx,int lev) { enum symbol relop; bool nxtlev[symnum]; if(sym==oddsym)/*准备按照odd运算处理*/ { getsymdo; expressiondo(fsys,ptx,lev); gendo(opr,0,6);/*生成odd指令*/ } else { memcpy(nxtlev,fsys,sizeof(bool)*symnum); nxtlev[eql]=true; nxtlev[neq]=true; nxtlev[lss]=true; nxtlev[leq]=true; nxtlev[gtr]=true; nxtlev[geq]=true; expressiondo(nxtlev,ptx,lev); if(sym!=eql&&sym!=neq&&sym!=lss&&sym!=leq&&sym!=gtr&&sym!=geq) { error(20); } else { relop=sym; getsymdo; expressiondo(fsys,ptx,lev); switch(relop) { case eql: gendo(opr,0,8); break; case neq: gendo(opr,0,9); break; case lss: gendo(opr,0,10); break; case geq: gendo(opr,0,11); break; case gtr: gendo(opr,0,12); break; case leq: gendo(opr,0,13); break; } } } return 0; }
void genstmt(SNODE *stmt) /* * genstmt will generate a statement and follow the next pointer * until the block is generated. */ { while( stmt != 0 ) { switch( stmt->stype ) { case st_block: genstmt(stmt->exp); break; case st_label: gen_label((int)stmt->label); break; case st_goto: gen_code(op_jmp,0,make_label((int)stmt->label),0); break; case st_expr: initstack(); gen_expr(stmt->exp,F_ALL | F_NOVALUE, natural_size(stmt->exp)); break; case st_return: genreturn(stmt,0); break; case st_if: genif(stmt); break; case st_while: genwhile(stmt); break; case st_do: gendo(stmt); break; case st_for: gen_for(stmt); break; case st_continue: gen_code(op_jmp,0,make_label(contlab),0); break; case st_break: gen_code(op_jmp,0,make_label(breaklab),0); break; case st_switch: genxswitch(stmt); break; case st_line: gen_line(stmt); break; case st_asm: if (stmt->exp) add_peep(stmt->exp); break; case st__genword: gen_code(op_genword,0,make_immed((int)stmt->exp),0); break; default: diag("unknown statement."); break; } stmt = stmt->next; } }