X-Git-Url: https://www.kengrimes.com/gitweb/?p=henge%2Fwebcc.git;a=blobdiff_plain;f=src%2Fapc%2Fparser.y;h=9190bc413187da8cd027e489bc63459bfe4aeb45;hp=e795d316ed1be93133bc36891504f7fbe05af997;hb=0f505368fa8abbc2e9ab0296b9a5e6bd4869345f;hpb=7d0ebfbeac502841bd0ab9dafeed64fbcaeb680a diff --git a/src/apc/parser.y b/src/apc/parser.y index e795d31..9190bc4 100644 --- a/src/apc/parser.y +++ b/src/apc/parser.y @@ -1,4 +1,8 @@ /* Asset Package Compiler */ +%code requires{ + #include + #include +} %{ #include #include @@ -15,154 +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 -%token MOD -//nonterminal types -%type element -%type vdat -%type elem_label -%type 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 -%precedence LOW -%precedence MED -%precedence HIGH +%precedence LP +%precedence MP +%precedence HP /* Syntax Directed Translation Scheme of the APC grammar */ - /* Rules */ %% -output: -class_list {condense();} //Seperate file? -; - -class_list: -class_list class {inc_cbi()}; -| class +cdat_buf: +class_list ; class: -label CLOPEN class_closure CLCLOSE {set_class_label($1);}; + CLOPEN NAME {push_cdat($2);} class_block CLCLOSE {pop_cdat();}; ; -class_closure: -subclass_list -| subclass_list set_list -| set_list +class_list: +class_list class +| class ; -subclass_list: -subclass_list class {inc_subclass_idx();}; -| class +class_block: +class_list +| class_list set_list +| set_list ; set_list: -set_list set {inc_set_index();}; +set_list set | set ; +variant_list: +variant_list variant +| variant +; -//set needs a label, vdat_id. -set: -set_map_data element_list HIGH {insert_set();}; -| element_list LOW +hitbox: +HB NUM +; + +root: +ROOT NUM NUM NUM ; +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 {inc_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 HIGH {inc_ele();}; -| element LOW +element_list element MP +| element LP ; -element: -set_label elem_label vdat LOW {insert_ele($2,$3); }; +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 {inc_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);}; +; +vdat: +VOPEN model_list +| VOPEN NAME NUM NUM NAME {insert_vdat($2, $3, $4, $5);}; ; +model_list: +model_list model +| model + ; + model: -MOD model fdat -| fdat +spritesheet LP ; -fdat: -label SS FNAME {insert_fdat($1, $2, $3);}; +spritesheet: +spritesheet HP framesheet +| framesheet ; -label: -STR REF -| REF +framesheet: +SSD NAME REF HEIGHT WIDTH NUM_PTRS frame_pointers LP //{insert_framesheet($1, $2, $3, $4, $5, $6);}; ; +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)