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