diff --git a/src/Expression.cpp b/src/Expression.cpp index 0c71700..f9f942a 100644 --- a/src/Expression.cpp +++ b/src/Expression.cpp @@ -127,6 +127,38 @@ string ExpressionGrouping::toString() { return "( " + expression->toString() + " )"; } +// +// ExpressionIfElse +ExpressionIfElse::ExpressionIfElse(shared_ptr condition, shared_ptr thenBlock, shared_ptr elseBlock): + Expression(Expression::Kind::IF_ELSE), condition(condition), thenBlock(thenBlock), elseBlock(elseBlock) { +} + +shared_ptr ExpressionIfElse::getCondition() { + return condition; +} + +shared_ptr ExpressionIfElse::getThenBlock() { + return thenBlock; +} + +shared_ptr ExpressionIfElse::getElseBlock() { + return elseBlock; +} + +string ExpressionIfElse::toString() { + string value = ""; + + value += "IF(" + condition->toString() + ")\n"; + value += thenBlock->toString(); + if (elseBlock != nullptr) { + value += "ELSE\n"; + value += elseBlock->toString(); + } + value += ";"; + + return value; +} + // // ExpressionInvalid ExpressionInvalid::ExpressionInvalid(shared_ptr token): diff --git a/src/Expression.h b/src/Expression.h index 748ad95..a425bcd 100644 --- a/src/Expression.h +++ b/src/Expression.h @@ -2,6 +2,9 @@ #define EXPRESSION_H #include "Token.h" +#include "Statement.h" + +class StatementBlock; using namespace std; @@ -11,6 +14,7 @@ public: LITERAL, GROUPING, BINARY, + IF_ELSE, INVALID }; @@ -73,6 +77,20 @@ public: string toString() override; }; +class ExpressionIfElse: public Expression { +private: + shared_ptr condition; + shared_ptr thenBlock; + shared_ptr elseBlock; + +public: + ExpressionIfElse(shared_ptr condition, shared_ptr thenBlock, shared_ptr elseBlock); + shared_ptr getCondition(); + shared_ptr getThenBlock(); + shared_ptr getElseBlock(); + string toString() override; +}; + class ExpressionInvalid: public Expression { private: shared_ptr token; diff --git a/src/Lexer.cpp b/src/Lexer.cpp index 8fb6f4d..e257b42 100644 --- a/src/Lexer.cpp +++ b/src/Lexer.cpp @@ -161,6 +161,14 @@ shared_ptr Lexer::nextToken() { token = match(Token::Kind::SEMICOLON, ";", false); if (token != nullptr) return token; + + token = match(Token::Kind::QUESTION_QUESTION, "??", false); + if (token != nullptr) + return token; + + token = match(Token::Kind::QUESTION, "?", false); + if (token != nullptr) + return token; // keywords token = match(Token::Kind::FUNCTION, "fun", true); diff --git a/src/Parser.cpp b/src/Parser.cpp index cfda9e4..fecb75c 100644 --- a/src/Parser.cpp +++ b/src/Parser.cpp @@ -122,7 +122,17 @@ shared_ptr Parser::matchStatementInvalid() { // Expression // shared_ptr Parser::nextExpression() { - return matchEquality(); + shared_ptr expression; + + expression = matchEquality(); + if (expression != nullptr) + return expression; + + expression = matchExpressionIfElse(); + if (expression != nullptr) + return expression; + + return nullptr; } shared_ptr Parser::matchEquality() { @@ -243,6 +253,10 @@ shared_ptr Parser::matchExpressionBinary(shared_ptr left return nullptr; } +shared_ptr Parser::matchExpressionIfElse() { + return nullptr; +} + shared_ptr Parser::matchExpressionInvalid() { return make_shared(tokens.at(currentIndex)); } diff --git a/src/Parser.h b/src/Parser.h index 054b130..dc9b63a 100644 --- a/src/Parser.h +++ b/src/Parser.h @@ -31,6 +31,7 @@ private: shared_ptr matchExpressionLiteral(); shared_ptr matchExpressionGrouping(); shared_ptr matchExpressionBinary(shared_ptr left); + shared_ptr matchExpressionIfElse(); shared_ptr matchExpressionInvalid(); bool matchesTokenKinds(vector kinds); diff --git a/src/Statement.h b/src/Statement.h index 01aac2c..1604854 100644 --- a/src/Statement.h +++ b/src/Statement.h @@ -6,6 +6,8 @@ #include "Token.h" #include "Expression.h" +class Expression; + using namespace std; class Statement; diff --git a/src/Token.cpp b/src/Token.cpp index 4baa857..10f45bd 100644 --- a/src/Token.cpp +++ b/src/Token.cpp @@ -103,6 +103,10 @@ string Token::toString() { return "COLON"; case SEMICOLON: return "SEMICOLON"; + case QUESTION_QUESTION: + return "QUESTION_QUESTION"; + case QUESTION: + return "QUESTION"; case INTEGER: return "INTEGER(" + lexme + ")"; diff --git a/src/Token.h b/src/Token.h index 8d91da6..4947759 100644 --- a/src/Token.h +++ b/src/Token.h @@ -25,6 +25,8 @@ public: RIGHT_PAREN, COLON, SEMICOLON, + QUESTION, + QUESTION_QUESTION, FUNCTION, RETURN,