/* * jumpStatement * return 语句在第一遍扫描结束之后回填 * break continue 可以在for while语句的时候,直接转换成为jump语句 */ public override object VisitJumpStatement([NotNull] CMMParser.JumpStatementContext context) { IntermediateCode code = null; switch (context.GetChild(0).GetText()) { case "break": code = new IntermediateCode(InstructionType.b, context.Start.Line); break; case "continue": code = new IntermediateCode(InstructionType.cnt, context.Start.Line); break; case "return": if (context.ChildCount == 2) { // 向操作栈压入0表示没有返回值 codes.Add(new IntermediateCode(0, InstructionType.push, context.Start.Line)); } else { Visit(context.expression()); // 向操作栈压入1表示有返回值 codes.Add(new IntermediateCode(1, InstructionType.push, context.Start.Line)); } code = new IntermediateCode(InstructionType.ret, context.Start.Line); break; } codes.Add(code); return(null); }
/// <summary> /// Visit a parse tree produced by <see cref="CMMParser.jumpStatement"/>. /// <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 VisitJumpStatement([NotNull] CMMParser.JumpStatementContext context) { return(VisitChildren(context)); }
/// <summary> /// Exit a parse tree produced by <see cref="CMMParser.jumpStatement"/>. /// <para>The default implementation does nothing.</para> /// </summary> /// <param name="context">The parse tree.</param> public virtual void ExitJumpStatement([NotNull] CMMParser.JumpStatementContext context) { }