refactor AST to use nameless union instead of child array
parent
41bf2bece8
commit
abc82f381e
368
src/ast.c
368
src/ast.c
|
@ -16,7 +16,6 @@ const char* SyntaxKindString(SyntaxKind syntaxKind)
|
|||
case Comment: return "Comment";
|
||||
case CustomTypeNode: return "CustomTypeNode";
|
||||
case Declaration: return "Declaration";
|
||||
case Expression: return "Expression";
|
||||
case ForLoop: return "ForLoop";
|
||||
case DeclarationSequence: return "DeclarationSequence";
|
||||
case FunctionArgumentSequence: return "FunctionArgumentSequence";
|
||||
|
@ -45,7 +44,7 @@ const char* SyntaxKindString(SyntaxKind syntaxKind)
|
|||
uint8_t IsPrimitiveType(
|
||||
Node *typeNode
|
||||
) {
|
||||
return typeNode->children[0]->syntaxKind == PrimitiveTypeNode;
|
||||
return typeNode->type.typeNode->syntaxKind == PrimitiveTypeNode;
|
||||
}
|
||||
|
||||
Node* MakePrimitiveTypeNode(
|
||||
|
@ -53,8 +52,7 @@ Node* MakePrimitiveTypeNode(
|
|||
) {
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = PrimitiveTypeNode;
|
||||
node->primitiveType = type;
|
||||
node->childCount = 0;
|
||||
node->primitiveType.type = type;
|
||||
return node;
|
||||
}
|
||||
|
||||
|
@ -63,8 +61,7 @@ Node* MakeCustomTypeNode(
|
|||
) {
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = CustomTypeNode;
|
||||
node->value.string = strdup(name);
|
||||
node->childCount = 0;
|
||||
node->customType.name = strdup(name);
|
||||
return node;
|
||||
}
|
||||
|
||||
|
@ -73,9 +70,7 @@ Node* MakeReferenceTypeNode(
|
|||
) {
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = ReferenceTypeNode;
|
||||
node->childCount = 1;
|
||||
node->children = (Node**) malloc(sizeof(Node*));
|
||||
node->children[0] = typeNode;
|
||||
node->referenceType.type = typeNode;
|
||||
return node;
|
||||
}
|
||||
|
||||
|
@ -84,9 +79,7 @@ Node* MakeTypeNode(
|
|||
) {
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = Type;
|
||||
node->childCount = 1;
|
||||
node->children = (Node**) malloc(sizeof(Node*));
|
||||
node->children[0] = typeNode;
|
||||
node->type.typeNode = typeNode;
|
||||
return node;
|
||||
}
|
||||
|
||||
|
@ -95,8 +88,7 @@ Node* MakeIdentifierNode(
|
|||
) {
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = Identifier;
|
||||
node->value.string = strdup(id);
|
||||
node->childCount = 0;
|
||||
node->identifier.name = strdup(id);
|
||||
node->typeTag = NULL;
|
||||
return node;
|
||||
}
|
||||
|
@ -107,8 +99,7 @@ Node* MakeNumberNode(
|
|||
char *ptr;
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = Number;
|
||||
node->value.number = strtoul(numberString, &ptr, 10);
|
||||
node->childCount = 0;
|
||||
node->number.value = strtoul(numberString, &ptr, 10);
|
||||
return node;
|
||||
}
|
||||
|
||||
|
@ -118,8 +109,7 @@ Node* MakeStringNode(
|
|||
size_t slen = strlen(string);
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = StringLiteral;
|
||||
node->value.string = strndup(string + 1, slen - 2);
|
||||
node->childCount = 0;
|
||||
node->stringLiteral.string = strndup(string + 1, slen - 2);
|
||||
return node;
|
||||
}
|
||||
|
||||
|
@ -127,10 +117,10 @@ Node* MakeStaticNode()
|
|||
{
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = StaticModifier;
|
||||
node->childCount = 0;
|
||||
return node;
|
||||
}
|
||||
|
||||
/* FIXME: this sucks */
|
||||
Node* MakeFunctionModifiersNode(
|
||||
Node **pModifierNodes,
|
||||
uint32_t modifierCount
|
||||
|
@ -138,13 +128,14 @@ Node* MakeFunctionModifiersNode(
|
|||
uint32_t i;
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = FunctionModifiers;
|
||||
node->childCount = modifierCount;
|
||||
node->functionModifiers.count = modifierCount;
|
||||
node->functionModifiers.sequence = NULL;
|
||||
if (modifierCount > 0)
|
||||
{
|
||||
node->children = malloc(sizeof(Node*) * node->childCount);
|
||||
node->functionModifiers.sequence = malloc(sizeof(Node*) * node->functionModifiers.count);
|
||||
for (i = 0; i < modifierCount; i += 1)
|
||||
{
|
||||
node->children[i] = pModifierNodes[i];
|
||||
node->functionModifiers.sequence[i] = pModifierNodes[i];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -157,10 +148,8 @@ Node* MakeUnaryNode(
|
|||
) {
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = UnaryExpression;
|
||||
node->operator.unaryOperator = operator;
|
||||
node->children = malloc(sizeof(Node*));
|
||||
node->children[0] = child;
|
||||
node->childCount = 1;
|
||||
node->unaryExpression.operator = operator;
|
||||
node->unaryExpression.child = child;
|
||||
return node;
|
||||
}
|
||||
|
||||
|
@ -171,11 +160,9 @@ Node* MakeBinaryNode(
|
|||
) {
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = BinaryExpression;
|
||||
node->operator.binaryOperator = operator;
|
||||
node->children = malloc(sizeof(Node*) * 2);
|
||||
node->children[0] = left;
|
||||
node->children[1] = right;
|
||||
node->childCount = 2;
|
||||
node->binaryExpression.left = left;
|
||||
node->binaryExpression.right = right;
|
||||
node->binaryExpression.operator = operator;
|
||||
return node;
|
||||
}
|
||||
|
||||
|
@ -185,10 +172,8 @@ Node* MakeDeclarationNode(
|
|||
) {
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = Declaration;
|
||||
node->children = (Node**) malloc(sizeof(Node*) * 2);
|
||||
node->childCount = 2;
|
||||
node->children[0] = typeNode;
|
||||
node->children[1] = identifierNode;
|
||||
node->declaration.type = typeNode;
|
||||
node->declaration.identifier = identifierNode;
|
||||
return node;
|
||||
}
|
||||
|
||||
|
@ -198,10 +183,8 @@ Node* MakeAssignmentNode(
|
|||
) {
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = Assignment;
|
||||
node->childCount = 2;
|
||||
node->children = malloc(sizeof(Node*) * 2);
|
||||
node->children[0] = left;
|
||||
node->children[1] = right;
|
||||
node->assignmentStatement.left = left;
|
||||
node->assignmentStatement.right = right;
|
||||
return node;
|
||||
}
|
||||
|
||||
|
@ -210,9 +193,9 @@ Node* StartStatementSequenceNode(
|
|||
) {
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = StatementSequence;
|
||||
node->children = (Node**) malloc(sizeof(Node*));
|
||||
node->childCount = 1;
|
||||
node->children[0] = statementNode;
|
||||
node->statementSequence.sequence = (Node**) malloc(sizeof(Node*));
|
||||
node->statementSequence.sequence[0] = statementNode;
|
||||
node->statementSequence.count = 1;
|
||||
return node;
|
||||
}
|
||||
|
||||
|
@ -220,9 +203,9 @@ Node* AddStatement(
|
|||
Node* statementSequenceNode,
|
||||
Node *statementNode
|
||||
) {
|
||||
statementSequenceNode->children = realloc(statementSequenceNode->children, sizeof(Node*) * (statementSequenceNode->childCount + 1));
|
||||
statementSequenceNode->children[statementSequenceNode->childCount] = statementNode;
|
||||
statementSequenceNode->childCount += 1;
|
||||
statementSequenceNode->statementSequence.sequence = realloc(statementSequenceNode->statementSequence.sequence, sizeof(Node*) * (statementSequenceNode->statementSequence.count + 1));
|
||||
statementSequenceNode->statementSequence.sequence[statementSequenceNode->statementSequence.count] = statementNode;
|
||||
statementSequenceNode->statementSequence.count += 1;
|
||||
return statementSequenceNode;
|
||||
}
|
||||
|
||||
|
@ -231,9 +214,7 @@ Node* MakeReturnStatementNode(
|
|||
) {
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = Return;
|
||||
node->children = (Node**) malloc(sizeof(Node*));
|
||||
node->childCount = 1;
|
||||
node->children[0] = expressionNode;
|
||||
node->returnStatement.expression = expressionNode;
|
||||
return node;
|
||||
}
|
||||
|
||||
|
@ -241,8 +222,6 @@ Node* MakeReturnVoidStatementNode()
|
|||
{
|
||||
Node *node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = ReturnVoid;
|
||||
node->childCount = 0;
|
||||
node->children = NULL;
|
||||
return node;
|
||||
}
|
||||
|
||||
|
@ -251,9 +230,9 @@ Node *StartFunctionSignatureArgumentsNode(
|
|||
) {
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = FunctionSignatureArguments;
|
||||
node->childCount = 1;
|
||||
node->children = (Node**) malloc(sizeof(Node*));
|
||||
node->children[0] = argumentNode;
|
||||
node->functionSignatureArguments.sequence = (Node**) malloc(sizeof(Node*));
|
||||
node->functionSignatureArguments.sequence[0] = argumentNode;
|
||||
node->functionSignatureArguments.count = 1;
|
||||
return node;
|
||||
}
|
||||
|
||||
|
@ -261,9 +240,9 @@ Node* AddFunctionSignatureArgumentNode(
|
|||
Node *argumentsNode,
|
||||
Node *argumentNode
|
||||
) {
|
||||
argumentsNode->children = realloc(argumentsNode->children, sizeof(Node*) * (argumentsNode->childCount + 1));
|
||||
argumentsNode->children[argumentsNode->childCount] = argumentNode;
|
||||
argumentsNode->childCount += 1;
|
||||
argumentsNode->functionSignatureArguments.sequence = realloc(argumentsNode->functionSignatureArguments.sequence, sizeof(Node*) * (argumentsNode->functionSignatureArguments.count + 1));
|
||||
argumentsNode->functionSignatureArguments.sequence[argumentsNode->functionSignatureArguments.count] = argumentNode;
|
||||
argumentsNode->functionSignatureArguments.count += 1;
|
||||
return argumentsNode;
|
||||
}
|
||||
|
||||
|
@ -271,8 +250,8 @@ Node *MakeEmptyFunctionSignatureArgumentsNode()
|
|||
{
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = FunctionSignatureArguments;
|
||||
node->childCount = 0;
|
||||
node->children = NULL;
|
||||
node->functionSignatureArguments.sequence = NULL;
|
||||
node->functionSignatureArguments.count = 0;
|
||||
return node;
|
||||
}
|
||||
|
||||
|
@ -284,12 +263,10 @@ Node* MakeFunctionSignatureNode(
|
|||
) {
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = FunctionSignature;
|
||||
node->childCount = 4;
|
||||
node->children = (Node**) malloc(sizeof(Node*) * (node->childCount));
|
||||
node->children[0] = identifierNode;
|
||||
node->children[1] = typeNode;
|
||||
node->children[2] = arguments;
|
||||
node->children[3] = modifiersNode;
|
||||
node->functionSignature.identifier = identifierNode;
|
||||
node->functionSignature.type = typeNode;
|
||||
node->functionSignature.arguments = arguments;
|
||||
node->functionSignature.modifiers = modifiersNode;
|
||||
return node;
|
||||
}
|
||||
|
||||
|
@ -299,10 +276,8 @@ Node* MakeFunctionDeclarationNode(
|
|||
) {
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = FunctionDeclaration;
|
||||
node->childCount = 2;
|
||||
node->children = (Node**) malloc(sizeof(Node*) * 2);
|
||||
node->children[0] = functionSignatureNode;
|
||||
node->children[1] = functionBodyNode;
|
||||
node->functionDeclaration.functionSignature = functionSignatureNode;
|
||||
node->functionDeclaration.functionBody = functionBodyNode;
|
||||
return node;
|
||||
}
|
||||
|
||||
|
@ -312,10 +287,8 @@ Node* MakeStructDeclarationNode(
|
|||
) {
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = StructDeclaration;
|
||||
node->childCount = 2;
|
||||
node->children = (Node**) malloc(sizeof(Node*) * 2);
|
||||
node->children[0] = identifierNode;
|
||||
node->children[1] = declarationSequenceNode;
|
||||
node->structDeclaration.identifier = identifierNode;
|
||||
node->structDeclaration.declarationSequence = declarationSequenceNode;
|
||||
return node;
|
||||
}
|
||||
|
||||
|
@ -324,9 +297,9 @@ Node* StartDeclarationSequenceNode(
|
|||
) {
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = DeclarationSequence;
|
||||
node->children = (Node**) malloc(sizeof(Node*));
|
||||
node->childCount = 1;
|
||||
node->children[0] = declarationNode;
|
||||
node->declarationSequence.sequence = (Node**) malloc(sizeof(Node*));
|
||||
node->declarationSequence.sequence[0] = declarationNode;
|
||||
node->declarationSequence.count = 1;
|
||||
return node;
|
||||
}
|
||||
|
||||
|
@ -334,9 +307,9 @@ Node* AddDeclarationNode(
|
|||
Node *declarationSequenceNode,
|
||||
Node *declarationNode
|
||||
) {
|
||||
declarationSequenceNode->children = realloc(declarationSequenceNode->children, sizeof(Node*) * (declarationSequenceNode->childCount + 1));
|
||||
declarationSequenceNode->children[declarationSequenceNode->childCount] = declarationNode;
|
||||
declarationSequenceNode->childCount += 1;
|
||||
declarationSequenceNode->declarationSequence.sequence = (Node**) realloc(declarationSequenceNode->declarationSequence.sequence, sizeof(Node*) * (declarationSequenceNode->declarationSequence.count + 1));
|
||||
declarationSequenceNode->declarationSequence.sequence[declarationSequenceNode->declarationSequence.count] = declarationNode;
|
||||
declarationSequenceNode->declarationSequence.count += 1;
|
||||
return declarationSequenceNode;
|
||||
}
|
||||
|
||||
|
@ -345,9 +318,9 @@ Node* StartFunctionArgumentSequenceNode(
|
|||
) {
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = FunctionArgumentSequence;
|
||||
node->childCount = 1;
|
||||
node->children = (Node**) malloc(sizeof(Node*));
|
||||
node->children[0] = argumentNode;
|
||||
node->functionArgumentSequence.sequence = (Node**) malloc(sizeof(Node*));
|
||||
node->functionArgumentSequence.sequence[0] = argumentNode;
|
||||
node->functionArgumentSequence.count = 1;
|
||||
return node;
|
||||
}
|
||||
|
||||
|
@ -355,9 +328,9 @@ Node* AddFunctionArgumentNode(
|
|||
Node *argumentSequenceNode,
|
||||
Node *argumentNode
|
||||
) {
|
||||
argumentSequenceNode->children = realloc(argumentSequenceNode->children, sizeof(Node*) * (argumentSequenceNode->childCount + 1));
|
||||
argumentSequenceNode->children[argumentSequenceNode->childCount] = argumentNode;
|
||||
argumentSequenceNode->childCount += 1;
|
||||
argumentSequenceNode->functionArgumentSequence.sequence = (Node**) realloc(argumentSequenceNode->functionArgumentSequence.sequence, sizeof(Node*) * (argumentSequenceNode->functionArgumentSequence.count + 1));
|
||||
argumentSequenceNode->functionArgumentSequence.sequence[argumentSequenceNode->functionArgumentSequence.count] = argumentNode;
|
||||
argumentSequenceNode->functionArgumentSequence.count += 1;
|
||||
return argumentSequenceNode;
|
||||
}
|
||||
|
||||
|
@ -365,8 +338,8 @@ Node *MakeEmptyFunctionArgumentSequenceNode()
|
|||
{
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = FunctionArgumentSequence;
|
||||
node->childCount = 0;
|
||||
node->children = NULL;
|
||||
node->functionArgumentSequence.count = 0;
|
||||
node->functionArgumentSequence.sequence = NULL;
|
||||
return node;
|
||||
}
|
||||
|
||||
|
@ -376,10 +349,8 @@ Node* MakeFunctionCallExpressionNode(
|
|||
) {
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = FunctionCallExpression;
|
||||
node->children = (Node**) malloc(sizeof(Node*) * 2);
|
||||
node->childCount = 2;
|
||||
node->children[0] = identifierNode;
|
||||
node->children[1] = argumentSequenceNode;
|
||||
node->functionCallExpression.identifier = identifierNode;
|
||||
node->functionCallExpression.argumentSequence = argumentSequenceNode;
|
||||
return node;
|
||||
}
|
||||
|
||||
|
@ -389,10 +360,8 @@ Node* MakeAccessExpressionNode(
|
|||
) {
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = AccessExpression;
|
||||
node->children = (Node**) malloc(sizeof(Node*) * 2);
|
||||
node->childCount = 2;
|
||||
node->children[0] = accessee;
|
||||
node->children[1] = accessor;
|
||||
node->accessExpression.accessee = accessee;
|
||||
node->accessExpression.accessor = accessor;
|
||||
return node;
|
||||
}
|
||||
|
||||
|
@ -400,9 +369,7 @@ Node* MakeAllocNode(Node *typeNode)
|
|||
{
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = AllocExpression;
|
||||
node->childCount = 1;
|
||||
node->children = (Node**) malloc(sizeof(Node*));
|
||||
node->children[0] = typeNode;
|
||||
node->allocExpression.type = typeNode;
|
||||
return node;
|
||||
}
|
||||
|
||||
|
@ -412,40 +379,34 @@ Node* MakeIfNode(
|
|||
) {
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = IfStatement;
|
||||
node->childCount = 2;
|
||||
node->children = (Node**) malloc(sizeof(Node*));
|
||||
node->children[0] = expressionNode;
|
||||
node->children[1] = statementSequenceNode;
|
||||
node->ifStatement.expression = expressionNode;
|
||||
node->ifStatement.statementSequence = statementSequenceNode;
|
||||
return node;
|
||||
}
|
||||
|
||||
Node* MakeIfElseNode(
|
||||
Node *ifNode,
|
||||
Node *statementSequenceNode
|
||||
Node *elseNode
|
||||
) {
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = IfElseStatement;
|
||||
node->childCount = 2;
|
||||
node->children = (Node**) malloc(sizeof(Node*));
|
||||
node->children[0] = ifNode;
|
||||
node->children[1] = statementSequenceNode;
|
||||
node->ifElseStatement.ifStatement = ifNode;
|
||||
node->ifElseStatement.elseStatement = elseNode;
|
||||
return node;
|
||||
}
|
||||
|
||||
Node* MakeForLoopNode(
|
||||
Node *identifierNode,
|
||||
Node *declarationNode,
|
||||
Node *startNumberNode,
|
||||
Node *endNumberNode,
|
||||
Node *statementSequenceNode
|
||||
) {
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = ForLoop;
|
||||
node->childCount = 4;
|
||||
node->children = (Node**) malloc(sizeof(Node*) * 4);
|
||||
node->children[0] = identifierNode;
|
||||
node->children[1] = startNumberNode;
|
||||
node->children[2] = endNumberNode;
|
||||
node->children[3] = statementSequenceNode;
|
||||
node->forLoop.declaration = declarationNode;
|
||||
node->forLoop.startNumber = startNumberNode;
|
||||
node->forLoop.endNumber = endNumberNode;
|
||||
node->forLoop.statementSequence = statementSequenceNode;
|
||||
return node;
|
||||
}
|
||||
|
||||
|
@ -462,9 +423,19 @@ static const char* PrimitiveTypeToString(PrimitiveType type)
|
|||
return "Unknown";
|
||||
}
|
||||
|
||||
static void PrintBinaryOperator(BinaryOperator expression)
|
||||
static void PrintUnaryOperator(UnaryOperator operator)
|
||||
{
|
||||
switch (expression)
|
||||
switch (operator)
|
||||
{
|
||||
case Negate:
|
||||
printf("!");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void PrintBinaryOperator(BinaryOperator operator)
|
||||
{
|
||||
switch (operator)
|
||||
{
|
||||
case Add:
|
||||
printf("+");
|
||||
|
@ -480,7 +451,7 @@ static void PrintBinaryOperator(BinaryOperator expression)
|
|||
}
|
||||
}
|
||||
|
||||
static void PrintNode(Node *node, int tabCount)
|
||||
void PrintNode(Node *node, uint32_t tabCount)
|
||||
{
|
||||
uint32_t i;
|
||||
for (i = 0; i < tabCount; i += 1)
|
||||
|
@ -491,48 +462,157 @@ static void PrintNode(Node *node, int tabCount)
|
|||
printf("%s: ", SyntaxKindString(node->syntaxKind));
|
||||
switch (node->syntaxKind)
|
||||
{
|
||||
case BinaryExpression:
|
||||
PrintBinaryOperator(node->operator.binaryOperator);
|
||||
case AccessExpression:
|
||||
PrintNode(node->accessExpression.accessee, tabCount + 1);
|
||||
PrintNode(node->accessExpression.accessor, tabCount + 1);
|
||||
break;
|
||||
|
||||
case Declaration:
|
||||
case AllocExpression:
|
||||
PrintNode(node->allocExpression.type, tabCount + 1);
|
||||
break;
|
||||
|
||||
case Assignment:
|
||||
PrintNode(node->assignmentStatement.left, tabCount + 1);
|
||||
PrintNode(node->assignmentStatement.right, tabCount + 1);
|
||||
break;
|
||||
|
||||
case BinaryExpression:
|
||||
PrintNode(node->binaryExpression.left, tabCount + 1);
|
||||
PrintBinaryOperator(node->binaryExpression.operator);
|
||||
PrintNode(node->binaryExpression.right, tabCount + 1);
|
||||
break;
|
||||
|
||||
case CustomTypeNode:
|
||||
printf("%s", node->value.string);
|
||||
printf("%s", node->customType.name);
|
||||
break;
|
||||
|
||||
case PrimitiveTypeNode:
|
||||
printf("%s", PrimitiveTypeToString(node->primitiveType));
|
||||
case Declaration:
|
||||
PrintNode(node->declaration.identifier, tabCount + 1);
|
||||
PrintNode(node->declaration.type, tabCount + 1);
|
||||
break;
|
||||
|
||||
case DeclarationSequence:
|
||||
for (i = 0; i < node->declarationSequence.count; i += 1)
|
||||
{
|
||||
PrintNode(node->declarationSequence.sequence[i], tabCount + 1);
|
||||
}
|
||||
break;
|
||||
|
||||
case ForLoop:
|
||||
PrintNode(node->forLoop.declaration, tabCount + 1);
|
||||
PrintNode(node->forLoop.startNumber, tabCount + 1);
|
||||
PrintNode(node->forLoop.endNumber, tabCount + 1);
|
||||
PrintNode(node->forLoop.statementSequence, tabCount + 1);
|
||||
break;
|
||||
|
||||
case FunctionArgumentSequence:
|
||||
for (i = 0; i < node->functionArgumentSequence.count; i += 1)
|
||||
{
|
||||
PrintNode(node->functionArgumentSequence.sequence[i], tabCount + 1);
|
||||
}
|
||||
break;
|
||||
|
||||
case FunctionCallExpression:
|
||||
PrintNode(node->functionCallExpression.identifier, tabCount + 1);
|
||||
PrintNode(node->functionCallExpression.argumentSequence, tabCount + 1);
|
||||
break;
|
||||
|
||||
case FunctionDeclaration:
|
||||
PrintNode(node->functionDeclaration.functionSignature, tabCount + 1);
|
||||
PrintNode(node->functionDeclaration.functionBody, tabCount + 1);
|
||||
break;
|
||||
|
||||
case FunctionModifiers:
|
||||
for (i = 0; i < node->functionModifiers.count; i += 1)
|
||||
{
|
||||
PrintNode(node->functionModifiers.sequence[i], tabCount + 1);
|
||||
}
|
||||
break;
|
||||
|
||||
case FunctionSignature:
|
||||
PrintNode(node->functionSignature.identifier, tabCount + 1);
|
||||
PrintNode(node->functionSignature.arguments, tabCount + 1);
|
||||
PrintNode(node->functionSignature.type, tabCount + 1);
|
||||
PrintNode(node->functionSignature.modifiers, tabCount + 1);
|
||||
break;
|
||||
|
||||
case FunctionSignatureArguments:
|
||||
for (i = 0; i < node->functionSignatureArguments.count; i += 1)
|
||||
{
|
||||
PrintNode(node->functionSignatureArguments.sequence[i], tabCount + 1);
|
||||
}
|
||||
break;
|
||||
|
||||
case Identifier:
|
||||
if (node->typeTag == NULL) {
|
||||
printf("%s", node->value.string);
|
||||
printf("%s", node->identifier.name);
|
||||
} else {
|
||||
char *type = TypeTagToString(node->typeTag);
|
||||
printf("%s<%s>", node->value.string, type);
|
||||
printf("%s<%s>", node->identifier.name, type);
|
||||
}
|
||||
break;
|
||||
|
||||
case IfStatement:
|
||||
PrintNode(node->ifStatement.expression, tabCount + 1);
|
||||
PrintNode(node->ifStatement.statementSequence, tabCount + 1);
|
||||
break;
|
||||
|
||||
case IfElseStatement:
|
||||
PrintNode(node->ifElseStatement.ifStatement, tabCount + 1);
|
||||
PrintNode(node->ifElseStatement.elseStatement, tabCount + 1);
|
||||
break;
|
||||
|
||||
case Number:
|
||||
printf("%lu", node->value.number);
|
||||
printf("%lu", node->number.value);
|
||||
break;
|
||||
|
||||
case PrimitiveTypeNode:
|
||||
printf("%s", PrimitiveTypeToString(node->primitiveType.type));
|
||||
break;
|
||||
|
||||
case ReferenceTypeNode:
|
||||
PrintNode(node->referenceType.type, tabCount + 1);
|
||||
break;
|
||||
|
||||
case Return:
|
||||
PrintNode(node->returnStatement.expression, tabCount + 1);
|
||||
break;
|
||||
|
||||
case ReturnVoid:
|
||||
break;
|
||||
|
||||
case StatementSequence:
|
||||
for (i = 0; i < node->statementSequence.count; i += 1)
|
||||
{
|
||||
PrintNode(node->statementSequence.sequence[i], tabCount + 1);
|
||||
}
|
||||
break;
|
||||
|
||||
case StaticModifier:
|
||||
break;
|
||||
|
||||
case StringLiteral:
|
||||
printf("%s", node->stringLiteral.string);
|
||||
break;
|
||||
|
||||
case StructDeclaration:
|
||||
PrintNode(node->structDeclaration.identifier, tabCount + 1);
|
||||
PrintNode(node->structDeclaration.declarationSequence, tabCount + 1);
|
||||
break;
|
||||
|
||||
case Type:
|
||||
PrintNode(node->type.typeNode, tabCount + 1);
|
||||
break;
|
||||
|
||||
case UnaryExpression:
|
||||
PrintUnaryOperator(node->unaryExpression.operator);
|
||||
PrintNode(node->unaryExpression.child, tabCount + 1);
|
||||
break;
|
||||
}
|
||||
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
void PrintTree(Node *node, uint32_t tabCount)
|
||||
{
|
||||
uint32_t i;
|
||||
PrintNode(node, tabCount);
|
||||
for (i = 0; i < node->childCount; i += 1)
|
||||
{
|
||||
PrintTree(node->children[i], tabCount + 1);
|
||||
}
|
||||
}
|
||||
|
||||
TypeTag* MakeTypeTag(Node *node) {
|
||||
if (node == NULL) {
|
||||
fprintf(stderr, "wraith: Attempted to call MakeTypeTag on null value.\n");
|
||||
|
@ -542,40 +622,40 @@ TypeTag* MakeTypeTag(Node *node) {
|
|||
TypeTag *tag = (TypeTag*)malloc(sizeof(TypeTag));
|
||||
switch (node->syntaxKind) {
|
||||
case Type:
|
||||
tag = MakeTypeTag(node->children[0]);
|
||||
tag = MakeTypeTag(node->type.typeNode);
|
||||
break;
|
||||
|
||||
case PrimitiveTypeNode:
|
||||
tag->type = Primitive;
|
||||
tag->value.primitiveType = node->primitiveType;
|
||||
tag->value.primitiveType = node->primitiveType.type;
|
||||
break;
|
||||
|
||||
case ReferenceTypeNode:
|
||||
tag->type = Reference;
|
||||
tag->value.referenceType = MakeTypeTag(node->children[0]);
|
||||
tag->value.referenceType = MakeTypeTag(node->referenceType.type);
|
||||
break;
|
||||
|
||||
case CustomTypeNode:
|
||||
tag->type = Custom;
|
||||
tag->value.customType = strdup(node->value.string);
|
||||
tag->value.customType = strdup(node->customType.name);
|
||||
break;
|
||||
|
||||
case Declaration:
|
||||
tag = MakeTypeTag(node->children[0]);
|
||||
tag = MakeTypeTag(node->declaration.type);
|
||||
break;
|
||||
|
||||
case StructDeclaration:
|
||||
tag->type = Custom;
|
||||
tag->value.customType = strdup(node->children[0]->value.string);
|
||||
tag->value.customType = strdup(node->structDeclaration.identifier->identifier.name);
|
||||
printf("Struct tag: %s\n", TypeTagToString(tag));
|
||||
break;
|
||||
|
||||
case FunctionDeclaration:
|
||||
tag = MakeTypeTag(node->children[0]->children[1]);
|
||||
tag = MakeTypeTag(node->functionDeclaration.functionSignature->functionSignature.type);
|
||||
break;
|
||||
|
||||
default:
|
||||
fprintf(stderr,
|
||||
fprintf(stderr,
|
||||
"wraith: Attempted to call MakeTypeTag on"
|
||||
" node with unsupported SyntaxKind: %s\n",
|
||||
SyntaxKindString(node->syntaxKind));
|
||||
|
@ -605,4 +685,4 @@ char* TypeTagToString(TypeTag *tag) {
|
|||
case Custom:
|
||||
return tag->value.customType;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
201
src/ast.h
201
src/ast.h
|
@ -4,6 +4,15 @@
|
|||
#include <stdint.h>
|
||||
#include "identcheck.h"
|
||||
|
||||
/* -Wpedantic nameless union/struct silencing */
|
||||
#ifndef WRAITHNAMELESS
|
||||
#ifdef __GNUC__
|
||||
#define WRAITHNAMELESS __extension__
|
||||
#else
|
||||
#define WRAITHNAMELESS
|
||||
#endif /* __GNUC__ */
|
||||
#endif /* WRAITHNAMELESS */
|
||||
|
||||
typedef enum
|
||||
{
|
||||
AccessExpression,
|
||||
|
@ -14,7 +23,6 @@ typedef enum
|
|||
CustomTypeNode,
|
||||
Declaration,
|
||||
DeclarationSequence,
|
||||
Expression,
|
||||
ForLoop,
|
||||
FunctionArgumentSequence,
|
||||
FunctionCallExpression,
|
||||
|
@ -92,25 +100,184 @@ typedef struct TypeTag
|
|||
} value;
|
||||
} TypeTag;
|
||||
|
||||
typedef struct Node
|
||||
typedef struct Node Node;
|
||||
|
||||
struct Node
|
||||
{
|
||||
Node *parent;
|
||||
SyntaxKind syntaxKind;
|
||||
struct Node **children;
|
||||
uint32_t childCount;
|
||||
union
|
||||
WRAITHNAMELESS union
|
||||
{
|
||||
UnaryOperator unaryOperator;
|
||||
BinaryOperator binaryOperator;
|
||||
} operator;
|
||||
union
|
||||
{
|
||||
char *string;
|
||||
uint64_t number;
|
||||
} value;
|
||||
PrimitiveType primitiveType;
|
||||
struct
|
||||
{
|
||||
Node *accessee;
|
||||
Node *accessor;
|
||||
} accessExpression;
|
||||
|
||||
struct
|
||||
{
|
||||
Node *type;
|
||||
} allocExpression;
|
||||
|
||||
struct
|
||||
{
|
||||
Node *left;
|
||||
Node *right;
|
||||
} assignmentStatement;
|
||||
|
||||
struct
|
||||
{
|
||||
Node *left;
|
||||
Node *right;
|
||||
BinaryOperator operator;
|
||||
} binaryExpression;
|
||||
|
||||
struct
|
||||
{
|
||||
|
||||
} comment;
|
||||
|
||||
struct
|
||||
{
|
||||
char *name;
|
||||
} customType;
|
||||
|
||||
struct
|
||||
{
|
||||
Node *type;
|
||||
Node *identifier;
|
||||
} declaration;
|
||||
|
||||
struct
|
||||
{
|
||||
Node **sequence;
|
||||
uint32_t count;
|
||||
} declarationSequence;
|
||||
|
||||
struct
|
||||
{
|
||||
Node *declaration;
|
||||
Node *startNumber;
|
||||
Node *endNumber;
|
||||
Node *statementSequence;
|
||||
} forLoop;
|
||||
|
||||
struct
|
||||
{
|
||||
Node **sequence;
|
||||
uint32_t count;
|
||||
} functionArgumentSequence;
|
||||
|
||||
struct
|
||||
{
|
||||
Node *identifier; /* FIXME: need better name */
|
||||
Node *argumentSequence;
|
||||
} functionCallExpression;
|
||||
|
||||
struct
|
||||
{
|
||||
Node *functionSignature;
|
||||
Node *functionBody;
|
||||
} functionDeclaration;
|
||||
|
||||
struct
|
||||
{
|
||||
Node **sequence;
|
||||
uint32_t count;
|
||||
} functionModifiers;
|
||||
|
||||
struct
|
||||
{
|
||||
Node *identifier;
|
||||
Node *type;
|
||||
Node *arguments;
|
||||
Node *modifiers;
|
||||
} functionSignature;
|
||||
|
||||
struct
|
||||
{
|
||||
Node **sequence;
|
||||
uint32_t count;
|
||||
} functionSignatureArguments;
|
||||
|
||||
struct
|
||||
{
|
||||
char *name;
|
||||
} identifier;
|
||||
|
||||
struct
|
||||
{
|
||||
Node *expression;
|
||||
Node *statementSequence;
|
||||
} ifStatement;
|
||||
|
||||
struct
|
||||
{
|
||||
Node *ifStatement;
|
||||
Node *elseStatement;
|
||||
} ifElseStatement;
|
||||
|
||||
struct
|
||||
{
|
||||
uint64_t value;
|
||||
} number;
|
||||
|
||||
struct
|
||||
{
|
||||
PrimitiveType type;
|
||||
} primitiveType;
|
||||
|
||||
struct
|
||||
{
|
||||
Node *type;
|
||||
} referenceType;
|
||||
|
||||
struct
|
||||
{
|
||||
Node *expression;
|
||||
} returnStatement;
|
||||
|
||||
struct
|
||||
{
|
||||
|
||||
} returnVoidStatement;
|
||||
|
||||
struct
|
||||
{
|
||||
Node **sequence;
|
||||
uint32_t count;
|
||||
} statementSequence;
|
||||
|
||||
struct
|
||||
{
|
||||
|
||||
} staticModifier; /* FIXME: modifiers should just be an enum */
|
||||
|
||||
struct
|
||||
{
|
||||
char *string;
|
||||
} stringLiteral;
|
||||
|
||||
struct
|
||||
{
|
||||
Node *identifier;
|
||||
Node *declarationSequence;
|
||||
} structDeclaration;
|
||||
|
||||
struct
|
||||
{
|
||||
Node *typeNode;
|
||||
} type; /* FIXME: this needs a refactor */
|
||||
|
||||
struct
|
||||
{
|
||||
Node *child;
|
||||
UnaryOperator operator;
|
||||
} unaryExpression;
|
||||
};
|
||||
TypeTag *typeTag;
|
||||
IdNode *idLink;
|
||||
} Node;
|
||||
};
|
||||
|
||||
const char* SyntaxKindString(SyntaxKind syntaxKind);
|
||||
|
||||
|
@ -223,7 +390,7 @@ Node* MakeIfNode(
|
|||
);
|
||||
Node* MakeIfElseNode(
|
||||
Node *ifNode,
|
||||
Node *statementSequenceNode
|
||||
Node *elseNode /* can be a conditional or a statement sequence */
|
||||
);
|
||||
Node* MakeForLoopNode(
|
||||
Node *identifierNode,
|
||||
|
@ -232,7 +399,7 @@ Node* MakeForLoopNode(
|
|||
Node *statementSequenceNode
|
||||
);
|
||||
|
||||
void PrintTree(Node *node, uint32_t tabCount);
|
||||
void PrintNode(Node *node, uint32_t tabCount);
|
||||
const char* SyntaxKindString(SyntaxKind syntaxKind);
|
||||
|
||||
TypeTag* MakeTypeTag(Node *node);
|
||||
|
|
172
src/codegen.c
172
src/codegen.c
|
@ -263,7 +263,7 @@ static void AddStructDeclaration(
|
|||
for (i = 0; i < fieldDeclarationCount; i += 1)
|
||||
{
|
||||
structTypeDeclarations[index].fields = realloc(structTypeDeclarations[index].fields, sizeof(StructTypeField) * (structTypeDeclarations[index].fieldCount + 1));
|
||||
structTypeDeclarations[index].fields[i].name = strdup(fieldDeclarations[i]->children[1]->value.string);
|
||||
structTypeDeclarations[index].fields[i].name = strdup(fieldDeclarations[i]->declaration.identifier->identifier.name);
|
||||
structTypeDeclarations[index].fields[i].index = i;
|
||||
structTypeDeclarations[index].fieldCount += 1;
|
||||
}
|
||||
|
@ -319,16 +319,15 @@ static LLVMTypeRef ResolveType(Node* typeNode)
|
|||
{
|
||||
if (IsPrimitiveType(typeNode))
|
||||
{
|
||||
return WraithTypeToLLVMType(typeNode->children[0]->primitiveType);
|
||||
return WraithTypeToLLVMType(typeNode->type.typeNode->primitiveType.type);
|
||||
}
|
||||
else if (typeNode->children[0]->syntaxKind == CustomTypeNode)
|
||||
else if (typeNode->type.typeNode->syntaxKind == CustomTypeNode)
|
||||
{
|
||||
char *typeName = typeNode->children[0]->value.string;
|
||||
return LookupCustomType(typeName);
|
||||
return LookupCustomType(typeNode->type.typeNode->customType.name);
|
||||
}
|
||||
else if (typeNode->children[0]->syntaxKind == ReferenceTypeNode)
|
||||
else if (typeNode->type.typeNode->syntaxKind == ReferenceTypeNode)
|
||||
{
|
||||
return LLVMPointerType(ResolveType(typeNode->children[0]->children[0]), 0);
|
||||
return LLVMPointerType(ResolveType(typeNode->type.typeNode->referenceType.type), 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -443,24 +442,24 @@ static LLVMValueRef CompileExpression(
|
|||
static LLVMValueRef CompileNumber(
|
||||
Node *numberExpression
|
||||
) {
|
||||
return LLVMConstInt(LLVMInt64Type(), numberExpression->value.number, 0);
|
||||
return LLVMConstInt(LLVMInt64Type(), numberExpression->number.value, 0);
|
||||
}
|
||||
|
||||
static LLVMValueRef CompileString(
|
||||
LLVMBuilderRef builder,
|
||||
Node *stringExpression
|
||||
) {
|
||||
return LLVMBuildGlobalStringPtr(builder, stringExpression->value.string, "stringConstant");
|
||||
return LLVMBuildGlobalStringPtr(builder, stringExpression->stringLiteral.string, "stringConstant");
|
||||
}
|
||||
|
||||
static LLVMValueRef CompileBinaryExpression(
|
||||
LLVMBuilderRef builder,
|
||||
Node *binaryExpression
|
||||
) {
|
||||
LLVMValueRef left = CompileExpression(builder, binaryExpression->children[0]);
|
||||
LLVMValueRef right = CompileExpression(builder, binaryExpression->children[1]);
|
||||
LLVMValueRef left = CompileExpression(builder, binaryExpression->binaryExpression.left);
|
||||
LLVMValueRef right = CompileExpression(builder, binaryExpression->binaryExpression.right);
|
||||
|
||||
switch (binaryExpression->operator.binaryOperator)
|
||||
switch (binaryExpression->binaryExpression.operator)
|
||||
{
|
||||
case Add:
|
||||
return LLVMBuildAdd(builder, left, right, "addResult");
|
||||
|
@ -494,11 +493,11 @@ static LLVMValueRef CompileBinaryExpression(
|
|||
/* FIXME THIS IS ALL BROKEN */
|
||||
static LLVMValueRef CompileFunctionCallExpression(
|
||||
LLVMBuilderRef builder,
|
||||
Node *expression
|
||||
Node *functionCallExpression
|
||||
) {
|
||||
uint32_t i;
|
||||
uint32_t argumentCount = 0;
|
||||
LLVMValueRef args[expression->children[1]->childCount + 1];
|
||||
LLVMValueRef args[functionCallExpression->functionCallExpression.argumentSequence->functionArgumentSequence.count + 1];
|
||||
LLVMValueRef function;
|
||||
uint8_t isStatic;
|
||||
LLVMValueRef structInstance;
|
||||
|
@ -506,25 +505,26 @@ static LLVMValueRef CompileFunctionCallExpression(
|
|||
char *returnName = "";
|
||||
|
||||
/* FIXME: this needs to be recursive on access chains */
|
||||
if (expression->children[0]->syntaxKind == AccessExpression)
|
||||
/* FIXME: this needs to be able to call same-struct functions implicitly */
|
||||
if (functionCallExpression->functionCallExpression.identifier->syntaxKind == AccessExpression)
|
||||
{
|
||||
LLVMTypeRef typeReference = FindStructType(
|
||||
expression->children[0]->children[0]->value.string
|
||||
functionCallExpression->functionCallExpression.identifier->identifier.name
|
||||
);
|
||||
|
||||
if (typeReference != NULL)
|
||||
{
|
||||
function = LookupFunctionByType(
|
||||
typeReference,
|
||||
expression->children[0]->children[1]->value.string,
|
||||
functionCallExpression->functionCallExpression.identifier->accessExpression.accessor->identifier.name,
|
||||
&functionReturnType,
|
||||
&isStatic
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
structInstance = FindVariablePointer(expression->children[0]->children[0]->value.string);
|
||||
function = LookupFunctionByInstance(structInstance, expression->children[0]->children[1]->value.string, &functionReturnType, &isStatic);
|
||||
structInstance = FindVariablePointer(functionCallExpression->functionCallExpression.identifier->accessExpression.accessee->identifier.name);
|
||||
function = LookupFunctionByInstance(structInstance, functionCallExpression->functionCallExpression.identifier->accessExpression.accessor->identifier.name, &functionReturnType, &isStatic);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -539,9 +539,9 @@ static LLVMValueRef CompileFunctionCallExpression(
|
|||
argumentCount += 1;
|
||||
}
|
||||
|
||||
for (i = 0; i < expression->children[1]->childCount; i += 1)
|
||||
for (i = 0; i < functionCallExpression->functionCallExpression.argumentSequence->functionArgumentSequence.count; i += 1)
|
||||
{
|
||||
args[argumentCount] = CompileExpression(builder, expression->children[1]->children[i]);
|
||||
args[argumentCount] = CompileExpression(builder, functionCallExpression->functionCallExpression.argumentSequence->functionArgumentSequence.sequence[i]);
|
||||
argumentCount += 1;
|
||||
}
|
||||
|
||||
|
@ -555,30 +555,26 @@ static LLVMValueRef CompileFunctionCallExpression(
|
|||
|
||||
static LLVMValueRef CompileAccessExpressionForStore(
|
||||
LLVMBuilderRef builder,
|
||||
Node *expression
|
||||
Node *accessExpression
|
||||
) {
|
||||
Node *accessee = expression->children[0];
|
||||
Node *accessor = expression->children[1];
|
||||
LLVMValueRef accesseeValue = FindVariablePointer(accessee->value.string);
|
||||
return FindStructFieldPointer(builder, accesseeValue, accessor->value.string);
|
||||
LLVMValueRef accesseeValue = FindVariablePointer(accessExpression->accessExpression.accessee->identifier.name);
|
||||
return FindStructFieldPointer(builder, accesseeValue, accessExpression->accessExpression.accessor->identifier.name);
|
||||
}
|
||||
|
||||
static LLVMValueRef CompileAccessExpression(
|
||||
LLVMBuilderRef builder,
|
||||
Node *expression
|
||||
Node *accessExpression
|
||||
) {
|
||||
Node *accessee = expression->children[0];
|
||||
Node *accessor = expression->children[1];
|
||||
LLVMValueRef accesseeValue = FindVariablePointer(accessee->value.string);
|
||||
LLVMValueRef access = FindStructFieldPointer(builder, accesseeValue, accessor->value.string);
|
||||
return LLVMBuildLoad(builder, access, accessor->value.string);
|
||||
LLVMValueRef accesseeValue = FindVariablePointer(accessExpression->accessExpression.accessee->identifier.name);
|
||||
LLVMValueRef access = FindStructFieldPointer(builder, accesseeValue, accessExpression->accessExpression.accessor->identifier.name);
|
||||
return LLVMBuildLoad(builder, access, accessExpression->accessExpression.accessor->identifier.name);
|
||||
}
|
||||
|
||||
static LLVMValueRef CompileAllocExpression(
|
||||
LLVMBuilderRef builder,
|
||||
Node *expression
|
||||
Node *allocExpression
|
||||
) {
|
||||
LLVMTypeRef type = ResolveType(expression->children[0]);
|
||||
LLVMTypeRef type = ResolveType(allocExpression->allocExpression.type);
|
||||
return LLVMBuildMalloc(builder, type, "allocation");
|
||||
}
|
||||
|
||||
|
@ -601,7 +597,7 @@ static LLVMValueRef CompileExpression(
|
|||
return CompileFunctionCallExpression(builder, expression);
|
||||
|
||||
case Identifier:
|
||||
return FindVariableValue(builder, expression->value.string);
|
||||
return FindVariableValue(builder, expression->identifier.name);
|
||||
|
||||
case Number:
|
||||
return CompileNumber(expression);
|
||||
|
@ -619,7 +615,7 @@ static LLVMBasicBlockRef CompileStatement(LLVMBuilderRef builder, LLVMValueRef f
|
|||
|
||||
static LLVMBasicBlockRef CompileReturn(LLVMBuilderRef builder, LLVMValueRef function, Node *returnStatemement)
|
||||
{
|
||||
LLVMValueRef expression = CompileExpression(builder, returnStatemement->children[0]);
|
||||
LLVMValueRef expression = CompileExpression(builder, returnStatemement->returnStatement.expression);
|
||||
LLVMBuildRet(builder, expression);
|
||||
return LLVMGetLastBasicBlock(function);
|
||||
}
|
||||
|
@ -634,11 +630,11 @@ static LLVMBasicBlockRef CompileReturnVoid(LLVMBuilderRef builder, LLVMValueRef
|
|||
static LLVMValueRef CompileFunctionVariableDeclaration(LLVMBuilderRef builder, LLVMValueRef function, Node *variableDeclaration)
|
||||
{
|
||||
LLVMValueRef variable;
|
||||
char *variableName = variableDeclaration->children[1]->value.string;
|
||||
char *variableName = variableDeclaration->declaration.identifier->identifier.name;
|
||||
char *ptrName = strdup(variableName);
|
||||
strcat(ptrName, "_ptr");
|
||||
|
||||
variable = LLVMBuildAlloca(builder, ResolveType(variableDeclaration->children[0]), ptrName);
|
||||
variable = LLVMBuildAlloca(builder, ResolveType(variableDeclaration->declaration.type), ptrName);
|
||||
|
||||
free(ptrName);
|
||||
|
||||
|
@ -649,19 +645,19 @@ static LLVMValueRef CompileFunctionVariableDeclaration(LLVMBuilderRef builder, L
|
|||
|
||||
static LLVMBasicBlockRef CompileAssignment(LLVMBuilderRef builder, LLVMValueRef function, Node *assignmentStatement)
|
||||
{
|
||||
LLVMValueRef result = CompileExpression(builder, assignmentStatement->children[1]);
|
||||
LLVMValueRef result = CompileExpression(builder, assignmentStatement->assignmentStatement.right);
|
||||
LLVMValueRef identifier;
|
||||
if (assignmentStatement->children[0]->syntaxKind == AccessExpression)
|
||||
if (assignmentStatement->assignmentStatement.left->syntaxKind == AccessExpression)
|
||||
{
|
||||
identifier = CompileAccessExpressionForStore(builder, assignmentStatement->children[0]);
|
||||
identifier = CompileAccessExpressionForStore(builder, assignmentStatement->assignmentStatement.left);
|
||||
}
|
||||
else if (assignmentStatement->children[0]->syntaxKind == Identifier)
|
||||
else if (assignmentStatement->assignmentStatement.left->syntaxKind == Identifier)
|
||||
{
|
||||
identifier = FindVariablePointer(assignmentStatement->children[0]->value.string);
|
||||
identifier = FindVariablePointer(assignmentStatement->assignmentStatement.left->identifier.name);
|
||||
}
|
||||
else if (assignmentStatement->children[0]->syntaxKind == Declaration)
|
||||
else if (assignmentStatement->assignmentStatement.left->syntaxKind == Declaration)
|
||||
{
|
||||
identifier = CompileFunctionVariableDeclaration(builder, function, assignmentStatement->children[0]);
|
||||
identifier = CompileFunctionVariableDeclaration(builder, function, assignmentStatement->assignmentStatement.left);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -677,7 +673,7 @@ static LLVMBasicBlockRef CompileAssignment(LLVMBuilderRef builder, LLVMValueRef
|
|||
static LLVMBasicBlockRef CompileIfStatement(LLVMBuilderRef builder, LLVMValueRef function, Node *ifStatement)
|
||||
{
|
||||
uint32_t i;
|
||||
LLVMValueRef conditional = CompileExpression(builder, ifStatement->children[0]);
|
||||
LLVMValueRef conditional = CompileExpression(builder, ifStatement->ifStatement.expression);
|
||||
|
||||
LLVMBasicBlockRef block = LLVMAppendBasicBlock(function, "ifBlock");
|
||||
LLVMBasicBlockRef afterCond = LLVMAppendBasicBlock(function, "afterCond");
|
||||
|
@ -686,9 +682,9 @@ static LLVMBasicBlockRef CompileIfStatement(LLVMBuilderRef builder, LLVMValueRef
|
|||
|
||||
LLVMPositionBuilderAtEnd(builder, block);
|
||||
|
||||
for (i = 0; i < ifStatement->children[1]->childCount; i += 1)
|
||||
for (i = 0; i < ifStatement->ifStatement.statementSequence->statementSequence.count; i += 1)
|
||||
{
|
||||
CompileStatement(builder, function, ifStatement->children[1]->children[i]);
|
||||
CompileStatement(builder, function, ifStatement->ifStatement.statementSequence->statementSequence.sequence[i]);
|
||||
}
|
||||
|
||||
LLVMBuildBr(builder, afterCond);
|
||||
|
@ -700,7 +696,7 @@ static LLVMBasicBlockRef CompileIfStatement(LLVMBuilderRef builder, LLVMValueRef
|
|||
static LLVMBasicBlockRef CompileIfElseStatement(LLVMBuilderRef builder, LLVMValueRef function, Node *ifElseStatement)
|
||||
{
|
||||
uint32_t i;
|
||||
LLVMValueRef conditional = CompileExpression(builder, ifElseStatement->children[0]->children[0]);
|
||||
LLVMValueRef conditional = CompileExpression(builder, ifElseStatement->ifElseStatement.ifStatement->ifStatement.expression);
|
||||
|
||||
LLVMBasicBlockRef ifBlock = LLVMAppendBasicBlock(function, "ifBlock");
|
||||
LLVMBasicBlockRef elseBlock = LLVMAppendBasicBlock(function, "elseBlock");
|
||||
|
@ -710,25 +706,25 @@ static LLVMBasicBlockRef CompileIfElseStatement(LLVMBuilderRef builder, LLVMValu
|
|||
|
||||
LLVMPositionBuilderAtEnd(builder, ifBlock);
|
||||
|
||||
for (i = 0; i < ifElseStatement->children[0]->children[1]->childCount; i += 1)
|
||||
for (i = 0; i < ifElseStatement->ifElseStatement.ifStatement->ifStatement.statementSequence->statementSequence.count; i += 1)
|
||||
{
|
||||
CompileStatement(builder, function, ifElseStatement->children[0]->children[1]->children[i]);
|
||||
CompileStatement(builder, function, ifElseStatement->ifStatement.statementSequence->statementSequence.sequence[i]);
|
||||
}
|
||||
|
||||
LLVMBuildBr(builder, afterCond);
|
||||
|
||||
LLVMPositionBuilderAtEnd(builder, elseBlock);
|
||||
|
||||
if (ifElseStatement->children[1]->syntaxKind == StatementSequence)
|
||||
if (ifElseStatement->ifElseStatement.elseStatement->syntaxKind == StatementSequence)
|
||||
{
|
||||
for (i = 0; i < ifElseStatement->children[1]->childCount; i += 1)
|
||||
for (i = 0; i < ifElseStatement->ifElseStatement.elseStatement->statementSequence.count; i += 1)
|
||||
{
|
||||
CompileStatement(builder, function, ifElseStatement->children[1]->children[i]);
|
||||
CompileStatement(builder, function, ifElseStatement->ifElseStatement.elseStatement->statementSequence.sequence[i]);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
CompileStatement(builder, function, ifElseStatement->children[1]);
|
||||
CompileStatement(builder, function, ifElseStatement->ifElseStatement.elseStatement);
|
||||
}
|
||||
|
||||
LLVMBuildBr(builder, afterCond);
|
||||
|
@ -744,8 +740,8 @@ static LLVMBasicBlockRef CompileForLoopStatement(LLVMBuilderRef builder, LLVMVal
|
|||
LLVMBasicBlockRef checkBlock = LLVMAppendBasicBlock(function, "loopCheck");
|
||||
LLVMBasicBlockRef bodyBlock = LLVMAppendBasicBlock(function, "loopBody");
|
||||
LLVMBasicBlockRef afterLoopBlock = LLVMAppendBasicBlock(function, "afterLoop");
|
||||
char *iteratorVariableName = forLoopStatement->children[0]->children[1]->value.string;
|
||||
LLVMTypeRef iteratorVariableType = ResolveType(forLoopStatement->children[0]->children[0]);
|
||||
char *iteratorVariableName = forLoopStatement->forLoop.declaration->declaration.identifier->identifier.name;
|
||||
LLVMTypeRef iteratorVariableType = ResolveType(forLoopStatement->forLoop.declaration->declaration.type);
|
||||
|
||||
PushScopeFrame(scope);
|
||||
|
||||
|
@ -762,13 +758,13 @@ static LLVMBasicBlockRef CompileForLoopStatement(LLVMBuilderRef builder, LLVMVal
|
|||
LLVMValueRef nextValue = LLVMBuildAdd(
|
||||
builder,
|
||||
iteratorValue,
|
||||
LLVMConstInt(iteratorVariableType, forLoopStatement->children[1]->value.number, 0),
|
||||
LLVMConstInt(iteratorVariableType, 1, 0), /* FIXME: add custom increment value */
|
||||
"next"
|
||||
);
|
||||
|
||||
LLVMPositionBuilderAtEnd(builder, checkBlock);
|
||||
|
||||
LLVMValueRef iteratorEndValue = CompileNumber(forLoopStatement->children[2]);
|
||||
LLVMValueRef iteratorEndValue = CompileNumber(forLoopStatement->forLoop.endNumber);
|
||||
LLVMValueRef comparison = LLVMBuildICmp(builder, LLVMIntULE, iteratorValue, iteratorEndValue, "iteratorCompare");
|
||||
|
||||
LLVMBuildCondBr(builder, comparison, bodyBlock, afterLoopBlock);
|
||||
|
@ -776,9 +772,9 @@ static LLVMBasicBlockRef CompileForLoopStatement(LLVMBuilderRef builder, LLVMVal
|
|||
LLVMPositionBuilderAtEnd(builder, bodyBlock);
|
||||
|
||||
LLVMBasicBlockRef lastBlock;
|
||||
for (i = 0; i < forLoopStatement->children[3]->childCount; i += 1)
|
||||
for (i = 0; i < forLoopStatement->forLoop.statementSequence->statementSequence.count; i += 1)
|
||||
{
|
||||
lastBlock = CompileStatement(builder, function, forLoopStatement->children[3]->children[i]);
|
||||
lastBlock = CompileStatement(builder, function, forLoopStatement->forLoop.statementSequence->statementSequence.sequence[i]);
|
||||
}
|
||||
|
||||
LLVMBuildBr(builder, checkBlock);
|
||||
|
@ -786,7 +782,7 @@ static LLVMBasicBlockRef CompileForLoopStatement(LLVMBuilderRef builder, LLVMVal
|
|||
LLVMPositionBuilderBefore(builder, LLVMGetFirstInstruction(checkBlock));
|
||||
|
||||
LLVMValueRef incomingValues[2];
|
||||
incomingValues[0] = CompileNumber(forLoopStatement->children[1]);
|
||||
incomingValues[0] = CompileNumber(forLoopStatement->forLoop.startNumber);
|
||||
incomingValues[1] = nextValue;
|
||||
|
||||
LLVMBasicBlockRef incomingBlocks[2];
|
||||
|
@ -848,17 +844,17 @@ static void CompileFunction(
|
|||
uint32_t i;
|
||||
uint8_t hasReturn = 0;
|
||||
uint8_t isStatic = 0;
|
||||
Node *functionSignature = functionDeclaration->children[0];
|
||||
Node *functionBody = functionDeclaration->children[1];
|
||||
uint32_t argumentCount = functionSignature->children[2]->childCount;
|
||||
Node *functionSignature = functionDeclaration->functionDeclaration.functionSignature;
|
||||
Node *functionBody = functionDeclaration->functionDeclaration.functionBody;
|
||||
uint32_t argumentCount = functionSignature->functionSignature.arguments->functionSignatureArguments.count;
|
||||
LLVMTypeRef paramTypes[argumentCount + 1];
|
||||
uint32_t paramIndex = 0;
|
||||
|
||||
if (functionSignature->children[3]->childCount > 0)
|
||||
if (functionSignature->functionSignature.modifiers->functionModifiers.count > 0)
|
||||
{
|
||||
for (i = 0; i < functionSignature->children[3]->childCount; i += 1)
|
||||
for (i = 0; i < functionSignature->functionSignature.modifiers->functionModifiers.count; i += 1)
|
||||
{
|
||||
if (functionSignature->children[3]->children[i]->syntaxKind == StaticModifier)
|
||||
if (functionSignature->functionSignature.modifiers->functionModifiers.sequence[i]->syntaxKind == StaticModifier)
|
||||
{
|
||||
isStatic = 1;
|
||||
break;
|
||||
|
@ -875,22 +871,22 @@ static void CompileFunction(
|
|||
PushScopeFrame(scope);
|
||||
|
||||
/* FIXME: should work for non-primitive types */
|
||||
for (i = 0; i < functionSignature->children[2]->childCount; i += 1)
|
||||
for (i = 0; i < functionSignature->functionSignature.arguments->functionSignatureArguments.count; i += 1)
|
||||
{
|
||||
paramTypes[paramIndex] = WraithTypeToLLVMType(functionSignature->children[2]->children[i]->children[0]->children[0]->primitiveType);
|
||||
paramTypes[paramIndex] = ResolveType(functionSignature->functionSignature.arguments->functionSignatureArguments.sequence[i]->declaration.type);
|
||||
paramIndex += 1;
|
||||
}
|
||||
|
||||
LLVMTypeRef returnType = WraithTypeToLLVMType(functionSignature->children[1]->children[0]->primitiveType);
|
||||
LLVMTypeRef returnType = ResolveType(functionSignature->functionSignature.type);
|
||||
LLVMTypeRef functionType = LLVMFunctionType(returnType, paramTypes, paramIndex, 0);
|
||||
|
||||
char *functionName = strdup(parentStructName);
|
||||
strcat(functionName, "_");
|
||||
strcat(functionName, functionSignature->children[0]->value.string);
|
||||
strcat(functionName, functionSignature->functionSignature.identifier->identifier.name);
|
||||
LLVMValueRef function = LLVMAddFunction(module, functionName, functionType);
|
||||
free(functionName);
|
||||
|
||||
DeclareStructFunction(wStructPointerType, function, returnType, isStatic, functionSignature->children[0]->value.string);
|
||||
DeclareStructFunction(wStructPointerType, function, returnType, isStatic, functionSignature->functionSignature.identifier->identifier.name);
|
||||
|
||||
LLVMBasicBlockRef entry = LLVMAppendBasicBlock(function, "entry");
|
||||
LLVMBuilderRef builder = LLVMCreateBuilder();
|
||||
|
@ -902,20 +898,20 @@ static void CompileFunction(
|
|||
AddStructVariablesToScope(builder, wStructPointer);
|
||||
}
|
||||
|
||||
for (i = 0; i < functionSignature->children[2]->childCount; i += 1)
|
||||
for (i = 0; i < functionSignature->functionSignature.arguments->functionSignatureArguments.count; i += 1)
|
||||
{
|
||||
char *ptrName = strdup(functionSignature->children[2]->children[i]->children[1]->value.string);
|
||||
char *ptrName = strdup(functionSignature->functionSignature.arguments->functionSignatureArguments.sequence[i]->identifier.name);
|
||||
strcat(ptrName, "_ptr");
|
||||
LLVMValueRef argument = LLVMGetParam(function, i + !isStatic);
|
||||
LLVMValueRef argumentCopy = LLVMBuildAlloca(builder, LLVMTypeOf(argument), ptrName);
|
||||
LLVMBuildStore(builder, argument, argumentCopy);
|
||||
free(ptrName);
|
||||
AddLocalVariable(scope, argumentCopy, NULL, functionSignature->children[2]->children[i]->children[1]->value.string);
|
||||
AddLocalVariable(scope, argumentCopy, NULL, functionSignature->functionSignature.arguments->functionSignatureArguments.sequence[i]->identifier.name);
|
||||
}
|
||||
|
||||
for (i = 0; i < functionBody->childCount; i += 1)
|
||||
for (i = 0; i < functionBody->statementSequence.count; i += 1)
|
||||
{
|
||||
CompileStatement(builder, function, functionBody->children[i]);
|
||||
CompileStatement(builder, function, functionBody->statementSequence.sequence[i]);
|
||||
}
|
||||
|
||||
hasReturn = LLVMGetBasicBlockTerminator(LLVMGetLastBasicBlock(function)) != NULL;
|
||||
|
@ -938,12 +934,12 @@ static void CompileStruct(LLVMModuleRef module, LLVMContextRef context, Node *no
|
|||
{
|
||||
uint32_t i;
|
||||
uint32_t fieldCount = 0;
|
||||
uint32_t declarationCount = node->children[1]->childCount;
|
||||
uint32_t declarationCount = node->structDeclaration.declarationSequence->declarationSequence.count;
|
||||
uint8_t packed = 1;
|
||||
LLVMTypeRef types[declarationCount];
|
||||
Node *currentDeclarationNode;
|
||||
Node *fieldDeclarations[declarationCount];
|
||||
char *structName = node->children[0]->value.string;
|
||||
char *structName = node->structDeclaration.identifier->identifier.name;
|
||||
|
||||
PushScopeFrame(scope);
|
||||
|
||||
|
@ -953,12 +949,12 @@ static void CompileStruct(LLVMModuleRef module, LLVMContextRef context, Node *no
|
|||
/* first, build the structure definition */
|
||||
for (i = 0; i < declarationCount; i += 1)
|
||||
{
|
||||
currentDeclarationNode = node->children[1]->children[i];
|
||||
currentDeclarationNode = node->structDeclaration.declarationSequence->declarationSequence.sequence[i];
|
||||
|
||||
switch (currentDeclarationNode->syntaxKind)
|
||||
{
|
||||
case Declaration: /* this is badly named */
|
||||
types[fieldCount] = ResolveType(currentDeclarationNode->children[0]);
|
||||
types[fieldCount] = ResolveType(currentDeclarationNode->declaration.type);
|
||||
fieldDeclarations[fieldCount] = currentDeclarationNode;
|
||||
fieldCount += 1;
|
||||
break;
|
||||
|
@ -966,12 +962,12 @@ static void CompileStruct(LLVMModuleRef module, LLVMContextRef context, Node *no
|
|||
}
|
||||
|
||||
LLVMStructSetBody(wStructType, types, fieldCount, packed);
|
||||
AddStructDeclaration(wStructType, wStructPointerType, node->children[0]->value.string, fieldDeclarations, fieldCount);
|
||||
AddStructDeclaration(wStructType, wStructPointerType, structName, fieldDeclarations, fieldCount);
|
||||
|
||||
/* now we can wire up the functions */
|
||||
for (i = 0; i < declarationCount; i += 1)
|
||||
{
|
||||
currentDeclarationNode = node->children[1]->children[i];
|
||||
currentDeclarationNode = node->structDeclaration.declarationSequence->declarationSequence.sequence[i];
|
||||
|
||||
switch (currentDeclarationNode->syntaxKind)
|
||||
{
|
||||
|
@ -984,15 +980,15 @@ static void CompileStruct(LLVMModuleRef module, LLVMContextRef context, Node *no
|
|||
PopScopeFrame(scope);
|
||||
}
|
||||
|
||||
static void Compile(LLVMModuleRef module, LLVMContextRef context, Node *node)
|
||||
static void Compile(LLVMModuleRef module, LLVMContextRef context, Node *declarationSequenceNode)
|
||||
{
|
||||
uint32_t i;
|
||||
|
||||
for (i = 0; i < node->childCount; i += 1)
|
||||
for (i = 0; i < declarationSequenceNode->declarationSequence.count; i += 1)
|
||||
{
|
||||
if (node->children[i]->syntaxKind == StructDeclaration)
|
||||
if (declarationSequenceNode->declarationSequence.sequence[i]->syntaxKind == StructDeclaration)
|
||||
{
|
||||
CompileStruct(module, context, node->children[i]);
|
||||
CompileStruct(module, context, declarationSequenceNode->declarationSequence.sequence[i]);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -69,7 +69,7 @@ int main(int argc, char *argv[])
|
|||
IdNode *idTree = MakeIdTree(rootNode, NULL);
|
||||
PrintIdTree(idTree, /*tabCount=*/0);
|
||||
printf("\n");
|
||||
PrintTree(rootNode, /*tabCount=*/0);
|
||||
PrintNode(rootNode, /*tabCount=*/0);
|
||||
}
|
||||
exitCode = Codegen(rootNode, optimizationLevel);
|
||||
}
|
||||
|
|
|
@ -31,7 +31,7 @@ int Parse(char *inputFilename, Node **pRootNode, uint8_t parseVerbose)
|
|||
{
|
||||
if (parseVerbose)
|
||||
{
|
||||
PrintTree(*pRootNode, 0);
|
||||
PrintNode(*pRootNode, 0);
|
||||
}
|
||||
}
|
||||
else if (result == 1)
|
||||
|
|
Loading…
Reference in New Issue