e6d145c0d7fdac481bfbde0776c2e8f6cb41ebd2
[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 %token <voidp> QPTR
57 // Change width, height, num_ptrs to NUM because
58 // when scanning, we can't determine which NUM
59 // is which.
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 CLOPEN NAME {push_cdat($2);} 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_file:
101 QOPEN QPTR QCLOSE {insert_quad($2);};
102
103 hitbox:
104 HB NUM {insert_hitbox($2);}
105 ;
106
107 set_map_data:
108 quad_file
109 | quad_file hitbox
110 | quad_file hitbox root
111 | hitbox root
112 | hitbox
113 | root
114 ;
115
116 set:
117 SOPEN set_label set_map_data element_list {alloc_vdat();} vdat SCLOSE {insert_set(); insert_set_vdatid();};
118 | SOPEN set_label set_map_data element_list set_vlink SCLOSE {insert_set();};
119 | SOPEN set_label set_map_data element_list set_svlink SCLOSE {insert_set_svlink($5); insert_set(); };
120 | SOPEN set_label element_list {alloc_vdat();} vdat SCLOSE {insert_set(); insert_set_vdatid();};
121 | SOPEN set_label element_list set_vlink SCLOSE {insert_set(); }
122 | SOPEN set_label element_list set_svlink SCLOSE {insert_set_svlink($4); insert_set();};
123 | SOPEN olink SCLOSE {insert_set_olink($2);};
124 ;
125
126
127 set_label:
128 HP NAME REF {insert_set_label($2,$3);};
129 | LP NAME {insert_set_label($2, -1);};
130 ;
131
132 set_svlink:
133 REF
134
135 ;
136
137 set_vlink:
138 REF NAME {insert_set_vlink($1, $2);};
139 ;
140
141 olink:
142 REF
143 ;
144
145 //parent_id is the set_index of the subclass_index.
146 element_list:
147 element_list element MP
148 | element LP
149 ;
150
151 ele_label:
152 HP NAME REF {insert_ele_label($2, $3);};
153 | LP NAME {insert_ele_label($2, -1);};
154 ;
155
156 ele_vlink:
157 REF NAME {insert_ele_vlink($1, $2);};
158 ;
159
160 ele_svlink:
161 REF
162 ;
163
164 element:
165 EOPEN ele_label hitbox root {alloc_vdat();} vdat ECLOSE {insert_ele(); insert_ele_vdatid();};
166 | EOPEN ele_label hitbox root ele_vlink ECLOSE {insert_ele(); };
167 | EOPEN ele_label hitbox root ele_svlink ECLOSE {insert_ele_svlink($5);insert_ele(); };
168 | EOPEN ele_label root {alloc_vdat();} vdat ECLOSE {insert_ele(); insert_ele_vdatid();};
169 | EOPEN ele_label root ele_vlink ECLOSE {insert_ele(); };
170 | EOPEN ele_label root ele_svlink ECLOSE {insert_ele_svlink($4); insert_ele(); };
171 | EOPEN olink ECLOSE {insert_ele_olink($2);};
172 ;
173
174 vdat:
175 VOPEN model_list VCLOSE
176 ;
177
178 model_list:
179 model_list model
180 | model
181 ;
182
183 model:
184 spritesheet LP
185 ;
186
187 spritesheet:
188 spritesheet HP framesheet
189 | framesheet
190 ;
191
192 framesheet:
193 SSD NAME REF HEIGHT WIDTH NUM_PTRS frame_pointers LP {insert_framesheet($1, $2, $3, $4, $5, $6);};
194 ;
195
196 frame_pointers:
197 frame_pointers SSD HP FPTR {insert_frame_pointer($2, $4);};
198 | SSD FPTR {insert_frame_pointer($1, $2);};
199 ;
200
201 %%
202
203 void
204 yyerror (char const *s)
205 { fprintf(stderr, "%s\n", s);
206 }