/* Asset Package Compiler */ %code requires{ #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 { 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 %token MOD %token SET %token FS %token ELE //nonterminal types %type olink %type ele_svlink %type set_svlink //terminals %token NUM %token STR %token SS %token NAME %token REF %token SSD %token FPTR %token WIDTH %token HEIGHT %token NUM_PTRS //precedence %precedence LP %precedence MP %precedence HP /* Syntax Directed Translation Scheme of the APC grammar */ /* Rules */ %% cdat_buf: class_list ; class_list: class_list class | class ; class: NAME CLOPEN {push_cdat($1);} class_block CLCLOSE {pop_cdat();}; ; class_block: class_list | class_list set_list | set_list ; set_list: set_list set | set ; root: RT NUM NUM NUM {insert_root($2, $3, $4);}; ; 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);} ; set_map_data: quad_list | quad_list hitbox | quad_list hitbox root | hitbox root | hitbox | root ; set: SOPEN set_label element_list set_map_data vdat SCLOSE {insert_set(); insert_vdat();}; | SOPEN set_label element_list set_map_data set_vlink SCLOSE {insert_set();}; | SOPEN set_label element_list set_map_data set_svlink SCLOSE {insert_set_svlink($5); insert_set(); }; | SOPEN set_label element_list vdat SCLOSE {insert_set(); insert_vdat();}; | 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 ; element: EOPEN ele_label hitbox root vdat ECLOSE {insert_ele(); insert_vdat();}; | 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 vdat ECLOSE {insert_ele(); insert_vdat();}; | 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: 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); }