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