api with struct definitions in header file
[henge/webcc.git] / src / apc / parser.y
1 /* Asset Package Compiler */
2 %code requires{
3 #include <stdint.h>
4 }
5 %{
6 #include <stdio.h>
7 #include <string.h>
8 #include <dirent.h>
9 #include <png.h>
10 #include <apc/ir.h>
11
12 extern int lexer_init();
13 extern int lexer();
14 #define yylex lexer
15
16
17 void yyerror();
18 %}
19 %define parse.error verbose
20 %define lr.type ielr
21
22 %union {
23 uint64_t ref;
24 int val;
25 char *str;
26 void *voidp;
27
28 }
29
30 //operators
31 %token CLOPEN // (
32 %token CLCLOSE // )
33 %token SOPEN // {
34 %token SCLOSE // }
35 %token EOPEN // [
36 %token ECLOSE // ]
37 %token VOPEN // /
38 %token VCLOSE // \
39
40 %token QOPEN // !
41 %token QCLOSE // @
42 %token RT // &
43 %token HB // #
44 //nonterminal types
45 %type <ref> olink
46 %type <ref> ele_svlink
47 %type <ref> set_svlink
48 //terminals
49 %token <val> NUM
50 %token <str> STR
51 %token <val> SS
52 %token <str> NAME
53 %token <ref> REF
54 %token <val> SSD
55 %token <voidp> FPTR
56 // Change width, height, num_ptrs to NUM because
57 // when scanning, we can't determine which NUM
58 // is which.
59 %token <val> WIDTH
60 %token <val> HEIGHT
61 %token <val> NUM_PTRS
62 //precedence
63 %precedence LP
64 %precedence MP
65 %precedence HP
66
67 /* Syntax Directed Translation Scheme of the APC grammar */
68
69 /* Rules */
70 %%
71 cdat_buf:
72 class_list
73 ;
74
75 class_list:
76 class_list class
77 | class
78 ;
79
80 class:
81 NAME CLOPEN {push_cdat($1);} class_block CLCLOSE {pop_cdat();};
82 ;
83
84 class_block:
85 class_list
86 | class_list set_list
87 | set_list
88 ;
89
90 set_list:
91 set_list set
92 | set
93 ;
94
95 root:
96 RT NUM NUM NUM {insert_root($2, $3, $4);};
97 ;
98
99 quad_list:
100 quad_list quad
101 | quad
102 ;
103
104 quad:
105 QOPEN NUM NUM NUM REF QCLOSE {insert_quad($2, $3, $4, $5);};
106
107 hitbox:
108 HB NUM {insert_hitbox($2);}
109 ;
110
111 set_map_data:
112 quad_list
113 | quad_list hitbox
114 | quad_list hitbox root
115 | hitbox root
116 | hitbox
117 | root
118 ;
119
120 set:
121 SOPEN set_label set_map_data element_list {alloc_vdat();} vdat SCLOSE {insert_set(); insert_set_vdatid();};
122 | SOPEN set_label set_map_data element_list set_vlink SCLOSE {insert_set();};
123 | SOPEN set_label set_map_data element_list set_svlink SCLOSE {insert_set_svlink($5); insert_set(); };
124 | SOPEN set_label element_list {alloc_vdat();} vdat SCLOSE {insert_set(); insert_set_vdatid();};
125 | SOPEN set_label element_list set_vlink SCLOSE {insert_set(); }
126 | SOPEN set_label element_list set_svlink SCLOSE {insert_set_svlink($4); insert_set();};
127 | SOPEN olink SCLOSE {insert_set_olink($2);};
128 ;
129
130
131 set_label:
132 HP NAME REF {insert_set_label($2,$3);};
133 | LP NAME {insert_set_label($2, -1);};
134 ;
135
136 set_svlink:
137 REF
138 ;
139
140 set_vlink:
141 REF NAME {insert_set_vlink($1, $2);};
142 ;
143
144 olink:
145 REF
146 ;
147
148 //parent_id is the set_index of the subclass_index.
149 element_list:
150 element_list element MP
151 | element LP
152 ;
153
154 ele_label:
155 HP NAME REF {insert_ele_label($2, $3);};
156 | LP NAME {insert_ele_label($2, -1);};
157 ;
158
159 ele_vlink:
160 REF NAME {insert_ele_vlink($1, $2);};
161 ;
162
163 ele_svlink:
164 REF
165 ;
166
167 element:
168 EOPEN ele_label hitbox root {alloc_vdat();} vdat ECLOSE {insert_ele(); insert_ele_vdatid();};
169 | EOPEN ele_label hitbox root ele_vlink ECLOSE {insert_ele(); };
170 | EOPEN ele_label hitbox root ele_svlink ECLOSE {insert_ele_svlink($5);insert_ele(); };
171 | EOPEN ele_label root {alloc_vdat();} vdat ECLOSE {insert_ele(); insert_ele_vdatid();};
172 | EOPEN ele_label root ele_vlink ECLOSE {insert_ele(); };
173 | EOPEN ele_label root ele_svlink ECLOSE {insert_ele_svlink($4); insert_ele(); };
174 | EOPEN olink ECLOSE {insert_ele_olink($2);};
175 ;
176
177 vdat:
178 VOPEN model_list VCLOSE
179 ;
180
181 model_list:
182 model_list model
183 | model
184 ;
185
186 model:
187 spritesheet LP
188 ;
189
190 spritesheet:
191 spritesheet HP framesheet
192 | framesheet
193 ;
194
195 framesheet:
196 SSD NAME REF HEIGHT WIDTH NUM_PTRS frame_pointers LP {insert_framesheet($1, $2, $3, $4, $5, $6);};
197 ;
198
199 frame_pointers:
200 frame_pointers SSD HP FPTR {insert_frame_pointer($2, $4);};
201 | SSD FPTR {insert_frame_pointer($1, $2);};
202 ;
203
204 %%
205
206 void
207 yyerror (char const *s)
208 { fprintf(stderr, "%s\n", s);
209 }