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