summaryrefslogtreecommitdiff
path: root/parser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'parser.cpp')
-rw-r--r--parser.cpp49
1 files changed, 29 insertions, 20 deletions
diff --git a/parser.cpp b/parser.cpp
index e1595f3..04f6a50 100644
--- a/parser.cpp
+++ b/parser.cpp
@@ -8,31 +8,31 @@ using std::string, std::stoi;
// De haber habido un error vaciaremos la pila de expresiones.
void Parser::panic() {
- for(auto ptr = tree_stack.begin(); ptr != tree_stack.end(); ++ptr)
+ for(auto ptr = tree_queue.begin(); ptr != tree_queue.end(); ++ptr)
delete *ptr;
throw ParserException("Sintaxis incorrecta.");
}
-Expression *Parser::popStack() {
- Expression *val = tree_stack.back();
- tree_stack.pop_back();
+Expression *Parser::popQueue() {
+ Expression *val = tree_queue.front();
+ tree_queue.pop_front();
return val;
}
-Expression *Parser::newTree(token_type type) {
+Expression *Parser::newTree(token_type type, Expression *left, Expression *right) {
switch(type) {
case sum:
- return new AddExpression(popStack(), popStack());
+ return new AddExpression(left, right);
case substraction:
- return new SubExpression(popStack(), popStack());
+ return new SubExpression(left, right);
case multiplication:
- return new MultiplicationExpression(popStack(), popStack());
+ return new MultiplicationExpression(left, right);
case division:
- return new DivisionExpression(popStack(), popStack());
+ return new DivisionExpression(left, right);
default: // Potencia.
- return new PowerExpression(popStack(), popStack());
+ return new PowerExpression(left, right);
}
}
@@ -55,7 +55,7 @@ Expression *Parser::parse(string expr) {
if(tokenizer.getCurrentToken().type != nil)
panic();
- return popStack();
+ return popQueue();
}
void Parser::parseExpr() {
@@ -65,6 +65,7 @@ void Parser::parseExpr() {
void Parser::parsePrimeExpr() {
token_type current;
+ Expression *left, *right;
if(tokenizer.getCurrentToken().type == sum
|| tokenizer.getCurrentToken().type == substraction) {
@@ -74,8 +75,10 @@ void Parser::parsePrimeExpr() {
if(checkToken())
panic();
+ left = popQueue();
parseTerm();
- tree_stack.push_back(newTree(current));
+ right = popQueue();
+ tree_queue.push_back(newTree(current, left, right));
parsePrimeExpr();
}
}
@@ -87,6 +90,7 @@ void Parser::parseTerm() {
void Parser::parsePrimeTerm() {
token_type current;
+ Expression *left, *right;
if(tokenizer.getCurrentToken().type == multiplication
|| tokenizer.getCurrentToken().type == division) {
@@ -96,8 +100,10 @@ void Parser::parsePrimeTerm() {
if(checkToken())
panic();
+ left = popQueue();
parsePower();
- tree_stack.push_back(newTree(current));
+ right = popQueue();
+ tree_queue.push_back(newTree(current, left, right));
parsePrimeTerm();
}
}
@@ -108,16 +114,19 @@ void Parser::parsePower() {
}
void Parser::parsePrimePower() {
+ Expression *left, *right;
+
if(tokenizer.getCurrentToken().type == power) {
tokenizer.nextToken();
if(tokenizer.getCurrentToken().type != number)
panic();
- tree_stack.push_back(new Literal(stoi(tokenizer.getCurrentToken().value)));
+ left = popQueue();
+ right = new Literal(stoi(tokenizer.getCurrentToken().value));
tokenizer.nextToken();
-
- tree_stack.push_back(newTree(power));
+
+ tree_queue.push_back(newTree(power, left, right));
parsePrimePower();
}
}
@@ -130,7 +139,7 @@ void Parser::parseFactor() {
tokenizer.nextToken();
parseExpr();
- tree_stack.push_back(new NegationExpression(popStack()));
+ tree_queue.push_back(new NegationExpression(popQueue()));
break;
case left_parens:
@@ -170,7 +179,7 @@ void Parser::parseFactor() {
panic();
tokenizer.nextToken();
- tree_stack.push_back(new Function(popStack(), name));
+ tree_queue.push_back(new Function(popQueue(), name));
break;
case variable:
@@ -181,12 +190,12 @@ void Parser::parseFactor() {
else
panic(); // Se introdujeron dos variables en la expresión.
- tree_stack.push_back(new Variable(tokenizer.getCurrentToken().value[0]));
+ tree_queue.push_back(new Variable(tokenizer.getCurrentToken().value[0]));
tokenizer.nextToken();
break;
case number:
- tree_stack.push_back(new Literal(stoi(tokenizer.getCurrentToken().value)));
+ tree_queue.push_back(new Literal(stoi(tokenizer.getCurrentToken().value)));
tokenizer.nextToken();
break;