Sentence function_declaration(Tipo retorno, string id) { EnvTypes savedEnvTypes = entornoTipos; entornoTipos = new EnvTypes(entornoTipos); //EnvValues savedEnvValues = entornoValores; //entornoValores = new EnvValues(entornoValores); EnvValues savedEnvValues = Parser.pilaValores.Peek(); Parser.pilaValores.Push(new EnvValues(Parser.pilaValores.Peek())); match("("); Dictionary<string,Tipo> paramsTypeList = parameter_type_list(); match(")"); FunctionDefinition funcDefinition = new FunctionDefinition(); funcionActual = funcDefinition; Sentence compoundStmnt = function_definition(); funcDefinition.init(id, retorno, compoundStmnt); entornoTipos = savedEnvTypes; entornoValores = savedEnvValues; Parser.pilaValores.Pop(); Funcion funcion = new Funcion(retorno, paramsTypeList); entornoTipos.put(id, funcion); ValorFuncion funcionVal = new ValorFuncion(funcDefinition); //entornoValores.put(id, funcionVal); Parser.pilaValores.Peek().put(id, funcionVal); funcionActual = null; if (id == "main") { main = funcDefinition; } return funcDefinition; }
VariableDeclarator enum_constant_expression(EnvValues savedEnvValues, EnvTypes savedEnvTypes) { string varName = variable_name(); EnvValues savedEnvValues2 = entornoValores; entornoValores = savedEnvValues; VariableInitializer varInit = enum_constant_expressionP(); entornoValores = savedEnvValues2; VariableSubDeclarator varSubDec = new VariableSubDeclarator(new Entero(), varName); entornoTipos.put(varName, new Entero()); savedEnvTypes.put(varName, new Entero()); VariableDeclarator varDeclarator = new VariableDeclarator(varSubDec, varInit); return varDeclarator; }
Sentence enum_initializer(string enumName) { if (peek("{")) { EnvTypes savedEnvTypes = entornoTipos; entornoTipos = new EnvTypes(entornoTipos); EnvValues savedEnvValues = entornoValores; entornoValores = new EnvValues(null); match("{"); List<VariableDeclarator> varsDec = enum_initializer_list(savedEnvValues, savedEnvTypes); match("}"); EnumerationDeclaration enumDeclaration = new EnumerationDeclaration(enumName, varsDec, savedEnvValues); ValorEnumeracion valEnum = new ValorEnumeracion(); Enumeracion varEnum = new Enumeracion(entornoTipos); valEnum.valor = entornoValores; entornoTipos = savedEnvTypes; entornoTipos.put(enumName, varEnum); entornoValores = savedEnvValues; entornoValores.put(enumName, valEnum); return enumDeclaration; } else { Tipo varEnum = entornoTipos.get(enumName); Valor valEnum = entornoValores.get(enumName); string enumVarName = currentToken.Lexema; match(TokenType.ID); EnumerationVariableDeclaration enumVarDeclaration = new EnumerationVariableDeclaration(enumName, enumVarName, varEnum, valEnum); entornoTipos.put(enumVarName, varEnum); return enumVarDeclaration; } }
Sentence struct_declarationP(string structName) { if (peek("{")) { match("{"); EnvTypes savedEnvTypes = entornoTipos; entornoTipos = new EnvTypes(null); EnvValues savedEnvValues = entornoValores; entornoValores = new EnvValues(null); Sentence strVarDecs = variable_declaration_list(savedEnvTypes, savedEnvValues); match("}"); Registro record = new Registro(entornoTipos); ValorRegistro Valrec = new ValorRegistro(); Valrec.valor = entornoValores; entornoTipos = savedEnvTypes; entornoTipos.put(structName, record); entornoValores = savedEnvValues; entornoValores.put(structName, Valrec); return strVarDecs; } else { Tipo varRecord = entornoTipos.get(structName); Valor valRecord = entornoValores.get(structName); string strVarName = variable_name(); entornoTipos.put(strVarName, varRecord); //entornoValores.put(strVarName, valRecord); return new StructVariableDeclaration(structName, strVarName, varRecord, valRecord); } }