public override int VisitWhile_loop_stmt(BRAQParser.While_loop_stmtContext context) { //сгенерируем условие Label beforeCond = il.DefineLabel(); var prev_loop_begin = loop_begin; var prev_loop_end = loop_end; il.MarkLabel(beforeCond); //точка перед условием Label after_loop_body = il.DefineLabel(); loop_begin = beforeCond; loop_end = after_loop_body; if (context.cond != null) // возможно сгенерируем условие { context.cond.Accept(this); il.Emit(OpCodes.Brfalse_S, after_loop_body); } context.body.Accept(this); il.Emit(OpCodes.Br_S, beforeCond); // прыгаем к проверке условий il.MarkLabel(after_loop_body); //точка выхода loop_begin = prev_loop_begin; loop_end = prev_loop_end; return(0); }
public override Type VisitWhile_loop_stmt(BRAQParser.While_loop_stmtContext context) { if (context.cond != null && context.cond.Accept(this) != typeof(bool)) { Console.WriteLine($"Expected {typeof(bool)} in loop condition but got {type_dict[context.cond]} [Line {context.cond.Start.Line}]"); throw new TypeMismatchError(); } return(context.body.Accept(this)); }
public override int VisitWhile_loop_stmt(BRAQParser.While_loop_stmtContext context) { context.cond?.Accept(this); bool prev_inside = inside_loop; inside_loop = true; context.body.Accept(this); inside_loop = prev_inside; return(0); }
/// <summary> /// Visit a parse tree produced by <see cref="BRAQParser.while_loop_stmt"/>. /// <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 VisitWhile_loop_stmt([NotNull] BRAQParser.While_loop_stmtContext context) { return(VisitChildren(context)); }
/// <summary> /// Exit a parse tree produced by <see cref="BRAQParser.while_loop_stmt"/>. /// <para>The default implementation does nothing.</para> /// </summary> /// <param name="context">The parse tree.</param> public virtual void ExitWhile_loop_stmt([NotNull] BRAQParser.While_loop_stmtContext context) { }