Var without initializer

This commit is contained in:
Rafał Grodziński
2025-08-08 13:11:06 +09:00
parent e4c956cdd6
commit 885094eef6
4 changed files with 26 additions and 14 deletions

View File

@@ -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
;

View File

@@ -203,14 +203,19 @@ void ModuleBuilder::buildVarDeclaration(shared_ptr<StatementVariable> 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);
}
}
}

View File

@@ -271,7 +271,10 @@ string Logger::toString(shared_ptr<StatementMetaExternFunction> statement) {
}
string Logger::toString(shared_ptr<StatementVariable> 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<StatementFunction> statement) {

View File

@@ -192,8 +192,14 @@ shared_ptr<Statement> 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<Statement> Parser::matchStatementVariable() {
string identifier = resultsGroup.getResults().at(0).getToken()->getLexme();
shared_ptr<ValueType> valueType = resultsGroup.getResults().at(1).getValueType();
shared_ptr<Expression> expression = resultsGroup.getResults().at(2).getExpression();
shared_ptr<Expression> expression = resultsGroup.getResults().size() > 2 ? resultsGroup.getResults().at(2).getExpression() : nullptr;
return make_shared<StatementVariable>(identifier, valueType, expression);
}