Ejemplo n.º 1
0
        public override void EnterDecl(LatteParser.DeclContext context)
        {
            if (context.type().Equals(new LatteParser.TVoidContext()))
            {
                StateUtils.InterruptWithMessage(
                    context.start.Line,
                    context.start.Column,
                    ErrorMessages.VoidDeclaration);
            }

            foreach (var decl in context.item())
            {
                var id = decl.ID().GetText();
                if (_environment.NameToVarDef.ContainsKey(id) &&
                    _environment.NameToVarDef[id].IsDefinedInCurrentBlock)
                {
                    _errorState.AddErrorMessage(new ErrorMessage(
                                                    decl.start.Line,
                                                    decl.start.Column,
                                                    ErrorMessages.VarAlreadyDefined(id)));
                }

                if (_skipNextDecl)
                {
                    _skipNextDecl = false;
                }
                else
                {
                    _environment.NameToVarDef[id] = new VarDef(context.type(), id);
                }

                if (decl.expr() == null)
                {
                    continue;
                }

                var exprType = new ExpressionTypeVisitor().Visit(decl.expr());
                if (!context.type().Equals(exprType) && !IsTypeParent(exprType, context.type()))
                {
                    StateUtils.InterruptWithMessage(
                        decl.start.Line,
                        decl.start.Column,
                        ErrorMessages.VarExprTypesMismatch(decl.ID().GetText()));
                }
            }
        }
Ejemplo n.º 2
0
 public static Stmt StmtFromStmtContext(LatteParser.StmtContext context)
 {
     return(context switch
     {
         LatteParser.AssContext assContext => new Ass(assContext),
         LatteParser.BlockStmtContext blockStmtContext => new Block(blockStmtContext),
         LatteParser.CondContext condContext => new Cond(condContext),
         LatteParser.CondElseContext condElseContext => new CondElse(condElseContext),
         LatteParser.DeclContext declContext => new Decl(declContext),
         LatteParser.DecrContext decrContext => new Decr(decrContext),
         LatteParser.EmptyContext _ => new Empty(),
         LatteParser.IncrContext incrContext => new Incr(incrContext),
         LatteParser.RetContext retContext => new Ret(retContext),
         LatteParser.SExpContext sExpContext => new ExpStmt(sExpContext),
         LatteParser.StructAssContext structAssContext => new StructAss(structAssContext),
         LatteParser.StructDecrContext structDecrContext => new StructDecr(structDecrContext),
         LatteParser.StructIncrContext structIncrContext => new StructIncr(structIncrContext),
         LatteParser.VRetContext vRetContext => new Ret(vRetContext),
         LatteParser.WhileContext whileContext => new While(whileContext),
         _ => throw new ArgumentOutOfRangeException(nameof(context))
     });
Ejemplo n.º 3
0
 public Decl(LatteParser.DeclContext context)
 {
     Type = context.type();
     context.item().ToList().ForEach(item => Items.Add(new Item(item)));
 }