private Statement parseStatement() { // Bloque if (token.TokenType == TokenType.LLAVEI) { entornoActual = new Entorno(entornoActual); eat(TokenType.LLAVEI); // recursively call parseStatement() until closing brace StatementList stms = new StatementList(); while (token.TokenType != TokenType.LLAVED && token.TokenType != TokenType.EOF) { stms.addElement(parseStatement()); } eat(TokenType.LLAVED); entornoActual = entornoActual.Anterior; return(new Block(stms, entornoActual)); } switch (token.TokenType) { case TokenType.PUNTOYCOMA: eat(TokenType.PUNTOYCOMA); return(Statement.Null); case TokenType.IF: eat(TokenType.IF); // parse conditional expression eat(TokenType.IPAREN); Exp condExp = parseExpression(); eat(TokenType.DPAREN); Statement trueStm = parseStatement(); if (token.TokenType != TokenType.ELSE) { return(new If(condExp, trueStm)); } eat(TokenType.ELSE); Statement falseStm = parseStatement(); return(new Else(condExp, trueStm, falseStm)); case TokenType.WHILE: eat(TokenType.WHILE); eat(TokenType.IPAREN); Exp x = parseExpression(); eat(TokenType.DPAREN); Statement loopStm = parseStatement(); While nodowhile = new While(x, loopStm); return(nodowhile); case TokenType.DO: eat(TokenType.DO); Statement loopStnm = parseStatement(); eat(TokenType.WHILE); eat(TokenType.IPAREN); Exp bulcleBody = parseExpression(); eat(TokenType.DPAREN); eat(TokenType.PUNTOYCOMA); return(new Do(loopStnm, bulcleBody)); case TokenType.FOR: entornoActual = new Entorno(entornoActual); // Crera un nuevo entorno para el bucle for eat(TokenType.FOR); eat(TokenType.IPAREN); Statement declararion; if (token.TokenType != TokenType.ident) { declararion = parseVarDecl(); } else { declararion = Asignar(); } Exp loopExpr = parseExpression(); eat(TokenType.PUNTOYCOMA); Asignacion incExpr = Asignar(bucleFor: true); eat(TokenType.DPAREN); Statement stm = parseStatement(); entornoActual = entornoActual.Anterior; return(new For(declararion, loopExpr, incExpr, stm)); case TokenType.ident: if (token.Lexeme == "System") { eat(TokenType.ident); eat(TokenType.PUNTO); if (token.Lexeme != "out") { error("Se esperaba out"); } eat(TokenType.ident); eat(TokenType.PUNTO); if (token.Lexeme != "println") { error("Se esperaba out"); } eat(TokenType.ident); eat(TokenType.IPAREN); Exp expresion = parseExpression(); eat(TokenType.DPAREN); return(new Print(expresion)); } return(Asignar()); } switch (token.TokenType) { // int and boolean signals start of var declaration case TokenType.INT: return(parseVarDecl()); case TokenType.BOOLEAN: return(parseVarDecl()); case TokenType.FLOAT: return(parseVarDecl()); case TokenType.STRING: return(parseVarDecl()); case TokenType.CHAR: return(parseVarDecl()); case TokenType.DOUBLE: return(parseVarDecl()); } // statement type unknown error("Error no se esperaba " + token.TokenType); return(null); }