ir files compile, still a wip
[henge/webcc.git] / src / apc / parser.y
1 /* Asset Package Compiler */
2 %{
3 #include <stdio.h>
4 #include <string.h>
5 #include <dirent.h>
6 #include <png.h>
7 #include <apc/ir.h>
8
9 extern int lexer_init();
10 extern int lexer();
11 #define yylex lexer
12
13
14 void yyerror();
15 %}
16 %define parse.error verbose
17 %define lr.type ielr
18 %define api.value.type union
19 %token <char*> WORD
20 //operators
21 %token CLOPEN // /
22 %token CLCLOSE // \
23 %token RLS //!
24 %token RLE //#
25 %token RT //*
26 %token HB
27 %token MOD
28 //nonterminal types
29 %type <int> element
30 %type <int> vdat
31 %type <str> elem_label
32 %type <str> label
33
34 //terminals
35 %token <int> NUM
36 %token <int> fd
37 %token <str> STR
38 %token <int> VAR
39 %token <int> SS
40 %token <str> FNAME
41 //precedence
42 %precedence LOW
43 %precedence MED
44 %precedence HIGH
45
46 /* Syntax Directed Translation Scheme of the APC grammar */
47
48
49 /* Rules */
50 %%
51 output:
52 class_list {condense();} //Seperate file?
53 ;
54
55 class_list:
56 class_list class {inc_cbi()};
57 | class
58 ;
59
60 class:
61 label CLOPEN class_closure CLCLOSE {set_class_label($1);};
62 ;
63
64 class_closure:
65 subclass_list
66 | subclass_list set_list
67 | set_list
68 ;
69
70 subclass_list:
71 subclass_list class {inc_subclass_idx();};
72 | class
73 ;
74
75 set_list:
76 set_list set {inc_set_index();};
77 | set
78 ;
79
80
81 //set needs a label, vdat_id.
82 set:
83 set_map_data element_list HIGH {insert_set();};
84 | element_list LOW
85 ;
86
87
88 //TODO: Figure out what to do with hitbox and root.
89 set_map_data:
90 ref_list {};
91 | ref_list hitbox
92 | ref_list hitbox root
93 | hitbox root
94 | hitbox
95 | root
96 ;
97
98 ref_list:
99 RLS quads RLE
100 ;
101
102 quads:
103 quads quad {inc_ref();};
104 | quad
105 ;
106
107 quad:
108 NUM NUM NUM NUM {insert_ref($1, $2, $3, $4);};
109 ;
110
111 hitbox:
112 HB NUM
113 ;
114
115 root:
116 RT NUM NUM NUM
117 ;
118
119 //parent_id is the set_index of the subclass_index.
120 element_list:
121 element_list element HIGH {inc_ele();};
122 | element LOW
123 ;
124
125 element:
126 set_label elem_label vdat LOW {insert_ele($2,$3); };
127 ;
128
129 set_label:
130 STR
131 ;
132
133 elem_label:
134 STR
135 ;
136
137 vdat:
138 vdat model {inc_models();};
139 | model
140
141 ;
142
143 model:
144 MOD model fdat
145 | fdat
146 ;
147
148 fdat:
149 label SS FNAME {insert_fdat($1, $2, $3);};
150 ;
151
152 label:
153 STR REF
154 | REF
155 ;
156
157
158 %%
159 int
160 main (argc, argv)
161 {
162 lexer_init();
163 yyparse();
164 return 0;
165 }
166
167 void
168 yyerror (char const *s)
169 { fprintf(stderr, "%s\n", s);
170 }