initializing compiler structure
							parent
							
								
									545a010e58
								
							
						
					
					
						commit
						392ce41e97
					
				
							
								
								
									
										57
									
								
								compiler.c
								
								
								
								
							
							
						
						
									
										57
									
								
								compiler.c
								
								
								
								
							|  | @ -1,11 +1,60 @@ | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| 
 |  | ||||||
| #include <llvm-c/Core.h> | #include <llvm-c/Core.h> | ||||||
|  | 
 | ||||||
| #include "y.tab.h" | #include "y.tab.h" | ||||||
|  | #include "ast.h" | ||||||
| #include "stack.h" | #include "stack.h" | ||||||
| 
 | 
 | ||||||
| extern FILE *yyin; | extern FILE *yyin; | ||||||
| Stack *stack; | Stack *stack; | ||||||
|  | Node *rootNode; | ||||||
|  | 
 | ||||||
|  | LLVMTypeRef WraithTypeToLLVMType(PrimitiveType type) | ||||||
|  | { | ||||||
|  |     switch (type) | ||||||
|  |     { | ||||||
|  |         case Int: | ||||||
|  |             return LLVMInt64Type(); | ||||||
|  | 
 | ||||||
|  |         case UInt: | ||||||
|  |             return LLVMInt64Type(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return NULL; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void CompileFunction(LLVMModuleRef module, Node *functionDeclaration) | ||||||
|  | { | ||||||
|  |     uint32_t i; | ||||||
|  |     Node *functionSignature = functionDeclaration->children[0]; | ||||||
|  |     LLVMTypeRef paramTypes[functionSignature->children[2]->childCount]; | ||||||
|  | 
 | ||||||
|  |     for (i = 0; i < functionSignature->children[2]->childCount; i += 1) | ||||||
|  |     { | ||||||
|  |         LLVMTypeRef paramType = WraithTypeToLLVMType(functionSignature->children[0]->type); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     LLVMTypeRef returnType = WraithTypeToLLVMType(functionSignature->children[1]->type); | ||||||
|  | 
 | ||||||
|  |     LLVMAddFunction(module, functionSignature->children[0]->value.string, returnType); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Compile(LLVMModuleRef module, Node *node) | ||||||
|  | { | ||||||
|  |     uint32_t i; | ||||||
|  | 
 | ||||||
|  |     switch (node->syntaxKind) | ||||||
|  |     { | ||||||
|  |         case FunctionDeclaration: | ||||||
|  |             CompileFunction(module, node); | ||||||
|  |             break; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     for (i = 0; i < node->childCount; i += 1) | ||||||
|  |     { | ||||||
|  |         Compile(module, node->children[i]); | ||||||
|  |     } | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| int main(int argc, char *argv[]) | int main(int argc, char *argv[]) | ||||||
| { | { | ||||||
|  | @ -22,7 +71,11 @@ int main(int argc, char *argv[]) | ||||||
|     yyparse(fp, stack); |     yyparse(fp, stack); | ||||||
|     fclose(fp); |     fclose(fp); | ||||||
| 
 | 
 | ||||||
|     LLVMModuleRef mod = LLVMModuleCreateWithName("my_module"); |     PrintTree(rootNode, 0); | ||||||
|  | 
 | ||||||
|  |     LLVMModuleRef module = LLVMModuleCreateWithName("my_module"); | ||||||
|  | 
 | ||||||
|  |     Compile(module, rootNode); | ||||||
| 
 | 
 | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										5
									
								
								wraith.y
								
								
								
								
							
							
						
						
									
										5
									
								
								wraith.y
								
								
								
								
							|  | @ -15,6 +15,8 @@ void yyerror(FILE *fp, Stack *stack, char *s) | ||||||
| extern char *yytext; | extern char *yytext; | ||||||
| extern int yylex (void); | extern int yylex (void); | ||||||
| extern FILE *yyin; | extern FILE *yyin; | ||||||
|  | 
 | ||||||
|  | extern Node *rootNode; | ||||||
| %} | %} | ||||||
| 
 | 
 | ||||||
| %define api.value.type {struct Node*} | %define api.value.type {struct Node*} | ||||||
|  | @ -73,7 +75,8 @@ Program                 : Declarations | ||||||
|                             declarationSequence = MakeDeclarationSequenceNode(declarations, declarationCount); |                             declarationSequence = MakeDeclarationSequenceNode(declarations, declarationCount); | ||||||
| 
 | 
 | ||||||
|                             PopStackFrame(stack); |                             PopStackFrame(stack); | ||||||
|                             PrintTree(declarationSequence, 0); | 
 | ||||||
|  |                             rootNode = declarationSequence; | ||||||
|                         } |                         } | ||||||
| 
 | 
 | ||||||
| Type                    : INT | Type                    : INT | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue