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