X-Git-Url: https://www.kengrimes.com/gitweb/?p=henge%2Fwebcc.git;a=blobdiff_plain;f=src%2Fapc%2Fparser.y;h=c45a5ce04bc1977539d829332d2c1b78d53d2cd9;hp=f42ea7b02f7ba1a4a3b3f277ce82c681b6240a83;hb=301cac5f6e2edcecf2e1bd89aee5182130a213fc;hpb=a00b12aee56b4e8f633a291d8ead2d3e169166ca diff --git a/src/apc/parser.y b/src/apc/parser.y index f42ea7b..c45a5ce 100644 --- a/src/apc/parser.y +++ b/src/apc/parser.y @@ -1,10 +1,14 @@ /* Asset Package Compiler */ +%code requires{ + #include + #include +} %{ #include #include #include #include - #include "ir.h" + #include extern int lexer_init(); extern int lexer(); @@ -15,154 +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 -%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);}; + NAME CLOPEN {push_cdat($1);} 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 ; - -//set needs a label, vdat_id. -set: -set_map_data element_list HIGH {insert_set();}; -| element_list LOW +map_list: +map_list map MP +| map LP ; +map: +MOPEN NAME NUM NUM NAME {insert_map($2, $3, $4, $5);}; +| MOPEN NAME NAME {insert_map($2, 0, 0, $3);}; +; -//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 +map_list MP ; -ref_list: -RLS quads RLE +set: +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);}; ; -quads: -quads quad {inc_ref();}; -| quad + + +set_label: +NAME REF MP {insert_set_label($1,$2);}; +| NAME LP {insert_set_label($1, -1);}; ; -quad: -NUM NUM NUM NUM {insert_ref($1, $2, $3, $4);}; +set_svlink: +REF MP ; -hitbox: -HB NUM +set_vlink: +REF NAME HP {insert_set_vlink($1, $2);}; ; -root: -RT NUM NUM NUM +olink: +REF LP ; //parent_id is the set_index of the subclass_index. element_list: -element_list element HIGH {inc_ele();}; -| element LOW +element_list element HP +| element LP ; -element: -set_label elem_label vdat LOW {insert_ele($2,$3); }; +ele_label: +NAME REF MP {insert_ele_label($1, $2);}; +| NAME LP {insert_ele_label($1, -1);}; ; -set_label: - STR +ele_vlink: +REF NAME HP {insert_ele_vlink($1, $2);}; ; -elem_label: - STR +ele_svlink: +REF MP ; -vdat: -vdat model {inc_models();}; -| model +ele_map_data: +map MP +| map_list HP +; + +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: +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: -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)