e5098905bae7ad6da184d79cb14983ee1d6edbe8
[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_refid(int);
19 extern void insert_set_name(struct name*);
20 extern void insert_set_namelist(struct name*);
21 extern void insert_link_name(struct name*);
22 extern void insert_map(struct name*,int, int, int, int, uint8_t*);
23 extern void insert_mlink(struct name*, int);
24 extern void insert_vlink(struct name*, int);
25 extern void insert_framesheet(struct name* ,int, int, int,int, uint8_t*);
26
27 #define yylex lexer
28
29
30 void yyerror();
31 %}
32 %define parse.error verbose
33 %define lr.type ielr
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 //nonterminals
62 %type <val> ref_id
63 /* Syntax Directed Translation Scheme of the APC grammar */
64
65 /* Rules */
66 %%
67 cdat_buf:
68 class_block
69 ;
70
71 class:
72 NAME CLOPEN {push_cdat($1);} class_block CLCLOSE {pop_cdat();};
73 ;
74
75 class_list:
76 class_list class
77 | class
78 ;
79
80 class_block:
81 class_list
82 | class_list statement_list
83 | statement_list
84 ;
85
86 statement_list:
87 statement_list statement
88 | statement
89 ;
90
91 statement:
92 vdat_statement
93 | map_statement
94 | ref_statement
95 | olink
96 ;
97
98 ref_statement:
99 set_namelist ref_id {insert_refid($2);};
100 ;
101
102 link_namelist:
103 link_namelist NAME {insert_link_name($2);};
104 | NAME {};
105 ;
106
107
108 set_namelist:
109 set_namelist NAME {insert_set_name($2);};
110 | NAME {insert_set_namelist($1);};
111 ;
112
113 map_statement:
114 set_namelist MOPEN map
115 | set_namelist MOPEN mlink
116 ;
117
118 map:
119 NAME NUM NUM PATH {insert_map($1, 0, $3, 0, 0, $4);};
120 | NAME PATH {insert_map($1, 0, 0, 0, 0, $2);};
121 | NAME D PATH {insert_map($1, $2, 0, 0, 0, $3);};
122 | NAME D NUM NUM PATH {insert_map($1, $2, $3, $4, 0, $5);};
123 | NAME NUM NUM ref_id PATH {insert_map($1, 0, $2, $3, $4, $5);};
124 | NAME ref_id PATH {insert_map($1, 0, 0, 0, $2, $3);};
125 | NAME D ref_id PATH {insert_map($1, $2, 0, 0, $3, $4);};
126 | NAME D NUM NUM ref_id PATH {insert_map($1, $2, $3, $4, $5, $6);};
127 ;
128
129 //shift list_namelist name > reduce mlink
130 mlink:
131 MOPEN LINK NAME LINK link_namelist PATH {insert_mlink($3, 0); };
132 | MOPEN LINK link_namelist PATH {insert_mlink(NULL, 0); };
133 | MOPEN LINK ref_id PATH {insert_mlink(NULL, $3); };
134 | MOPEN LINK NAME LINK ref_id PATH {insert_mlink($3,$5); };
135 ;
136
137 //shift list_namelist name > reduce vlink
138 vlink:
139 LINK NAME LINK link_namelist PATH {insert_vlink($2, 0); };
140 | LINK link_namelist PATH {insert_vlink(NULL, 0);};
141 | LINK REF PATH {insert_vlink(NULL, $2);};//vdat of ref
142 | LINK NAME LINK REF PATH {insert_vlink($2, $4);};//modelname of ref
143 ;
144
145
146 olink:
147 set_namelist MOPEN REF
148 ;
149
150 ref_id:
151 LINK REF {$$ = $2;};
152 ;
153
154
155 vdat_statement:
156 set_namelist SS spritesheet_statement
157 | set_namelist SS vlink
158 ;
159
160 spritesheet_statement:
161 NAME D HEIGHT WIDTH PATH {insert_framesheet($1, $2, $3, $4, 0, $5);};
162 | NAME D PATH {insert_framesheet($1, $2, 0, 0, 0, $3);};
163 | NAME HEIGHT WIDTH PATH {insert_framesheet($1, 0, $2, $3, 0, $4);};
164 | NAME PATH {insert_framesheet($1, 0, 0, 0, 0, $2);};
165 | NAME D HEIGHT WIDTH ref_id PATH {insert_framesheet($1, $2, $3, $4, $5, $6);};
166 | NAME D ref_id PATH {insert_framesheet($1, $2, 0, 0, $3, $4);};
167 | NAME HEIGHT WIDTH ref_id PATH {insert_framesheet($1, 0, $2, $3, $4, $5);};
168 | NAME ref_id PATH {insert_framesheet($1, 0, 0, 0, $2, $3);};
169 ;
170
171 %%
172
173 void
174 yyerror (char const *s)
175 { fprintf(stderr, "%s\n", s);
176 }