diff --git a/src/Parser.cpp b/src/Parser.cpp index fed88a0..4aa768c 100644 --- a/src/Parser.cpp +++ b/src/Parser.cpp @@ -29,6 +29,10 @@ shared_ptr 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 Parser::matchStatementFunctionDeclaration() { return make_shared(identifierToken->getLexme(), ValueType::SINT32, dynamic_pointer_cast(statementBlock)); } +shared_ptr Parser::matchStatementVarDeclaration() { + if (!matchesTokenKinds({TokenKind::IDENTIFIER, TokenKind::COLON, TokenKind::TYPE})) + return nullptr; + + shared_ptr identifierToken = tokens.at(currentIndex); + currentIndex++; + currentIndex++; // skip colon + shared_ptr valueTypeToken = tokens.at(currentIndex); + currentIndex++; // skip fun + + // Expect left arrow + if (tokens.at(currentIndex)->getKind() != TokenKind::LEFT_ARROW) + return matchStatementInvalid(); + currentIndex++; + + shared_ptr 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(identifierToken->getLexme(), valueType, expression); +} + shared_ptr Parser::matchStatementBlock() { vector> statements; diff --git a/src/Parser.h b/src/Parser.h index 199c1bd..d1fcaba 100644 --- a/src/Parser.h +++ b/src/Parser.h @@ -16,6 +16,7 @@ private: shared_ptr nextStatement(); shared_ptr matchStatementFunctionDeclaration(); + shared_ptr matchStatementVarDeclaration(); shared_ptr matchStatementBlock(); shared_ptr matchStatementReturn(); shared_ptr matchStatementExpression(); diff --git a/src/Statement.cpp b/src/Statement.cpp index cc4f24d..ba16259 100644 --- a/src/Statement.cpp +++ b/src/Statement.cpp @@ -50,8 +50,7 @@ string StatementFunctionDeclaration::toString(int indent) { // // StatementVarDeclaration StatementVarDeclaration::StatementVarDeclaration(string name, ValueType valueType, shared_ptr expression): -Statement(StatementKind::VAR_DECLARATION) { - +Statement(StatementKind::VAR_DECLARATION), name(name), valueType(valueType), expression(expression) { } string StatementVarDeclaration::getName() { diff --git a/src/main.cpp b/src/main.cpp index a4aad53..13fbb63 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -51,9 +51,9 @@ int main(int argc, char **argv) { } cout << endl << endl; - ModuleBuilder moduleBuilder(statements); - shared_ptr module = moduleBuilder.getModule(); - module->print(llvm::outs(), nullptr); + //ModuleBuilder moduleBuilder(statements); + //shared_ptr module = moduleBuilder.getModule(); + //module->print(llvm::outs(), nullptr); //CodeGenerator codeGenerator(module); //codeGenerator.generateObjectFile("dummy.s");