initial interface implementation
							parent
							
								
									9adfaed54c
								
							
						
					
					
						commit
						45004f83e0
					
				|  | @ -14,6 +14,7 @@ | |||
| "bool"                      return BOOL; | ||||
| "MemoryAddress"             return MEMORYADDRESS; | ||||
| "struct"                    return STRUCT; | ||||
| "interface"                 return INTERFACE; | ||||
| "return"                    return RETURN; | ||||
| "static"                    return STATIC; | ||||
| "Reference"                 return REFERENCE; | ||||
|  |  | |||
|  | @ -27,6 +27,7 @@ extern FILE *yyin; | |||
| %token BOOL | ||||
| %token MEMORYADDRESS | ||||
| %token STRUCT | ||||
| %token INTERFACE | ||||
| %token RETURN | ||||
| %token STATIC | ||||
| %token REFERENCE | ||||
|  | @ -355,6 +356,10 @@ GenericDeclaration      : Identifier | |||
|                         { | ||||
|                             $$ = MakeGenericDeclarationNode($1, NULL); | ||||
|                         } | ||||
|                         | Identifier COLON Type | ||||
|                         { | ||||
|                             $$ = MakeGenericDeclarationNode($1, $3); | ||||
|                         } | ||||
| 
 | ||||
| GenericDeclarations     : GenericDeclaration | ||||
|                         { | ||||
|  | @ -433,7 +438,28 @@ Declarations            : Declaration | |||
|                             $$ = AddDeclarationNode($1, $2); | ||||
|                         } | ||||
| 
 | ||||
| TopLevelDeclaration     : StructDeclaration; | ||||
| InterfaceMember         : FunctionSignature SEMICOLON | ||||
|                         { | ||||
|                             $$ = $1; | ||||
|                         } | ||||
| 
 | ||||
| InterfaceMembers        : InterfaceMember | ||||
|                         { | ||||
|                             $$ = StartInterfaceMembersNode($1); | ||||
|                         } | ||||
|                         | InterfaceMembers InterfaceMember | ||||
|                         { | ||||
|                             $$ = AddInterfaceMemberNode($1, $2); | ||||
|                         } | ||||
| 
 | ||||
| InterfaceDeclaration    : INTERFACE Identifier LEFT_BRACE InterfaceMembers RIGHT_BRACE | ||||
|                         { | ||||
|                             $$ = MakeInterfaceDeclarationNode($2, $4); | ||||
|                         } | ||||
| 
 | ||||
| TopLevelDeclaration     : StructDeclaration | ||||
|                         | InterfaceDeclaration | ||||
|                         ; | ||||
| 
 | ||||
| TopLevelDeclarations    : TopLevelDeclaration | ||||
|                         { | ||||
|  |  | |||
|  | @ -0,0 +1,30 @@ | |||
| struct Ass | ||||
| { | ||||
|     Fart(): void | ||||
|     { | ||||
|         Console.PrintLine("Poot!"); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| interface Farter | ||||
| { | ||||
|     Fart(): void; | ||||
| } | ||||
| 
 | ||||
| struct FartDispatcher | ||||
| { | ||||
|     static Fart<T : Farter>(farter: T): void | ||||
|     { | ||||
|         farter.Fart(); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| struct Program { | ||||
|     static Main(): int { | ||||
|         ass: Ass; | ||||
| 
 | ||||
|         FartDispatcher.Fart(ass); | ||||
| 
 | ||||
|         return 0; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										35
									
								
								src/ast.c
								
								
								
								
							
							
						
						
									
										35
									
								
								src/ast.c
								
								
								
								
							|  | @ -612,6 +612,41 @@ Node *MakeStructInitExpressionNode(Node *typeNode, Node *structInitFieldsNode) | |||
|     return node; | ||||
| } | ||||
| 
 | ||||
| Node *MakeInterfaceDeclarationNode( | ||||
|     Node *identifierNode, | ||||
|     Node *interfaceMembersNode) | ||||
| { | ||||
|     Node *node = (Node *)malloc(sizeof(Node)); | ||||
|     node->syntaxKind = Interface; | ||||
|     node->interface.identifier = identifierNode; | ||||
|     node->interface.interfaceMembers = interfaceMembersNode; | ||||
|     return node; | ||||
| } | ||||
| 
 | ||||
| Node *StartInterfaceMembersNode(Node *interfaceMemberNode) | ||||
| { | ||||
|     Node *node = (Node *)malloc(sizeof(Node)); | ||||
|     node->syntaxKind = InterfaceMembers; | ||||
|     node->interfaceMembers.members = (Node **)malloc(sizeof(Node *)); | ||||
|     node->interfaceMembers.members[0] = interfaceMemberNode; | ||||
|     node->interfaceMembers.count = 1; | ||||
|     return node; | ||||
| } | ||||
| 
 | ||||
| Node *AddInterfaceMemberNode( | ||||
|     Node *interfaceMembersNode, | ||||
|     Node *interfaceMemberNode) | ||||
| { | ||||
|     interfaceMembersNode->interfaceMembers.members = realloc( | ||||
|         interfaceMembersNode->interfaceMembers.members, | ||||
|         sizeof(Node *) * (interfaceMembersNode->interfaceMembers.count + 1)); | ||||
|     interfaceMembersNode->interfaceMembers | ||||
|         .members[interfaceMembersNode->interfaceMembers.count] = | ||||
|         interfaceMemberNode; | ||||
|     interfaceMembersNode->interfaceMembers.count += 1; | ||||
|     return interfaceMembersNode; | ||||
| } | ||||
| 
 | ||||
| static const char *PrimitiveTypeToString(PrimitiveType type) | ||||
| { | ||||
|     switch (type) | ||||
|  |  | |||
							
								
								
									
										21
									
								
								src/ast.h
								
								
								
								
							
							
						
						
									
										21
									
								
								src/ast.h
								
								
								
								
							|  | @ -39,6 +39,8 @@ typedef enum | |||
|     Identifier, | ||||
|     IfStatement, | ||||
|     IfElseStatement, | ||||
|     Interface, | ||||
|     InterfaceMembers, | ||||
|     Number, | ||||
|     PrimitiveTypeNode, | ||||
|     ReferenceTypeNode, | ||||
|  | @ -284,6 +286,18 @@ struct Node | |||
|             Node *elseStatement; | ||||
|         } ifElseStatement; | ||||
| 
 | ||||
|         struct | ||||
|         { | ||||
|             Node *identifier; | ||||
|             Node *interfaceMembers; | ||||
|         } interface; | ||||
| 
 | ||||
|         struct | ||||
|         { | ||||
|             Node **members; | ||||
|             uint32_t count; | ||||
|         } interfaceMembers; | ||||
| 
 | ||||
|         struct | ||||
|         { | ||||
|             uint64_t value; | ||||
|  | @ -445,6 +459,13 @@ Node *StartStructInitFieldsNode(Node *fieldInitNode); | |||
| Node *AddFieldInitNode(Node *structInitFieldsNode, Node *fieldInitNode); | ||||
| Node *MakeEmptyFieldInitNode(); | ||||
| Node *MakeStructInitExpressionNode(Node *typeNode, Node *structInitFieldsNode); | ||||
| Node *MakeInterfaceDeclarationNode( | ||||
|     Node *identifierNode, | ||||
|     Node *interfaceMembersNode); | ||||
| Node *StartInterfaceMembersNode(Node *interfaceMemberNode); | ||||
| Node *AddInterfaceMemberNode( | ||||
|     Node *interfaceMembersNode, | ||||
|     Node *interfaceMemberNode); | ||||
| 
 | ||||
| void PrintNode(Node *node, uint32_t tabCount); | ||||
| const char *SyntaxKindString(SyntaxKind syntaxKind); | ||||
|  |  | |||
|  | @ -2334,11 +2334,17 @@ static void Compile( | |||
|                 context, | ||||
|                 declarationSequenceNode->declarationSequence.sequence[i]); | ||||
|         } | ||||
|         else if ( | ||||
|             declarationSequenceNode->declarationSequence.sequence[i] | ||||
|                 ->syntaxKind == Interface) | ||||
|         { | ||||
|             /* Interfaces don't need to compile! */ | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             fprintf( | ||||
|                 stderr, | ||||
|                 "top level declarations that are not structs are " | ||||
|                 "top level declarations that are not structs or interfaces are " | ||||
|                 "forbidden!\n"); | ||||
|         } | ||||
|     } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue