forked from cosmonaut/wraith-lang
				
			Adds type tags to the id-tree
							parent
							
								
									e2bca66dc4
								
							
						
					
					
						commit
						5ab3cc533d
					
				
							
								
								
									
										78
									
								
								src/ast.c
								
								
								
								
							
							
						
						
									
										78
									
								
								src/ast.c
								
								
								
								
							|  | @ -526,3 +526,81 @@ void PrintTree(Node *node, uint32_t tabCount) | |||
|         PrintTree(node->children[i], tabCount + 1); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| TypeTag* MakeTypeTag(Node *node) { | ||||
|     if (node == NULL) { | ||||
|         fprintf(stderr, "wraith: Attempted to call MakeTypeTag on null value.\n"); | ||||
|         return NULL; | ||||
|     } | ||||
| 
 | ||||
|     TypeTag *tag = (TypeTag*)malloc(sizeof(TypeTag)); | ||||
|     switch (node->syntaxKind) { | ||||
|         case Type: | ||||
|             tag = MakeTypeTag(node->children[0]); | ||||
|             break; | ||||
| 
 | ||||
|         case PrimitiveTypeNode: | ||||
|             tag->type = Primitive; | ||||
|             tag->value.primitiveType = node->primitiveType; | ||||
|             break; | ||||
| 
 | ||||
|         case ReferenceTypeNode: | ||||
|             tag->type = Reference; | ||||
|             tag->value.referenceType = MakeTypeTag(node->children[0]); | ||||
|             break; | ||||
| 
 | ||||
|         case CustomTypeNode: | ||||
|             tag->type = Custom; | ||||
|             tag->value.customType = strdup(node->value.string); | ||||
|             break; | ||||
| 
 | ||||
|         case Declaration: | ||||
|             tag = MakeTypeTag(node->children[0]); | ||||
|             break; | ||||
| 
 | ||||
|         case StructDeclaration: | ||||
|             tag->type = Custom; | ||||
|             tag->value.customType = strdup(node->children[0]->value.string); | ||||
|             break; | ||||
| 
 | ||||
|         case FunctionDeclaration: | ||||
|             tag = MakeTypeTag(node->children[0]->children[1]); | ||||
|             break; | ||||
| 
 | ||||
|         default: | ||||
|             fprintf(stderr,  | ||||
|                     "wraith: Attempted to call MakeTypeTag on" | ||||
|                     " node with unsupported SyntaxKind: %s\n", | ||||
|                     SyntaxKindString(node->syntaxKind)); | ||||
|             return NULL; | ||||
|     } | ||||
|     return tag; | ||||
| } | ||||
| 
 | ||||
| char* TypeTagToString(TypeTag *tag) { | ||||
|     if (tag == NULL) { | ||||
|         fprintf(stderr, "wraith: Attempted to call TypeTagToString with null value\n"); | ||||
|         return NULL; | ||||
|     } | ||||
| 
 | ||||
|     switch (tag->type) { | ||||
|         case Unknown: | ||||
|             return "Unknown"; | ||||
|         case Primitive: | ||||
|             return PrimitiveTypeToString(tag->value.primitiveType); | ||||
|         case Reference: { | ||||
|             char *inner = TypeTagToString(tag->value.referenceType); | ||||
|             size_t innerStrLen = strlen(inner); | ||||
|             char *result = malloc(sizeof(char) * (innerStrLen + 5)); | ||||
|             sprintf(result, "Ref<%s>", inner); | ||||
|             return result; | ||||
|         } | ||||
|         case Custom: | ||||
|             return tag->value.customType; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void AddTypeTags(Node *ast)  | ||||
| { | ||||
|     fprintf(stderr, "wraith: AddTypeTags not implemented yet.\n"); | ||||
| } | ||||
							
								
								
									
										25
									
								
								src/ast.h
								
								
								
								
							
							
						
						
									
										25
									
								
								src/ast.h
								
								
								
								
							|  | @ -71,6 +71,26 @@ typedef union | |||
|     BinaryOperator binaryOperator; | ||||
| } Operator; | ||||
| 
 | ||||
| typedef struct TypeTag | ||||
| { | ||||
|     enum Type  | ||||
|     { | ||||
|         Unknown, | ||||
|         Primitive, | ||||
|         Reference, | ||||
|         Custom | ||||
|     } type; | ||||
|     union  | ||||
|     { | ||||
|         // Valid when type = Primitive.
 | ||||
|         PrimitiveType primitiveType; | ||||
|         // Valid when type = Reference.
 | ||||
|         struct TypeTag *referenceType; | ||||
|         // Valid when type = Custom.
 | ||||
|         char *customType; | ||||
|     } value; | ||||
| } TypeTag; | ||||
| 
 | ||||
| typedef struct Node | ||||
| { | ||||
|     SyntaxKind syntaxKind; | ||||
|  | @ -87,6 +107,7 @@ typedef struct Node | |||
|         uint64_t number; | ||||
|     } value; | ||||
|     PrimitiveType primitiveType; | ||||
|     TypeTag *typeTag;  | ||||
| } Node; | ||||
| 
 | ||||
| const char* SyntaxKindString(SyntaxKind syntaxKind); | ||||
|  | @ -211,4 +232,8 @@ Node* MakeForLoopNode( | |||
| 
 | ||||
| void PrintTree(Node *node, uint32_t tabCount); | ||||
| 
 | ||||
| TypeTag* MakeTypeTag(Node *node); | ||||
| char* TypeTagToString(TypeTag *tag); | ||||
| void AddTypeTags(Node *ast); | ||||
| 
 | ||||
| #endif /* WRAITH_AST_H */ | ||||
|  |  | |||
|  | @ -76,13 +76,17 @@ IdNode* MakeIdTree(Node *astNode, IdNode *parent) { | |||
|             return loopNode; | ||||
|         } | ||||
| 
 | ||||
|         case Declaration: | ||||
|             return MakeIdNode(Variable, astNode->children[1]->value.string, parent); | ||||
|         case Declaration: { | ||||
|             IdNode *declNode = MakeIdNode(Variable, astNode->children[1]->value.string, parent); | ||||
|             declNode->typeTag = MakeTypeTag(astNode); | ||||
|             return declNode; | ||||
|         } | ||||
| 
 | ||||
|         case StructDeclaration: { | ||||
|             Node *idNode = astNode->children[0]; | ||||
|             Node *declsNode = astNode->children[1]; | ||||
|             IdNode *structNode = MakeIdNode(Struct, idNode->value.string, parent); | ||||
|             structNode->typeTag = MakeTypeTag(astNode); | ||||
|             for (i = 0; i < declsNode->childCount; i++) { | ||||
|                 AddChildToNode(structNode, MakeIdTree(declsNode->children[i], structNode)); | ||||
|             } | ||||
|  | @ -95,6 +99,7 @@ IdNode* MakeIdTree(Node *astNode, IdNode *parent) { | |||
|             Node *funcArgsNode = sigNode->children[2]; | ||||
|             Node *bodyStatementsNode = astNode->children[1]; | ||||
|             IdNode *funcNode = MakeIdNode(Function, funcNameNode->value.string, parent); | ||||
|             funcNode->typeTag = MakeTypeTag(astNode); | ||||
|             for (i = 0; i < funcArgsNode->childCount; i++) { | ||||
|                 AddChildToNode(funcNode, MakeIdTree(funcArgsNode->children[i], funcNode)); | ||||
|             } | ||||
|  | @ -118,11 +123,24 @@ IdNode* MakeIdTree(Node *astNode, IdNode *parent) { | |||
| } | ||||
| 
 | ||||
| void PrintIdNode(IdNode *node) { | ||||
|     if (node == NULL) { | ||||
|         fprintf(stderr, "wraith: Attempted to call PrintIdNode with null value.\n"); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     switch(node->type) { | ||||
|         case LexicalScope: printf("Scope (%s)\n", node->name); break; | ||||
|         case Struct: printf("%s : Struct\n", node->name); break; | ||||
|         case Function: printf("%s : Function\n", node->name); break; | ||||
|         case Variable: printf("%s : Variable\n", node->name); break; | ||||
|         case LexicalScope:  | ||||
|             printf("Scope (%s)\n", node->name);  | ||||
|             break; | ||||
|         case Struct: | ||||
|             printf("%s : %s\n", node->name, TypeTagToString(node->typeTag));  | ||||
|             break; | ||||
|         case Function: | ||||
|             printf("%s : Function<%s>\n", node->name, TypeTagToString(node->typeTag)); | ||||
|             break; | ||||
|         case Variable:  | ||||
|             printf("%s : %s\n", node->name, TypeTagToString(node->typeTag));  | ||||
|             break; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -16,6 +16,7 @@ typedef enum NodeType { | |||
| typedef struct IdNode { | ||||
|     NodeType type; | ||||
|     char *name; | ||||
|     TypeTag *typeTag; | ||||
|     struct IdNode *parent; | ||||
|     struct IdNode **children; | ||||
|     uint32_t childCount; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue