X-Git-Url: https://www.kengrimes.com/gitweb/?p=henge%2Fwebcc.git;a=blobdiff_plain;f=src%2Fapc%2Fparser.y;h=c45a5ce04bc1977539d829332d2c1b78d53d2cd9;hp=c16dc1880eb16c45e61579d77491959cc1da5117;hb=301cac5f6e2edcecf2e1bd89aee5182130a213fc;hpb=6d5141829211936ecaed3d9d13a239a75ecae712 diff --git a/src/apc/parser.y b/src/apc/parser.y index c16dc18..c45a5ce 100644 --- a/src/apc/parser.y +++ b/src/apc/parser.y @@ -1,12 +1,14 @@ /* Asset Package Compiler */ +%code requires{ + #include + #include +} %{ #include #include #include - #include "sprite.h" - #include "symbol.h" #include - #include "ir.h" + #include extern int lexer_init(); extern int lexer(); @@ -17,157 +19,194 @@ %} %define parse.error verbose %define lr.type ielr -%define api.value.type union -%token WORD -//operators -%token CLOPEN // / -%token CLCLOSE // \ -%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 -//nonterminal types -%type element -%type vdat -%type elem_label +%token ROOT + +%token QOPEN // ! +%token QCLOSE // @ + + //nonterminal types +%type olink +%type ele_svlink +%type set_svlink //terminals -%token NUM -%token fd +%token NUM %token STR -%token VAR -%token SS +%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 -%right LOW HIGH - -/* Syntax Directed Translation Scheme of the APC grammar */ - +%precedence LP +%precedence MP +%precedence HP + /* Syntax Directed Translation Scheme of the APC grammar */ /* Rules */ %% -output: -class_list {condense();} //Seperate file? +cdat_buf: +class_list +; + +class: + NAME CLOPEN {push_cdat($1);} class_block CLCLOSE {pop_cdat();}; ; class_list: -class_list class {cbi++;}; +class_list class | class ; -class_label: -STR +class_block: +class_list +| class_list set_list +| set_list ; -class: -class_label CLOPEN class_closure CLCLOSE {CB[cbi].label = $1;}; +set_list: +set_list set +| set ; -class_closure: -subclass_list -| subclass_list set_list -| set_list +map_list: +map_list map MP +| map LP ; -subclass_list: -subclass_list class {CB[cbi].subclass_index++;}; -| class +map: +MOPEN NAME NUM NUM NAME {insert_map($2, $3, $4, $5);}; +| MOPEN NAME NAME {insert_map($2, 0, 0, $3);}; ; -set_list: -set_list set {CB[cbi].set_index++;}; -| set +set_map_data: +map_list MP ; - -//set needs a label, vdat_id. set: -set_map_data element_list {insert_set();}; -| element_list +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);}; ; -//TODO: Figure out what to do with hitbox and root. -set_map_data: -ref_list {}; -| ref_list hitbox -| ref_list hitbox root -| hitbox root -| hitbox -| root + +set_label: +NAME REF MP {insert_set_label($1,$2);}; +| NAME LP {insert_set_label($1, -1);}; ; -ref_list: -RLS quads RLE +set_svlink: +REF MP ; -quads: -quads quad {OB[obi].ref_index++;OB[obi].num_ref++;}; -| quad +set_vlink: +REF NAME HP {insert_set_vlink($1, $2);}; ; -quad: -NUM NUM NUM NUM {insert_ref($1, $2, $3, $4);}; +olink: +REF LP ; -hitbox: -HB NUM +//parent_id is the set_index of the subclass_index. +element_list: +element_list element HP +| element LP ; -root: -RT NUM NUM NUM +ele_label: +NAME REF MP {insert_ele_label($1, $2);}; +| NAME LP {insert_ele_label($1, -1);}; ; -//parent_id is the set_index of the subclass_index. -element_list: -element_list element {CB[cbi].set_stack[stack_index].num_ele++;}; -| element +ele_vlink: +REF NAME HP {insert_ele_vlink($1, $2);}; ; -element: -set_label elem_label vdat {insert_ele($2,$3); vbi++;}; +ele_svlink: +REF MP ; -set_label: - STR +ele_map_data: +map MP +| map_list HP ; -elem_label: - STR +element: + 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: -vdat model {VB[vbi].num_models++;}; -| model +model_list LP +| NAME NUM NUM NAME MP {insert_vdat($1, $2, $3, $4);}; +| NAME NAME {insert_vdat($1, 0, 0, $2);}; ; -model: -model fdat -| fdat -; +model_list: +model_list model +| model + ; -fdat: -label SS FNAME {insert_fdat($1, $2, $3);}; +model: +spritesheet LP ; -label: -STR +spritesheet: +spritesheet HP framesheet +| framesheet ; -ref: -NUM +framesheet: +SSD NAME REF HEIGHT WIDTH NUM_PTRS frame_pointers LP //{insert_framesheet($1, $2, $3, $4, $5, $6);}; ; -FNAME: -STR +frame_pointers: +frame_pointers SSD HP FPTR //{insert_frame_pointer($2, $4);}; +| SSD FPTR //{insert_frame_pointer($1, $2);}; ; %% -int -main (argc, argv) -{ - lexer_init(); - yyparse(); - return 0; -} void yyerror (char const *s)