add if statement
parent
9a97b73c7c
commit
a320086038
|
@ -36,6 +36,11 @@ struct Program
|
|||
myStruct.myInt = myInt;
|
||||
myStruct.Increment();
|
||||
|
||||
if (myStruct.myInt < 5)
|
||||
{
|
||||
myStruct.Increment();
|
||||
}
|
||||
|
||||
return myStruct.myInt;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,6 +17,8 @@
|
|||
"static" return STATIC;
|
||||
"Reference" return REFERENCE;
|
||||
"alloc" return ALLOC;
|
||||
"if" return IF;
|
||||
"else" return ELSE;
|
||||
[0-9]+ return NUMBER;
|
||||
[a-zA-Z][a-zA-Z0-9]* return ID;
|
||||
\"[a-zA-Z][a-zA-Z0-9]*\" return STRING_LITERAL;
|
||||
|
|
|
@ -31,6 +31,8 @@ extern FILE *yyin;
|
|||
%token STATIC
|
||||
%token REFERENCE
|
||||
%token ALLOC
|
||||
%token IF
|
||||
%token ELSE
|
||||
%token NUMBER
|
||||
%token ID
|
||||
%token STRING_LITERAL
|
||||
|
@ -178,6 +180,10 @@ BinaryExpression : Expression PLUS Expression
|
|||
{
|
||||
$$ = MakeBinaryNode(Multiply, $1, $3);
|
||||
}
|
||||
| Expression LESS_THAN Expression
|
||||
{
|
||||
$$ = MakeBinaryNode(LessThan, $1, $3);
|
||||
}
|
||||
|
||||
Expression : PrimaryExpression
|
||||
| UnaryExpression
|
||||
|
@ -229,7 +235,23 @@ PartialStatement : FunctionCallExpression
|
|||
| ReturnStatement
|
||||
;
|
||||
|
||||
Statement : PartialStatement SEMICOLON;
|
||||
IfStatement : IF LEFT_PAREN Expression RIGHT_PAREN LEFT_BRACE Statements RIGHT_BRACE
|
||||
{
|
||||
Node **statements;
|
||||
Node *statementSequence;
|
||||
uint32_t statementCount;
|
||||
|
||||
statements = GetNodes(stack, &statementCount);
|
||||
statementSequence = MakeStatementSequenceNode(statements, statementCount);
|
||||
|
||||
$$ = MakeIfNode($3, statementSequence);
|
||||
|
||||
PopStackFrame(stack);
|
||||
}
|
||||
|
||||
Statement : PartialStatement SEMICOLON
|
||||
| IfStatement
|
||||
;
|
||||
|
||||
Statements : Statement Statements
|
||||
{
|
||||
|
|
13
src/ast.c
13
src/ast.c
|
@ -376,6 +376,19 @@ Node* MakeAllocNode(Node *typeNode)
|
|||
return node;
|
||||
}
|
||||
|
||||
Node* MakeIfNode(
|
||||
Node *expressionNode,
|
||||
Node *statementSequenceNode
|
||||
) {
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = IfStatement;
|
||||
node->childCount = 2;
|
||||
node->children = (Node**) malloc(sizeof(Node*));
|
||||
node->children[0] = expressionNode;
|
||||
node->children[1] = statementSequenceNode;
|
||||
return node;
|
||||
}
|
||||
|
||||
static const char* PrimitiveTypeToString(PrimitiveType type)
|
||||
{
|
||||
switch (type)
|
||||
|
|
|
@ -22,6 +22,7 @@ typedef enum
|
|||
FunctionSignature,
|
||||
FunctionSignatureArguments,
|
||||
Identifier,
|
||||
IfStatement,
|
||||
Number,
|
||||
PrimitiveTypeNode,
|
||||
ReferenceTypeNode,
|
||||
|
@ -44,7 +45,8 @@ typedef enum
|
|||
{
|
||||
Add,
|
||||
Subtract,
|
||||
Multiply
|
||||
Multiply,
|
||||
LessThan
|
||||
} BinaryOperator;
|
||||
|
||||
typedef enum
|
||||
|
@ -174,6 +176,10 @@ Node* MakeAccessExpressionNode(
|
|||
Node* MakeAllocNode(
|
||||
Node *typeNode
|
||||
);
|
||||
Node* MakeIfNode(
|
||||
Node *expressionNode,
|
||||
Node *statementSequenceNode
|
||||
);
|
||||
|
||||
void PrintTree(Node *node, uint32_t tabCount);
|
||||
|
||||
|
|
|
@ -423,7 +423,7 @@ static void AddStructVariablesToScope(
|
|||
|
||||
static LLVMValueRef CompileExpression(
|
||||
LLVMBuilderRef builder,
|
||||
Node *binaryExpression
|
||||
Node *expression
|
||||
);
|
||||
|
||||
static LLVMValueRef CompileNumber(
|
||||
|
@ -442,14 +442,17 @@ static LLVMValueRef CompileBinaryExpression(
|
|||
switch (binaryExpression->operator.binaryOperator)
|
||||
{
|
||||
case Add:
|
||||
return LLVMBuildAdd(builder, left, right, "tmp");
|
||||
return LLVMBuildAdd(builder, left, right, "addResult");
|
||||
|
||||
case Subtract:
|
||||
return LLVMBuildSub(builder, left, right, "tmp");
|
||||
return LLVMBuildSub(builder, left, right, "subtractResult");
|
||||
|
||||
case Multiply:
|
||||
return LLVMBuildMul(builder, left, right, "tmp");
|
||||
return LLVMBuildMul(builder, left, right, "multiplyResult");
|
||||
|
||||
/* FIXME: need type information for comparison */
|
||||
case LessThan:
|
||||
return LLVMBuildICmp(builder, LLVMIntSLT, left, right, "compareResult");
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
@ -575,6 +578,8 @@ static LLVMValueRef CompileExpression(
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static uint8_t CompileStatement(LLVMBuilderRef builder, LLVMValueRef function, Node *statement);
|
||||
|
||||
static void CompileReturn(LLVMBuilderRef builder, Node *returnStatemement)
|
||||
{
|
||||
LLVMValueRef expression = CompileExpression(builder, returnStatemement->children[0]);
|
||||
|
@ -622,6 +627,27 @@ static void CompileFunctionVariableDeclaration(LLVMBuilderRef builder, Node *var
|
|||
AddLocalVariable(scope, variable, variableName);
|
||||
}
|
||||
|
||||
static void CompileIfStatement(LLVMBuilderRef builder, LLVMValueRef function, Node *ifStatement)
|
||||
{
|
||||
uint32_t i;
|
||||
LLVMValueRef conditional = CompileExpression(builder, ifStatement->children[0]);
|
||||
|
||||
LLVMBasicBlockRef block = LLVMAppendBasicBlock(function, "ifBlock");
|
||||
LLVMBasicBlockRef afterCond = LLVMAppendBasicBlock(function, "afterCond");
|
||||
|
||||
LLVMBuildCondBr(builder, conditional, block, afterCond);
|
||||
|
||||
LLVMPositionBuilderAtEnd(builder, block);
|
||||
|
||||
for (i = 0; i < ifStatement->children[1]->childCount; i += 1)
|
||||
{
|
||||
CompileStatement(builder, function, ifStatement->children[1]->children[i]);
|
||||
LLVMBuildBr(builder, afterCond);
|
||||
}
|
||||
|
||||
LLVMPositionBuilderAtEnd(builder, afterCond);
|
||||
}
|
||||
|
||||
static uint8_t CompileStatement(LLVMBuilderRef builder, LLVMValueRef function, Node *statement)
|
||||
{
|
||||
switch (statement->syntaxKind)
|
||||
|
@ -638,6 +664,10 @@ static uint8_t CompileStatement(LLVMBuilderRef builder, LLVMValueRef function, N
|
|||
CompileFunctionVariableDeclaration(builder, statement);
|
||||
return 0;
|
||||
|
||||
case IfStatement:
|
||||
CompileIfStatement(builder, function, statement);
|
||||
return 0;
|
||||
|
||||
case Return:
|
||||
CompileReturn(builder, statement);
|
||||
return 1;
|
||||
|
|
Loading…
Reference in New Issue