/* * 处理if语句 */ public override object VisitIfStatement([NotNull] CMMParser.IfStatementContext context) { // 查看expression的结果 Visit(context.expression()); IntermediateCode code0 = new IntermediateCode(0, InstructionType.push, context.expression().Start.Line); codes.Add(code0); // 比较expression的结果和0的关系,等于0的话就跳转走,code1的目的地址待回填 IntermediateCode code1 = new IntermediateCode(InstructionType.je, context.expression().Stop.Line); codes.Add(code1); if (context.codeBlock() != null) { Visit(context.codeBlock()); } IntermediateCode code3 = new IntermediateCode(InstructionType.j, context.codeBlock().Stop.Line); codes.Add(code3); // 条件不符合的情况应该执行的代码行号为addr0,回填一下 int addr0 = codes.Count; code1.setOperant(addr0); List <IntermediateCode> needToAddFinishAddrCodes = new List <IntermediateCode>(); needToAddFinishAddrCodes.Add(code3); // 每个else语句都执行一下 if (context.elseClause() != null) { foreach (CMMParser.ElseClauseContext ctx in context.elseClause()) { if (ctx.ifStatement() == null) { Visit(ctx.codeBlock()); IntermediateCode code = new IntermediateCode(InstructionType.j, ctx.codeBlock().Stop.Line); needToAddFinishAddrCodes.Add(code); codes.Add(code); } else { Visit(ctx.ifStatement()); } } } foreach (IntermediateCode c in needToAddFinishAddrCodes) { c.operant = codes.Count; } return(null); }
/// <summary> /// Visit a parse tree produced by <see cref="CMMParser.ifStatement"/>. /// <para> /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/> /// on <paramref name="context"/>. /// </para> /// </summary> /// <param name="context">The parse tree.</param> /// <return>The visitor result.</return> public virtual Result VisitIfStatement([NotNull] CMMParser.IfStatementContext context) { return(VisitChildren(context)); }
/// <summary> /// Exit a parse tree produced by <see cref="CMMParser.ifStatement"/>. /// <para>The default implementation does nothing.</para> /// </summary> /// <param name="context">The parse tree.</param> public virtual void ExitIfStatement([NotNull] CMMParser.IfStatementContext context) { }