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); }
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); }
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); }