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