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
|
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
|
||||||
;
|
;
|
||||||
@@ -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());
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user