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 User blob
num1 s32 num1 s32
num2 u8 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 add $1, $2
mov $0, $1 mov $0, $1
; ;*/
main fun -> u32 main fun -> u32
n1 u32 <- 5 us User
n2 u32 <- 4
n3 u32 <- rawAdd(n1, n2)
ret 0 ret 0
; ;

View File

@@ -203,16 +203,21 @@ void ModuleBuilder::buildVarDeclaration(shared_ptr<StatementVariable> statement)
if (!setAlloca(statement->getName(), alloca)) if (!setAlloca(statement->getName(), alloca))
return; return;
} else { } else {
llvm::Value *value = valueForExpression(statement->getExpression());
if (value == nullptr)
return;
llvm::AllocaInst *alloca = builder->CreateAlloca(typeForValueType(statement->getValueType(), 0), nullptr, statement->getName()); llvm::AllocaInst *alloca = builder->CreateAlloca(typeForValueType(statement->getValueType(), 0), nullptr, statement->getName());
if (!setAlloca(statement->getName(), alloca)) if (!setAlloca(statement->getName(), alloca))
return; return;
// set initial value
if (statement->getExpression() != nullptr) {
llvm::Value *value = nullptr;
value = valueForExpression(statement->getExpression());
if (value == nullptr)
return;
builder->CreateStore(value, alloca); builder->CreateStore(value, alloca);
} }
} }
}
void ModuleBuilder::buildAssignment(shared_ptr<StatementAssignment> statement) { void ModuleBuilder::buildAssignment(shared_ptr<StatementAssignment> statement) {
llvm::AllocaInst *alloca = getAlloca(statement->getName()); llvm::AllocaInst *alloca = getAlloca(statement->getName());

View File

@@ -271,7 +271,10 @@ string Logger::toString(shared_ptr<StatementMetaExternFunction> statement) {
} }
string Logger::toString(shared_ptr<StatementVariable> statement) { string Logger::toString(shared_ptr<StatementVariable> statement) {
if (statement->getExpression() != nullptr)
return format("{}({}|{})", statement->getName(), toString(statement->getValueType()), toString(statement->getExpression())); 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) { string Logger::toString(shared_ptr<StatementFunction> statement) {

View File

@@ -192,9 +192,15 @@ shared_ptr<Statement> Parser::matchStatementVariable() {
{ {
Parsee::tokenParsee(TokenKind::IDENTIFIER, true, true, false), Parsee::tokenParsee(TokenKind::IDENTIFIER, true, true, false),
Parsee::valueTypeParsee(true, true, false), Parsee::valueTypeParsee(true, true, false),
Parsee::tokenParsee(TokenKind::LEFT_ARROW, true, false, true), Parsee::groupParsee(
ParseeGroup(
{
Parsee::tokenParsee(TokenKind::LEFT_ARROW, true, false, false),
Parsee::expressionParsee(true, true, true) 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(); string identifier = resultsGroup.getResults().at(0).getToken()->getLexme();
shared_ptr<ValueType> valueType = resultsGroup.getResults().at(1).getValueType(); 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); return make_shared<StatementVariable>(identifier, valueType, expression);
} }