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