- allow functions in structs. This is needed for several internal data types like players, sectors, lines, etc.
- added a new type 'NativeStruct'. This will be used for types that cannot be instantiated, and is also needed to cleanly handle many internal types that only can exist as reference.
This commit is contained in:
parent
df4e9324c9
commit
f11f020b6c
11 changed files with 418 additions and 335 deletions
|
|
@ -278,16 +278,21 @@ class_member(X) ::= const_def(A). { X = A; /*X-overwrites-A*/ }
|
|||
%type struct_body{ZCC_TreeNode *}
|
||||
%type struct_member{ZCC_TreeNode *}
|
||||
|
||||
struct_def(X) ::= STRUCT(T) IDENTIFIER(A) LBRACE opt_struct_body(B) RBRACE opt_semicolon.
|
||||
struct_def(X) ::= STRUCT(T) IDENTIFIER(A) struct_flags(S) LBRACE opt_struct_body(B) RBRACE opt_semicolon.
|
||||
{
|
||||
NEW_AST_NODE(Struct,def,T);
|
||||
def->NodeName = A.Name();
|
||||
def->Body = B;
|
||||
def->Type = nullptr;
|
||||
def->Symbol = nullptr;
|
||||
def->Flags = S.Flags;
|
||||
X = def;
|
||||
}
|
||||
|
||||
%type struct_flags{ClassFlagsBlock}
|
||||
struct_flags(X) ::= . { X.Flags = 0; }
|
||||
struct_flags(X) ::= NATIVE. { X.Flags = ZCC_Native; }
|
||||
|
||||
opt_struct_body(X) ::= . { X = NULL; }
|
||||
opt_struct_body(X) ::= struct_body(X).
|
||||
|
||||
|
|
@ -295,7 +300,7 @@ struct_body(X) ::= error. { X = NULL; }
|
|||
struct_body(X) ::= struct_member(X).
|
||||
struct_body(X) ::= struct_member(A) struct_body(B). { X = A; /*X-overwrites-A*/ X->AppendSibling(B); }
|
||||
|
||||
struct_member(X) ::= declarator_no_fun(A). { X = A; /*X-overwrites-A*/ }
|
||||
struct_member(X) ::= declarator(A). { X = A; /*X-overwrites-A*/ }
|
||||
struct_member(X) ::= enum_def(A). { X = A; /*X-overwrites-A*/ }
|
||||
struct_member(X) ::= const_def(A). { X = A; /*X-overwrites-A*/ }
|
||||
|
||||
|
|
@ -844,14 +849,6 @@ declarator(X) ::= decl_flags(A) type_list_or_void(B) variables_or_function(C).
|
|||
X = NULL;
|
||||
}
|
||||
}
|
||||
declarator_no_fun(X) ::= decl_flags(A) type(B) variable_list(C) SEMICOLON.
|
||||
{
|
||||
NEW_AST_NODE(VarDeclarator, decl, A != nullptr? A->SourceLoc : B->SourceLoc);
|
||||
decl->Type = B;
|
||||
decl->Names = C;
|
||||
decl->Flags = A == nullptr? 0 : A->Flags;
|
||||
X = decl;
|
||||
}
|
||||
|
||||
// Need to split it up like this to avoid parsing conflicts.
|
||||
variables_or_function(X) ::= IDENTIFIER(A) LPAREN func_params(B) RPAREN func_const(C) opt_func_body(D). /* Function */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue