Exemplo n.º 1
0
        public bool Parse(Lexer lexer, Token token, Attributes attributes)
        {
            var successfullyParsed = true;

            try
            {
                var environments = new Environments();

                environments.Push(new Environment()
                {
                    IsGlobal = true
                });

                attributes.AddAttribute(environments, "ENVS");

                successfullyParsed &= ParserFactory.GetEnvironmentParser().Parse(lexer, token, attributes);

                ValidateToken(lexer.GetCurrentToken(), TokenType.EndOfFile);
            }
            catch (Exception ex)
            {
                successfullyParsed = false;
                Logger(ex.Message);
            }

            return(successfullyParsed);
        }
Exemplo n.º 2
0
        public bool Parse(Lexer lexer, Token token, Attributes attributes)
        {
            var successfullyParsed = true;

            var environments = ((Environments)attributes["ENVS"]);

            var procedure = ParseProcedureDeclaration(lexer, token, environments[0], out successfullyParsed);

            environments[0].Subroutines.AddSubroutine(procedure);

            var globalEnvironmentElementsCount = environments[0].Locals.Count() +
                                                 environments[0].Subroutines.Count();

            if (procedure.Identifier == "MAIN")
            {
                // SEM: Main no puede tener parametros
                if (procedure.Environment.FormalParameters.HasParameters())
                {
                    LogMainHasParameters();
                    successfullyParsed = false;
                }

                procedure.Environment = environments[0];
            }

            environments.Push(procedure.Environment);

            successfullyParsed &= ParserFactory.GetEnvironmentParser().Parse(lexer, lexer.GetNextToken(), attributes);

            // SEM: Main no puede tener entorno local
            if (globalEnvironmentElementsCount < (environments[0].Locals.Count() + environments[0].Subroutines.Count()))
            {
                LogMainHasLocalEnvironment();
                successfullyParsed = false;
            }

            successfullyParsed &= ParseProcedureBody(lexer, lexer.GetCurrentToken(), procedure, attributes);
            successfullyParsed &= ParseProcedureEnd(lexer, lexer.GetCurrentToken());

            environments.Pop();

            return(successfullyParsed);
        }
Exemplo n.º 3
0
        public bool Parse(Lexer lexer, Token token, Attributes attributes)
        {
            var successfullyParsed = true;

            var environments = ((Environments)attributes["ENVS"]);

            var function = ParseFunctionDeclaration(lexer, token, environments[0], out successfullyParsed);

            environments[0].Subroutines.AddSubroutine(function);

            environments.Push(function.Environment);

            successfullyParsed &= ParserFactory.GetEnvironmentParser().Parse(lexer, lexer.GetNextToken(), attributes);

            successfullyParsed &= ParseFunctionBody(lexer, lexer.GetCurrentToken(), function, attributes);
            successfullyParsed &= ParseFunctionEnd(lexer, lexer.GetCurrentToken(), function, attributes);

            environments.Pop();

            return(successfullyParsed);
        }