X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fparser_proc.y;h=345ab226271fe0b12e419936298a764886a36bc1;hp=f3a51f46ef3c319b5875304872c7f972f33b7d8a;hb=3137da963d298c73ce3bc858874fdfc87fa941b7;hpb=61918592ab618c073b9846783ce79fed9f26c5f7 diff --git a/src/parser_proc.y b/src/parser_proc.y index f3a51f4..345ab22 100644 --- a/src/parser_proc.y +++ b/src/parser_proc.y @@ -92,6 +92,12 @@ decl_typedef(def) ::= TYPEDEF decl_type(type) NAME(ALIAS) EOS. { def = init_decl_typedef(ALIAS->text, type); free(ALIAS); } +/* support opaque types */ +decl_typedef(def) ::= TYPEDEF VOID(V) NAME(ALIAS) EOS. { + def = init_decl_typedef(ALIAS->text, init_decl_type(V->type, V->text)); + free(V); + free(ALIAS); +} decl_typedef(def) ::= TYPEDEF STRUCT(S) NAME(N) NAME(ALIAS) EOS. { def = init_decl_typedef(ALIAS->text, init_decl_type(S->type, N->text)); free(ALIAS); @@ -155,7 +161,7 @@ decl_vars(vars) ::= decl_vars(vars_) COMMA decl_var(var). { %type decl_arg {decl_arg*} %destructor decl_arg {free_decl_arg($$);} -decl_arg(arg_) ::= decl_type(type) decl_var(var). { +decl_arg(arg_) ::= const_decl_type(type) decl_var(var). { arg_ = var->arg = init_decl_arg(type, var); } /* void pointers need a specific rule */ @@ -168,6 +174,15 @@ decl_arg(arg_) ::= VOID(T) pointers(p) NAME(N). { free(T); free(N); } +decl_arg(arg_) ::= CONST VOID(T) pointers(p) NAME(N). { + arg_ = init_decl_arg( + init_decl_type(T->type, T->text), + init_decl_var(N->text, p, 0) + ); + arg_->var->arg = arg_; + free(T); + free(N); +} %type decl_args {decl_args*} %destructor decl_args {free_decl_args($$);} @@ -224,6 +239,15 @@ decl_type(type_) ::= STRUCT(S) NAME(T). { free(T); } +%type const_decl_type {decl_type*} +%destructor const_decl_type {free_decl_type($$);} +const_decl_type(type) ::= decl_type(type_). { + type = type_; +} +const_decl_type(type) ::= CONST decl_type(type_). { + type = type_; +} + %type impl {impl*} %destructor impl {free_impl($$);} impl(impl) ::= impl_func(func) LBRACE impl_stmts(stmts) RBRACE. {