/* 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: CLOPEN NAME {push_cdat($2);} 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 ; variant_list: variant_list variant | variant ; hitbox: HB NUM ; root: ROOT NUM NUM NUM ; variant: MOPEN NAME NUM NUM NAME {insert_variant($2, $3, $4, $5);}; ; set_map_data: variant_list | variant_list HP hitbox root | variant_list MP root ; 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);}; ; set_label: HP NAME REF {insert_set_label($2,$3);}; | LP NAME {insert_set_label($2, -1);}; ; set_svlink: REF ; set_vlink: REF NAME {insert_set_vlink($1, $2);}; ; olink: REF ; //parent_id is the set_index of the subclass_index. element_list: element_list element MP | element LP ; ele_label: HP NAME REF {insert_ele_label($2, $3);}; | LP NAME {insert_ele_label($2, -1);}; ; ele_vlink: REF NAME {insert_ele_vlink($1, $2);}; ; ele_svlink: REF ; 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: 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); }