Added grouping

This commit is contained in:
Rafał Grodziński
2025-05-31 20:54:25 +09:00
parent c6f2156e3b
commit 2b78b5bf23
6 changed files with 38 additions and 2 deletions

View File

@@ -7,6 +7,8 @@ Expression::Expression(Kind kind, Token token, shared_ptr<Expression> left, shar
case LITERAL:
setupLiteral(token);
break;
case GROUPING:
setupGrouping(token, left);
case BINARY:
setupBinary(token, left, right);
break;
@@ -24,6 +26,17 @@ void Expression::setupLiteral(Token token) {
integer = stoi(token.getLexme());
}
void Expression::setupGrouping(Token token, shared_ptr<Expression> expression) {
bool isKindValid = token.getKind() == Token::Kind::LEFT_PAREN;
bool isExpressionValid = expression != nullptr && expression->getKind() != Kind::INVALID;
if (!isKindValid || !isExpressionValid)
return;
kind = GROUPING;
left = expression;
}
void Expression::setupBinary(Token token, shared_ptr<Expression> left, shared_ptr<Expression> right) {
bool isKindValid = token.isOneOf({Token::Kind::PLUS, Token::Kind::MINUS, Token::Kind::STAR, Token::Kind::SLASH, Token::Kind::PERCENT});
bool isLeftValid = left != nullptr && left->getKind() != Kind::INVALID;
@@ -90,6 +103,8 @@ std::string Expression::toString() {
switch (kind) {
case LITERAL:
return to_string(integer);
case GROUPING:
return "<( " + left->toString() + " )>";
case BINARY:
switch (operation) {
case ADD: