X-Git-Url: https://www.kengrimes.com/gitweb/?p=henge%2Fwebcc.git;a=blobdiff_plain;f=src%2Fapc%2Fparser.y;h=c45a5ce04bc1977539d829332d2c1b78d53d2cd9;hp=fdbb56f8baeaff10700944d19362bc5053a6d247;hb=301cac5f6e2edcecf2e1bd89aee5182130a213fc;hpb=6d71e2f6bce0712867cf9e214d97f8fad4f659f1 diff --git a/src/apc/parser.y b/src/apc/parser.y index fdbb56f..c45a5ce 100644 --- a/src/apc/parser.y +++ b/src/apc/parser.y @@ -1,8 +1,11 @@ /* Asset Package Compiler */ +%code requires{ + #include + #include +} %{ #include #include - #include #include #include #include @@ -16,45 +19,54 @@ %} %define parse.error verbose %define lr.type ielr -%define api.value.type union -//operators -%token CLOPEN // / -%token CLCLOSE // \ -%token SOPEN -%token SCLOSE -%token EOPEN -%token ECLOSE -%token VOPEN -%token VCLOSE - -%token RLS //! -%token RLE //# -%token RT //* + +%union { + int ref; + int val; + uint8_t *str; + void *voidp; +} + + //operators +%token CLOPEN // ( +%token CLCLOSE // ) +%token SOPEN // { +%token SCLOSE // } +%token EOPEN // [ +%token ECLOSE // ] +%token VOPEN // / +%token VCLOSE // '\' +%token MOPEN // { +%token MCLOSE %token HB -%token MOD -%token SET -%token FS -%token ELE -//nonterminal types -%type olink -%type ele_svlink -%type set_svlink +%token ROOT + +%token QOPEN // ! +%token QCLOSE // @ + + //nonterminal types +%type olink +%type ele_svlink +%type set_svlink //terminals -%token NUM -%token STR -%token SS -%token NAME -%token REF -%token SSD -%token FPTR -%token WIDTH -%token HEIGHT -%token NUM_PTRS +%token NUM +%token STR +%token SS +%token NAME +%token FNAME +%token REF +%token SSD +// Change width, height, num_ptrs to NUM because +// when scanning, we can't determine which NUM +// is which. +%token WIDTH +%token HEIGHT +%token NUM_PTRS +%token FPTR //precedence -%precedence LOW -%precedence MED -%precedence HIGH - +%precedence LP +%precedence MP +%precedence HP /* Syntax Directed Translation Scheme of the APC grammar */ /* Rules */ @@ -63,18 +75,18 @@ cdat_buf: class_list ; +class: + NAME CLOPEN {push_cdat($1);} class_block CLCLOSE {pop_cdat();}; +; + class_list: class_list class | class ; -class: -NAME CLOPEN {push_cdat($1);} class_block CLCLOSE {pop_cdat();}; -; - class_block: class_list -| class_list set_list +| class_list set_list | set_list ; @@ -83,116 +95,115 @@ set_list set | set ; -root: -RT NUM NUM NUM {insert_root($2, $3, $4);}; -; -quad_list: -RLS quads RLE +map_list: +map_list map MP +| map LP ; -quads: -quads quad -| quad -; - -quad: -NUM NUM NUM REF {insert_quad($1, $2, $3, $4);}; - -hitbox: -HB NUM {insert_hitbox($2);} +map: +MOPEN NAME NUM NUM NAME {insert_map($2, $3, $4, $5);}; +| MOPEN NAME NAME {insert_map($2, 0, 0, $3);}; ; set_map_data: -quad_list -| quad_list hitbox -| quad_list hitbox root -| hitbox root -| hitbox -| root +map_list MP ; set: -SOPEN set_label element_list set_map_data vdat SCLOSE {insert_set(); insert_vdat();}; -| SOPEN set_label element_list set_map_data set_vlink SCLOSE {insert_set();}; -| SOPEN set_label element_list set_map_data set_svlink SCLOSE {insert_set_svlink($5); insert_set(); }; -| SOPEN set_label element_list vdat SCLOSE {insert_set(); insert_vdat();}; -| SOPEN set_label element_list set_vlink SCLOSE {insert_set(); } -| SOPEN set_label element_list set_svlink SCLOSE {insert_set_svlink($4); insert_set();}; -| SOPEN olink SCLOSE {insert_set_olink($2);}; +set_label vdat set_map_data element_list HP {insert_set(); insert_set_vdatid();}; +| set_label set_vlink set_map_data element_list MP {insert_set();}; +| set_label set_svlink set_map_data element_list LP {insert_set_svlink($2); insert_set(); }; +| set_label set_map_data element_list MP {insert_set(); }; +| set_label set_map_data LP {insert_set(); }; +| set_label vdat element_list MP {insert_set(); insert_set_vdatid();}; +| set_label set_vlink element_list LP {insert_set(); }; +| set_label set_svlink element_list MP {insert_set_svlink($2); insert_set();}; +| set_label element_list MP +| set_label vdat LP +| olink {insert_set_olink($1);}; ; + set_label: -HIGH NAME REF {insert_set_label($2,$3);}; -| LOW NAME {insert_set_label($2, -1);}; +NAME REF MP {insert_set_label($1,$2);}; +| NAME LP {insert_set_label($1, -1);}; ; set_svlink: -REF +REF MP ; set_vlink: -REF NAME {insert_set_vlink($1, $2);}; +REF NAME HP {insert_set_vlink($1, $2);}; ; olink: -REF +REF LP ; //parent_id is the set_index of the subclass_index. element_list: -element_list element MED -| element LOW +element_list element HP +| element LP ; ele_label: -HIGH NAME REF {insert_ele_label($2, $3);}; -| LOW NAME {insert_ele_label($2, -1);}; +NAME REF MP {insert_ele_label($1, $2);}; +| NAME LP {insert_ele_label($1, -1);}; ; ele_vlink: -REF NAME {insert_ele_vlink($1, $2);}; +REF NAME HP {insert_ele_vlink($1, $2);}; ; ele_svlink: -REF +REF MP +; + +ele_map_data: +map MP +| map_list HP ; element: -EOPEN ele_label hitbox root vdat ECLOSE {insert_ele(); insert_vdat();}; -| EOPEN ele_label hitbox root ele_vlink ECLOSE {insert_ele(); }; -| EOPEN ele_label hitbox root ele_svlink ECLOSE {insert_ele_svlink($5);insert_ele(); }; -| EOPEN ele_label root vdat ECLOSE {insert_ele(); insert_vdat();}; -| EOPEN ele_label root ele_vlink ECLOSE {insert_ele(); }; -| EOPEN ele_label root ele_svlink ECLOSE {insert_ele_svlink($4); insert_ele(); }; -| EOPEN olink ECLOSE {insert_ele_olink($2);}; + ele_label vdat ele_map_data {insert_ele(); insert_ele_vdatid();}; +| ele_label ele_vlink ele_map_data {insert_ele(); }; +| ele_label ele_svlink ele_map_data {insert_ele_svlink($2);insert_ele(); }; +| ele_label ele_map_data {insert_ele();}; +| ele_label vdat {insert_ele(); insert_ele_vdatid();}; +| ele_label ele_vlink {insert_ele(); }; +| ele_label ele_svlink {insert_ele_svlink($2); insert_ele(); ;}; +| MOPEN olink {insert_ele_olink($2);}; ; vdat: -VOPEN model_list VCLOSE +model_list LP +| NAME NUM NUM NAME MP {insert_vdat($1, $2, $3, $4);}; +| NAME NAME {insert_vdat($1, 0, 0, $2);}; ; model_list: model_list model -| model -; +| model + ; model: -spritesheet LOW +spritesheet LP ; spritesheet: -spritesheet HIGH framesheet +spritesheet HP framesheet | framesheet ; framesheet: -SSD NAME REF HEIGHT WIDTH NUM_PTRS frame_pointers LOW {insert_framesheet($1, $2, $3, $4, $5, $6);}; +SSD NAME REF HEIGHT WIDTH NUM_PTRS frame_pointers LP //{insert_framesheet($1, $2, $3, $4, $5, $6);}; ; frame_pointers: -frame_pointers SSD HIGH FPTR {insert_frame_pointer($2, $4);}; -| SSD FPTR {insert_frame_pointer($1, $2);}; +frame_pointers SSD HP FPTR //{insert_frame_pointer($2, $4);}; +| SSD FPTR //{insert_frame_pointer($1, $2);}; ; %%