64bed5ad6d4874172d6c7c66f4d4aec6519a1cf4
[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 %token MOD
45 %token SET
46 %token FS
47 %token ELE
48 //nonterminal types
49 %type <ref> olink
50 %type <ref> ele_svlink
51 %type <ref> set_svlink
52 //terminals
53 %token <val> NUM
54 %token <str> STR
55 %token <val> SS
56 %token <str> NAME
57 %token <ref> REF
58 %token <val> SSD
59 %token <voidp> FPTR
60 %token <val> WIDTH
61 %token <val> HEIGHT
62 %token <val> NUM_PTRS
63 //precedence
64 %precedence LP
65 %precedence MP
66 %precedence HP
67
68 /* Syntax Directed Translation Scheme of the APC grammar */
69
70 /* Rules */
71 %%
72 cdat_buf:
73 class_list
74 ;
75
76 class_list:
77 class_list class
78 | class
79 ;
80
81 class:
82 NAME CLOPEN {push_cdat($1);} class_block CLCLOSE {pop_cdat();};
83 ;
84
85 class_block:
86 class_list
87 | class_list set_list
88 | set_list
89 ;
90
91 set_list:
92 set_list set
93 | set
94 ;
95
96 root:
97 RT NUM NUM NUM {insert_root($2, $3, $4);};
98 ;
99
100 quad_list:
101 quad_list quad
102 | quad
103 ;
104
105 quad:
106 QOPEN NUM NUM NUM REF QCLOSE {insert_quad($2, $3, $4, $5);};
107
108 hitbox:
109 HB NUM {insert_hitbox($2);}
110 ;
111
112 set_map_data:
113 quad_list
114 | quad_list hitbox
115 | quad_list hitbox root
116 | hitbox root
117 | hitbox
118 | root
119 ;
120
121 set:
122 SOPEN set_label element_list set_map_data vdat SCLOSE {insert_set(); insert_vdat();};
123 | SOPEN set_label element_list set_map_data set_vlink SCLOSE {insert_set();};
124 | SOPEN set_label element_list set_map_data set_svlink SCLOSE {insert_set_svlink($5); insert_set(); };
125 | SOPEN set_label element_list vdat SCLOSE {insert_set(); insert_vdat();};
126 | SOPEN set_label element_list set_vlink SCLOSE {insert_set(); }
127 | SOPEN set_label element_list set_svlink SCLOSE {insert_set_svlink($4); insert_set();};
128 | SOPEN olink SCLOSE {insert_set_olink($2);};
129 ;
130
131
132 set_label:
133 HP NAME REF {insert_set_label($2,$3);};
134 | LP NAME {insert_set_label($2, -1);};
135 ;
136
137 set_svlink:
138 REF
139 ;
140
141 set_vlink:
142 REF NAME {insert_set_vlink($1, $2);};
143 ;
144
145 olink:
146 REF
147 ;
148
149 //parent_id is the set_index of the subclass_index.
150 element_list:
151 element_list element MP
152 | element LP
153 ;
154
155 ele_label:
156 HP NAME REF {insert_ele_label($2, $3);};
157 | LP NAME {insert_ele_label($2, -1);};
158 ;
159
160 ele_vlink:
161 REF NAME {insert_ele_vlink($1, $2);};
162 ;
163
164 ele_svlink:
165 REF
166 ;
167
168 element:
169 EOPEN ele_label hitbox root vdat ECLOSE {insert_ele(); insert_vdat();};
170 | EOPEN ele_label hitbox root ele_vlink ECLOSE {insert_ele(); };
171 | EOPEN ele_label hitbox root ele_svlink ECLOSE {insert_ele_svlink($5);insert_ele(); };
172 | EOPEN ele_label root vdat ECLOSE {insert_ele(); insert_vdat();};
173 | EOPEN ele_label root ele_vlink ECLOSE {insert_ele(); };
174 | EOPEN ele_label root ele_svlink ECLOSE {insert_ele_svlink($4); insert_ele(); };
175 | EOPEN olink ECLOSE {insert_ele_olink($2);};
176 ;
177
178 vdat:
179 VOPEN model_list VCLOSE
180 ;
181
182 model_list:
183 model_list model
184 | model
185 ;
186
187 model:
188 spritesheet LP
189 ;
190
191 spritesheet:
192 spritesheet HP framesheet
193 | framesheet
194 ;
195
196 framesheet:
197 SSD NAME REF HEIGHT WIDTH NUM_PTRS frame_pointers LP {insert_framesheet($1, $2, $3, $4, $5, $6);};
198 ;
199
200 frame_pointers:
201 frame_pointers SSD HP FPTR {insert_frame_pointer($2, $4);};
202 | SSD FPTR {insert_frame_pointer($1, $2);};
203 ;
204
205 %%
206
207 void
208 yyerror (char const *s)
209 { fprintf(stderr, "%s\n", s);
210 }