/* Asset Package Compiler */ %{ #include #include #include #include #include "ir.h" extern int lexer_init(); extern int lexer(); #define yylex lexer void yyerror(); %} %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 //terminals %token NUM %token fd %token STR %token VAR %token SS %token FNAME //precedence %precedence LOW %precedence MED %precedence HIGH /* Syntax Directed Translation Scheme of the APC grammar */ /* Rules */ %% output: class_list {condense();} //Seperate file? ; class_list: class_list class {inc_cbi()}; | class ; class: label CLOPEN class_closure CLCLOSE {set_class_label($1);}; ; class_closure: subclass_list | subclass_list set_list | set_list ; subclass_list: subclass_list class {inc_subclass_idx();}; | class ; set_list: set_list set {inc_set_index();}; | set ; //set needs a label, vdat_id. set: set_map_data element_list HIGH {insert_set();}; | element_list LOW ; //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 ; ref_list: RLS quads RLE ; quads: quads quad {inc_ref();}; | quad ; quad: NUM NUM NUM NUM {insert_ref($1, $2, $3, $4);}; ; hitbox: HB NUM ; root: RT NUM NUM NUM ; //parent_id is the set_index of the subclass_index. element_list: element_list element HIGH {inc_ele();}; | element LOW ; element: set_label elem_label vdat LOW {insert_ele($2,$3); }; ; set_label: STR ; elem_label: STR ; vdat: vdat model {inc_models();}; | model ; model: MOD model fdat | fdat ; fdat: label SS FNAME {insert_fdat($1, $2, $3);}; ; label: STR REF | REF ; %% int main (argc, argv) { lexer_init(); yyparse(); return 0; } void yyerror (char const *s) { fprintf(stderr, "%s\n", s); }