forked from cosmonaut/wraith-lang
if-else chains
parent
708d4de0ae
commit
c728dd6b8c
|
@ -23,7 +23,7 @@ find_package(LLVM)
|
|||
|
||||
include_directories(${CMAKE_SOURCE_DIR})
|
||||
|
||||
BISON_TARGET(Parser generators/wraith.y ${CMAKE_CURRENT_BINARY_DIR}/y.tab.c COMPILE_FLAGS "-d -v -t")
|
||||
BISON_TARGET(Parser generators/wraith.y ${CMAKE_CURRENT_BINARY_DIR}/y.tab.c COMPILE_FLAGS "-d -v -t -Wcounterexamples")
|
||||
FLEX_TARGET(Scanner generators/wraith.lex ${CMAKE_CURRENT_BINARY_DIR}/lex.yy.c)
|
||||
|
||||
ADD_FLEX_BISON_DEPENDENCY(Scanner Parser)
|
||||
|
|
|
@ -45,10 +45,14 @@ struct Program
|
|||
{
|
||||
myStruct.Increment();
|
||||
}
|
||||
else
|
||||
else if (myStruct.myInt > 10)
|
||||
{
|
||||
myStruct.Decrement();
|
||||
}
|
||||
else
|
||||
{
|
||||
myStruct.myInt = 4;
|
||||
}
|
||||
|
||||
return myStruct.myInt;
|
||||
}
|
||||
|
|
|
@ -65,7 +65,9 @@ extern FILE *yyin;
|
|||
|
||||
%define parse.error verbose
|
||||
|
||||
%left GREATER_THAN LESS_THAN
|
||||
%left PLUS MINUS
|
||||
%left STAR
|
||||
%left BANG
|
||||
%left LEFT_PAREN RIGHT_PAREN
|
||||
|
||||
|
@ -174,10 +176,14 @@ BinaryExpression : Expression PLUS Expression
|
|||
{
|
||||
$$ = MakeBinaryNode(LessThan, $1, $3);
|
||||
}
|
||||
| Expression GREATER_THAN Expression
|
||||
{
|
||||
$$ = MakeBinaryNode(GreaterThan, $1, $3);
|
||||
}
|
||||
|
||||
Expression : PrimaryExpression
|
||||
Expression : BinaryExpression
|
||||
| UnaryExpression
|
||||
| BinaryExpression
|
||||
| PrimaryExpression
|
||||
| HeapAllocation
|
||||
;
|
||||
|
||||
|
@ -229,6 +235,10 @@ Conditional : IfStatement
|
|||
{
|
||||
$$ = MakeIfElseNode($1, $4);
|
||||
}
|
||||
| IfStatement ELSE Conditional
|
||||
{
|
||||
$$ = MakeIfElseNode($1, $3);
|
||||
}
|
||||
|
||||
Statement : PartialStatement SEMICOLON
|
||||
| Conditional
|
||||
|
|
|
@ -47,7 +47,8 @@ typedef enum
|
|||
Add,
|
||||
Subtract,
|
||||
Multiply,
|
||||
LessThan
|
||||
LessThan,
|
||||
GreaterThan
|
||||
} BinaryOperator;
|
||||
|
||||
typedef enum
|
||||
|
|
|
@ -452,7 +452,10 @@ static LLVMValueRef CompileBinaryExpression(
|
|||
|
||||
/* FIXME: need type information for comparison */
|
||||
case LessThan:
|
||||
return LLVMBuildICmp(builder, LLVMIntSLT, left, right, "compareResult");
|
||||
return LLVMBuildICmp(builder, LLVMIntSLT, left, right, "lessThanResult");
|
||||
|
||||
case GreaterThan:
|
||||
return LLVMBuildICmp(builder, LLVMIntSGT, left, right, "greaterThanResult");
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
@ -670,9 +673,16 @@ static void CompileIfElseStatement(LLVMBuilderRef builder, LLVMValueRef function
|
|||
|
||||
LLVMPositionBuilderAtEnd(builder, elseBlock);
|
||||
|
||||
for (i = 0; i < ifElseStatement->children[1]->childCount; i += 1)
|
||||
if (ifElseStatement->children[1]->syntaxKind == StatementSequence)
|
||||
{
|
||||
CompileStatement(builder, function, ifElseStatement->children[1]->children[i]);
|
||||
for (i = 0; i < ifElseStatement->children[1]->childCount; i += 1)
|
||||
{
|
||||
CompileStatement(builder, function, ifElseStatement->children[1]->children[i]);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
CompileStatement(builder, function, ifElseStatement->children[1]);
|
||||
}
|
||||
|
||||
LLVMBuildBr(builder, afterCond);
|
||||
|
|
Loading…
Reference in New Issue