X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;ds=inline;f=src%2Fparser_proc.y;h=f3a51f46ef3c319b5875304872c7f972f33b7d8a;hb=61918592ab618c073b9846783ce79fed9f26c5f7;hp=69d69555884964e6edecfe7d17649c889efb3b12;hpb=7a717dad32d06fe5273ad3a9ce755908723f6685;p=m6w6%2Fext-psi diff --git a/src/parser_proc.y b/src/parser_proc.y index 69d6955..f3a51f4 100644 --- a/src/parser_proc.y +++ b/src/parser_proc.y @@ -19,15 +19,13 @@ } %nonassoc NAME. -%fallback NAME FREE SET LET RETURN LIB. +%fallback NAME FREE SET LET RETURN LIB INT. file ::= blocks. blocks ::= block. blocks ::= blocks block. -block ::= COMMENT. - block ::= LIB(T) QUOTED_STRING(libname) EOS. { if (P->psi.file.ln) { PSI_ParserSyntaxError(P, P->psi.file.ln, T->line, "Extra 'lib %s' statement has no effect", libname->text); @@ -59,11 +57,21 @@ block ::= decl_struct(strct). { %type decl_struct {decl_struct*} %destructor decl_struct {free_decl_struct($$);} -decl_struct(strct) ::= STRUCT NAME(N) LBRACE struct_args(args) RBRACE. { +decl_struct(strct) ::= STRUCT NAME(N) struct_size(size_) LBRACE struct_args(args) RBRACE. { strct = init_decl_struct(N->text, args); + strct->size = size_; free(N); } +%type struct_size {size_t} +struct_size(size) ::= . { + size = 0; +} +struct_size(size) ::= COLON COLON LPAREN NUMBER(SIZ) RPAREN. { + size = atol(SIZ->text); + free(SIZ); +} + %token_class const_type_token BOOL INT FLOAT STRING. %type const_type {const_type*} %destructor const_type {free_const_type($$);} @@ -173,12 +181,29 @@ decl_args(args) ::= decl_args(args_) COMMA decl_arg(arg). { } %type struct_args {decl_args*} %destructor struct_args {free_decl_args($$);} -struct_args(args) ::= decl_arg(arg) EOS. { +struct_args(args) ::= struct_arg(arg). { args = init_decl_args(arg); } -struct_args(args) ::= struct_args(args_) decl_arg(arg) EOS. { +struct_args(args) ::= struct_args(args_) struct_arg(arg). { args = add_decl_arg(args_, arg); } +%type struct_arg {decl_arg*} +%destructor struct_arg {free_decl_arg($$);} +struct_arg(arg) ::= decl_arg(arg_) struct_layout(layout_) EOS. { + arg_->layout = layout_; + arg = arg_; +} + +%type struct_layout {decl_struct_layout*} +%destructor struct_layout {free_decl_struct_layout($$);} +struct_layout(layout) ::= . { + layout = NULL; +} +struct_layout(layout) ::= COLON COLON LPAREN NUMBER(POS) COMMA NUMBER(SIZ) RPAREN. { + layout = init_decl_struct_layout(atol(POS->text), atol(SIZ->text)); + free(POS); + free(SIZ); +} %token_class decl_type_token FLOAT DOUBLE INT8 UINT8 INT16 UINT16 INT32 UINT32 INT64 UINT64 NAME. %type decl_type {decl_type*}