/* Asset Package Compiler */ %code requires { #include } %{ #include "apc.h" #include #include #include extern int lexer_init(); //? extern int lexer(); //? extern void pop_cdat(void); extern void push_cdat(struct name*); extern void insert_vdat(void); extern void insert_refid(int); extern void insert_refid(int); extern void insert_set_name(struct name*); extern void insert_set_namelist(struct name*); extern void insert_link_name(struct name*); extern void insert_map(struct name*,int, int, int, int, uint8_t*); extern void insert_mlink(struct name*, int); extern void insert_vlink(struct name*, int); extern void insert_framesheet(struct name* ,int, int, int,int, uint8_t*); #define yylex lexer void yyerror(); %} %define parse.error verbose %define lr.type ielr %union { int ref; int val; uint8_t* str; struct name* name; void *voidp; } //operators %token CLOPEN // ( %token CLCLOSE // ) %token MOPEN // ~ %token HB %token ROOT %token SS %token LINK //# %token SCLOSE %token CHILD //terminals %token NUM %token PATH %token REF %token HEIGHT %token WIDTH %token D %token NAME //nonterminals %type ref_id /* Syntax Directed Translation Scheme of the APC grammar */ /* Rules */ %% cdat_buf: class_block ; class: NAME CLOPEN {push_cdat($1);} class_block CLCLOSE {pop_cdat();}; ; class_list: class_list class | class ; class_block: class_list | class_list statement_list | statement_list ; statement_list: statement_list statement | statement ; statement: vdat_statement | map_statement | ref_statement | olink ; ref_statement: set_namelist ref_id {insert_refid($2);}; ; link_namelist: link_namelist NAME {insert_link_name($2);}; | NAME {}; ; set_namelist: set_namelist NAME {insert_set_name($2);}; | NAME {insert_set_namelist($1);}; ; map_statement: set_namelist MOPEN map | set_namelist MOPEN mlink ; map: NAME NUM NUM PATH {insert_map($1, 0, $3, 0, 0, $4);}; | NAME PATH {insert_map($1, 0, 0, 0, 0, $2);}; | NAME D PATH {insert_map($1, $2, 0, 0, 0, $3);}; | NAME D NUM NUM PATH {insert_map($1, $2, $3, $4, 0, $5);}; | NAME NUM NUM ref_id PATH {insert_map($1, 0, $2, $3, $4, $5);}; | NAME ref_id PATH {insert_map($1, 0, 0, 0, $2, $3);}; | NAME D ref_id PATH {insert_map($1, $2, 0, 0, $3, $4);}; | NAME D NUM NUM ref_id PATH {insert_map($1, $2, $3, $4, $5, $6);}; ; //shift list_namelist name > reduce mlink mlink: MOPEN LINK NAME LINK link_namelist PATH {insert_mlink($3, 0); }; | MOPEN LINK link_namelist PATH {insert_mlink(NULL, 0); }; | MOPEN LINK ref_id PATH {insert_mlink(NULL, $3); }; | MOPEN LINK NAME LINK ref_id PATH {insert_mlink($3,$5); }; ; //shift list_namelist name > reduce vlink vlink: LINK NAME LINK link_namelist PATH {insert_vlink($2, 0); }; | LINK link_namelist PATH {insert_vlink(NULL, 0);}; | LINK REF PATH {insert_vlink(NULL, $2);};//vdat of ref | LINK NAME LINK REF PATH {insert_vlink($2, $4);};//modelname of ref ; olink: set_namelist MOPEN REF ; ref_id: LINK REF {$$ = $2;}; ; vdat_statement: set_namelist SS spritesheet_statement | set_namelist SS vlink ; spritesheet_statement: NAME D HEIGHT WIDTH PATH {insert_framesheet($1, $2, $3, $4, 0, $5);}; | NAME D PATH {insert_framesheet($1, $2, 0, 0, 0, $3);}; | NAME HEIGHT WIDTH PATH {insert_framesheet($1, 0, $2, $3, 0, $4);}; | NAME PATH {insert_framesheet($1, 0, 0, 0, 0, $2);}; | NAME D HEIGHT WIDTH ref_id PATH {insert_framesheet($1, $2, $3, $4, $5, $6);}; | NAME D ref_id PATH {insert_framesheet($1, $2, 0, 0, $3, $4);}; | NAME HEIGHT WIDTH ref_id PATH {insert_framesheet($1, 0, $2, $3, $4, $5);}; | NAME ref_id PATH {insert_framesheet($1, 0, 0, 0, $2, $3);}; ; %% void yyerror (char const *s) { fprintf(stderr, "%s\n", s); }