summaryrefslogtreecommitdiff
path: root/parser.cpp
diff options
context:
space:
mode:
authorHombreLaser <sebastian-440@live.com>2022-04-02 11:54:14 -0600
committerHombreLaser <sebastian-440@live.com>2022-04-02 11:54:14 -0600
commitbbf4e8304b50b6a972cacc6337d1aa283ccb83be (patch)
tree73821eb1485bb05c038af64a372d17a0626acfe3 /parser.cpp
parent4a8400c2846a0db0778817e48da6c0f20849471f (diff)
Añadido código del parser
Diffstat (limited to 'parser.cpp')
-rw-r--r--parser.cpp119
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;
+ }
+}