Return statement
This commit is contained in:
@@ -29,6 +29,12 @@ shared_ptr<Statement> Parser::nextStatement() {
|
||||
return statement;
|
||||
}
|
||||
|
||||
{
|
||||
shared_ptr<Statement> statement = matchReturnStatement();
|
||||
if (statement->isValid())
|
||||
return statement;
|
||||
}
|
||||
|
||||
{
|
||||
shared_ptr<Statement> statement = matchExpressionStatement();
|
||||
if (statement->isValid())
|
||||
@@ -78,6 +84,24 @@ shared_ptr<Statement> Parser::matchBlockStatement() {
|
||||
return make_shared<Statement>(Statement::Kind::BLOCK, nullptr, nullptr, nullptr, statements, "");
|
||||
}
|
||||
|
||||
shared_ptr<Statement> Parser::matchReturnStatement() {
|
||||
if (tokens.at(currentIndex).getKind() != Token::Kind::RETURN)
|
||||
return make_shared<Statement>(Statement::Kind::INVALID, make_shared<Token>(tokens.at(currentIndex)), nullptr, nullptr, vector<shared_ptr<Statement>>(), "");
|
||||
|
||||
currentIndex++;
|
||||
|
||||
shared_ptr<Expression> expression = term();
|
||||
if (!expression->isValid())
|
||||
expression = nullptr;
|
||||
|
||||
if (tokens.at(currentIndex).getKind() != Token::Kind::NEW_LINE)
|
||||
return make_shared<Statement>(Statement::Kind::INVALID, make_shared<Token>(tokens.at(currentIndex)), nullptr, nullptr, vector<shared_ptr<Statement>>(), "");
|
||||
|
||||
currentIndex++; // new line
|
||||
|
||||
return make_shared<Statement>(Statement::Kind::RETURN, nullptr, expression, nullptr, vector<shared_ptr<Statement>>(), "");
|
||||
}
|
||||
|
||||
shared_ptr<Statement> Parser::matchInvalidStatement() {
|
||||
return make_shared<Statement>(Statement::Kind::INVALID, make_shared<Token>(tokens.at(currentIndex)), nullptr, nullptr, vector<shared_ptr<Statement>>(), "");
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ private:
|
||||
|
||||
shared_ptr<Statement> matchFunctionDeclarationStatement();
|
||||
shared_ptr<Statement> matchBlockStatement();
|
||||
shared_ptr<Statement> matchReturnStatement();
|
||||
shared_ptr<Statement> matchInvalidStatement();
|
||||
|
||||
shared_ptr<Statement> matchExpressionStatement();
|
||||
|
||||
@@ -31,6 +31,13 @@ string Statement::toString() {
|
||||
}
|
||||
case FUNCTION_DECLARATION:
|
||||
return "FUNCTION " + name + "\n" + blockStatement->toString() + "\n;";
|
||||
case RETURN: {
|
||||
string value = "RETURN";
|
||||
if (expression != nullptr) {
|
||||
value += " " + expression->toString();
|
||||
}
|
||||
return value;
|
||||
}
|
||||
case INVALID:
|
||||
return "INVALID";
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@ public:
|
||||
EXPRESSION,
|
||||
BLOCK,
|
||||
FUNCTION_DECLARATION,
|
||||
RETURN,
|
||||
INVALID
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user