initial interface implementation
							parent
							
								
									9adfaed54c
								
							
						
					
					
						commit
						45004f83e0
					
				|  | @ -14,6 +14,7 @@ | ||||||
| "bool"                      return BOOL; | "bool"                      return BOOL; | ||||||
| "MemoryAddress"             return MEMORYADDRESS; | "MemoryAddress"             return MEMORYADDRESS; | ||||||
| "struct"                    return STRUCT; | "struct"                    return STRUCT; | ||||||
|  | "interface"                 return INTERFACE; | ||||||
| "return"                    return RETURN; | "return"                    return RETURN; | ||||||
| "static"                    return STATIC; | "static"                    return STATIC; | ||||||
| "Reference"                 return REFERENCE; | "Reference"                 return REFERENCE; | ||||||
|  |  | ||||||
|  | @ -27,6 +27,7 @@ extern FILE *yyin; | ||||||
| %token BOOL | %token BOOL | ||||||
| %token MEMORYADDRESS | %token MEMORYADDRESS | ||||||
| %token STRUCT | %token STRUCT | ||||||
|  | %token INTERFACE | ||||||
| %token RETURN | %token RETURN | ||||||
| %token STATIC | %token STATIC | ||||||
| %token REFERENCE | %token REFERENCE | ||||||
|  | @ -355,6 +356,10 @@ GenericDeclaration      : Identifier | ||||||
|                         { |                         { | ||||||
|                             $$ = MakeGenericDeclarationNode($1, NULL); |                             $$ = MakeGenericDeclarationNode($1, NULL); | ||||||
|                         } |                         } | ||||||
|  |                         | Identifier COLON Type | ||||||
|  |                         { | ||||||
|  |                             $$ = MakeGenericDeclarationNode($1, $3); | ||||||
|  |                         } | ||||||
| 
 | 
 | ||||||
| GenericDeclarations     : GenericDeclaration | GenericDeclarations     : GenericDeclaration | ||||||
|                         { |                         { | ||||||
|  | @ -433,7 +438,28 @@ Declarations            : Declaration | ||||||
|                             $$ = AddDeclarationNode($1, $2); |                             $$ = 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 | 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; |     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) | static const char *PrimitiveTypeToString(PrimitiveType type) | ||||||
| { | { | ||||||
|     switch (type) |     switch (type) | ||||||
|  |  | ||||||
							
								
								
									
										21
									
								
								src/ast.h
								
								
								
								
							
							
						
						
									
										21
									
								
								src/ast.h
								
								
								
								
							|  | @ -39,6 +39,8 @@ typedef enum | ||||||
|     Identifier, |     Identifier, | ||||||
|     IfStatement, |     IfStatement, | ||||||
|     IfElseStatement, |     IfElseStatement, | ||||||
|  |     Interface, | ||||||
|  |     InterfaceMembers, | ||||||
|     Number, |     Number, | ||||||
|     PrimitiveTypeNode, |     PrimitiveTypeNode, | ||||||
|     ReferenceTypeNode, |     ReferenceTypeNode, | ||||||
|  | @ -284,6 +286,18 @@ struct Node | ||||||
|             Node *elseStatement; |             Node *elseStatement; | ||||||
|         } ifElseStatement; |         } ifElseStatement; | ||||||
| 
 | 
 | ||||||
|  |         struct | ||||||
|  |         { | ||||||
|  |             Node *identifier; | ||||||
|  |             Node *interfaceMembers; | ||||||
|  |         } interface; | ||||||
|  | 
 | ||||||
|  |         struct | ||||||
|  |         { | ||||||
|  |             Node **members; | ||||||
|  |             uint32_t count; | ||||||
|  |         } interfaceMembers; | ||||||
|  | 
 | ||||||
|         struct |         struct | ||||||
|         { |         { | ||||||
|             uint64_t value; |             uint64_t value; | ||||||
|  | @ -445,6 +459,13 @@ Node *StartStructInitFieldsNode(Node *fieldInitNode); | ||||||
| Node *AddFieldInitNode(Node *structInitFieldsNode, Node *fieldInitNode); | Node *AddFieldInitNode(Node *structInitFieldsNode, Node *fieldInitNode); | ||||||
| Node *MakeEmptyFieldInitNode(); | Node *MakeEmptyFieldInitNode(); | ||||||
| Node *MakeStructInitExpressionNode(Node *typeNode, Node *structInitFieldsNode); | 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); | void PrintNode(Node *node, uint32_t tabCount); | ||||||
| const char *SyntaxKindString(SyntaxKind syntaxKind); | const char *SyntaxKindString(SyntaxKind syntaxKind); | ||||||
|  |  | ||||||
|  | @ -2334,11 +2334,17 @@ static void Compile( | ||||||
|                 context, |                 context, | ||||||
|                 declarationSequenceNode->declarationSequence.sequence[i]); |                 declarationSequenceNode->declarationSequence.sequence[i]); | ||||||
|         } |         } | ||||||
|  |         else if ( | ||||||
|  |             declarationSequenceNode->declarationSequence.sequence[i] | ||||||
|  |                 ->syntaxKind == Interface) | ||||||
|  |         { | ||||||
|  |             /* Interfaces don't need to compile! */ | ||||||
|  |         } | ||||||
|         else |         else | ||||||
|         { |         { | ||||||
|             fprintf( |             fprintf( | ||||||
|                 stderr, |                 stderr, | ||||||
|                 "top level declarations that are not structs are " |                 "top level declarations that are not structs or interfaces are " | ||||||
|                 "forbidden!\n"); |                 "forbidden!\n"); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue