Compare commits
	
		
			1 Commits 
		
	
	
	| Author | SHA1 | Date | 
|---|---|---|
|  | f46630b0ab | 
							
								
								
									
										10
									
								
								example.w
								
								
								
								
							
							
						
						
									
										10
									
								
								example.w
								
								
								
								
							|  | @ -1,6 +1,16 @@ | ||||||
|  | interface Increments | ||||||
|  | { | ||||||
|  |     Increment(): void; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| struct YourStruct | struct YourStruct | ||||||
| { | { | ||||||
|     yourInt: int; |     yourInt: int; | ||||||
|  | 
 | ||||||
|  |     IncrementOther<T: Increments>(other: T): void | ||||||
|  |     { | ||||||
|  |         other.Increment(); | ||||||
|  |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| struct MyStruct | struct MyStruct | ||||||
|  |  | ||||||
|  | @ -13,6 +13,7 @@ | ||||||
| "string"                    return STRING; | "string"                    return STRING; | ||||||
| "bool"                      return BOOL; | "bool"                      return BOOL; | ||||||
| "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; | ||||||
|  |  | ||||||
|  | @ -26,6 +26,7 @@ extern FILE *yyin; | ||||||
| %token STRING | %token STRING | ||||||
| %token BOOL | %token BOOL | ||||||
| %token STRUCT | %token STRUCT | ||||||
|  | %token INTERFACE | ||||||
| %token RETURN | %token RETURN | ||||||
| %token STATIC | %token STATIC | ||||||
| %token REFERENCE | %token REFERENCE | ||||||
|  | @ -307,14 +308,40 @@ Body                    : LEFT_BRACE Statements RIGHT_BRACE | ||||||
|                             $$ = $2; |                             $$ = $2; | ||||||
|                         } |                         } | ||||||
| 
 | 
 | ||||||
| FunctionSignature       : Identifier LEFT_PAREN SignatureArguments RIGHT_PAREN COLON Type | GenericConstraint       : Identifier COLON Identifier | ||||||
|                         { |                         { | ||||||
|                             $$ = MakeFunctionSignatureNode($1, $6, $3, MakeFunctionModifiersNode(NULL, 0)); |                             $$ = MakeGenericConstraintNode($1, $3); | ||||||
|  |                         } | ||||||
|  | 
 | ||||||
|  | GenericConstraints      : GenericConstraint | ||||||
|  |                         { | ||||||
|  |                             $$ = StartGenericConstraintsNode($1); | ||||||
|  |                         } | ||||||
|  |                         | GenericConstraints COMMA GenericConstraint | ||||||
|  |                         { | ||||||
|  |                             $$ = AddGenericConstraint($1, $3); | ||||||
|  |                         } | ||||||
|  |                         ; | ||||||
|  | 
 | ||||||
|  | GenericConstraintClause : LESS_THAN GenericConstraints GREATER_THAN | ||||||
|  |                         { | ||||||
|  |                             $$ = $2; | ||||||
|  |                         } | ||||||
|  |                         | | ||||||
|  |                         { | ||||||
|  |                             $$ = MakeEmptyGenericConstraintsNode(); | ||||||
|  |                         } | ||||||
|  |                         ; | ||||||
|  | 
 | ||||||
|  | /* FIXME: modifiers should be recursive */ | ||||||
|  | FunctionSignature       : Identifier GenericConstraintClause LEFT_PAREN SignatureArguments RIGHT_PAREN COLON Type | ||||||
|  |                         { | ||||||
|  |                             $$ = MakeFunctionSignatureNode($1, $7, $4, MakeFunctionModifiersNode(NULL, 0), $2); | ||||||
|                         } |                         } | ||||||
|                         | STATIC Identifier LEFT_PAREN SignatureArguments RIGHT_PAREN COLON Type |                         | STATIC Identifier LEFT_PAREN SignatureArguments RIGHT_PAREN COLON Type | ||||||
|                         { |                         { | ||||||
|                             Node *modifier = MakeStaticNode(); |                             Node *modifier = MakeStaticNode(); | ||||||
|                             $$ = MakeFunctionSignatureNode($2, $7, $4, MakeFunctionModifiersNode(&modifier, 1)); |                             $$ = MakeFunctionSignatureNode($2, $7, $4, MakeFunctionModifiersNode(&modifier, 1), MakeEmptyGenericConstraintsNode()); | ||||||
|                         } |                         } | ||||||
| 
 | 
 | ||||||
| FunctionDeclaration     : FunctionSignature Body | FunctionDeclaration     : FunctionSignature Body | ||||||
|  | @ -327,6 +354,24 @@ StructDeclaration       : STRUCT Identifier LEFT_BRACE Declarations RIGHT_BRACE | ||||||
|                             $$ = MakeStructDeclarationNode($2, $4); |                             $$ = MakeStructDeclarationNode($2, $4); | ||||||
|                         } |                         } | ||||||
| 
 | 
 | ||||||
|  | InterfaceDeclaration    : INTERFACE Identifier LEFT_BRACE InterfaceChildren RIGHT_BRACE | ||||||
|  |                         { | ||||||
|  |                             $$ = MakeInterfaceDeclarationNode($2, $4); | ||||||
|  |                         } | ||||||
|  | 
 | ||||||
|  | InterfaceChild          : FunctionSignature SEMICOLON | ||||||
|  |                         ; | ||||||
|  | 
 | ||||||
|  | InterfaceChildren       : InterfaceChild | ||||||
|  |                         { | ||||||
|  |                             $$ = StartDeclarationSequenceNode($1); | ||||||
|  |                         } | ||||||
|  |                         | InterfaceChildren InterfaceChild | ||||||
|  |                         { | ||||||
|  |                             $$ = AddDeclarationNode($1, $2); | ||||||
|  |                         } | ||||||
|  |                         ; | ||||||
|  | 
 | ||||||
| Declaration             : FunctionDeclaration | Declaration             : FunctionDeclaration | ||||||
|                         | VariableDeclaration SEMICOLON |                         | VariableDeclaration SEMICOLON | ||||||
|                         ; |                         ; | ||||||
|  | @ -340,7 +385,9 @@ Declarations            : Declaration | ||||||
|                             $$ = AddDeclarationNode($1, $2); |                             $$ = AddDeclarationNode($1, $2); | ||||||
|                         } |                         } | ||||||
| 
 | 
 | ||||||
| TopLevelDeclaration     : StructDeclaration; | TopLevelDeclaration     : StructDeclaration | ||||||
|  |                         | InterfaceDeclaration | ||||||
|  |                         ; | ||||||
| 
 | 
 | ||||||
| TopLevelDeclarations    : TopLevelDeclaration | TopLevelDeclarations    : TopLevelDeclaration | ||||||
|                         { |                         { | ||||||
|  |  | ||||||
							
								
								
									
										56
									
								
								src/ast.c
								
								
								
								
							
							
						
						
									
										56
									
								
								src/ast.c
								
								
								
								
							|  | @ -286,20 +286,59 @@ Node *MakeEmptyFunctionSignatureArgumentsNode() | ||||||
|     return node; |     return node; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | Node* MakeGenericConstraintNode(Node *identifierNode, Node *interfaceNode) | ||||||
|  | { | ||||||
|  |     Node* node = (Node*) malloc(sizeof(Node)); | ||||||
|  |     node->syntaxKind = GenericConstraint; | ||||||
|  |     node->childCount = 2; | ||||||
|  |     node->children = (Node**) malloc(sizeof(Node*) * 2); | ||||||
|  |     node->children[0] = identifierNode; | ||||||
|  |     node->children[1] = interfaceNode; | ||||||
|  |     return node; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Node* StartGenericConstraintsNode(Node *genericNode) | ||||||
|  | { | ||||||
|  |     Node* node = (Node*) malloc(sizeof(Node)); | ||||||
|  |     node->syntaxKind = GenericConstraints; | ||||||
|  |     node->childCount = 1; | ||||||
|  |     node->children = (Node**) malloc(sizeof(Node*)); | ||||||
|  |     node->children[0] = genericNode; | ||||||
|  |     return node; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Node* AddGenericConstraint(Node *genericsNode, Node *genericNode) | ||||||
|  | { | ||||||
|  |     genericsNode->children = realloc(genericsNode->children, sizeof(Node*) * (genericsNode->childCount + 1)); | ||||||
|  |     genericsNode->children[genericsNode->childCount] = genericNode; | ||||||
|  |     genericsNode->childCount += 1; | ||||||
|  |     return genericsNode; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Node* MakeEmptyGenericConstraintsNode() | ||||||
|  | { | ||||||
|  |     Node* node = (Node*) malloc(sizeof(Node)); | ||||||
|  |     node->syntaxKind = GenericConstraints; | ||||||
|  |     node->childCount = 0; | ||||||
|  |     return node; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| Node* MakeFunctionSignatureNode( | Node* MakeFunctionSignatureNode( | ||||||
|     Node *identifierNode, |     Node *identifierNode, | ||||||
|     Node* typeNode, |     Node* typeNode, | ||||||
|     Node* arguments, |     Node* arguments, | ||||||
|     Node* modifiersNode |     Node* modifiersNode, | ||||||
|  |     Node* genericConstraintsNode | ||||||
| ) { | ) { | ||||||
|     Node* node = (Node*) malloc(sizeof(Node)); |     Node* node = (Node*) malloc(sizeof(Node)); | ||||||
|     node->syntaxKind = FunctionSignature; |     node->syntaxKind = FunctionSignature; | ||||||
|     node->childCount = 4; |     node->childCount = 5; | ||||||
|     node->children = (Node**) malloc(sizeof(Node*) * (node->childCount)); |     node->children = (Node**) malloc(sizeof(Node*) * (node->childCount)); | ||||||
|     node->children[0] = identifierNode; |     node->children[0] = identifierNode; | ||||||
|     node->children[1] = typeNode; |     node->children[1] = typeNode; | ||||||
|     node->children[2] = arguments; |     node->children[2] = arguments; | ||||||
|     node->children[3] = modifiersNode; |     node->children[3] = modifiersNode; | ||||||
|  |     node->children[4] = genericConstraintsNode; | ||||||
|     return node; |     return node; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -329,6 +368,19 @@ Node* MakeStructDeclarationNode( | ||||||
|     return node; |     return node; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | Node* MakeInterfaceDeclarationNode( | ||||||
|  |     Node *identifierNode, | ||||||
|  |     Node *declarationSequenceNode | ||||||
|  | ) { | ||||||
|  |     Node* node = (Node*) malloc(sizeof(Node)); | ||||||
|  |     node->syntaxKind = InterfaceDeclaration; | ||||||
|  |     node->childCount = 2; | ||||||
|  |     node->children = (Node**) malloc(sizeof(Node*) * 2); | ||||||
|  |     node->children[0] = identifierNode; | ||||||
|  |     node->children[1] = declarationSequenceNode; | ||||||
|  |     return node; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| Node* StartDeclarationSequenceNode( | Node* StartDeclarationSequenceNode( | ||||||
|     Node *declarationNode |     Node *declarationNode | ||||||
| ) { | ) { | ||||||
|  |  | ||||||
							
								
								
									
										20
									
								
								src/ast.h
								
								
								
								
							
							
						
						
									
										20
									
								
								src/ast.h
								
								
								
								
							|  | @ -21,9 +21,12 @@ typedef enum | ||||||
|     FunctionModifiers, |     FunctionModifiers, | ||||||
|     FunctionSignature, |     FunctionSignature, | ||||||
|     FunctionSignatureArguments, |     FunctionSignatureArguments, | ||||||
|  |     GenericConstraint, | ||||||
|  |     GenericConstraints, | ||||||
|     Identifier, |     Identifier, | ||||||
|     IfStatement, |     IfStatement, | ||||||
|     IfElseStatement, |     IfElseStatement, | ||||||
|  |     InterfaceDeclaration, | ||||||
|     Number, |     Number, | ||||||
|     PrimitiveTypeNode, |     PrimitiveTypeNode, | ||||||
|     ReferenceTypeNode, |     ReferenceTypeNode, | ||||||
|  | @ -155,11 +158,22 @@ Node* AddFunctionSignatureArgumentNode( | ||||||
|     Node *argumentNode |     Node *argumentNode | ||||||
| ); | ); | ||||||
| Node* MakeEmptyFunctionSignatureArgumentsNode(); | Node* MakeEmptyFunctionSignatureArgumentsNode(); | ||||||
|  | Node* MakeGenericConstraintNode( | ||||||
|  |     Node *identifierNode, | ||||||
|  |     Node *interfaceNode | ||||||
|  | ); | ||||||
|  | Node* StartGenericConstraintsNode(Node *genericNode); | ||||||
|  | Node* AddGenericConstraint( | ||||||
|  |     Node *genericsNode, | ||||||
|  |     Node *genericNode | ||||||
|  | ); | ||||||
|  | Node* MakeEmptyGenericConstraintsNode(); | ||||||
| Node* MakeFunctionSignatureNode( | Node* MakeFunctionSignatureNode( | ||||||
|     Node *identifierNode, |     Node *identifierNode, | ||||||
|     Node *typeNode, |     Node *typeNode, | ||||||
|     Node *argumentsNode, |     Node *argumentsNode, | ||||||
|     Node* modifiersNode |     Node *modifiersNode, | ||||||
|  |     Node *genericConstraintsNode | ||||||
| ); | ); | ||||||
| Node* MakeFunctionDeclarationNode( | Node* MakeFunctionDeclarationNode( | ||||||
|     Node *functionSignatureNode, |     Node *functionSignatureNode, | ||||||
|  | @ -169,6 +183,10 @@ Node* MakeStructDeclarationNode( | ||||||
|     Node *identifierNode, |     Node *identifierNode, | ||||||
|     Node *declarationSequenceNode |     Node *declarationSequenceNode | ||||||
| ); | ); | ||||||
|  | Node* MakeInterfaceDeclarationNode( | ||||||
|  |     Node *identifierNode, | ||||||
|  |     Node *declarationSequenceNode | ||||||
|  | ); | ||||||
| Node* StartDeclarationSequenceNode( | Node* StartDeclarationSequenceNode( | ||||||
|     Node *declarationNode |     Node *declarationNode | ||||||
| ); | ); | ||||||
|  |  | ||||||
|  | @ -984,6 +984,11 @@ static void CompileStruct(LLVMModuleRef module, LLVMContextRef context, Node *no | ||||||
|     PopScopeFrame(scope); |     PopScopeFrame(scope); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static void CompileInterface(LLVMModuleRef module, LLVMContextRef context, Node *node) | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static void Compile(LLVMModuleRef module, LLVMContextRef context, Node *node) | static void Compile(LLVMModuleRef module, LLVMContextRef context, Node *node) | ||||||
| { | { | ||||||
|     uint32_t i; |     uint32_t i; | ||||||
|  | @ -994,9 +999,13 @@ static void Compile(LLVMModuleRef module, LLVMContextRef context, Node *node) | ||||||
|         { |         { | ||||||
|             CompileStruct(module, context, node->children[i]); |             CompileStruct(module, context, node->children[i]); | ||||||
|         } |         } | ||||||
|  |         else if (node->children[i]->syntaxKind == InterfaceDeclaration) | ||||||
|  |         { | ||||||
|  |             CompileInterface(module, context, node->children[i]); | ||||||
|  |         } | ||||||
|         else |         else | ||||||
|         { |         { | ||||||
|             fprintf(stderr, "top level declarations that are not structs are forbidden!\n"); |             fprintf(stderr, "Top-level declarations that are not structs or interfaces are forbidden!\n"); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue