diff --git a/samples/test.brc b/samples/test.brc index 3d1cfa0..d5b647e 100644 --- a/samples/test.brc +++ b/samples/test.brc @@ -1,19 +1,17 @@ -@extern putchar fun: character u32 -> u32 +//@extern putchar fun: character u32 -> u32 User blob num1 s32 num2 u8 ; -rawAdd raw<"=r,r,r">: num1 u32, num2 u32 -> u32 +/*rawAdd raw<"=r,r,r">: num1 u32, num2 u32 -> u32 add $1, $2 mov $0, $1 -; +;*/ main fun -> u32 - n1 u32 <- 5 - n2 u32 <- 4 - n3 u32 <- rawAdd(n1, n2) + us User ret 0 ; \ No newline at end of file diff --git a/src/Compiler/ModuleBuilder.cpp b/src/Compiler/ModuleBuilder.cpp index cb0fa73..598f78d 100644 --- a/src/Compiler/ModuleBuilder.cpp +++ b/src/Compiler/ModuleBuilder.cpp @@ -203,14 +203,19 @@ void ModuleBuilder::buildVarDeclaration(shared_ptr statement) if (!setAlloca(statement->getName(), alloca)) return; } else { - llvm::Value *value = valueForExpression(statement->getExpression()); - if (value == nullptr) - return; llvm::AllocaInst *alloca = builder->CreateAlloca(typeForValueType(statement->getValueType(), 0), nullptr, statement->getName()); if (!setAlloca(statement->getName(), alloca)) return; - builder->CreateStore(value, alloca); + + // set initial value + if (statement->getExpression() != nullptr) { + llvm::Value *value = nullptr; + value = valueForExpression(statement->getExpression()); + if (value == nullptr) + return; + builder->CreateStore(value, alloca); + } } } diff --git a/src/Logger.cpp b/src/Logger.cpp index a8559ec..5ffe5ee 100644 --- a/src/Logger.cpp +++ b/src/Logger.cpp @@ -271,7 +271,10 @@ string Logger::toString(shared_ptr statement) { } string Logger::toString(shared_ptr statement) { - return format("{}({}|{})", statement->getName(), toString(statement->getValueType()), toString(statement->getExpression())); + if (statement->getExpression() != nullptr) + return format("{}({}|{})", statement->getName(), toString(statement->getValueType()), toString(statement->getExpression())); + else + return format("{}({})", statement->getName(), toString(statement->getValueType())); } string Logger::toString(shared_ptr statement) { diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp index ce3e639..05f8484 100644 --- a/src/Parser/Parser.cpp +++ b/src/Parser/Parser.cpp @@ -192,8 +192,14 @@ shared_ptr Parser::matchStatementVariable() { { Parsee::tokenParsee(TokenKind::IDENTIFIER, true, true, false), Parsee::valueTypeParsee(true, true, false), - Parsee::tokenParsee(TokenKind::LEFT_ARROW, true, false, true), - Parsee::expressionParsee(true, true, true) + Parsee::groupParsee( + ParseeGroup( + { + Parsee::tokenParsee(TokenKind::LEFT_ARROW, true, false, false), + Parsee::expressionParsee(true, true, true) + } + ), false, true, false + ) } ) ); @@ -203,7 +209,7 @@ shared_ptr Parser::matchStatementVariable() { string identifier = resultsGroup.getResults().at(0).getToken()->getLexme(); shared_ptr valueType = resultsGroup.getResults().at(1).getValueType(); - shared_ptr expression = resultsGroup.getResults().at(2).getExpression(); + shared_ptr expression = resultsGroup.getResults().size() > 2 ? resultsGroup.getResults().at(2).getExpression() : nullptr; return make_shared(identifier, valueType, expression); }