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