예제 #1
0
        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);
        }