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