diff options
Diffstat (limited to 'parser.cpp')
-rw-r--r-- | parser.cpp | 49 |
1 files changed, 29 insertions, 20 deletions
@@ -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; |