diff options
author | HombreLaser <sebastian-440@live.com> | 2022-04-02 11:54:14 -0600 |
---|---|---|
committer | HombreLaser <sebastian-440@live.com> | 2022-04-02 11:54:14 -0600 |
commit | bbf4e8304b50b6a972cacc6337d1aa283ccb83be (patch) | |
tree | 73821eb1485bb05c038af64a372d17a0626acfe3 /parser.cpp | |
parent | 4a8400c2846a0db0778817e48da6c0f20849471f (diff) |
Añadido código del parser
Diffstat (limited to 'parser.cpp')
-rw-r--r-- | parser.cpp | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/parser.cpp b/parser.cpp new file mode 100644 index 0000000..8cba19e --- /dev/null +++ b/parser.cpp @@ -0,0 +1,119 @@ +#include <string> +#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(); +} + +void Parser::parseExpr(){ + parseTerm(); + parsePrimeExpr(); +} + +void Parser::parsePrimeExpr(){ + if(tokenizer.getCurrentToken().type == sum + || tokenizer.getCurrentToken().type == substraction) + { + tokenizer.nextToken(); + + if(!checkToken()) + throw ParserException("Carácter inválido."); + + 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("Carácter inválido."); + + 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."); + + 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."); + 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."); + + break; + case variable: + tokenizer.nextToken(); + + break; + case number: + tokenizer.nextToken(); + + break; + default: + throw ParserException("Sintaxis incorrecta."); + + break; + } +} |