#include #include "include/parser.hpp" #include "include/lexer.hpp" #include "include/exceptions.hpp" using std::string; void Parser::setText(string text){ tokenizer.setText(text); // Se prepara el lexer. } bool Parser::checkToken(){ if(tokenizer.getCurrentToken().type == nil) return false; return true; } void Parser::parse(string expr){ setText(expr); parseExpr(); /* Si no se ha consumido toda la cadena, lanzamos error. */ if(tokenizer.getCurrentToken().type != nil) throw ParserException("Sintaxis incorrecta."); } void Parser::parseExpr(){ parseTerm(); parsePrimeExpr(); } void Parser::parsePrimeExpr(){ if(tokenizer.getCurrentToken().type == sum || tokenizer.getCurrentToken().type == substraction) { tokenizer.nextToken(); if(!checkToken()) throw ParserException("Sintaxis incorrecta."); parseTerm(); parsePrimeExpr(); } } void Parser::parseTerm(){ parsePower(); parsePrimeTerm(); } void Parser::parsePrimeTerm(){ if(tokenizer.getCurrentToken().type == multiplication || tokenizer.getCurrentToken().type == division) { tokenizer.nextToken(); if(!checkToken()) throw ParserException("Sintaxis incorrecta."); parsePower(); parsePrimeTerm(); } } void Parser::parsePower(){ parseFactor(); parsePrimePower(); } void Parser::parsePrimePower(){ if(tokenizer.getCurrentToken().type == power) { tokenizer.nextToken(); if(tokenizer.getCurrentToken().type != number) throw ParserException("Sintaxis incorrecta."); tokenizer.nextToken(); parsePrimePower(); } } void Parser::parseFactor(){ switch(tokenizer.getCurrentToken().type) { case substraction: tokenizer.nextToken(); parseExpr(); break; case left_parens: tokenizer.nextToken(); parseExpr(); // Consumimos paréntesis derecho. if(tokenizer.getCurrentToken().type != right_parens) throw ParserException("Sintaxis incorrecta."); tokenizer.nextToken(); break; case function: tokenizer.nextToken(); if(tokenizer.getCurrentToken().type != left_parens) throw ParserException("Sintaxis incorrecta."); parseExpr(); if(tokenizer.getCurrentToken().type != right_parens) throw ParserException("Sintaxis incorrecta."); tokenizer.nextToken(); break; case variable: tokenizer.nextToken(); break; case number: tokenizer.nextToken(); break; default: throw ParserException("Sintaxis incorrecta."); break; } }