X-Git-Url: https://www.kengrimes.com/gitweb/?p=henge%2Fwebcc.git;a=blobdiff_plain;f=src%2Fapc%2Fparser.y;h=9190bc413187da8cd027e489bc63459bfe4aeb45;hp=c16dc1880eb16c45e61579d77491959cc1da5117;hb=0f505368fa8abbc2e9ab0296b9a5e6bd4869345f;hpb=6d5141829211936ecaed3d9d13a239a75ecae712 diff --git a/src/apc/parser.y b/src/apc/parser.y index c16dc18..9190bc4 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,196 @@ %} %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: + CLOPEN NAME {push_cdat($2);} 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 +variant_list: +variant_list variant +| variant ; -subclass_list: -subclass_list class {CB[cbi].subclass_index++;}; -| class +hitbox: +HB NUM ; -set_list: -set_list set {CB[cbi].set_index++;}; -| set +root: +ROOT NUM NUM NUM ; - -//set needs a label, vdat_id. -set: -set_map_data element_list {insert_set();}; -| element_list +variant: +MOPEN NAME NUM NUM NAME {insert_variant($2, $3, $4, $5);}; ; - -//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 +variant_list +| variant_list HP hitbox root +| variant_list MP root ; -ref_list: -RLS quads RLE +set: +SOPEN set_label set_map_data element_list vdat SCLOSE {insert_set(); insert_set_vdatid();}; +| SOPEN set_label set_map_data element_list set_vlink SCLOSE {insert_set();}; +| SOPEN set_label set_map_data element_list set_svlink SCLOSE {insert_set_svlink($5); insert_set(); }; +| SOPEN set_label element_list vdat SCLOSE {insert_set(); insert_set_vdatid();}; +| 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);}; ; -quads: -quads quad {OB[obi].ref_index++;OB[obi].num_ref++;}; -| quad + +set_label: +HP NAME REF {insert_set_label($2,$3);}; +| LP NAME {insert_set_label($2, -1);}; ; -quad: -NUM NUM NUM NUM {insert_ref($1, $2, $3, $4);}; +set_svlink: +REF + ; -hitbox: -HB NUM +set_vlink: +REF NAME {insert_set_vlink($1, $2);}; ; -root: -RT NUM NUM NUM +olink: +REF ; //parent_id is the set_index of the subclass_index. element_list: -element_list element {CB[cbi].set_stack[stack_index].num_ele++;}; -| element +element_list element MP +| element LP ; -element: -set_label elem_label vdat {insert_ele($2,$3); vbi++;}; +ele_label: +HP NAME REF {insert_ele_label($2, $3);}; +| LP NAME {insert_ele_label($2, -1);}; ; -set_label: - STR +ele_vlink: +REF NAME {insert_ele_vlink($1, $2);}; ; -elem_label: - STR +ele_svlink: +REF ; -vdat: -vdat model {VB[vbi].num_models++;}; -| model +ele_map_data: +variant_list + +element: +EOPEN ele_label ele_map_data vdat ECLOSE {insert_ele(); insert_ele_vdatid();}; +| EOPEN ele_label ele_map_data ele_vlink ECLOSE {insert_ele(); }; +| EOPEN ele_label ele_map_data ele_svlink ECLOSE {insert_ele_svlink($4);insert_ele(); }; +| EOPEN ele_label vdat ECLOSE {insert_ele(); insert_ele_vdatid();}; +| EOPEN ele_label ele_vlink ECLOSE {insert_ele(); }; +| EOPEN ele_label ele_svlink ECLOSE {insert_ele_svlink($3); insert_ele(); ;} +| EOPEN olink ECLOSE {insert_ele_olink($2);}; ; -model: -model fdat -| fdat +vdat: +VOPEN model_list +| VOPEN NAME NUM NUM NAME {insert_vdat($2, $3, $4, $5);}; ; -fdat: -label SS FNAME {insert_fdat($1, $2, $3);}; +model_list: +model_list model +| model + ; + +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)