diff --git a/src/Expression.cpp b/src/Expression.cpp index 9b309dc..7caf860 100644 --- a/src/Expression.cpp +++ b/src/Expression.cpp @@ -21,6 +21,24 @@ string Expression::toString() { ExpressionBinary::ExpressionBinary(shared_ptr token, shared_ptr left, shared_ptr right): Expression(Expression::Kind::BINARY), left(left), right(right) { switch (token->getKind()) { + case Token::Kind::EQUAL: + operation = EQUAL; + break; + case Token::Kind::NOT_EQUAL: + operation = NOT_EQUAL; + break; + case Token::Kind::LESS: + operation = LESS; + break; + case Token::Kind::LESS_EQUAL: + operation = LESS_EQUAL; + break; + case Token::Kind::GREATER: + operation = GREATER; + break; + case Token::Kind::GREATER_EQUAL: + operation = GREATER_EQUAL; + break; case Token::Kind::PLUS: operation = ADD; break; @@ -55,16 +73,28 @@ shared_ptr ExpressionBinary::getRight() { string ExpressionBinary::toString() { switch (operation) { + case EQUAL: + return "{= " + left->toString() + " " + right->toString() + "}"; + case NOT_EQUAL: + return "{!= " + left->toString() + " " + right->toString() + "}"; + case LESS: + return "{< " + left->toString() + " " + right->toString() + "}"; + case LESS_EQUAL: + return "{<= " + left->toString() + " " + right->toString() + "}"; + case GREATER: + return "{> " + left->toString() + " " + right->toString() + "}"; + case GREATER_EQUAL: + return "{<= " + left->toString() + " " + right->toString() + "}"; case ADD: - return "<+ " + left->toString() + " " + right->toString() + ">"; + return "{+ " + left->toString() + " " + right->toString() + "}"; case SUB: - return "<- " + left->toString() + " " + right->toString() + ">"; + return "{- " + left->toString() + " " + right->toString() + "}"; case MUL: - return "<* " + left->toString() + " " + right->toString() + ">"; + return "{* " + left->toString() + " " + right->toString() + "}"; case DIV: - return "toString() + " " + right->toString() + ">"; + return "{/ " + left->toString() + " " + right->toString() + "}"; case MOD: - return "<% " + left->toString() + " " + right->toString() + ">"; + return "{% " + left->toString() + " " + right->toString() + "}"; } } diff --git a/src/Expression.h b/src/Expression.h index c5ad1e2..748ad95 100644 --- a/src/Expression.h +++ b/src/Expression.h @@ -47,6 +47,12 @@ public: class ExpressionBinary: public Expression { public: enum Operation { + EQUAL, + NOT_EQUAL, + LESS, + LESS_EQUAL, + GREATER, + GREATER_EQUAL, ADD, SUB, MUL, diff --git a/src/Lexer.cpp b/src/Lexer.cpp index 507cdda..8fb6f4d 100644 --- a/src/Lexer.cpp +++ b/src/Lexer.cpp @@ -120,7 +120,7 @@ shared_ptr Lexer::nextToken() { if (token != nullptr) return token; - // logical + // comparison token = match(Token::Kind::NOT_EQUAL, "!=", false); if (token != nullptr) return token; diff --git a/src/Parser.cpp b/src/Parser.cpp index 3409f02..36d0f0a 100644 --- a/src/Parser.cpp +++ b/src/Parser.cpp @@ -122,7 +122,33 @@ shared_ptr Parser::matchStatementInvalid() { // Expression // shared_ptr Parser::nextExpression() { - return matchTerm(); + return matchEquality(); +} + +shared_ptr Parser::matchEquality() { + shared_ptr expression = matchTerm(); + if (expression == nullptr || !expression->isValid()) + return expression; + + while (tokens.at(currentIndex)->isOfKind(Token::tokensEquality)) { + // comaprison + expression = matchExpressionBinary(expression); + } + + return expression; +} + +shared_ptr Parser::matchComparison() { + shared_ptr expression = matchTerm(); + if (expression == nullptr || !expression->isValid()) + return expression; + + while (tokens.at(currentIndex)->isOfKind(Token::tokensComparison)) { + // term + expression = matchExpressionBinary(expression); + } + + return expression; } shared_ptr Parser::matchTerm() { @@ -130,7 +156,8 @@ shared_ptr Parser::matchTerm() { if (expression == nullptr || !expression->isValid()) return expression; - while (tokens.at(currentIndex)->isOfKind({Token::Kind::PLUS, Token::Kind::MINUS})) { + while (tokens.at(currentIndex)->isOfKind(Token::tokensTerm)) { + // factor expression = matchExpressionBinary(expression); } @@ -142,7 +169,8 @@ shared_ptr Parser::matchFactor() { if (expression == nullptr || !expression->isValid()) return expression; - while (tokens.at(currentIndex)->isOfKind({Token::Kind::STAR, Token::Kind::SLASH, Token::Kind::PERCENT})) { + while (tokens.at(currentIndex)->isOfKind(Token::tokensFactor)) { + // unary expression = matchExpressionBinary(expression); } @@ -196,7 +224,7 @@ shared_ptr Parser::matchExpressionGrouping() { shared_ptr Parser::matchExpressionBinary(shared_ptr left) { shared_ptr token = tokens.at(currentIndex); - if (token->isOfKind({Token::Kind::PLUS, Token::Kind::MINUS, Token::Kind::STAR, Token::Kind::SLASH, Token::Kind::PERCENT})) { + if (token->isOfKind(Token::tokensBinary)) { currentIndex++; shared_ptr right = matchFactor(); if (right == nullptr) { diff --git a/src/Parser.h b/src/Parser.h index 22e19fe..054b130 100644 --- a/src/Parser.h +++ b/src/Parser.h @@ -22,6 +22,8 @@ private: shared_ptr matchStatementInvalid(); shared_ptr nextExpression(); + shared_ptr matchEquality(); // =, != + shared_ptr matchComparison(); // <, <=, >, >= shared_ptr matchTerm(); // +, - shared_ptr matchFactor(); // *, /, % shared_ptr matchPrimary(); // integer, () diff --git a/src/Token.cpp b/src/Token.cpp index b8b6948..4baa857 100644 --- a/src/Token.cpp +++ b/src/Token.cpp @@ -1,5 +1,41 @@ #include "Token.h" +vector Token::tokensEquality = { + Token::Kind::EQUAL, + Token::Kind::NOT_EQUAL +}; +vector Token::tokensComparison = { + Token::Kind::LESS, + Token::Kind::LESS_EQUAL, + Token::Kind::GREATER, + Token::Kind::GREATER_EQUAL +}; +vector Token::tokensTerm = { + Token::Kind::PLUS, + Token::Kind::MINUS +}; +vector Token::tokensFactor = { + Token::Kind::STAR, + Token::Kind::SLASH, + Token::Kind::PERCENT +}; +vector Token::tokensBinary = { + Token::Kind::EQUAL, + Token::Kind::NOT_EQUAL, + + Token::Kind::LESS, + Token::Kind::LESS_EQUAL, + Token::Kind::GREATER, + Token::Kind::GREATER_EQUAL, + + Token::Kind::PLUS, + Token::Kind::MINUS, + + Token::Kind::STAR, + Token::Kind::SLASH, + Token::Kind::PERCENT +}; + Token::Token(Kind kind, string lexme, int line, int column): kind(kind), lexme(lexme), line(line), column(column) { } diff --git a/src/Token.h b/src/Token.h index 1f32570..8d91da6 100644 --- a/src/Token.h +++ b/src/Token.h @@ -45,6 +45,12 @@ private: int column; public: + static vector tokensEquality; + static vector tokensComparison; + static vector tokensTerm; + static vector tokensFactor; + static vector tokensBinary; + Token(Kind kind, string lexme, int line, int column); Kind getKind(); string getLexme();