1 /* Asset Package Compiler */
6 typedef struct class_state_t yycstate;
7 struct frame_spec_t { ir_facing d; int w, h; };
10 yycstate* yycstate_new(void);
11 void yycstate_delete(yycstate*);
20 struct class_state_t {
22 ir_class class_stack[];
25 extern long sys_pagesize;
27 static void yyerror(yycstate*, char const*);
28 static inline ir_class yyclass_push(yycstate*, ir_class);
29 static inline ir_class yyclass_pop(yycstate*);
30 /* Stack-based class handler */
31 #define yyclass(CS) (*(CS->csp))
32 #define yyclassld(CS) (ir_classld_from_class(yyclass(CS)))
34 %define parse.error verbose
37 %define api.push-pull push
38 %parse-param {yycstate* cs}
48 struct frame_spec_t frame_spec;
66 %type<ld> set_ld set_link
67 %type<frame_spec> frame_spec
69 /* Syntax Directed Translation Scheme of the APC grammar */
72 | class_list statement_list
82 NAME CLOPEN { yyclass_push(cs,ir_class_addchild(yyclass(cs), $1)); }
84 CLCLOSE { yyclass_pop(cs); }
88 statement_list statement
93 set_spec data_spec REF PATH { ir_data_assign_path($2,$4); ir_set_assign_data($1,$2); ir_set_assign_ref($1,$3); }
94 | set_spec data_spec PATH { ir_data_assign_path($2,$3); ir_set_assign_data($1,$2); }
95 | set_spec REF PATH { ir_set_assign_ref($1,$2); }
99 SS NAME frame_spec { $$ = ir_framesheet($2,$3.d,$3.w,$3.h); }
100 | MAP NAME frame_spec { $$ = ir_mapsheet($2,$3.d,$3.w,$3.h); }
101 | AUDIO NAME { $$ = ir_audio($2); }
102 | LINK set_ld { $$ = ir_link_odat($2); }
103 | LINK set_ld MAP { $$ = ir_link_mdat($2,NULL); }
104 | LINK set_ld MAP NAME { $$ = ir_link_mdat($2,$4); }
105 | LINK set_ld SS { $$ = ir_link_vdat($2,NULL); }
106 | LINK set_ld SS NAME { $$ = ir_link_vdat($2,$4); }
107 | LINK set_ld AUDIO { $$ = ir_link_adat($2,NULL); }
108 | LINK set_ld AUDIO NAME { $$ = ir_link_adat($2,$4); }
112 set_spec NAME { $$ = ir_set_addchild($1,$2); }
113 | NAME { $$ = ir_class_addset(yyclass(cs),$1); }
117 set_link NAME { $$ = ir_setld_addchild($1,$2); }
118 | NAME { $$ = ir_setld_from_classld(yyclassld(cs),$1); }
122 set_link { $$ = $1; }
123 | REF { $$ = ir_setld_from_ref($1); }
127 NUM NUM { $$ = (struct frame_spec_t) {SFACE,$1,$2}; }
128 | FACING { $$ = (struct frame_spec_t) {$1,0,0}; }
129 | FACING NUM NUM { $$ = (struct frame_spec_t) {$1,$2,$3}; }
139 { fprintf(stderr, "%s\n", s); }
141 yycstate* yycstate_new
143 { yycstate* class_state;
144 class_state = (yycstate*) malloc((size_t) sys_pagesize);
145 if(class_state == NULL)
146 { yyerror(class_state, "Memory allocation error.");
149 class_state->csp = &class_state->class_stack[0];
150 yyclass_push(class_state, ir_class_root());
157 { return *(cs->csp)--; }
160 ir_class yyclass_push
164 { *++cs->csp = class;
169 ( yycstate* class_state )
170 { free(class_state); }