public void parse_sema_whi(Exp_whi whi) { s++; Exp_Operate opter = new Exp_Operate(); opter.op = type_op.LABEL; opter.result = getLabel(); list_op.add(opter); Exp_Operate opt = new Exp_Operate(); Exp_cond condition = whi.condition; Exp_mark m1 = (Exp_mark) condition.left; Exp_mark m2 = (Exp_mark) condition.right; opt.op = get_compare_mark(condition.exp_comp); opt.s = backString(m1, type_cal.NUM); opt.d = backString(m2, type_cal.NUM); opt.result = getLabel(); // 跳转标签 list_op.add(opt); Exp_B exp = (Exp_B) whi.next; exec_exp_B(exp, null); Exp_Operate op1 = new Exp_Operate(); op1.op = type_op.JMP; op1.result = opter.result; list_op.add(op1); Exp_Operate op2 = new Exp_Operate(); op2.op = type_op.LABEL; op2.result = opt.result; list_op.add(op2); s--; st.check_Dimension(s); }
public void parse_sema_ife(Exp_ife ife) { s++; Exp_Operate opt = new Exp_Operate(); Exp_cond condition = ife.condition; Exp_mark m1 = (Exp_mark) condition.left; Exp_mark m2 = (Exp_mark) condition.right; opt.op = get_compare_mark(condition.exp_comp); if (m1 != null) { opt.s = backString(m1, type_cal.NUM); } if (m2 != null) { opt.d = backString(m2, type_cal.NUM); } opt.result = getLabel(); // 跳转标签 list_op.add(opt); Exp_B exp_left = (Exp_B) ife.left; Exp_B exp_right = (Exp_B) ife.right; if (exp_left != null) { exec_exp_B(exp_left, null); } // 如果有else if (exp_right != null) { exec_exp_B(exp_right, opt.result); } else { Exp_Operate operate = new Exp_Operate(); operate.op = type_op.LABEL; operate.result = opt.result; list_op.add(operate); } s--; List<Integer> list = st.check_Dimension(s); // 返回那些引用数目为0的变量 // 优化部分 if (list != null) { int i = 0; while (i < list.size()) { list_op.remove(list.get(i)); i++; } } }