X-Git-Url: https://git.kengrimes.com/?p=henge%2Fwebcc.git;a=blobdiff_plain;f=src%2Fapc%2Fparser.y;h=12e88745d39167b80cb68e4a6b5920a2739fba0c;hp=f42ea7b02f7ba1a4a3b3f277ce82c681b6240a83;hb=92d574d704e54743631464fac3ce739b1077222c;hpb=a00b12aee56b4e8f633a291d8ead2d3e169166ca diff --git a/src/apc/parser.y b/src/apc/parser.y index f42ea7b..12e8874 100644 --- a/src/apc/parser.y +++ b/src/apc/parser.y @@ -1,10 +1,13 @@ /* Asset Package Compiler */ +%code requires{ + #include +} %{ #include #include #include #include - #include "ir.h" + #include extern int lexer_init(); extern int lexer(); @@ -15,154 +18,190 @@ %} %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 //* -%token HB -%token MOD -//nonterminal types -%type element -%type vdat -%type elem_label -%type label +%union { + uint64_t ref; + int val; + char *str; + void *voidp; + +} + + //operators +%token CLOPEN // ( +%token CLCLOSE // ) +%token SOPEN // { +%token SCLOSE // } +%token EOPEN // [ +%token ECLOSE // ] +%token VOPEN // / +%token VCLOSE // \ + +%token QOPEN // ! +%token QCLOSE // @ +%token RT // & +%token HB // # +//nonterminal types +%type olink +%type ele_svlink +%type set_svlink //terminals -%token NUM -%token fd +%token NUM %token STR -%token VAR -%token SS -%token FNAME +%token SS +%token NAME +%token REF +%token SSD +%token FPTR +// 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 //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? +cdat_buf: +class_list ; class_list: -class_list class {inc_cbi()}; +class_list class | class ; class: -label CLOPEN class_closure CLCLOSE {set_class_label($1);}; + NAME CLOPEN {push_cdat($1);} class_block CLCLOSE {pop_cdat();}; ; -class_closure: -subclass_list -| subclass_list set_list +class_block: +class_list +| class_list set_list | set_list ; -subclass_list: -subclass_list class {inc_subclass_idx();}; -| class -; - set_list: -set_list set {inc_set_index();}; +set_list set | set ; +root: +RT NUM NUM NUM {insert_root($2, $3, $4);}; +; -//set needs a label, vdat_id. -set: -set_map_data element_list HIGH {insert_set();}; -| element_list LOW +quad_list: +quad_list quad +| quad ; +quad: +QOPEN NUM NUM NUM REF QCLOSE {insert_quad($2, $3, $4, $5);}; + +hitbox: +HB NUM {insert_hitbox($2);} +; -//TODO: Figure out what to do with hitbox and root. set_map_data: -ref_list {}; -| ref_list hitbox -| ref_list hitbox root +quad_list +| quad_list hitbox +| quad_list hitbox root | hitbox root | hitbox | root ; -ref_list: -RLS quads RLE +set: +SOPEN set_label set_map_data element_list {alloc_vdat();} 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 {alloc_vdat();} 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 +element: +EOPEN ele_label hitbox root {alloc_vdat();} vdat ECLOSE {insert_ele(); insert_ele_vdatid();}; +| 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 {alloc_vdat();} vdat ECLOSE {insert_ele(); insert_ele_vdatid();}; +| 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);}; +; +vdat: +VOPEN model_list VCLOSE ; +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)