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