Example #1
0
        private void EnterFunctionDef(FunctionDef context, int line, LatteParser.BlockContext block, LatteParser.ArgContext arg)
        {
            _environment.DetachVarEnv();
            _environment.CurrentFunctionName = context.Id;

            if (!context.Type.Equals(new LatteParser.TVoidContext()) &&
                !new ReturnsCheckVisitor().Visit(block))
            {
                _errorState.AddErrorMessage(new ErrorMessage(
                                                line,
                                                ErrorMessages.FunctionBranchWithoutRet(_environment.CurrentFunctionName)));
            }

            if (arg == null)
            {
                return;
            }

            var args = arg.type().Zip(arg.ID(), (a, b) => (a, b));

            foreach (var(type, id) in args)
            {
                var ident = id.GetText();

                if (_environment.NameToVarDef.ContainsKey(ident))
                {
                    _errorState.AddErrorMessage(new ErrorMessage(
                                                    line,
                                                    ErrorMessages.VarAlreadyDefined(ident)));
                }

                _environment.NameToVarDef[ident] = new VarDef(type, ident);
            }
        }
Example #2
0
 public Block(LatteParser.BlockContext context)
 {
     context?.stmt().ToList().ForEach(stmt => Stmts.Add(Utils.StmtFromStmtContext(stmt)));
 }