RPA Toolkit
added --dump-alias. Work on the RJS.
[rpatk.git] / rpa2 / rpaparser.c
1 #include "rmem.h"
2 #include "rvmcodegen.h"
3 #include "rstring.h"
4 #include "rpaparser.h"
5
6 static rint rpa_parser_init(rpa_parser_t *pa);
7
8
9 rpa_parser_t *rpa_parser_create()
10 {
11         rpa_parser_t *pa;
12
13         pa = (rpa_parser_t *)r_zmalloc(sizeof(*pa));
14         r_memset(pa, 0, sizeof(*pa));
15         pa->co = rpa_compiler_create();
16         pa->stat = rpa_stat_create(NULL, RPA_PARSER_STACK);
17         if (rpa_parser_init(pa) < 0) {
18                 rpa_parser_destroy(pa);
19                 return NULL;
20         }
21         return pa;
22 }
23
24
25 void rpa_parser_destroy(rpa_parser_t *pa)
26 {
27         if (pa) {
28                 rpa_compiler_destroy(pa->co);
29                 rpa_stat_destroy(pa->stat);
30                 r_free(pa);
31         }
32 }
33
34
35 rlong rpa_parser_load(rpa_parser_t *pa, const rchar *prods, rsize_t size)
36 {
37         rlong ret = 0;
38         rpa_compiler_t *co = pa->co;
39         rpastat_t *stat = pa->stat;
40
41         rpa_stat_init(stat, prods, prods, prods + size);
42         rpa_stat_cachedisable(stat, 0);
43
44         if (rpa_stat_exec(stat, rvm_codegen_getcode(co->cg, 0), pa->main) < 0)
45                 return -1;
46         ret = (rlong)RVM_CPUREG_GETL(stat->cpu, R0);
47         if (ret < 0)
48                 return 0;
49         return ret;
50 }
51
52
53 rlong rpa_parser_load_s(rpa_parser_t *pa, const rchar *prods)
54 {
55         return rpa_parser_load(pa, prods, r_strlen(prods));
56 }
57
58
59 static void rpa_production_directives(rpa_parser_t *pa)
60 {
61         rpa_compiler_t *co = pa->co;
62
63         rpa_compiler_rule_begin_s(co, "directives");
64
65         rpa_compiler_altexp_begin(co, RPA_MATCH_MULTIPLE);
66
67         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
68         rpa_compiler_reference_nan_s(co, "emit");
69         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
70         rpa_compiler_branch_end(co);
71
72         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
73         rpa_compiler_reference_nan_s(co, "noemit");
74         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
75         rpa_compiler_branch_end(co);
76
77         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
78         rpa_compiler_reference_nan_s(co, "emitall");
79         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
80         rpa_compiler_branch_end(co);
81
82         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
83         rpa_compiler_reference_nan_s(co, "emitnone");
84         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
85         rpa_compiler_branch_end(co);
86
87         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
88         rpa_compiler_reference_nan_s(co, "uid");
89         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
90         rpa_compiler_branch_end(co);
91         rpa_compiler_altexp_end(co);
92         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
93
94         /*
95          * Skip any junk we might have up to the end of the line
96          */
97         rpa_compiler_notexp_begin(co, RPA_MATCH_MULTIOPT);
98         rpa_compiler_class_begin(co, RPA_MATCH_NONE);
99         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '\r'));
100         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
101         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '\n'));
102         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
103         rpa_compiler_class_end(co);
104         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
105         rpa_compiler_notexp_end(co);
106
107         rpa_compiler_rule_end(co);
108 }
109
110
111 static void rpa_production_bnf(rpa_parser_t *pa)
112 {
113         rpa_compiler_t *co = pa->co;
114
115 //      rpa_compiler_rulepref_set_ruleuid_flags_s(co, "bnf", RPA_PRODUCTION_BNF);
116         rpa_compiler_rule_begin_s(co, "bnf");
117
118         rpa_compiler_altexp_begin(co, RPA_MATCH_MULTIPLE);
119
120         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
121         rpa_compiler_reference_nan_s(co, "space");
122         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
123         rpa_compiler_branch_end(co);
124
125         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
126         rpa_compiler_reference_nan_s(co, "directives");
127         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
128         rpa_compiler_branch_end(co);
129
130         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
131         rpa_compiler_reference_nan_s(co, "comment");
132         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
133         rpa_compiler_branch_end(co);
134
135         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
136         rpa_compiler_class_begin(co, RPA_MATCH_MULTIPLE);
137         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '\r'));
138         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
139         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '\n'));
140         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
141         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, ';'));
142         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
143         rpa_compiler_class_end(co);
144         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
145         rpa_compiler_branch_end(co);
146
147         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
148         rpa_compiler_reference_nan_s(co, "namedrule");
149         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
150         rpa_compiler_branch_end(co);
151
152         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
153         rpa_compiler_reference_nan_s(co, "anonymousrule");
154         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
155         rpa_compiler_branch_end(co);
156
157
158         rpa_compiler_altexp_end(co);
159
160         rpa_compiler_rule_end(co);
161 }
162
163
164 static void rpa_production_directive_uid(rpa_parser_t *pa)
165 {
166         rpa_compiler_t *co = pa->co;
167
168         rpa_compiler_rulepref_set_ruleuid_flags_s(co, "uid", RPA_PRODUCTION_DIRECTIVEUID, RPA_RFLAG_EMITRECORD);
169         rpa_compiler_rule_begin_s(co, "uid");
170
171         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '#'));
172         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
173         rpa_compiler_reference_opt_s(co, "space");
174         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '!'));
175         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
176         rpa_compiler_reference_opt_s(co, "space");
177         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'u'));
178         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
179         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'i'));
180         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
181         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'd'));
182         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
183         rpa_compiler_reference_nan_s(co, "space");
184         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
185         rpa_compiler_reference_nan_s(co, "rulename");
186         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
187         rpa_compiler_reference_nan_s(co, "space");
188         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
189         rpa_compiler_reference_opt_s(co, "aliasname");
190         rpa_compiler_reference_opt_s(co, "space");
191         rpa_compiler_reference_nan_s(co, "dec");
192         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
193
194         rpa_compiler_rule_end(co);
195 }
196
197
198 static void rpa_production_directive_emit(rpa_parser_t *pa)
199 {
200         rpa_compiler_t *co = pa->co;
201
202         rpa_compiler_rulepref_set_ruleuid_flags_s(co, "emit", RPA_PRODUCTION_DIRECTIVEEMIT, RPA_RFLAG_EMITRECORD);
203         rpa_compiler_rule_begin_s(co, "emit");
204
205         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '#'));
206         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
207         rpa_compiler_reference_opt_s(co, "space");
208         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '!'));
209         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
210         rpa_compiler_reference_opt_s(co, "space");
211         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'e'));
212         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
213         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'm'));
214         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
215         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'i'));
216         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
217         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 't'));
218         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
219         rpa_compiler_reference_nan_s(co, "space");
220         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
221         rpa_compiler_reference_nan_s(co, "rulename");
222
223         rpa_compiler_rule_end(co);
224 }
225
226
227 static void rpa_production_directive_emitall(rpa_parser_t *pa)
228 {
229         rpa_compiler_t *co = pa->co;
230
231         rpa_compiler_rulepref_set_ruleuid_flags_s(co, "emitall", RPA_PRODUCTION_DIRECTIVEEMITALL, RPA_RFLAG_EMITRECORD);
232         rpa_compiler_rule_begin_s(co, "emitall");
233
234         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '#'));
235         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
236         rpa_compiler_reference_opt_s(co, "space");
237         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '!'));
238         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
239         rpa_compiler_reference_opt_s(co, "space");
240         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'e'));
241         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
242         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'm'));
243         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
244         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'i'));
245         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
246         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 't'));
247         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
248         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'a'));
249         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
250         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'l'));
251         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
252         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'l'));
253         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
254         rpa_compiler_rule_end(co);
255 }
256
257
258 static void rpa_production_directive_emitnone(rpa_parser_t *pa)
259 {
260         rpa_compiler_t *co = pa->co;
261
262         rpa_compiler_rulepref_set_ruleuid_flags_s(co, "emitnone", RPA_PRODUCTION_DIRECTIVEEMITNONE, RPA_RFLAG_EMITRECORD);
263         rpa_compiler_rule_begin_s(co, "emitnone");
264
265         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '#'));
266         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
267         rpa_compiler_reference_opt_s(co, "space");
268         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '!'));
269         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
270         rpa_compiler_reference_opt_s(co, "space");
271         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'e'));
272         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
273         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'm'));
274         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
275         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'i'));
276         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
277         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 't'));
278         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
279         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'n'));
280         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
281         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'o'));
282         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
283         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'n'));
284         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
285         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'e'));
286         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
287         rpa_compiler_rule_end(co);
288 }
289
290
291 static void rpa_production_directive_noemit(rpa_parser_t *pa)
292 {
293         rpa_compiler_t *co = pa->co;
294
295         rpa_compiler_rulepref_set_ruleuid_flags_s(co, "noemit", RPA_PRODUCTION_DIRECTIVENOEMIT, RPA_RFLAG_EMITRECORD);
296         rpa_compiler_rule_begin_s(co, "noemit");
297
298         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '#'));
299         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
300         rpa_compiler_reference_opt_s(co, "space");
301         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '!'));
302         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
303         rpa_compiler_reference_opt_s(co, "space");
304         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'n'));
305         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
306         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'o'));
307         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
308         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'e'));
309         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
310         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'm'));
311         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
312         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'i'));
313         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
314         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 't'));
315         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
316         rpa_compiler_reference_nan_s(co, "space");
317         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
318         rpa_compiler_reference_nan_s(co, "rulename");
319
320         rpa_compiler_rule_end(co);
321 }
322
323
324 static void rpa_production_comment(rpa_parser_t *pa)
325 {
326         rpa_compiler_t *co = pa->co;
327
328         rpa_compiler_rule_begin_s(co, "comment");
329
330         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '#'));
331         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
332
333         rpa_compiler_exp_begin(co, RPA_MATCH_MULTIOPT);
334         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
335         rpa_compiler_class_begin(co, RPA_MATCH_NONE);
336         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '\r'));
337         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
338         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '\n'));
339         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
340         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '\0'));
341         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
342         rpa_compiler_class_end(co);
343         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
344         rpa_compiler_branch_end(co);
345         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHSPCHR_NAN, DA, XX, XX, '.'));
346         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
347         rpa_compiler_exp_end(co);
348
349         rpa_compiler_rule_end(co);
350 }
351
352
353 static void rpa_production_namedrule(rpa_parser_t *pa)
354 {
355         rpa_compiler_t *co = pa->co;
356
357         rpa_compiler_rulepref_set_ruleuid_flags_s(co, "namedrule", RPA_PRODUCTION_NAMEDRULE, RPA_RFLAG_EMITRECORD);
358         rpa_compiler_rule_begin_s(co, "namedrule");
359
360         rpa_compiler_reference_opt_s(co, "space");
361
362         rpa_compiler_reference_nan_s(co, "rulename");
363         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
364
365         rpa_compiler_reference_nan_s(co, "assign");
366         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
367
368         rpa_compiler_reference_mul_s(co, "orexp");
369         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
370
371         rpa_compiler_rule_end(co);
372 }
373
374
375 static void rpa_production_anonymousrule(rpa_parser_t *pa)
376 {
377         rpa_compiler_t *co = pa->co;
378
379         rpa_compiler_rulepref_set_ruleuid_flags_s(co, "anonymousrule", RPA_PRODUCTION_ANONYMOUSRULE, RPA_RFLAG_EMITRECORD);
380         rpa_compiler_rule_begin_s(co, "anonymousrule");
381
382         rpa_compiler_reference_opt_s(co, "space");
383
384         rpa_compiler_reference_mul_s(co, "orexp");
385         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
386
387         rpa_compiler_rule_end(co);
388 }
389
390
391 static void rpa_production_space(rpa_parser_t *pa)
392 {
393         rpa_compiler_t *co = pa->co;
394
395         rpa_compiler_rule_begin_s(co, "space");
396
397         rpa_compiler_class_begin(co, RPA_MATCH_MULTIPLE);
398         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, ' '));
399         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
400         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '\t'));
401         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
402         rpa_compiler_class_end(co);
403         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
404
405         rpa_compiler_rule_end(co);
406 }
407
408
409 static void rpa_production_rulename(rpa_parser_t *pa)
410 {
411         rpa_compiler_t *co = pa->co;
412
413         rpa_compiler_rulepref_set_ruleuid_flags_s(co, "rulename", RPA_PRODUCTION_RULENAME, RPA_RFLAG_EMITRECORD);
414         rpa_compiler_rule_begin_s(co, "rulename");
415
416         rpa_compiler_class_begin(co, RPA_MATCH_NONE);
417         rvm_codegen_addins(co->cg, rvm_asm2(RPA_MATCHRNG_NAN, DA, XX, XX, 'a', 'z'));
418         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
419         rvm_codegen_addins(co->cg, rvm_asm2(RPA_MATCHRNG_NAN, DA, XX, XX, 'A', 'Z'));
420         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
421         rpa_compiler_class_end(co);
422         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
423
424         rpa_compiler_class_begin(co, RPA_MATCH_MULTIOPT);
425         rvm_codegen_addins(co->cg, rvm_asm2(RPA_MATCHRNG_NAN, DA, XX, XX, 'a', 'z'));
426         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
427         rvm_codegen_addins(co->cg, rvm_asm2(RPA_MATCHRNG_NAN, DA, XX, XX, 'A', 'Z'));
428         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
429         rvm_codegen_addins(co->cg, rvm_asm2(RPA_MATCHRNG_NAN, DA, XX, XX, '0', '9'));
430         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
431         rpa_compiler_class_end(co);
432         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
433
434         rpa_compiler_rule_end(co);
435 }
436
437
438 static void rpa_production_aliasname(rpa_parser_t *pa)
439 {
440         rpa_compiler_t *co = pa->co;
441
442         rpa_compiler_rulepref_set_ruleuid_flags_s(co, "aliasname", RPA_PRODUCTION_ALIASNAME, RPA_RFLAG_EMITRECORD);
443         rpa_compiler_rule_begin_s(co, "aliasname");
444
445         rpa_compiler_class_begin(co, RPA_MATCH_NONE);
446         rvm_codegen_addins(co->cg, rvm_asm2(RPA_MATCHRNG_NAN, DA, XX, XX, 'a', 'z'));
447         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
448         rvm_codegen_addins(co->cg, rvm_asm2(RPA_MATCHRNG_NAN, DA, XX, XX, 'A', 'Z'));
449         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
450         rpa_compiler_class_end(co);
451         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
452
453         rpa_compiler_class_begin(co, RPA_MATCH_MULTIOPT);
454         rvm_codegen_addins(co->cg, rvm_asm2(RPA_MATCHRNG_NAN, DA, XX, XX, 'a', 'z'));
455         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
456         rvm_codegen_addins(co->cg, rvm_asm2(RPA_MATCHRNG_NAN, DA, XX, XX, 'A', 'Z'));
457         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
458         rvm_codegen_addins(co->cg, rvm_asm2(RPA_MATCHRNG_NAN, DA, XX, XX, '0', '9'));
459         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
460         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '_'));
461         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
462         rpa_compiler_class_end(co);
463         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
464
465         rpa_compiler_rule_end(co);
466 }
467
468
469 static void rpa_production_assign(rpa_parser_t *pa)
470 {
471         rpa_compiler_t *co = pa->co;
472
473         rpa_compiler_rule_begin_s(co, "assign");
474         rpa_compiler_exp_begin(co, RPA_MATCH_NONE);
475
476         rpa_compiler_reference_opt_s(co, "space");
477
478         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, ':'));
479         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
480         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, ':'));
481         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
482         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '='));
483
484         rpa_compiler_reference_mop_s(co, "space");
485
486         rpa_compiler_exp_end(co);
487         rpa_compiler_rule_end(co);
488 }
489
490 /*
491  * None of thesese " ~:#@^-|&+*?\"\'[]()<>.;\n\r\0"
492  */
493 static void rpa_production_regexchar(rpa_parser_t *pa)
494 {
495         rpa_compiler_t *co = pa->co;
496         rpa_compiler_rule_begin_s(co, "regexchar");
497
498         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, ' '));
499         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
500         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '~'));
501         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
502         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '#'));
503         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
504         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '^'));
505         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
506         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '-'));
507         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
508         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '|'));
509         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
510         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '&'));
511         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
512         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '+'));
513         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
514         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '*'));
515         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
516         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '?'));
517         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
518         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '"'));
519         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
520         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '\''));
521         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
522         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '('));
523         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
524         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, ')'));
525         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
526         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '['));
527         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
528         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, ']'));
529         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
530         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '<'));
531         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
532         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '>'));
533         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
534         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '.'));
535         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
536         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, ';'));
537         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
538         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '\t'));
539         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
540         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '\r'));
541         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
542         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '\n'));
543         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
544         rpa_compiler_reference_nan_s(co, "char");
545         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
546
547         rpa_compiler_rule_end(co);
548 }
549
550
551 static void rpa_production_char(rpa_parser_t *pa)
552 {
553         rpa_compiler_t *co = pa->co;
554
555         rpa_compiler_rulepref_set_ruleuid_flags_s(co, "char", RPA_PRODUCTION_CHAR, RPA_RFLAG_EMITRECORD);
556         rpa_compiler_rule_begin_s(co, "char");
557         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHSPCHR_NAN, DA, XX, XX, '.'));
558         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
559         rpa_compiler_rule_end(co);
560 }
561
562
563 static void rpa_production_escapedchar(rpa_parser_t *pa)
564 {
565         rpa_compiler_t *co = pa->co;
566
567         rpa_compiler_rule_begin_s(co, "escapedchar");
568         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '\\'));
569         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
570         rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
571         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
572         rpa_compiler_reference_nan_s(co, "specialchar");
573         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
574         rpa_compiler_branch_end(co);
575         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
576         rpa_compiler_reference_nan_s(co, "char");
577         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
578         rpa_compiler_branch_end(co);
579         rpa_compiler_altexp_end(co);
580         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
581         rpa_compiler_rule_end(co);
582 }
583
584
585 static void rpa_production_specialchar(rpa_parser_t *pa)
586 {
587         rpa_compiler_t *co = pa->co;
588
589         rpa_compiler_rulepref_set_ruleuid_flags_s(co, "specialchar", RPA_PRODUCTION_SPECIALCHAR, RPA_RFLAG_EMITRECORD);
590         rpa_compiler_rule_begin_s(co, "specialchar");
591
592         rpa_compiler_class_begin(co, RPA_MATCH_NONE);
593         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'r'));
594         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
595         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'n'));
596         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
597         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 't'));
598         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
599         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '.'));
600         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
601 //      rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '~'));
602 //      rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
603         rpa_compiler_class_end(co);
604         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
605
606         rpa_compiler_rule_end(co);
607 }
608
609
610 /*
611  * None of the " #\\-[]\t\n\r\0"
612  */
613 static void rpa_production_clschars(rpa_parser_t *pa)
614 {
615         rpa_compiler_t *co = pa->co;
616
617         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, ' '));
618         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
619         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '#'));
620         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
621         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '\\'));
622         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
623         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '-'));
624         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
625         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '['));
626         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
627         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, ']'));
628         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
629         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '\t'));
630         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
631         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '\r'));
632         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
633         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '\n'));
634         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
635         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '\0'));
636         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
637 }
638
639
640 static void rpa_production_clschar(rpa_parser_t *pa)
641 {
642         rpa_compiler_t *co = pa->co;
643
644         rpa_compiler_rulepref_set_ruleuid_flags_s(co, "clschar", RPA_PRODUCTION_CLSCHAR, RPA_RFLAG_EMITRECORD);
645         rpa_compiler_rule_begin_s(co, "clschar");
646
647         rpa_production_clschars(pa);
648         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHSPCHR_NAN, DA, XX, XX, '.'));
649         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
650         rpa_compiler_rule_end(co);
651 }
652
653
654 static void rpa_production_beginchar(rpa_parser_t *pa)
655 {
656         rpa_compiler_t *co = pa->co;
657
658         rpa_compiler_rulepref_set_ruleuid_flags_s(co, "beginchar", RPA_PRODUCTION_BEGINCHAR, RPA_RFLAG_EMITRECORD);
659         rpa_compiler_rule_begin_s(co, "beginchar");
660
661 //      rpa_compiler_class_begin(co, RPA_MATCH_NONE);
662         rpa_production_clschars(pa);
663 //      rpa_compiler_class_end(co);
664 //      rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
665         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHSPCHR_NAN, DA, XX, XX, '.'));
666         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
667
668         rpa_compiler_rule_end(co);
669 }
670
671
672 static void rpa_production_endchar(rpa_parser_t *pa)
673 {
674         rpa_compiler_t *co = pa->co;
675
676         rpa_compiler_rulepref_set_ruleuid_flags_s(co, "endchar", RPA_PRODUCTION_ENDCHAR, RPA_RFLAG_EMITRECORD);
677         rpa_compiler_rule_begin_s(co, "endchar");
678
679 //      rpa_compiler_class_begin(co, RPA_MATCH_NONE);
680         rpa_production_clschars(pa);
681 //      rpa_compiler_class_end(co);
682 //      rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
683         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHSPCHR_NAN, DA, XX, XX, '.'));
684         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
685         rpa_compiler_rule_end(co);
686 }
687
688
689 static void rpa_production_occurence(rpa_parser_t *pa)
690 {
691         rpa_compiler_t *co = pa->co;
692
693         rpa_compiler_rulepref_set_ruleuid_flags_s(co, "occurence", RPA_PRODUCTION_OCCURENCE, RPA_RFLAG_EMITRECORD);
694         rpa_compiler_rule_begin_s(co, "occurence");
695
696         rpa_compiler_class_begin(co, RPA_MATCH_NONE);
697         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '?'));
698         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
699         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '+'));
700         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
701         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '*'));
702         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
703         rpa_compiler_class_end(co);
704         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
705
706         rpa_compiler_rule_end(co);
707 }
708
709
710 static void rpa_production_charrng(rpa_parser_t *pa)
711 {
712         rpa_compiler_t *co = pa->co;
713
714         rpa_compiler_rulepref_set_ruleuid_flags_s(co, "charrng", RPA_PRODUCTION_CHARRNG, RPA_RFLAG_EMITRECORD);
715         rpa_compiler_rule_begin_s(co, "charrng");
716         rpa_compiler_reference_nan_s(co, "beginchar");
717         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
718         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '-'));
719         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
720         rpa_compiler_reference_nan_s(co, "endchar");
721         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
722         rpa_compiler_rule_end(co);
723 }
724
725
726 static void rpa_production_numrng(rpa_parser_t *pa)
727 {
728         rpa_compiler_t *co = pa->co;
729
730         rpa_compiler_rulepref_set_ruleuid_flags_s(co, "numrng", RPA_PRODUCTION_NUMRNG, RPA_RFLAG_EMITRECORD);
731         rpa_compiler_rule_begin_s(co, "numrng");
732
733         rpa_compiler_reference_nan_s(co, "num");
734         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
735         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '-'));
736         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
737         rpa_compiler_reference_nan_s(co, "num");
738         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
739
740         rpa_compiler_rule_end(co);
741 }
742
743
744 static void rpa_production_sqstr(rpa_parser_t *pa)
745 {
746         rpa_compiler_t *co = pa->co;
747
748         rpa_compiler_rule_begin_s(co, "sqstr");
749
750         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '\''));
751         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
752
753         rpa_compiler_exp_begin(co, RPA_MATCH_MULTIPLE);
754         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '\''));
755         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
756         rpa_compiler_reference_nan_s(co, "char");
757         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
758         rpa_compiler_exp_end(co);
759         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
760         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '\''));
761         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
762
763         rpa_compiler_rule_end(co);
764 }
765
766
767 static void rpa_production_dqstr(rpa_parser_t *pa)
768 {
769         rpa_compiler_t *co = pa->co;
770
771         rpa_compiler_rule_begin_s(co, "dqstr");
772
773         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '"'));
774         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
775
776         rpa_compiler_exp_begin(co, RPA_MATCH_MULTIPLE);
777         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '"'));
778         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
779         rpa_compiler_reference_nan_s(co, "char");
780         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
781         rpa_compiler_exp_end(co);
782         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
783
784         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '"'));
785         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
786
787         rpa_compiler_rule_end(co);
788 }
789
790
791 static void rpa_production_alphacls(rpa_parser_t *pa)
792 {
793         rpa_compiler_t *co = pa->co;
794
795         rpa_compiler_rule_begin_s(co, "alphacls");
796
797         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '['));
798         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
799
800         rpa_compiler_altexp_begin(co, RPA_MATCH_MULTIPLE);
801
802         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
803         rpa_compiler_reference_nan_s(co, "charrng");
804         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
805         rpa_compiler_branch_end(co);
806
807         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
808         rpa_compiler_reference_nan_s(co, "clschar");
809         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
810         rpa_compiler_branch_end(co);
811
812         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
813         rpa_compiler_reference_nan_s(co, "escapedchar");
814         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
815         rpa_compiler_branch_end(co);
816
817         rpa_compiler_altexp_end(co);
818         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
819
820         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, ']'));
821         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
822
823         rpa_compiler_rule_end(co);
824 }
825
826
827 static void rpa_production_clsnum(rpa_parser_t *pa)
828 {
829         rpa_compiler_t *co = pa->co;
830
831         rpa_compiler_rulepref_set_ruleuid_flags_s(co, "clsnum", RPA_PRODUCTION_CLSNUM, RPA_RFLAG_EMITRECORD);
832         rpa_compiler_rule_begin_s(co, "clsnum");
833
834         rpa_compiler_reference_nan_s(co, "num");
835         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
836
837         rpa_compiler_rule_end(co);
838 }
839
840
841 static void rpa_production_numcls(rpa_parser_t *pa)
842 {
843         rpa_compiler_t *co = pa->co;
844
845         rpa_compiler_rule_begin_s(co, "numcls");
846
847         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '['));
848         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
849
850         rpa_compiler_altexp_begin(co, RPA_MATCH_MULTIPLE);
851
852         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
853         rpa_compiler_reference_nan_s(co, "numrng");
854         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLEQ, DA, XX, XX, 0));
855         rpa_compiler_branch_end(co);
856
857
858         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
859         rpa_compiler_reference_nan_s(co, "clsnum");
860         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
861         rpa_compiler_branch_end(co);
862
863         rpa_compiler_altexp_end(co);
864         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
865
866         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, ']'));
867         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
868
869         rpa_compiler_rule_end(co);
870 }
871
872
873 static void rpa_production_cls(rpa_parser_t *pa)
874 {
875         rpa_compiler_t *co = pa->co;
876
877         rpa_compiler_rulepref_set_ruleuid_flags_s(co, "cls", RPA_PRODUCTION_CLS, RPA_RFLAG_EMITRECORD);
878         rpa_compiler_rule_begin_s(co, "cls");
879
880         rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
881
882         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
883         rpa_compiler_reference_nan_s(co, "numcls");
884         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
885         rpa_compiler_branch_end(co);
886
887         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
888         rpa_compiler_reference_nan_s(co, "alphacls");
889         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
890         rpa_compiler_branch_end(co);
891         rpa_compiler_altexp_end(co);
892         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
893
894         rpa_compiler_rule_end(co);
895 }
896
897
898 static void rpa_production_dec(rpa_parser_t *pa)
899 {
900         rpa_compiler_t *co = pa->co;
901
902         rpa_compiler_rulepref_set_ruleuid_flags_s(co, "dec", RPA_PRODUCTION_DEC, RPA_RFLAG_EMITRECORD);
903         rpa_compiler_rule_begin_s(co, "dec");
904
905         rvm_codegen_addins(co->cg, rvm_asm2(RPA_MATCHRNG_NAN, DA, XX, XX, '1', '9'));
906         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
907         rvm_codegen_addins(co->cg, rvm_asm2(RPA_MATCHRNG_MOP, DA, XX, XX, '0', '9'));
908         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
909
910         rpa_compiler_rule_end(co);
911 }
912
913
914 static void rpa_production_hex(rpa_parser_t *pa)
915 {
916         rpa_compiler_t *co = pa->co;
917
918         rpa_compiler_rulepref_set_ruleuid_flags_s(co, "hex", RPA_PRODUCTION_HEX, RPA_RFLAG_EMITRECORD);
919         rpa_compiler_rule_begin_s(co, "hex");
920
921         rpa_compiler_class_begin(co, RPA_MATCH_MULTIPLE);
922         rvm_codegen_addins(co->cg, rvm_asm2(RPA_MATCHRNG_NAN, DA, XX, XX, '0', '9'));
923         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
924         rvm_codegen_addins(co->cg, rvm_asm2(RPA_MATCHRNG_NAN, DA, XX, XX, 'a', 'f'));
925         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
926         rvm_codegen_addins(co->cg, rvm_asm2(RPA_MATCHRNG_NAN, DA, XX, XX, 'A', 'F'));
927         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
928         rpa_compiler_class_end(co);
929         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
930
931
932         rpa_compiler_rule_end(co);
933 }
934
935
936 static void rpa_production_num(rpa_parser_t *pa)
937 {
938         rpa_compiler_t *co = pa->co;
939
940         rpa_compiler_rule_begin_s(co, "num");
941
942         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '#'));
943         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
944
945         rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
946
947         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
948         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_OPT, DA, XX, XX, '0'));
949         rpa_compiler_class_begin(co, RPA_MATCH_NONE);
950         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'x'));
951         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
952         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'X'));
953         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
954         rpa_compiler_class_end(co);
955         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
956
957         rpa_compiler_reference_nan_s(co, "hex");
958         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
959         rpa_compiler_branch_end(co);
960
961         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
962         rpa_compiler_reference_nan_s(co, "dec");
963         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
964         rpa_compiler_branch_end(co);
965         rpa_compiler_altexp_end(co);
966         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
967
968         rpa_compiler_rule_end(co);
969 }
970
971
972 static void rpa_production_aref(rpa_parser_t *pa)
973 {
974         rpa_compiler_t *co = pa->co;
975
976         rpa_compiler_rulepref_set_ruleuid_flags_s(co, "aref", RPA_PRODUCTION_AREF, RPA_RFLAG_EMITRECORD);
977         rpa_compiler_rule_begin_s(co, "aref");
978
979         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '<'));
980         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
981
982         rpa_compiler_reference_nan_s(co, "rulename");
983         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
984
985         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '>'));
986         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
987
988         rpa_compiler_rule_end(co);
989 }
990
991
992 static void rpa_production_cref(rpa_parser_t *pa)
993 {
994         rpa_compiler_t *co = pa->co;
995
996         rpa_compiler_rulepref_set_ruleuid_flags_s(co, "cref", RPA_PRODUCTION_CREF, RPA_RFLAG_EMITRECORD);
997         rpa_compiler_rule_begin_s(co, "cref");
998
999         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '<'));
1000         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1001
1002         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, ':'));
1003         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1004
1005         rpa_compiler_reference_nan_s(co, "rulename");
1006         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1007
1008         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, ':'));
1009         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1010
1011         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '>'));
1012         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1013
1014         rpa_compiler_rule_end(co);
1015 }
1016
1017
1018 static void rpa_production_terminal(rpa_parser_t *pa)
1019 {
1020         rpa_compiler_t *co = pa->co;
1021
1022         rpa_compiler_rule_begin_s(co, "terminal");
1023
1024         rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
1025
1026         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
1027         rpa_compiler_reference_nan_s(co, "cls");
1028         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1029         rpa_compiler_branch_end(co);
1030
1031         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
1032         rpa_compiler_reference_nan_s(co, "sqstr");
1033         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1034         rpa_compiler_branch_end(co);
1035
1036         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
1037         rpa_compiler_reference_nan_s(co, "dqstr");
1038         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1039         rpa_compiler_branch_end(co);
1040
1041         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
1042         rpa_compiler_reference_nan_s(co, "cref");
1043         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1044         rpa_compiler_branch_end(co);
1045
1046         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
1047         rpa_compiler_reference_nan_s(co, "aref");
1048         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1049         rpa_compiler_branch_end(co);
1050
1051         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
1052         rpa_compiler_reference_nan_s(co, "bracketexp");
1053         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1054         rpa_compiler_branch_end(co);
1055
1056         rpa_compiler_altexp_end(co);
1057         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1058
1059
1060         rpa_compiler_rule_end(co);
1061 }
1062
1063
1064 static void rpa_production_qchar(rpa_parser_t *pa)
1065 {
1066         rpa_compiler_t *co = pa->co;
1067
1068         rpa_compiler_rule_begin_s(co, "qchar");
1069
1070         rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
1071
1072         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
1073         rpa_compiler_reference_nan_s(co, "escapedchar");
1074         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1075         rpa_compiler_branch_end(co);
1076
1077         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
1078         rpa_compiler_reference_nan_s(co, "regexchar");
1079         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1080         rpa_compiler_branch_end(co);
1081
1082         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
1083         rpa_compiler_reference_nan_s(co, "specialchar");
1084         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1085         rpa_compiler_branch_end(co);
1086         rpa_compiler_altexp_end(co);
1087         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1088         rpa_compiler_reference_opt_s(co, "space");
1089         rpa_compiler_reference_opt_s(co, "occurence");
1090         rpa_compiler_reference_opt_s(co, "space");
1091
1092         rpa_compiler_rule_end(co);
1093 }
1094
1095 static void rpa_production_qexp(rpa_parser_t *pa)
1096 {
1097         rpa_compiler_t *co = pa->co;
1098
1099         rpa_compiler_rule_begin_s(co, "qexp");
1100
1101         rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
1102
1103         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
1104         rpa_compiler_reference_nan_s(co, "terminal");
1105         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1106         rpa_compiler_reference_opt_s(co, "space");
1107         rpa_compiler_reference_opt_s(co, "occurence");
1108         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1109         rpa_compiler_reference_opt_s(co, "space");
1110         rpa_compiler_branch_end(co);
1111
1112         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
1113         rpa_compiler_reference_nan_s(co, "qchar");
1114         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1115         rpa_compiler_branch_end(co);
1116         rpa_compiler_altexp_end(co);
1117         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1118
1119         rpa_compiler_rule_end(co);
1120 }
1121
1122
1123 static void rpa_production_anchorop(rpa_parser_t *pa)
1124 {
1125         rpa_compiler_t *co = pa->co;
1126
1127         rpa_compiler_rulepref_set_ruleuid_flags_s(co, "anchorop", RPA_PRODUCTION_ANCHOROP, RPA_RFLAG_EMITRECORD);
1128         rpa_compiler_rule_begin_s(co, "anchorop");
1129         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '~'));
1130         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1131         rpa_compiler_reference_opt_s(co, "space");
1132         rpa_compiler_reference_nan_s(co, "qexp");
1133         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1134         rpa_compiler_rule_end(co);
1135 }
1136
1137
1138 static void rpa_production_anchorexp(rpa_parser_t *pa)
1139 {
1140         rpa_compiler_t *co = pa->co;
1141
1142         rpa_compiler_rule_begin_s(co, "anchorexp");
1143         rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
1144         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
1145         rpa_compiler_reference_nan_s(co, "anchorop");
1146         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1147         rpa_compiler_branch_end(co);
1148         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
1149         rpa_compiler_reference_nan_s(co, "qexp");
1150         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1151         rpa_compiler_branch_end(co);
1152         rpa_compiler_altexp_end(co);
1153         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1154         rpa_compiler_reference_opt_s(co, "space");
1155         rpa_compiler_rule_end(co);
1156 }
1157
1158
1159 static void rpa_production_notop(rpa_parser_t *pa)
1160 {
1161         rpa_compiler_t *co = pa->co;
1162
1163         rpa_compiler_rulepref_set_ruleuid_flags_s(co, "notop", RPA_PRODUCTION_NOTOP, RPA_RFLAG_EMITRECORD);
1164         rpa_compiler_rule_begin_s(co, "notop");
1165         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '^'));
1166         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1167         rpa_compiler_reference_opt_s(co, "space");
1168         rpa_compiler_reference_nan_s(co, "anchorexp");
1169
1170         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1171
1172         rpa_compiler_rule_end(co);
1173 }
1174
1175
1176 static void rpa_production_notexp(rpa_parser_t *pa)
1177 {
1178         rpa_compiler_t *co = pa->co;
1179
1180         rpa_compiler_rule_begin_s(co, "notexp");
1181         rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
1182         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
1183         rpa_compiler_reference_nan_s(co, "notop");
1184         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1185         rpa_compiler_branch_end(co);
1186         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
1187 //      rpa_compiler_reference_nan_s(co, "qexp");
1188         rpa_compiler_reference_nan_s(co, "anchorexp");
1189         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1190         rpa_compiler_branch_end(co);
1191         rpa_compiler_altexp_end(co);
1192         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1193         rpa_compiler_reference_opt_s(co, "space");
1194         rpa_compiler_rule_end(co);
1195 }
1196
1197
1198 static void rpa_production_exp(rpa_parser_t *pa)
1199 {
1200         rpa_compiler_t *co = pa->co;
1201
1202 //      rpa_compiler_rulepref_set_ruleuid_flags_s(co, "exp", RPA_PRODUCTION_EXP);
1203         rpa_compiler_rule_begin_s(co, "exp");
1204         rpa_compiler_reference_mul_s(co, "notexp");
1205         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1206         rpa_compiler_rule_end(co);
1207 }
1208
1209
1210 static void rpa_production_bracketexp(rpa_parser_t *pa)
1211 {
1212         rpa_compiler_t *co = pa->co;
1213
1214         rpa_compiler_rulepref_set_ruleuid_flags_s(co, "bracketexp", RPA_PRODUCTION_BRACKETEXP, RPA_RFLAG_EMITRECORD);
1215         rpa_compiler_rule_begin_s(co, "bracketexp");
1216
1217         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '('));
1218         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1219
1220         rpa_compiler_reference_opt_s(co, "space");
1221
1222         rpa_compiler_reference_nan_s(co, "orexp");
1223         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1224
1225         rpa_compiler_reference_opt_s(co, "space");
1226
1227         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, ')'));
1228         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1229
1230         rpa_compiler_rule_end(co);
1231 }
1232
1233
1234
1235 static void rpa_production_negbranch(rpa_parser_t *pa)
1236 {
1237         rpa_compiler_t *co = pa->co;
1238
1239         rpa_compiler_rulepref_set_ruleuid_flags_s(co, "negbranch", RPA_PRODUCTION_NEGBRANCH, RPA_RFLAG_EMITRECORD);
1240         rpa_compiler_rule_begin_s(co, "negbranch");
1241
1242         rpa_compiler_reference_nan_s(co, "exp");
1243         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1244
1245         rpa_compiler_rule_end(co);
1246 }
1247
1248
1249 static void rpa_production_norop(rpa_parser_t *pa)
1250 {
1251         rpa_compiler_t *co = pa->co;
1252
1253         rpa_compiler_rulepref_set_ruleuid_flags_s(co, "norop", RPA_PRODUCTION_NOROP, RPA_RFLAG_EMITRECORD);
1254         rpa_compiler_rule_begin_s(co, "norop");
1255
1256         rpa_compiler_exp_begin(co, RPA_MATCH_MULTIPLE);
1257         rpa_compiler_reference_opt_s(co, "space");
1258         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '-'));
1259         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1260         rpa_compiler_reference_opt_s(co, "space");
1261
1262         rpa_compiler_reference_mul_s(co, "negbranch");
1263         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1264         rpa_compiler_exp_end(co);
1265
1266         rpa_compiler_rule_end(co);
1267 }
1268
1269
1270 static void rpa_production_reqop(rpa_parser_t *pa)
1271 {
1272         rpa_compiler_t *co = pa->co;
1273
1274         rpa_compiler_rulepref_set_ruleuid_flags_s(co, "reqop", RPA_PRODUCTION_REQOP, RPA_RFLAG_EMITRECORD);
1275         rpa_compiler_rule_begin_s(co, "reqop");
1276
1277         rpa_compiler_reference_nan_s(co, "exp");
1278         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1279
1280         rpa_compiler_rule_end(co);
1281 }
1282
1283
1284 static void rpa_production_minop(rpa_parser_t *pa)
1285 {
1286         rpa_compiler_t *co = pa->co;
1287
1288         rpa_compiler_rulepref_set_ruleuid_flags_s(co, "minop", RPA_PRODUCTION_MINOP, RPA_RFLAG_EMITRECORD);
1289         rpa_compiler_rule_begin_s(co, "minop");
1290
1291         rpa_compiler_reference_nan_s(co, "reqop");
1292         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1293
1294         rpa_compiler_reference_nan_s(co, "norop");
1295         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1296
1297         rpa_compiler_rule_end(co);
1298 }
1299
1300
1301 static void rpa_production_minexp(rpa_parser_t *pa)
1302 {
1303         rpa_compiler_t *co = pa->co;
1304
1305         rpa_compiler_rule_begin_s(co, "minexp");
1306         rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
1307
1308         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
1309         rpa_compiler_reference_nan_s(co, "minop");
1310         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1311         rpa_compiler_branch_end(co);
1312
1313         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
1314         rpa_compiler_reference_nan_s(co, "exp");
1315         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1316         rpa_compiler_branch_end(co);
1317         rpa_compiler_altexp_end(co);
1318
1319         rpa_compiler_rule_end(co);
1320 }
1321
1322
1323 static void rpa_production_altbranch(rpa_parser_t *pa)
1324 {
1325         rpa_compiler_t *co = pa->co;
1326
1327         rpa_compiler_rulepref_set_ruleuid_flags_s(co, "altbranch", RPA_PRODUCTION_ALTBRANCH, RPA_RFLAG_EMITRECORD);
1328         rpa_compiler_rule_begin_s(co, "altbranch");
1329
1330         rpa_compiler_reference_nan_s(co, "minexp");
1331         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1332
1333         rpa_compiler_rule_end(co);
1334 }
1335
1336
1337 static void rpa_production_orop(rpa_parser_t *pa)
1338 {
1339         rpa_compiler_t *co = pa->co;
1340
1341         rpa_compiler_rulepref_set_ruleuid_flags_s(co, "orop", RPA_PRODUCTION_OROP, RPA_RFLAG_EMITRECORD);
1342         rpa_compiler_rule_begin_s(co, "orop");
1343
1344         rpa_compiler_reference_nan_s(co, "altbranch");
1345         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1346
1347         rpa_compiler_exp_begin(co, RPA_MATCH_MULTIPLE);
1348         rpa_compiler_reference_opt_s(co, "space");
1349         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_OPT, DA, XX, XX, '\r'));
1350         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_OPT, DA, XX, XX, '\n'));
1351         rpa_compiler_reference_opt_s(co, "space");
1352         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '|'));
1353         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1354         rpa_compiler_reference_opt_s(co, "space");
1355         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_OPT, DA, XX, XX, '\r'));
1356         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_OPT, DA, XX, XX, '\n'));
1357         rpa_compiler_reference_opt_s(co, "space");
1358
1359         rpa_compiler_reference_nan_s(co, "altbranch");
1360         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1361         rpa_compiler_exp_end(co);
1362         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1363
1364         rpa_compiler_rule_end(co);
1365 }
1366
1367
1368 static void rpa_production_orexp(rpa_parser_t *pa)
1369 {
1370         rpa_compiler_t *co = pa->co;
1371
1372         rpa_compiler_rule_begin_s(co, "orexp");
1373         rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
1374
1375         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
1376         rpa_compiler_reference_nan_s(co, "orop");
1377         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1378         rpa_compiler_branch_end(co);
1379
1380         rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
1381         rpa_compiler_reference_nan_s(co, "minexp");
1382         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
1383         rpa_compiler_branch_end(co);
1384         rpa_compiler_altexp_end(co);
1385
1386         rpa_compiler_rule_end(co);
1387 }
1388
1389
1390 static rint rpa_parser_init(rpa_parser_t *pa)
1391 {
1392         rvm_codelabel_t *err;
1393         rpa_compiler_t *co = pa->co;
1394
1395         pa->main = rvm_codegen_addins(co->cg, rvm_asml(RVM_NOP, XX, XX, XX, -1));
1396         rvm_codegen_addins(co->cg, rvm_asml(RVM_MOV, SP, DA, XX, 0));
1397         rvm_codegen_addins(co->cg, rvm_asml(RVM_MOV, R_LOO, DA, XX, 0));
1398         rvm_codegen_addins(co->cg, rvm_asml(RVM_MOV, R_TOP, DA, XX, -1));
1399
1400         rvm_codegen_addins(co->cg, rvm_asm(RPA_EMITHEAD, XX, XX, XX, 0));
1401         rvm_codegen_addins(co->cg, rvm_asm(RPA_SHIFT, XX, XX, XX, 0));
1402         rpa_compiler_reference_nan_s(co, "bnf");
1403         rvm_codegen_addins(co->cg, rvm_asm(RPA_EMITTAIL, XX, XX, XX, 0));
1404         rvm_codegen_addins(co->cg, rvm_asm(RVM_NOP, XX, XX, XX, -2));
1405         rvm_codegen_addins(co->cg, rvm_asm(RVM_EXT, XX, XX, XX, 0));
1406
1407         rpa_production_directive_emitall(pa);
1408         rpa_production_directive_emitnone(pa);
1409         rpa_production_directive_emit(pa);
1410         rpa_production_directive_noemit(pa);
1411         rpa_production_directive_uid(pa);
1412         rpa_production_directives(pa);
1413         rpa_production_char(pa);
1414         rpa_production_clsnum(pa);
1415         rpa_production_clschar(pa);
1416         rpa_production_occurence(pa);
1417         rpa_production_charrng(pa);
1418         rpa_production_numrng(pa);
1419         rpa_production_alphacls(pa);
1420         rpa_production_numcls(pa);
1421         rpa_production_cls(pa);
1422         rpa_production_beginchar(pa);
1423         rpa_production_endchar(pa);
1424
1425         rpa_production_escapedchar(pa);
1426         rpa_production_specialchar(pa);
1427         rpa_production_regexchar(pa);
1428         rpa_production_qchar(pa);
1429
1430         rpa_production_dec(pa);
1431         rpa_production_hex(pa);
1432         rpa_production_num(pa);
1433         rpa_production_sqstr(pa);
1434         rpa_production_dqstr(pa);
1435         rpa_production_aref(pa);
1436         rpa_production_cref(pa);
1437         rpa_production_terminal(pa);
1438         rpa_production_qexp(pa);
1439         rpa_production_anchorop(pa);
1440         rpa_production_anchorexp(pa);
1441         rpa_production_notop(pa);
1442         rpa_production_notexp(pa);
1443         rpa_production_negbranch(pa);
1444         rpa_production_norop(pa);
1445         rpa_production_minop(pa);
1446         rpa_production_minexp(pa);
1447         rpa_production_reqop(pa);
1448         rpa_production_orop(pa);
1449         rpa_production_altbranch(pa);
1450         rpa_production_orexp(pa);
1451         rpa_production_exp(pa);
1452         rpa_production_bracketexp(pa);
1453         rpa_production_space(pa);
1454         rpa_production_assign(pa);
1455         rpa_production_rulename(pa);
1456         rpa_production_aliasname(pa);
1457         rpa_production_namedrule(pa);
1458         rpa_production_anonymousrule(pa);
1459         rpa_production_comment(pa);
1460         rpa_production_bnf(pa);
1461
1462         if (rvm_codegen_relocate(co->cg, &err) < 0) {
1463                 r_printf("RPA_PARSER: Unresolved symbol: %s\n", err->name->str);
1464                 return -1;
1465         }
1466
1467         return 0;
1468 }
1469
1470
1471 void rpa_production_(rpa_parser_t *pa)
1472 {
1473         rpa_compiler_t *co = pa->co;
1474
1475         rpa_compiler_rule_begin_s(co, "");
1476
1477         rpa_compiler_rule_end(co);
1478 }