forked from cosmonaut/wraith-lang
started expanding type system
parent
c4c916a2de
commit
b00cde2193
50
ast.c
50
ast.c
|
@ -25,6 +25,7 @@ const char* SyntaxKindString(SyntaxKind syntaxKind)
|
|||
case Assignment: return "Assignment";
|
||||
case BinaryExpression: return "BinaryExpression";
|
||||
case Comment: return "Comment";
|
||||
case CustomTypeNode: return "CustomTypeNode";
|
||||
case Declaration: return "Declaration";
|
||||
case DeclarationSequence: return "DeclarationSequence";
|
||||
case FunctionArgumentSequence: return "FunctionArgumentSequence";
|
||||
|
@ -35,6 +36,8 @@ const char* SyntaxKindString(SyntaxKind syntaxKind)
|
|||
case FunctionSignatureArguments: return "FunctionSignatureArguments";
|
||||
case Identifier: return "Identifier";
|
||||
case Number: return "Number";
|
||||
case PrimitiveTypeNode: return "PrimitiveTypeNode";
|
||||
case ReferenceTypeNode: return "ReferenceTypeNode";
|
||||
case Return: return "Return";
|
||||
case StatementSequence: return "StatementSequence";
|
||||
case StaticModifier: return "StaticModifier";
|
||||
|
@ -46,25 +49,51 @@ const char* SyntaxKindString(SyntaxKind syntaxKind)
|
|||
}
|
||||
}
|
||||
|
||||
Node* MakeTypeNode(
|
||||
uint8_t IsPrimitiveType(
|
||||
Node *typeNode
|
||||
) {
|
||||
return typeNode->children[0]->syntaxKind == PrimitiveTypeNode;
|
||||
}
|
||||
|
||||
Node* MakePrimitiveTypeNode(
|
||||
PrimitiveType type
|
||||
) {
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = Type;
|
||||
node->type = type;
|
||||
node->syntaxKind = PrimitiveTypeNode;
|
||||
node->primitiveType = type;
|
||||
node->childCount = 0;
|
||||
return node;
|
||||
}
|
||||
|
||||
Node* MakeCustomTypeNode(
|
||||
Node *identifierNode
|
||||
char *name
|
||||
) {
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = CustomTypeNode;
|
||||
node->value.string = strdup(name);
|
||||
node->childCount = 0;
|
||||
return node;
|
||||
}
|
||||
|
||||
Node* MakeReferenceTypeNode(
|
||||
Node *typeNode
|
||||
) {
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = ReferenceTypeNode;
|
||||
node->childCount = 1;
|
||||
node->children = (Node**) malloc(sizeof(Node*));
|
||||
node->children[0] = typeNode;
|
||||
return node;
|
||||
}
|
||||
|
||||
Node* MakeTypeNode(
|
||||
Node* typeNode
|
||||
) {
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = Type;
|
||||
node->type = CustomType;
|
||||
node->childCount = 1;
|
||||
node->children = (Node**) malloc(sizeof(Node*));
|
||||
node->children[0] = identifierNode;
|
||||
node->children[0] = typeNode;
|
||||
return node;
|
||||
}
|
||||
|
||||
|
@ -344,7 +373,6 @@ static const char* PrimitiveTypeToString(PrimitiveType type)
|
|||
case UInt: return "UInt";
|
||||
case Bool: return "Bool";
|
||||
case Void: return "Void";
|
||||
case CustomType: return "CustomType";
|
||||
}
|
||||
|
||||
return "Unknown";
|
||||
|
@ -386,8 +414,12 @@ static void PrintNode(Node *node, int tabCount)
|
|||
case Declaration:
|
||||
break;
|
||||
|
||||
case Type:
|
||||
printf("%s", PrimitiveTypeToString(node->type));
|
||||
case CustomTypeNode:
|
||||
printf("%s", node->value.string);
|
||||
break;
|
||||
|
||||
case PrimitiveTypeNode:
|
||||
printf("%s", PrimitiveTypeToString(node->primitiveType));
|
||||
break;
|
||||
|
||||
case Identifier:
|
||||
|
|
19
ast.h
19
ast.h
|
@ -9,6 +9,7 @@ typedef enum
|
|||
Assignment,
|
||||
BinaryExpression,
|
||||
Comment,
|
||||
CustomTypeNode,
|
||||
Declaration,
|
||||
DeclarationSequence,
|
||||
Expression,
|
||||
|
@ -21,6 +22,8 @@ typedef enum
|
|||
FunctionSignatureArguments,
|
||||
Identifier,
|
||||
Number,
|
||||
PrimitiveTypeNode,
|
||||
ReferenceTypeNode,
|
||||
Return,
|
||||
ReturnVoid,
|
||||
StatementSequence,
|
||||
|
@ -51,8 +54,7 @@ typedef enum
|
|||
UInt,
|
||||
Float,
|
||||
Double,
|
||||
String,
|
||||
CustomType
|
||||
String
|
||||
} PrimitiveType;
|
||||
|
||||
typedef union
|
||||
|
@ -76,17 +78,24 @@ typedef struct Node
|
|||
char *string;
|
||||
uint64_t number;
|
||||
} value;
|
||||
PrimitiveType type;
|
||||
PrimitiveType primitiveType;
|
||||
} Node;
|
||||
|
||||
char* strdup (const char* s);
|
||||
const char* SyntaxKindString(SyntaxKind syntaxKind);
|
||||
|
||||
Node* MakeTypeNode(
|
||||
uint8_t IsPrimitiveType(Node *typeNode);
|
||||
Node* MakePrimitiveTypeNode(
|
||||
PrimitiveType type
|
||||
);
|
||||
Node* MakeCustomTypeNode(
|
||||
Node *identifierNode
|
||||
char *string
|
||||
);
|
||||
Node* MakeReferenceTypeNode(
|
||||
Node *typeNode
|
||||
);
|
||||
Node* MakeTypeNode(
|
||||
Node *typeNode /* can be primitive, custom, or reference */
|
||||
);
|
||||
Node* MakeIdentifierNode(
|
||||
const char *id
|
||||
|
|
16
compiler.c
16
compiler.c
|
@ -580,6 +580,7 @@ static void CompileAssignment(LLVMBuilderRef builder, Node *assignmentStatement)
|
|||
LLVMBuildStore(builder, result, identifier);
|
||||
}
|
||||
|
||||
/* FIXME: path for reference types */
|
||||
static void CompileFunctionVariableDeclaration(LLVMBuilderRef builder, Node *variableDeclaration)
|
||||
{
|
||||
LLVMValueRef variable;
|
||||
|
@ -587,14 +588,14 @@ static void CompileFunctionVariableDeclaration(LLVMBuilderRef builder, Node *var
|
|||
char *ptrName = strdup(variableName);
|
||||
strcat(ptrName, "_ptr");
|
||||
|
||||
if (variableDeclaration->children[0]->type == CustomType)
|
||||
if (IsPrimitiveType(variableDeclaration->children[0]))
|
||||
{
|
||||
char *customTypeName = variableDeclaration->children[0]->children[0]->value.string;
|
||||
variable = LLVMBuildAlloca(builder, LookupCustomType(customTypeName), ptrName);
|
||||
variable = LLVMBuildAlloca(builder, WraithTypeToLLVMType(variableDeclaration->children[0]->children[0]->primitiveType), ptrName);
|
||||
}
|
||||
else
|
||||
{
|
||||
variable = LLVMBuildAlloca(builder, WraithTypeToLLVMType(variableDeclaration->children[0]->type), ptrName);
|
||||
char *customTypeName = variableDeclaration->children[0]->children[0]->value.string;
|
||||
variable = LLVMBuildAlloca(builder, LookupCustomType(customTypeName), ptrName);
|
||||
}
|
||||
|
||||
free(ptrName);
|
||||
|
@ -668,13 +669,14 @@ static void CompileFunction(
|
|||
|
||||
PushScopeFrame(scope);
|
||||
|
||||
/* FIXME: should work for non-primitive types */
|
||||
for (i = 0; i < functionSignature->children[2]->childCount; i += 1)
|
||||
{
|
||||
paramTypes[paramIndex] = WraithTypeToLLVMType(functionSignature->children[2]->children[i]->children[0]->type);
|
||||
paramTypes[paramIndex] = WraithTypeToLLVMType(functionSignature->children[2]->children[i]->children[0]->children[0]->primitiveType);
|
||||
paramIndex += 1;
|
||||
}
|
||||
|
||||
LLVMTypeRef returnType = WraithTypeToLLVMType(functionSignature->children[1]->type);
|
||||
LLVMTypeRef returnType = WraithTypeToLLVMType(functionSignature->children[1]->children[0]->primitiveType);
|
||||
LLVMTypeRef functionType = LLVMFunctionType(returnType, paramTypes, paramIndex, 0);
|
||||
|
||||
char *functionName = strdup(parentStructName);
|
||||
|
@ -749,7 +751,7 @@ static void CompileStruct(LLVMModuleRef module, LLVMContextRef context, Node *no
|
|||
switch (currentDeclarationNode->syntaxKind)
|
||||
{
|
||||
case Declaration: /* this is badly named */
|
||||
types[fieldCount] = WraithTypeToLLVMType(currentDeclarationNode->children[0]->type);
|
||||
types[fieldCount] = WraithTypeToLLVMType(currentDeclarationNode->children[0]->children[0]->primitiveType);
|
||||
fieldDeclarations[fieldCount] = currentDeclarationNode;
|
||||
fieldCount += 1;
|
||||
break;
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
"struct" return STRUCT;
|
||||
"return" return RETURN;
|
||||
"static" return STATIC;
|
||||
"Reference" return REFERENCE;
|
||||
[0-9]+ return NUMBER;
|
||||
[a-zA-Z][a-zA-Z0-9]* return ID;
|
||||
\"[a-zA-Z][a-zA-Z0-9]*\" return STRING_LITERAL;
|
||||
|
|
34
wraith.y
34
wraith.y
|
@ -31,6 +31,7 @@ extern Node *rootNode;
|
|||
%token STRUCT
|
||||
%token RETURN
|
||||
%token STATIC
|
||||
%token REFERENCE
|
||||
%token NUMBER
|
||||
%token ID
|
||||
%token STRING_LITERAL
|
||||
|
@ -83,36 +84,49 @@ Program : TopLevelDeclarations
|
|||
rootNode = declarationSequence;
|
||||
}
|
||||
|
||||
Type : VOID
|
||||
BaseType : VOID
|
||||
{
|
||||
$$ = MakeTypeNode(Void);
|
||||
$$ = MakePrimitiveTypeNode(Void);
|
||||
}
|
||||
| INT
|
||||
{
|
||||
$$ = MakeTypeNode(Int);
|
||||
$$ = MakePrimitiveTypeNode(Int);
|
||||
}
|
||||
| UINT
|
||||
{
|
||||
$$ = MakeTypeNode(UInt);
|
||||
$$ = MakePrimitiveTypeNode(UInt);
|
||||
}
|
||||
| FLOAT
|
||||
{
|
||||
$$ = MakeTypeNode(Float);
|
||||
$$ = MakePrimitiveTypeNode(Float);
|
||||
}
|
||||
| DOUBLE
|
||||
{
|
||||
$$ = MakeTypeNode(Double);
|
||||
$$ = MakePrimitiveTypeNode(Double);
|
||||
}
|
||||
| STRING
|
||||
{
|
||||
$$ = MakeTypeNode(String);
|
||||
$$ = MakePrimitiveTypeNode(String);
|
||||
}
|
||||
| BOOL
|
||||
{
|
||||
$$ = MakeTypeNode(Bool);
|
||||
$$ = MakePrimitiveTypeNode(Bool);
|
||||
}
|
||||
| Identifier
|
||||
{
|
||||
$$ = MakeCustomTypeNode(yytext);
|
||||
}
|
||||
| REFERENCE LESS_THAN Type GREATER_THAN
|
||||
{
|
||||
$$ = MakeReferenceTypeNode($3);
|
||||
}
|
||||
;
|
||||
|
||||
Type : BaseType
|
||||
{
|
||||
$$ = MakeTypeNode($1);
|
||||
}
|
||||
|
||||
Identifier : ID
|
||||
{
|
||||
$$ = MakeIdentifierNode(yytext);
|
||||
|
@ -170,10 +184,6 @@ VariableDeclaration : Identifier COLON Type
|
|||
{
|
||||
$$ = MakeDeclarationNode($3, $1);
|
||||
}
|
||||
| Identifier COLON Identifier
|
||||
{
|
||||
$$ = MakeDeclarationNode(MakeCustomTypeNode($3), $1);
|
||||
}
|
||||
|
||||
AssignmentStatement : VariableDeclaration EQUAL Expression
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue