From 36e798ae3f20733fce4c81042864f5d00e684871 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Grodzi=C5=84ski?= Date: Wed, 4 Jun 2025 15:55:27 +0900 Subject: [PATCH] Refactored expressions --- src/Expression.h | 40 ++++++++++----------- src/Parser.cpp | 92 +++++++++++++++++++++++++----------------------- src/Parser.h | 12 +++---- 3 files changed, 74 insertions(+), 70 deletions(-) diff --git a/src/Expression.h b/src/Expression.h index e4547bc..c5ad1e2 100644 --- a/src/Expression.h +++ b/src/Expression.h @@ -24,6 +24,26 @@ public: virtual string toString(); }; +class ExpressionLiteral: public Expression { +private: + int64_t integer = 0; + +public: + ExpressionLiteral(shared_ptr token); + int64_t getInteger(); + string toString() override; +}; + +class ExpressionGrouping: public Expression { +private: + shared_ptr expression; + +public: + ExpressionGrouping(shared_ptr expression); + shared_ptr getExpression(); + string toString() override; +}; + class ExpressionBinary: public Expression { public: enum Operation { @@ -47,26 +67,6 @@ public: string toString() override; }; -class ExpressionLiteral: public Expression { -private: - int64_t integer = 0; - -public: - ExpressionLiteral(shared_ptr token); - int64_t getInteger(); - string toString() override; -}; - -class ExpressionGrouping: public Expression { -private: - shared_ptr expression; - -public: - ExpressionGrouping(shared_ptr expression); - shared_ptr getExpression(); - string toString() override; -}; - class ExpressionInvalid: public Expression { private: shared_ptr token; diff --git a/src/Parser.cpp b/src/Parser.cpp index 600d848..3409f02 100644 --- a/src/Parser.cpp +++ b/src/Parser.cpp @@ -111,7 +111,6 @@ shared_ptr Parser::matchStatementExpression() { else if (!expression->isValid()) return make_shared(tokens.at(currentIndex)); - currentIndex++; return make_shared(expression); } @@ -123,89 +122,94 @@ shared_ptr Parser::matchStatementInvalid() { // Expression // shared_ptr Parser::nextExpression() { - return matchExpressionInvalid(); + return matchTerm(); } -/*shared_ptr Parser::term() { - shared_ptr expression = factor(); - if (!expression->isValid()) +shared_ptr Parser::matchTerm() { + shared_ptr expression = matchFactor(); + if (expression == nullptr || !expression->isValid()) return expression; while (tokens.at(currentIndex)->isOfKind({Token::Kind::PLUS, Token::Kind::MINUS})) { - expression = matchBinary(expression); + expression = matchExpressionBinary(expression); } return expression; } -shared_ptr Parser::factor() { - shared_ptr expression = primary(); - if (!expression->isValid()) +shared_ptr Parser::matchFactor() { + shared_ptr expression = matchPrimary(); + if (expression == nullptr || !expression->isValid()) return expression; while (tokens.at(currentIndex)->isOfKind({Token::Kind::STAR, Token::Kind::SLASH, Token::Kind::PERCENT})) { - expression = matchBinary(expression); + expression = matchExpressionBinary(expression); } return expression; } -shared_ptr Parser::primary() { - { - shared_ptr expression = matchInteger(); - if (expression->isValid()) - return expression; - } +shared_ptr Parser::matchPrimary() { + shared_ptr expression; - { - shared_ptr expression = matchGrouping(); - if (expression->isValid()) - return expression; - } + expression = matchExpressionLiteral(); + if (expression != nullptr) + return expression; + + expression = matchExpressionGrouping(); + if (expression != nullptr) + return expression; - return make_shared(Expression::Kind::INVALID, tokens.at(currentIndex), nullptr, nullptr); + return nullptr; } -shared_ptr Parser::matchInteger() { - Token token = tokens.at(currentIndex); - if (token.getKind() == Token::Kind::INTEGER) { +shared_ptr Parser::matchExpressionLiteral() { + shared_ptr token = tokens.at(currentIndex); + if (token->isOfKind({Token::Kind::INTEGER})) { currentIndex++; - return make_shared(Expression::Kind::LITERAL, token, nullptr, nullptr); + return make_shared(token); } - return make_shared(Expression::Kind::INVALID, token, nullptr, nullptr); + return nullptr; } -shared_ptr Parser::matchGrouping() { - Token token = tokens.at(currentIndex); - if (token.getKind() == Token::Kind::LEFT_PAREN) { +shared_ptr Parser::matchExpressionGrouping() { + shared_ptr token = tokens.at(currentIndex); + if (token->getKind() == Token::Kind::LEFT_PAREN) { currentIndex++; - shared_ptr expression = term(); + shared_ptr expression = matchTerm(); // has grouped expression failed? - if (!expression->isValid()) + if (expression == nullptr) { + return matchExpressionInvalid(); + } else if(!expression->isValid()) { return expression; - if (tokens.at(currentIndex)->getKind() == Token::Kind::RIGHT_PAREN) { + } else if (tokens.at(currentIndex)->getKind() == Token::Kind::RIGHT_PAREN) { currentIndex++; - return make_shared(Expression::Kind::GROUPING, token, expression, nullptr); + return make_shared(expression); + } else { + return matchExpressionInvalid(); } } - return make_shared(Expression::Kind::INVALID, token, nullptr, nullptr); + return nullptr; } -shared_ptr Parser::matchBinary(shared_ptr left) { - Token token = tokens.at(currentIndex); - if (token.isOfKind({Token::Kind::PLUS, Token::Kind::MINUS, Token::Kind::STAR, Token::Kind::SLASH, Token::Kind::PERCENT})) { +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})) { currentIndex++; - shared_ptr right = factor(); - // Has right expression failed? - if (!right->isValid()) + shared_ptr right = matchFactor(); + if (right == nullptr) { + return matchExpressionInvalid(); + } else if (!right->isValid()) { return right; - return make_shared(Expression::Kind::BINARY, token, left, right); + } else { + return make_shared(token, left, right); + } } - return make_shared(Expression::Kind::INVALID, token, nullptr, nullptr); -}*/ + return nullptr; +} shared_ptr Parser::matchExpressionInvalid() { return make_shared(tokens.at(currentIndex)); diff --git a/src/Parser.h b/src/Parser.h index 3675d09..22e19fe 100644 --- a/src/Parser.h +++ b/src/Parser.h @@ -22,13 +22,13 @@ private: shared_ptr matchStatementInvalid(); shared_ptr nextExpression(); - /*shared_ptr term(); // +, - - shared_ptr factor(); // *, /, % - shared_ptr primary(); // integer, () + shared_ptr matchTerm(); // +, - + shared_ptr matchFactor(); // *, /, % + shared_ptr matchPrimary(); // integer, () - shared_ptr matchInteger(); - shared_ptr matchGrouping(); - shared_ptr matchBinary(shared_ptr left);*/ + shared_ptr matchExpressionLiteral(); + shared_ptr matchExpressionGrouping(); + shared_ptr matchExpressionBinary(shared_ptr left); shared_ptr matchExpressionInvalid(); bool matchesTokenKinds(vector kinds);