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