예제 #1
0
        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);
        }
예제 #2
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));
 }
예제 #3
0
        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);
        }
예제 #4
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));
 }
예제 #5
0
 /// <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)
 {
 }