Ejemplo n.º 1
0
        public override bool VisitStmtIfElseIfElse([NotNull] GamaParser.StmtIfElseIfElseContext context)
        {
            var exprctx = context.expr();

            /* lmao */
            for (int i = 0; i < exprctx.Length; i++)
            {
                var e   = exprctx[i];
                var val = VisitExpression(e);
                if (val == null)
                {
                    return(false);
                }

                if (val.Type != InstanceTypes.Bool)
                {
                    NamespaceContext.Context.AddError(new ErrorTypeMismatch(e));
                    return(false);
                }

                CurrentBlock.PositionBuilderAtEnd(Builder);

                var iftrue = Self.AddBlock("if.true");
                var ifend  = Self.AddBlock("if.end");

                Builder.BuildCondBr(val.Value, iftrue.Block, ifend.Block);

                SetBlock(iftrue);
                Push();
                {
                    Visit(context.block(i));
                }
                if (!iftrue.HasTerminator())
                {
                    iftrue.PositionBuilderAtEnd(Builder);
                    Builder.BuildBr(ifend.Block);
                }
                if (CurrentBlock != iftrue) /* Block nesting */
                {
                    CurrentBlock.PositionBuilderAtEnd(Builder);
                    Builder.BuildBr(ifend.Block);
                }
                Pop();
                SetBlock(ifend);
            }

            // TODO:

            return(true);
        }
Ejemplo n.º 2
0
 /// <summary>
 /// Visit a parse tree produced by the <c>StmtIfElseIfElse</c>
 /// labeled alternative in <see cref="GamaParser.stmtIf"/>.
 /// <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 VisitStmtIfElseIfElse([NotNull] GamaParser.StmtIfElseIfElseContext context)
 {
     return(VisitChildren(context));
 }
Ejemplo n.º 3
0
 /// <summary>
 /// Exit a parse tree produced by the <c>StmtIfElseIfElse</c>
 /// labeled alternative in <see cref="GamaParser.stmtIf"/>.
 /// <para>The default implementation does nothing.</para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 public virtual void ExitStmtIfElseIfElse([NotNull] GamaParser.StmtIfElseIfElseContext context)
 {
 }