Parse var declaration

This commit is contained in:
Rafał Grodziński
2025-06-09 00:11:56 +09:00
parent a28ddf7d87
commit 406fccd0b1
4 changed files with 48 additions and 5 deletions

View File

@@ -29,6 +29,10 @@ shared_ptr<Statement> Parser::nextStatement() {
if (statement != nullptr)
return statement;
statement = matchStatementVarDeclaration();
if (statement != nullptr)
return statement;
statement = matchStatementReturn();
if (statement != nullptr)
return statement;
@@ -62,6 +66,45 @@ shared_ptr<Statement> Parser::matchStatementFunctionDeclaration() {
return make_shared<StatementFunctionDeclaration>(identifierToken->getLexme(), ValueType::SINT32, dynamic_pointer_cast<StatementBlock>(statementBlock));
}
shared_ptr<Statement> Parser::matchStatementVarDeclaration() {
if (!matchesTokenKinds({TokenKind::IDENTIFIER, TokenKind::COLON, TokenKind::TYPE}))
return nullptr;
shared_ptr<Token> identifierToken = tokens.at(currentIndex);
currentIndex++;
currentIndex++; // skip colon
shared_ptr<Token> valueTypeToken = tokens.at(currentIndex);
currentIndex++; // skip fun
// Expect left arrow
if (tokens.at(currentIndex)->getKind() != TokenKind::LEFT_ARROW)
return matchStatementInvalid();
currentIndex++;
shared_ptr<Expression> expression = nextExpression();
if (expression == nullptr || !expression->isValid())
return matchStatementInvalid();
ValueType valueType;
if (valueTypeToken->getLexme().compare("Void") == 0)
valueType = ValueType::VOID;
else if (valueTypeToken->getLexme().compare("Bool") == 0)
valueType = ValueType::BOOL;
else if (valueTypeToken->getLexme().compare("SInt32") == 0)
valueType = ValueType::SINT32;
else if (valueTypeToken->getLexme().compare("Real32") == 0)
valueType = ValueType::REAL32;
else
return matchStatementInvalid();
//if (tokens.at(currentIndex)->getKind() != TokenKind::NEW_LINE)
// return matchStatementInvalid();
//currentIndex++;
return make_shared<StatementVarDeclaration>(identifierToken->getLexme(), valueType, expression);
}
shared_ptr<Statement> Parser::matchStatementBlock() {
vector<shared_ptr<Statement>> statements;