Lexer actually lexes filenames now, and odats are made out of mapvariants
[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 /* Syntax Directed Translation Scheme of the APC grammar */
71
72 /* Rules */
73 %%
74 cdat_buf:
75 class_list
76 ;
77
78 class:
79 NAME CLOPEN {push_cdat($1);} class_block CLCLOSE {pop_cdat();};
80 ;
81
82 class_list:
83 class_list class
84 | class
85 ;
86
87 class_block:
88 class_list
89 | class_list set_list
90 | set_list
91 ;
92
93 set_list:
94 set_list set
95 | set
96 ;
97
98 map_list:
99 map_list map MP
100 | map LP
101 ;
102
103 map:
104 MOPEN NAME NUM NUM NAME {insert_map($2, $3, $4, $5);};
105 | MOPEN NAME NAME {insert_map($2, 0, 0, $3);};
106 ;
107
108 set_map_data:
109 map_list MP
110 ;
111
112 set:
113 set_label vdat set_map_data element_list HP {insert_set(); insert_set_vdatid();};
114 | set_label set_vlink set_map_data element_list MP {insert_set();};
115 | set_label set_svlink set_map_data element_list LP {insert_set_svlink($2); insert_set(); };
116 | set_label set_map_data element_list MP {insert_set(); };
117 | set_label set_map_data LP {insert_set(); };
118 | set_label vdat element_list MP {insert_set(); insert_set_vdatid();};
119 | set_label set_vlink element_list LP {insert_set(); };
120 | set_label set_svlink element_list MP {insert_set_svlink($2); insert_set();};
121 | set_label element_list MP
122 | set_label vdat LP
123 | olink {insert_set_olink($1);};
124 ;
125
126
127
128 set_label:
129 NAME REF MP {insert_set_label($1,$2);};
130 | NAME LP {insert_set_label($1, -1);};
131 ;
132
133 set_svlink:
134 REF MP
135 ;
136
137 set_vlink:
138 REF NAME HP {insert_set_vlink($1, $2);};
139 ;
140
141 olink:
142 REF LP
143 ;
144
145 //parent_id is the set_index of the subclass_index.
146 element_list:
147 element_list element HP
148 | element LP
149 ;
150
151 ele_label:
152 NAME REF MP {insert_ele_label($1, $2);};
153 | NAME LP {insert_ele_label($1, -1);};
154 ;
155
156 ele_vlink:
157 REF NAME HP {insert_ele_vlink($1, $2);};
158 ;
159
160 ele_svlink:
161 REF MP
162 ;
163
164 ele_map_data:
165 map MP
166 | map_list HP
167 ;
168
169 element:
170 ele_label vdat ele_map_data {insert_ele(); insert_ele_vdatid();};
171 | ele_label ele_vlink ele_map_data {insert_ele(); };
172 | ele_label ele_svlink ele_map_data {insert_ele_svlink($2);insert_ele(); };
173 | ele_label ele_map_data {insert_ele();};
174 | ele_label vdat {insert_ele(); insert_ele_vdatid();};
175 | ele_label ele_vlink {insert_ele(); };
176 | ele_label ele_svlink {insert_ele_svlink($2); insert_ele(); ;};
177 | MOPEN olink {insert_ele_olink($2);};
178 ;
179
180 vdat:
181 model_list LP
182 | NAME NUM NUM NAME MP {insert_vdat($1, $2, $3, $4);};
183 | NAME NAME {insert_vdat($1, 0, 0, $2);};
184 ;
185
186 model_list:
187 model_list model
188 | model
189 ;
190
191 model:
192 spritesheet LP
193 ;
194
195 spritesheet:
196 spritesheet HP framesheet
197 | framesheet
198 ;
199
200 framesheet:
201 SSD NAME REF HEIGHT WIDTH NUM_PTRS frame_pointers LP //{insert_framesheet($1, $2, $3, $4, $5, $6);};
202 ;
203
204 frame_pointers:
205 frame_pointers SSD HP FPTR //{insert_frame_pointer($2, $4);};
206 | SSD FPTR //{insert_frame_pointer($1, $2);};
207 ;
208
209 %%
210
211 void
212 yyerror (char const *s)
213 { fprintf(stderr, "%s\n", s);
214 }