Failing expression for condition

This commit is contained in:
Rafał Grodziński
2025-06-05 16:08:19 +09:00
parent 1591c5927c
commit c500edf632
8 changed files with 82 additions and 1 deletions

View File

@@ -127,6 +127,38 @@ string ExpressionGrouping::toString() {
return "( " + expression->toString() + " )"; return "( " + expression->toString() + " )";
} }
//
// ExpressionIfElse
ExpressionIfElse::ExpressionIfElse(shared_ptr<Expression> condition, shared_ptr<StatementBlock> thenBlock, shared_ptr<StatementBlock> elseBlock):
Expression(Expression::Kind::IF_ELSE), condition(condition), thenBlock(thenBlock), elseBlock(elseBlock) {
}
shared_ptr<Expression> ExpressionIfElse::getCondition() {
return condition;
}
shared_ptr<StatementBlock> ExpressionIfElse::getThenBlock() {
return thenBlock;
}
shared_ptr<StatementBlock> 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::ExpressionInvalid(shared_ptr<Token> token): ExpressionInvalid::ExpressionInvalid(shared_ptr<Token> token):

View File

@@ -2,6 +2,9 @@
#define EXPRESSION_H #define EXPRESSION_H
#include "Token.h" #include "Token.h"
#include "Statement.h"
class StatementBlock;
using namespace std; using namespace std;
@@ -11,6 +14,7 @@ public:
LITERAL, LITERAL,
GROUPING, GROUPING,
BINARY, BINARY,
IF_ELSE,
INVALID INVALID
}; };
@@ -73,6 +77,20 @@ public:
string toString() override; string toString() override;
}; };
class ExpressionIfElse: public Expression {
private:
shared_ptr<Expression> condition;
shared_ptr<StatementBlock> thenBlock;
shared_ptr<StatementBlock> elseBlock;
public:
ExpressionIfElse(shared_ptr<Expression> condition, shared_ptr<StatementBlock> thenBlock, shared_ptr<StatementBlock> elseBlock);
shared_ptr<Expression> getCondition();
shared_ptr<StatementBlock> getThenBlock();
shared_ptr<StatementBlock> getElseBlock();
string toString() override;
};
class ExpressionInvalid: public Expression { class ExpressionInvalid: public Expression {
private: private:
shared_ptr<Token> token; shared_ptr<Token> token;

View File

@@ -162,6 +162,14 @@ shared_ptr<Token> Lexer::nextToken() {
if (token != nullptr) if (token != nullptr)
return token; 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 // keywords
token = match(Token::Kind::FUNCTION, "fun", true); token = match(Token::Kind::FUNCTION, "fun", true);
if (token != nullptr) if (token != nullptr)

View File

@@ -122,7 +122,17 @@ shared_ptr<StatementInvalid> Parser::matchStatementInvalid() {
// Expression // Expression
// //
shared_ptr<Expression> Parser::nextExpression() { shared_ptr<Expression> Parser::nextExpression() {
return matchEquality(); shared_ptr<Expression> expression;
expression = matchEquality();
if (expression != nullptr)
return expression;
expression = matchExpressionIfElse();
if (expression != nullptr)
return expression;
return nullptr;
} }
shared_ptr<Expression> Parser::matchEquality() { shared_ptr<Expression> Parser::matchEquality() {
@@ -243,6 +253,10 @@ shared_ptr<Expression> Parser::matchExpressionBinary(shared_ptr<Expression> left
return nullptr; return nullptr;
} }
shared_ptr<Expression> Parser::matchExpressionIfElse() {
return nullptr;
}
shared_ptr<ExpressionInvalid> Parser::matchExpressionInvalid() { shared_ptr<ExpressionInvalid> Parser::matchExpressionInvalid() {
return make_shared<ExpressionInvalid>(tokens.at(currentIndex)); return make_shared<ExpressionInvalid>(tokens.at(currentIndex));
} }

View File

@@ -31,6 +31,7 @@ private:
shared_ptr<Expression> matchExpressionLiteral(); shared_ptr<Expression> matchExpressionLiteral();
shared_ptr<Expression> matchExpressionGrouping(); shared_ptr<Expression> matchExpressionGrouping();
shared_ptr<Expression> matchExpressionBinary(shared_ptr<Expression> left); shared_ptr<Expression> matchExpressionBinary(shared_ptr<Expression> left);
shared_ptr<Expression> matchExpressionIfElse();
shared_ptr<ExpressionInvalid> matchExpressionInvalid(); shared_ptr<ExpressionInvalid> matchExpressionInvalid();
bool matchesTokenKinds(vector<Token::Kind> kinds); bool matchesTokenKinds(vector<Token::Kind> kinds);

View File

@@ -6,6 +6,8 @@
#include "Token.h" #include "Token.h"
#include "Expression.h" #include "Expression.h"
class Expression;
using namespace std; using namespace std;
class Statement; class Statement;

View File

@@ -103,6 +103,10 @@ string Token::toString() {
return "COLON"; return "COLON";
case SEMICOLON: case SEMICOLON:
return "SEMICOLON"; return "SEMICOLON";
case QUESTION_QUESTION:
return "QUESTION_QUESTION";
case QUESTION:
return "QUESTION";
case INTEGER: case INTEGER:
return "INTEGER(" + lexme + ")"; return "INTEGER(" + lexme + ")";

View File

@@ -25,6 +25,8 @@ public:
RIGHT_PAREN, RIGHT_PAREN,
COLON, COLON,
SEMICOLON, SEMICOLON,
QUESTION,
QUESTION_QUESTION,
FUNCTION, FUNCTION,
RETURN, RETURN,