forked from cosmonaut/wraith-lang
				
			Compare commits
	
		
			1 Commits 
		
	
	
	| Author | SHA1 | Date | 
|---|---|---|
| 
							
							
								
								 | 
						f46630b0ab | 
							
								
								
									
										10
									
								
								example.w
								
								
								
								
							
							
						
						
									
										10
									
								
								example.w
								
								
								
								
							| 
						 | 
				
			
			@ -1,6 +1,16 @@
 | 
			
		|||
interface Increments
 | 
			
		||||
{
 | 
			
		||||
    Increment(): void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct YourStruct
 | 
			
		||||
{
 | 
			
		||||
    yourInt: int;
 | 
			
		||||
 | 
			
		||||
    IncrementOther<T: Increments>(other: T): void
 | 
			
		||||
    {
 | 
			
		||||
        other.Increment();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct MyStruct
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,6 +13,7 @@
 | 
			
		|||
"string"                    return STRING;
 | 
			
		||||
"bool"                      return BOOL;
 | 
			
		||||
"struct"                    return STRUCT;
 | 
			
		||||
"interface"                 return INTERFACE;
 | 
			
		||||
"return"                    return RETURN;
 | 
			
		||||
"static"                    return STATIC;
 | 
			
		||||
"Reference"                 return REFERENCE;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,6 +26,7 @@ extern FILE *yyin;
 | 
			
		|||
%token STRING
 | 
			
		||||
%token BOOL
 | 
			
		||||
%token STRUCT
 | 
			
		||||
%token INTERFACE
 | 
			
		||||
%token RETURN
 | 
			
		||||
%token STATIC
 | 
			
		||||
%token REFERENCE
 | 
			
		||||
| 
						 | 
				
			
			@ -307,14 +308,40 @@ Body                    : LEFT_BRACE Statements RIGHT_BRACE
 | 
			
		|||
                            $$ = $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
 | 
			
		||||
                        {
 | 
			
		||||
                            Node *modifier = MakeStaticNode();
 | 
			
		||||
                            $$ = MakeFunctionSignatureNode($2, $7, $4, MakeFunctionModifiersNode(&modifier, 1));
 | 
			
		||||
                            $$ = MakeFunctionSignatureNode($2, $7, $4, MakeFunctionModifiersNode(&modifier, 1), MakeEmptyGenericConstraintsNode());
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
FunctionDeclaration     : FunctionSignature Body
 | 
			
		||||
| 
						 | 
				
			
			@ -327,6 +354,24 @@ StructDeclaration       : STRUCT Identifier LEFT_BRACE Declarations RIGHT_BRACE
 | 
			
		|||
                            $$ = 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
 | 
			
		||||
                        | VariableDeclaration SEMICOLON
 | 
			
		||||
                        ;
 | 
			
		||||
| 
						 | 
				
			
			@ -340,7 +385,9 @@ Declarations            : Declaration
 | 
			
		|||
                            $$ = AddDeclarationNode($1, $2);
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
TopLevelDeclaration     : StructDeclaration;
 | 
			
		||||
TopLevelDeclaration     : StructDeclaration
 | 
			
		||||
                        | InterfaceDeclaration
 | 
			
		||||
                        ;
 | 
			
		||||
 | 
			
		||||
TopLevelDeclarations    : TopLevelDeclaration
 | 
			
		||||
                        {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										56
									
								
								src/ast.c
								
								
								
								
							
							
						
						
									
										56
									
								
								src/ast.c
								
								
								
								
							| 
						 | 
				
			
			@ -286,20 +286,59 @@ Node *MakeEmptyFunctionSignatureArgumentsNode()
 | 
			
		|||
    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 *identifierNode,
 | 
			
		||||
    Node* typeNode,
 | 
			
		||||
    Node* arguments,
 | 
			
		||||
    Node* modifiersNode
 | 
			
		||||
    Node* modifiersNode,
 | 
			
		||||
    Node* genericConstraintsNode
 | 
			
		||||
) {
 | 
			
		||||
    Node* node = (Node*) malloc(sizeof(Node));
 | 
			
		||||
    node->syntaxKind = FunctionSignature;
 | 
			
		||||
    node->childCount = 4;
 | 
			
		||||
    node->childCount = 5;
 | 
			
		||||
    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->children[4] = genericConstraintsNode;
 | 
			
		||||
    return node;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -329,6 +368,19 @@ Node* MakeStructDeclarationNode(
 | 
			
		|||
    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 *declarationNode
 | 
			
		||||
) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										30
									
								
								src/ast.h
								
								
								
								
							
							
						
						
									
										30
									
								
								src/ast.h
								
								
								
								
							| 
						 | 
				
			
			@ -21,9 +21,12 @@ typedef enum
 | 
			
		|||
    FunctionModifiers,
 | 
			
		||||
    FunctionSignature,
 | 
			
		||||
    FunctionSignatureArguments,
 | 
			
		||||
    GenericConstraint,
 | 
			
		||||
    GenericConstraints,
 | 
			
		||||
    Identifier,
 | 
			
		||||
    IfStatement,
 | 
			
		||||
    IfElseStatement,
 | 
			
		||||
    InterfaceDeclaration,
 | 
			
		||||
    Number,
 | 
			
		||||
    PrimitiveTypeNode,
 | 
			
		||||
    ReferenceTypeNode,
 | 
			
		||||
| 
						 | 
				
			
			@ -154,21 +157,36 @@ Node* AddFunctionSignatureArgumentNode(
 | 
			
		|||
    Node *argumentsNode,
 | 
			
		||||
    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 *identifierNode,
 | 
			
		||||
    Node* typeNode,
 | 
			
		||||
    Node* argumentsNode,
 | 
			
		||||
    Node* modifiersNode
 | 
			
		||||
    Node *typeNode,
 | 
			
		||||
    Node *argumentsNode,
 | 
			
		||||
    Node *modifiersNode,
 | 
			
		||||
    Node *genericConstraintsNode
 | 
			
		||||
);
 | 
			
		||||
Node* MakeFunctionDeclarationNode(
 | 
			
		||||
    Node* functionSignatureNode,
 | 
			
		||||
    Node* functionBodyNode
 | 
			
		||||
    Node *functionSignatureNode,
 | 
			
		||||
    Node *functionBodyNode
 | 
			
		||||
);
 | 
			
		||||
Node* MakeStructDeclarationNode(
 | 
			
		||||
    Node *identifierNode,
 | 
			
		||||
    Node *declarationSequenceNode
 | 
			
		||||
);
 | 
			
		||||
Node* MakeInterfaceDeclarationNode(
 | 
			
		||||
    Node *identifierNode,
 | 
			
		||||
    Node *declarationSequenceNode
 | 
			
		||||
);
 | 
			
		||||
Node* StartDeclarationSequenceNode(
 | 
			
		||||
    Node *declarationNode
 | 
			
		||||
);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -984,6 +984,11 @@ static void CompileStruct(LLVMModuleRef module, LLVMContextRef context, Node *no
 | 
			
		|||
    PopScopeFrame(scope);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void CompileInterface(LLVMModuleRef module, LLVMContextRef context, Node *node)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void Compile(LLVMModuleRef module, LLVMContextRef context, Node *node)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t i;
 | 
			
		||||
| 
						 | 
				
			
			@ -994,9 +999,13 @@ static void Compile(LLVMModuleRef module, LLVMContextRef context, Node *node)
 | 
			
		|||
        {
 | 
			
		||||
            CompileStruct(module, context, node->children[i]);
 | 
			
		||||
        }
 | 
			
		||||
        else if (node->children[i]->syntaxKind == InterfaceDeclaration)
 | 
			
		||||
        {
 | 
			
		||||
            CompileInterface(module, context, node->children[i]);
 | 
			
		||||
        }
 | 
			
		||||
        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