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())); } } }
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)) });
public Decl(LatteParser.DeclContext context) { Type = context.type(); context.item().ToList().ForEach(item => Items.Add(new Item(item))); }