/* Asset Package Compiler */ %code requires{ #include #include } %{ #include #include #include #include #include extern int lexer_init(); extern int lexer(); #define yylex lexer void yyerror(); %} %define parse.error verbose %define lr.type ielr %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 ROOT %token QOPEN // ! %token QCLOSE // @ //nonterminal types %type olink %type ele_svlink %type set_svlink //terminals %token NUM %token STR %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 LP %precedence MP %precedence HP /* Syntax Directed Translation Scheme of the APC grammar */ /* Rules */ %% cdat_buf: class_list ; class: NAME CLOPEN {push_cdat($1);} class_block CLCLOSE {pop_cdat();}; ; class_list: class_list class | class ; class_block: class_list | class_list set_list | set_list ; set_list: set_list set | set ; 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);}; ; set_map_data: map_list MP ; 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);}; ; set_label: NAME REF MP {insert_set_label($1,$2);}; | NAME LP {insert_set_label($1, -1);}; ; set_svlink: REF MP ; set_vlink: REF NAME HP {insert_set_vlink($1, $2);}; ; olink: REF LP ; //parent_id is the set_index of the subclass_index. element_list: element_list element HP | element LP ; ele_label: NAME REF MP {insert_ele_label($1, $2);}; | NAME LP {insert_ele_label($1, -1);}; ; ele_vlink: REF NAME HP {insert_ele_vlink($1, $2);}; ; ele_svlink: REF MP ; 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: spritesheet LP ; spritesheet: spritesheet HP framesheet | framesheet ; 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);}; ; %% void yyerror (char const *s) { fprintf(stderr, "%s\n", s); }