Var without initializer
This commit is contained in:
@@ -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
|
||||
;
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user