public override bool VisitCondElse(LatteParser.CondElseContext context)
 {
     return(context.expr() switch
     {
         LatteParser.ETrueContext _ => Visit(context.stmt()[0]),
         LatteParser.EFalseContext _ => Visit(context.stmt()[1]),
         _ => (Visit(context.stmt()[0]) && Visit(context.stmt()[1]))
     });
示例#2
0
        public CondElse(LatteParser.CondElseContext context)
        {
            Expr = Exprs.Utils.ExprFromExprContext(context.expr());

            var stmt1 = Utils.StmtFromStmtContext(context.stmt()[0]);

            TBlock = stmt1 switch
            {
                Block block => block,
                Stmt s => new Block(s)
            };
            var stmt2 = Utils.StmtFromStmtContext(context.stmt()[1]);
            FBlock = stmt2 switch
            {
                Block block => block,
                Stmt s => new Block(s)
            };
        }
示例#3
0
        public override void EnterCondElse(LatteParser.CondElseContext context)
        {
            _environment.DetachVarEnv();
            if (context.stmt()[0] is LatteParser.DeclContext)
            {
                _skipNextDecl = true;
            }

            var exprType = new ExpressionTypeVisitor().Visit(context.expr());

            if (!exprType.Equals(new LatteParser.TBoolContext()))
            {
                _errorState.AddErrorMessage(new ErrorMessage(
                                                context.expr().start.Line,
                                                context.expr().start.Line,
                                                ErrorMessages.IfWrongCondition));
            }
        }