optimization pass thru parser
[henge/apc.git] / src / parser.y
1 /* Asset Package Compiler */
2 %code requires {
3 #include <unitypes.h>
4 }
5
6 %{
7 #include <stdio.h>
8 #include <string.h>
9 #include <dirent.h>
10 #include <unitypes.h>
11 extern int lexer_init(); //?
12 extern int lexer(); //?
13 extern void pop_cdat(void);
14 extern void push_cdat(uint8_t*);
15 extern void insert_vdat(void);
16 extern void insert_refid(int);
17 extern void insert_set_name(uint8_t*);
18 extern void insert_set_namelist(uint8_t*);
19 extern void insert_link_name(uint8_t*);
20 extern void insert_map(uint8_t*,int, int, int, int, uint8_t*);
21 extern void insert_mlink(uint8_t*, int);
22 extern void insert_vlink(uint8_t*, int);
23 extern void insert_framesheet(uint8_t* ,int, int, int,int, uint8_t*);
24
25 #define yylex lexer
26
27
28 void yyerror();
29 %}
30 %define parse.error verbose
31 %define lr.type ielr
32
33 %union {
34 long long ref;
35 int val;
36 uint8_t* str;
37 void *voidp;
38 }
39
40 //operators
41 %token CLOPEN // (
42 %token CLCLOSE // )
43 %token MOPEN // ~
44 %token HB
45 %token ROOT
46 %token SS
47 %token LINK //#
48 %token SCLOSE
49 %token CHILD
50 //terminals
51 %token <val> NUM
52 %token <str> PATH
53 %token <ref> REF
54 %token <val> HEIGHT
55 %token <val> WIDTH
56 %token <val> D
57 %token <str> NAME
58 //nonterminals
59 %type <val> ref_id
60 /* Syntax Directed Translation Scheme of the APC grammar */
61
62 /* Rules */
63 %%
64 cdat_buf:
65 class_block
66 ;
67
68 class:
69 NAME CLOPEN {push_cdat($1);} class_block CLCLOSE {pop_cdat();};
70 ;
71
72 class_list:
73 class_list class
74 | class
75 ;
76
77 class_block:
78 class_list
79 | class_list statement_list
80 | statement_list
81 ;
82
83 statement_list:
84 statement_list statement
85 | statement
86 ;
87
88 statement:
89 vdat_statement
90 | map_statement
91 | ref_statement
92 | olink
93 ;
94
95 ref_statement:
96 set_namelist ref_id {insert_refid($2);};
97 ;
98
99 link_namelist:
100 link_namelist NAME {insert_link_name($2);};
101 | NAME {};
102 ;
103
104
105 set_namelist:
106 set_namelist NAME {insert_set_name($2);};
107 | NAME {insert_set_namelist($1);};
108 ;
109
110 map_statement:
111 set_namelist MOPEN map
112 | set_namelist MOPEN mlink
113 ;
114
115 map:
116 NAME NUM NUM PATH {insert_map($1, 0, $3, 0, 0, $4);};
117 | NAME PATH {insert_map($1, 0, 0, 0, 0, $2);};
118 | NAME D PATH {insert_map($1, $2, 0, 0, 0, $3);};
119 | NAME D NUM NUM PATH {insert_map($1, $2, $3, $4, 0, $5);};
120 | NAME NUM NUM ref_id PATH {insert_map($1, 0, $2, $3, $4, $5);};
121 | NAME ref_id PATH {insert_map($1, 0, 0, 0, $2, $3);};
122 | NAME D ref_id PATH {insert_map($1, $2, 0, 0, $3, $4);};
123 | NAME D NUM NUM ref_id PATH {insert_map($1, $2, $3, $4, $5, $6);};
124 ;
125
126 //shift list_namelist name > reduce mlink
127 mlink:
128 MOPEN LINK NAME LINK link_namelist PATH {insert_mlink($3, 0); };
129 | MOPEN LINK link_namelist PATH {insert_mlink(NULL, 0); };
130 | MOPEN LINK ref_id PATH {insert_mlink(NULL, $3); };
131 | MOPEN LINK NAME LINK ref_id PATH {insert_mlink($3,$5); };
132 ;
133
134 //shift list_namelist name > reduce vlink
135 vlink:
136 LINK NAME LINK link_namelist PATH {insert_vlink($2, 0); };
137 | LINK link_namelist PATH {insert_vlink(NULL, 0);};
138 | LINK REF PATH {insert_vlink(NULL, $2);};//vdat of ref
139 | LINK NAME LINK REF PATH {insert_vlink($2, $4);};//modelname of ref
140 ;
141
142
143 olink:
144 set_namelist MOPEN REF
145 ;
146
147 ref_id:
148 LINK REF {$$ = $2;};
149 ;
150
151
152 vdat_statement:
153 set_namelist SS spritesheet_statement
154 | set_namelist SS vlink
155 ;
156
157 spritesheet_statement:
158 NAME D HEIGHT WIDTH PATH {insert_framesheet($1, $2, $3, $4, 0, $5);};
159 | NAME D PATH {insert_framesheet($1, $2, 0, 0, 0, $3);};
160 | NAME HEIGHT WIDTH PATH {insert_framesheet($1, 0, $2, $3, 0, $4);};
161 | NAME PATH {insert_framesheet($1, 0, 0, 0, 0, $2);};
162 | NAME D HEIGHT WIDTH ref_id PATH {insert_framesheet($1, $2, $3, $4, $5, $6);};
163 | NAME D ref_id PATH {insert_framesheet($1, $2, 0, 0, $3, $4);};
164 | NAME HEIGHT WIDTH ref_id PATH {insert_framesheet($1, 0, $2, $3, $4, $5);};
165 | NAME ref_id PATH {insert_framesheet($1, 0, 0, 0, $2, $3);};
166 ;
167
168 %%
169
170 void
171 yyerror (char const *s)
172 { fprintf(stderr, "%s\n", s);
173 }