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