From 510c688a70410b2ed97c7bcd3ebf5a14b2751b7e Mon Sep 17 00:00:00 2001 From: Kate F Date: Sun, 5 Jul 2020 20:22:45 -0700 Subject: [PATCH 01/23] Pass in an existing fsm for `ast_compile()`. --- src/libre/ast_compile.c | 46 +++++++++++++++++++++-------------------- src/libre/ast_compile.h | 4 ++-- src/libre/ast_rewrite.c | 10 ++++++++- src/libre/re.c | 20 ++++++++++++++---- 4 files changed, 51 insertions(+), 29 deletions(-) diff --git a/src/libre/ast_compile.c b/src/libre/ast_compile.c index ffcce49a3..704cc7653 100644 --- a/src/libre/ast_compile.c +++ b/src/libre/ast_compile.c @@ -186,11 +186,24 @@ static struct fsm * expr_compile(struct ast_expr *e, enum re_flags flags, const struct fsm_options *opt, struct re_err *err) { + struct fsm *fsm; struct ast ast; + fsm_state_t start; ast.expr = e; - return ast_compile(&ast, flags, opt, err); + fsm = fsm_new(opt); + if (fsm == NULL) { + return NULL; + } + + if (!ast_compile(&ast, fsm, &start, flags, err)) { + return NULL; + } + + fsm_setstart(fsm, start); + + return fsm; } static int @@ -968,31 +981,26 @@ comp_iter(struct comp_env *env, #undef LITERAL #undef RECURSE -struct fsm * +int ast_compile(const struct ast *ast, + struct fsm *fsm, fsm_state_t *start, enum re_flags re_flags, - const struct fsm_options *opt, struct re_err *err) { fsm_state_t x, y; - struct fsm *fsm; assert(ast != NULL); - - fsm = fsm_new(opt); - if (fsm == NULL) { - return NULL; - } + assert(start != NULL); if (!fsm_addstate(fsm, &x)) { - goto error; + return 0; } if (!fsm_addstate(fsm, &y)) { - goto error; + return 0; } - fsm_setstart(fsm, x); + *start = x; fsm_setend(fsm, y, 1); { @@ -1008,13 +1016,13 @@ ast_compile(const struct ast *ast, env.end = y; if (!comp_iter(&env, x, y, ast->expr)) { - goto error; + return 0; } } /* XXX: if (-1 == fsm_trim(fsm)) { - goto error; + return 0; } */ @@ -1026,16 +1034,10 @@ ast_compile(const struct ast *ast, if (re_flags & RE_REVERSE) { if (!fsm_reverse(fsm)) { - goto error; + return 0; } } - return fsm; - -error: - - fsm_free(fsm); - - return NULL; + return 1; } diff --git a/src/libre/ast_compile.h b/src/libre/ast_compile.h index 89e1b12a4..0d8c2f3dc 100644 --- a/src/libre/ast_compile.h +++ b/src/libre/ast_compile.h @@ -14,10 +14,10 @@ struct fsm; struct re_err; -struct fsm * +int ast_compile(const struct ast *ast, + struct fsm *fsm, fsm_state_t *start, enum re_flags re_flags, - const struct fsm_options *opt, struct re_err *err); #endif diff --git a/src/libre/ast_rewrite.c b/src/libre/ast_rewrite.c index 9f7f5c2ba..2b9c35292 100644 --- a/src/libre/ast_rewrite.c +++ b/src/libre/ast_rewrite.c @@ -80,6 +80,7 @@ compile_subexpr(struct ast_expr *e, enum re_flags flags) { struct fsm *fsm; struct ast ast; + fsm_state_t start; /* * We're compiling these expressions in isolation just for sake of @@ -104,11 +105,18 @@ compile_subexpr(struct ast_expr *e, enum re_flags flags) return 0; } - fsm = ast_compile(&ast, flags | RE_ANCHORED, NULL, NULL); + fsm = fsm_new(NULL); if (fsm == NULL) { return 0; } + if (!ast_compile(&ast, fsm, &start, flags | RE_ANCHORED, NULL)) { + fsm_free(fsm); + return 0; + } + + fsm_setstart(fsm, start); + e->flags = 0x0; return fsm; diff --git a/src/libre/re.c b/src/libre/re.c index e593e54b6..1601acc6c 100644 --- a/src/libre/re.c +++ b/src/libre/re.c @@ -139,9 +139,10 @@ re_comp(enum re_dialect dialect, int (*getc)(void *opaque), void *opaque, enum re_flags flags, struct re_err *err) { struct ast *ast; - struct fsm *new; + struct fsm *fsm; const struct dialect *m; int unsatisfiable; + fsm_state_t start; m = re_dialect(dialect); if (m == NULL) { @@ -165,17 +166,28 @@ re_comp(enum re_dialect dialect, int (*getc)(void *opaque), void *opaque, ast->expr = ast_expr_tombstone; } - new = ast_compile(ast, flags, opt, err); + fsm = fsm_new(opt); + if (fsm == NULL) { + ast_free(ast); + goto error; + } + + if (!ast_compile(ast, fsm, &start, flags, err)) { + ast_free(ast); + goto error; + } + + fsm_setstart(fsm, start); ast_free(ast); - if (new == NULL) { + if (fsm == NULL) { /* XXX: this can happen e.g. on malloc failure */ assert(err == NULL || err->e != RE_ESUCCESS); goto error; } - return new; + return fsm; error: From b732ae2a6507a919e2aa061c3c52ca70587a8ef9 Mon Sep 17 00:00:00 2001 From: Kate F Date: Mon, 6 Jul 2020 14:15:02 -0700 Subject: [PATCH 02/23] Pass in an existing fsm for `trie_to_fsm()`. --- src/libre/ac.c | 8 +++----- src/libre/ac.h | 2 +- src/libre/re_strings.c | 6 ++++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/libre/ac.c b/src/libre/ac.c index 0ba5d6151..9c7df556c 100644 --- a/src/libre/ac.c +++ b/src/libre/ac.c @@ -322,16 +322,14 @@ trie_to_fsm_state(struct trie_state *ts, struct fsm *fsm, } struct fsm * -trie_to_fsm(struct fsm *fsm, struct trie_graph *g, int have_end, fsm_state_t end) +trie_to_fsm(struct fsm *fsm, fsm_state_t *start, struct trie_graph *g, int have_end, fsm_state_t end) { - fsm_state_t start; + assert(start != NULL); - if (!trie_to_fsm_state(g->root, fsm, have_end, end, &start)) { + if (!trie_to_fsm_state(g->root, fsm, have_end, end, start)) { return NULL; } - fsm_setstart(fsm, start); - return fsm; } diff --git a/src/libre/ac.h b/src/libre/ac.h index 480c76bfb..dfa977ebe 100644 --- a/src/libre/ac.h +++ b/src/libre/ac.h @@ -26,7 +26,7 @@ int trie_add_failure_edges(struct trie_graph *g); struct fsm * -trie_to_fsm(struct fsm *fsm, struct trie_graph *g, +trie_to_fsm(struct fsm *fsm, fsm_state_t *start, struct trie_graph *g, int have_end, fsm_state_t end); void diff --git a/src/libre/re_strings.c b/src/libre/re_strings.c index f7d66be8f..9726232ed 100644 --- a/src/libre/re_strings.c +++ b/src/libre/re_strings.c @@ -87,7 +87,7 @@ re_strings_build(struct re_strings *g, const struct fsm_options *opt, enum re_strings_flags flags) { struct fsm *fsm; - fsm_state_t end; + fsm_state_t start, end; int have_end; fsm = NULL; @@ -120,10 +120,12 @@ re_strings_build(struct re_strings *g, end = (unsigned) -1; /* appease clang */ } - if (!trie_to_fsm(fsm, (struct trie_graph *) g, have_end, end)) { + if (!trie_to_fsm(fsm, &start, (struct trie_graph *) g, have_end, end)) { goto error; } + fsm_setstart(fsm, start); + return fsm; error: From 9a58888a1791839d0ee0d152367a795c593c7278 Mon Sep 17 00:00:00 2001 From: Kate F Date: Mon, 6 Jul 2020 21:13:24 -0700 Subject: [PATCH 03/23] Pass in an existing fsm for `re_comp()` and `re_strings()`. --- examples/bm/libfsm.c | 3 +- examples/words/main.c | 13 ++++++-- include/re/re.h | 19 +++++++++-- include/re/strings.h | 6 +++- src/libre/ast.c | 2 ++ src/libre/ast_analysis.c | 2 ++ src/libre/libre.syms | 1 + src/libre/parser.act | 2 ++ src/libre/perror.c | 2 ++ src/libre/print/abnf.c | 2 ++ src/libre/print/dot.c | 2 ++ src/libre/print/pcre.c | 2 ++ src/libre/print/tree.c | 2 ++ src/libre/re.c | 68 +++++++++++++++++++++++++++++----------- src/libre/re_strings.c | 36 +++++++++++++++------ src/libre/strerror.c | 2 ++ src/lx/parser.act | 4 +-- src/re/main.c | 5 +-- src/retest/cvtpcre.c | 2 +- src/retest/main.c | 2 +- src/retest/reperf.c | 2 +- theft/wrap.c | 6 +++- 22 files changed, 141 insertions(+), 44 deletions(-) diff --git a/examples/bm/libfsm.c b/examples/bm/libfsm.c index 27bedbb8e..11ad2b9ae 100644 --- a/examples/bm/libfsm.c +++ b/examples/bm/libfsm.c @@ -15,6 +15,7 @@ #include #include #include + #include int @@ -61,7 +62,7 @@ main(int argc, char *argv[]) opt.io = FSM_IO_STR; p = argv[0]; - fsm = re_comp(RE_PCRE, fsm_sgetc, &p, &opt, flags, &e); + fsm = re_comp_new(RE_PCRE, fsm_sgetc, &p, &opt, flags, &e); if (fsm == NULL) { re_perror(RE_LITERAL, &e, NULL, s); return 1; diff --git a/examples/words/main.c b/examples/words/main.c index e1a0933c0..6cbd23a56 100644 --- a/examples/words/main.c +++ b/examples/words/main.c @@ -127,7 +127,7 @@ int main(int argc, char *argv[]) { fsm_state_t rs; struct fsm *r; - r = re_comp(native ? RE_NATIVE : RE_LITERAL, fsm_sgetc, &p, &opt, 0, &e); + r = re_comp_new(native ? RE_NATIVE : RE_LITERAL, fsm_sgetc, &p, &opt, 0, &e); if (r == NULL) { re_perror(native ? RE_NATIVE : RE_LITERAL, &e, NULL, s); return 1; @@ -167,10 +167,17 @@ int main(int argc, char *argv[]) { exit(EXIT_FAILURE); } - fsm = re_strings_build(g, - &opt, unanchored ? 0 : (RE_STRINGS_ANCHOR_LEFT | RE_STRINGS_ANCHOR_RIGHT)); + fsm = fsm_new(&opt); if (fsm == NULL) { + perror("fsm_new"); + exit(EXIT_FAILURE); + } + + if (!re_strings_build(fsm, g, + unanchored ? 0 : (RE_STRINGS_ANCHOR_LEFT | RE_STRINGS_ANCHOR_RIGHT))) + { perror("re_strings_builder_build"); + fsm_free(fsm); exit(EXIT_FAILURE); } diff --git a/include/re/re.h b/include/re/re.h index 6e29b17ae..e3af4190b 100644 --- a/include/re/re.h +++ b/include/re/re.h @@ -127,9 +127,11 @@ re_getchar_fun(void *opaque); /* * Compile a regexp of the given dialect. + * States are populated into the given fsm. The start state is written out + * through the *start argument. * - * Returns NULL on error. If non-NULL, the *err struct is populated with the - * type and 0-indexed byte offset of the error. + * Returns 1 on success, or 0 on error. If non-NULL, the *err struct is + * populated with the type and 0-indexed byte offset of the error. * * libfsm provides getc callbacks suitable for use with re_comp; see . * For example: @@ -144,8 +146,19 @@ re_getchar_fun(void *opaque); * There's nothing special about libfsm's implementation of these; they could * equally well be user defined. */ +int +re_comp(struct fsm *fsm, fsm_state_t *start, enum re_dialect dialect, + re_getchar_fun *f, void *opaque, + const struct fsm_options *opt, + enum re_flags flags, struct re_err *err); + +/* + * A convenience to construct a new fsm. + * Returns NULL on error. + * See re_comp() for details. + */ struct fsm * -re_comp(enum re_dialect dialect, +re_comp_new(enum re_dialect dialect, re_getchar_fun *f, void *opaque, const struct fsm_options *opt, enum re_flags flags, struct re_err *err); diff --git a/include/re/strings.h b/include/re/strings.h index 06387a54c..a477ea6e2 100644 --- a/include/re/strings.h +++ b/include/re/strings.h @@ -47,8 +47,12 @@ re_strings_add_raw(struct re_strings *g, const void *p, size_t n); int re_strings_add_str(struct re_strings *g, const char *s); +int +re_strings_build(struct fsm *fsm, struct re_strings *g, + enum re_strings_flags flags); + struct fsm * -re_strings_build(struct re_strings *g, +re_strings_build_new(struct re_strings *g, const struct fsm_options *opt, enum re_strings_flags flags); #endif diff --git a/src/libre/ast.c b/src/libre/ast.c index 1c9564c10..4f09f0d50 100644 --- a/src/libre/ast.c +++ b/src/libre/ast.c @@ -11,6 +11,8 @@ #include #include +#include + #include #include "class.h" diff --git a/src/libre/ast_analysis.c b/src/libre/ast_analysis.c index 45c8e2c1c..60c20444b 100644 --- a/src/libre/ast_analysis.c +++ b/src/libre/ast_analysis.c @@ -10,6 +10,8 @@ #include #include +#include + #include #include "class.h" diff --git a/src/libre/libre.syms b/src/libre/libre.syms index 0789680a7..f361ec717 100644 --- a/src/libre/libre.syms +++ b/src/libre/libre.syms @@ -1,4 +1,5 @@ re_comp +re_comp_new re_flags re_strerror re_perror diff --git a/src/libre/parser.act b/src/libre/parser.act index d32918875..7206b1da7 100644 --- a/src/libre/parser.act +++ b/src/libre/parser.act @@ -30,6 +30,8 @@ #include #include + #include + #include #include "libre/class.h" diff --git a/src/libre/perror.c b/src/libre/perror.c index 76931d823..cecaeeced 100644 --- a/src/libre/perror.c +++ b/src/libre/perror.c @@ -10,6 +10,8 @@ #include #include +#include + #include static int diff --git a/src/libre/print/abnf.c b/src/libre/print/abnf.c index 88f822fe3..657ddc3fb 100644 --- a/src/libre/print/abnf.c +++ b/src/libre/print/abnf.c @@ -11,6 +11,8 @@ #include #include +#include + #include #include diff --git a/src/libre/print/dot.c b/src/libre/print/dot.c index f0f4972cb..0345fb257 100644 --- a/src/libre/print/dot.c +++ b/src/libre/print/dot.c @@ -9,6 +9,8 @@ #include #include +#include + #include #include diff --git a/src/libre/print/pcre.c b/src/libre/print/pcre.c index a77f039c2..ea4bed2dc 100644 --- a/src/libre/print/pcre.c +++ b/src/libre/print/pcre.c @@ -11,6 +11,8 @@ #include #include +#include + #include #include diff --git a/src/libre/print/tree.c b/src/libre/print/tree.c index 34d6d227a..9c69b387d 100644 --- a/src/libre/print/tree.c +++ b/src/libre/print/tree.c @@ -10,6 +10,8 @@ #include #include +#include + #include #include "../class.h" diff --git a/src/libre/re.c b/src/libre/re.c index 1601acc6c..4aec82af6 100644 --- a/src/libre/re.c +++ b/src/libre/re.c @@ -10,10 +10,10 @@ #include #include -#include - #include +#include + #include "ac.h" #include "class.h" #include "print.h" @@ -133,27 +133,34 @@ re_parse(enum re_dialect dialect, int (*getc)(void *opaque), void *opaque, return ast; } -struct fsm * -re_comp(enum re_dialect dialect, int (*getc)(void *opaque), void *opaque, +int +re_comp(struct fsm *fsm, fsm_state_t *start, enum re_dialect dialect, + re_getchar_fun *f, void *opaque, const struct fsm_options *opt, enum re_flags flags, struct re_err *err) { struct ast *ast; - struct fsm *fsm; const struct dialect *m; int unsatisfiable; - fsm_state_t start; + + assert(fsm != NULL); + assert(f != NULL); + assert(start != NULL); m = re_dialect(dialect); if (m == NULL) { - if (err != NULL) { err->e = RE_EBADDIALECT; } - return NULL; + if (err != NULL) { + err->e = RE_EBADDIALECT; + } + return 0; } flags |= m->flags; - ast = re_parse(dialect, getc, opaque, opt, flags, err, &unsatisfiable); - if (ast == NULL) { return NULL; } + ast = re_parse(dialect, f, opaque, opt, flags, err, &unsatisfiable); + if (ast == NULL) { + return 0; + } /* * If the RE is inherently unsatisfiable, then free the @@ -166,27 +173,51 @@ re_comp(enum re_dialect dialect, int (*getc)(void *opaque), void *opaque, ast->expr = ast_expr_tombstone; } - fsm = fsm_new(opt); - if (fsm == NULL) { - ast_free(ast); + if (!ast_compile(ast, fsm, start, flags, err)) { goto error; } - if (!ast_compile(ast, fsm, &start, flags, err)) { - ast_free(ast); - goto error; - } + ast_free(ast); - fsm_setstart(fsm, start); + return 1; + +error: ast_free(ast); + if (err != NULL) { + err->e = RE_EERRNO; + } + + return 0; +} + +struct fsm * +re_comp_new(enum re_dialect dialect, + re_getchar_fun *f, void *opaque, + const struct fsm_options *opt, + enum re_flags flags, struct re_err *err) +{ + struct fsm *fsm; + fsm_state_t start; + + fsm = fsm_new(opt); + if (fsm == NULL) { + goto error; + } + if (fsm == NULL) { /* XXX: this can happen e.g. on malloc failure */ assert(err == NULL || err->e != RE_ESUCCESS); goto error; } + if (!re_comp(fsm, &start, dialect, f, opaque, opt, flags, err)) { + goto error; + } + + fsm_setstart(fsm, start); + return fsm; error: @@ -197,3 +228,4 @@ re_comp(enum re_dialect dialect, int (*getc)(void *opaque), void *opaque, return NULL; } + diff --git a/src/libre/re_strings.c b/src/libre/re_strings.c index 9726232ed..ecc7e84be 100644 --- a/src/libre/re_strings.c +++ b/src/libre/re_strings.c @@ -82,15 +82,14 @@ re_strings_add_str(struct re_strings *g, const char *s) return re_strings_add_raw(g, s, strlen(s)); } -struct fsm * -re_strings_build(struct re_strings *g, - const struct fsm_options *opt, enum re_strings_flags flags) +int +re_strings_build(struct fsm *fsm, struct re_strings *g, + enum re_strings_flags flags) { - struct fsm *fsm; fsm_state_t start, end; int have_end; - fsm = NULL; + assert(fsm != NULL); if ((flags & RE_STRINGS_ANCHOR_LEFT) == 0) { if (trie_add_failure_edges((struct trie_graph *) g) < 0) { @@ -98,11 +97,6 @@ re_strings_build(struct re_strings *g, } } - fsm = fsm_new(opt); - if (fsm == NULL) { - goto error; - } - have_end = 0; if ((flags & RE_STRINGS_AC_AUTOMATON) == 0 && (flags & RE_STRINGS_ANCHOR_RIGHT) == 0) { @@ -126,6 +120,28 @@ re_strings_build(struct re_strings *g, fsm_setstart(fsm, start); + return 1; + +error: + + return 0; +} + +struct fsm * +re_strings_build_new(struct re_strings *g, + const struct fsm_options *opt, enum re_strings_flags flags) +{ + struct fsm *fsm; + + fsm = fsm_new(opt); + if (fsm == NULL) { + goto error; + } + + if (!re_strings_build(fsm, g, flags)) { + goto error; + } + return fsm; error: diff --git a/src/libre/strerror.c b/src/libre/strerror.c index ded431bd0..749e12ef6 100644 --- a/src/libre/strerror.c +++ b/src/libre/strerror.c @@ -10,6 +10,8 @@ #include #include +#include + #include const char * diff --git a/src/lx/parser.act b/src/lx/parser.act index fa1cf1392..e74056237 100644 --- a/src/lx/parser.act +++ b/src/lx/parser.act @@ -379,7 +379,7 @@ assert(@a != NULL); assert(@a->p != NULL); - @r = re_comp(RE_LITERAL, act_agetc, @a, act_state->opt, 0, &err); + @r = re_comp_new(RE_LITERAL, act_agetc, @a, act_state->opt, 0, &err); if (@r == NULL) { assert(err.e != RE_EBADDIALECT); /* TODO: pass filename for .lx source */ @@ -394,7 +394,7 @@ assert(@a != NULL); assert(@a->p != NULL); - @r = re_comp(RE_NATIVE, act_agetc, @a, act_state->opt, @f, &err); + @r = re_comp_new(RE_NATIVE, act_agetc, @a, act_state->opt, @f, &err); if (@r == NULL) { assert(err.e != RE_EBADDIALECT); /* TODO: pass filename for .lx source */ diff --git a/src/re/main.c b/src/re/main.c index f1cd6d06a..cdd13af2a 100644 --- a/src/re/main.c +++ b/src/re/main.c @@ -676,7 +676,7 @@ main(int argc, char *argv[]) f = xopen(argv[i]); - new = re_comp(dialect, fsm_fgetc, f, &opt, flags, &err); + new = re_comp_new(dialect, fsm_fgetc, f, &opt, flags, &err); fclose(f); } else { @@ -684,7 +684,7 @@ main(int argc, char *argv[]) s = argv[i]; - new = re_comp(dialect, fsm_sgetc, &s, &opt, flags, &err); + new = re_comp_new(dialect, fsm_sgetc, &s, &opt, flags, &err); } if (new == NULL) { @@ -747,6 +747,7 @@ main(int argc, char *argv[]) } } + /* TODO: instead of re_comp_new() above, could parse directly into the running fsm */ fsm = join(fsm, new); if (fsm == NULL) { perror("fsm_union/concat"); diff --git a/src/retest/cvtpcre.c b/src/retest/cvtpcre.c index 1c7532850..3eecadbb5 100644 --- a/src/retest/cvtpcre.c +++ b/src/retest/cvtpcre.c @@ -179,7 +179,7 @@ int main(int argc, char **argv) comp_err = err_zero; flags = 0; - fsm = re_comp(RE_PCRE, fsm_sgetc, &s, &opt, flags, &comp_err); + fsm = re_comp_new(RE_PCRE, fsm_sgetc, &s, &opt, flags, &comp_err); re_ok = (fsm != NULL); if (re_ok) { fsm_free(fsm); diff --git a/src/retest/main.c b/src/retest/main.c index c527afb08..cd2f592ff 100644 --- a/src/retest/main.c +++ b/src/retest/main.c @@ -561,7 +561,7 @@ process_test_file(const char *fname, enum re_dialect dialect, enum implementatio num_regexps++; re_str = regexp; - fsm = re_comp(dialect, fsm_sgetc, &re_str, &opt, flags, &err); + fsm = re_comp_new(dialect, fsm_sgetc, &re_str, &opt, flags, &err); if (fsm == NULL) { fprintf(stderr, "line %d: error with regexp /%s/: %s\n", linenum, regexp, re_strerror(err.e)); diff --git a/src/retest/reperf.c b/src/retest/reperf.c index 6dbdabe9d..e47417a4f 100644 --- a/src/retest/reperf.c +++ b/src/retest/reperf.c @@ -612,7 +612,7 @@ perf_case_run(struct perf_case *c, enum halt halt, xclock_gettime(&c0); for (iter=0; iter < c->count; iter++) { - fsm = re_comp(c->dialect, fsm_sgetc, &re, &opt, flags, &comp_err); + fsm = re_comp_new(c->dialect, fsm_sgetc, &re, &opt, flags, &comp_err); if (fsm == NULL) { return ERROR_PARSING_REGEXP; } diff --git a/theft/wrap.c b/theft/wrap.c index 558c218ef..2540c36b7 100644 --- a/theft/wrap.c +++ b/theft/wrap.c @@ -6,6 +6,10 @@ #include "theft_libfsm.h" +#include + +#include + #include struct scanner { @@ -74,7 +78,7 @@ wrap_re_comp(enum re_dialect dialect, const struct string_pair *pair, assert(opt != NULL); assert(err != NULL); - fsm = re_comp(dialect, scanner_next, &s, opt, RE_MULTI, err); + fsm = re_comp_new(dialect, scanner_next, &s, opt, RE_MULTI, err); assert(s.str == pair->string); assert(s.magic == &s.magic); From 07f8a67a12715b5df03039df7386cae8583d0e39 Mon Sep 17 00:00:00 2001 From: Kate F Date: Mon, 6 Jul 2020 21:16:12 -0700 Subject: [PATCH 04/23] Regenerated for `re_comp()`. --- src/libre/dialect/glob/parser.c | 58 ++-- src/libre/dialect/glob/parser.h | 4 +- src/libre/dialect/like/parser.c | 58 ++-- src/libre/dialect/like/parser.h | 4 +- src/libre/dialect/literal/parser.c | 42 +-- src/libre/dialect/literal/parser.h | 4 +- src/libre/dialect/native/parser.c | 270 +++++++-------- src/libre/dialect/native/parser.h | 4 +- src/libre/dialect/pcre/parser.c | 510 +++++++++++++++-------------- src/libre/dialect/pcre/parser.h | 4 +- src/libre/dialect/sql/parser.c | 290 ++++++++-------- src/libre/dialect/sql/parser.h | 4 +- src/lx/parser.c | 4 +- 13 files changed, 634 insertions(+), 622 deletions(-) diff --git a/src/libre/dialect/glob/parser.c b/src/libre/dialect/glob/parser.c index 7b7876151..f8eb87610 100644 --- a/src/libre/dialect/glob/parser.c +++ b/src/libre/dialect/glob/parser.c @@ -9,7 +9,7 @@ /* BEGINNING OF HEADER */ -#line 142 "src/libre/parser.act" +#line 144 "src/libre/parser.act" #include @@ -21,6 +21,8 @@ #include #include + #include + #include #include "libre/class.h" @@ -209,7 +211,7 @@ return s; } -#line 213 "src/libre/dialect/glob/parser.c" +#line 215 "src/libre/dialect/glob/parser.c" #ifndef ERROR_TERMINAL @@ -244,13 +246,13 @@ ZL2_list_Hof_Hatoms:; } /* BEGINNING OF ACTION: ast-add-concat */ { -#line 823 "src/libre/parser.act" +#line 825 "src/libre/parser.act" if (!ast_add_expr_concat((ZIcat), (ZIa))) { goto ZL1; } -#line 254 "src/libre/dialect/glob/parser.c" +#line 256 "src/libre/dialect/glob/parser.c" } /* END OF ACTION: ast-add-concat */ /* BEGINNING OF INLINE: 98 */ @@ -286,14 +288,14 @@ p_list_Hof_Hatoms_C_Catom(flags flags, lex_state lex_state, act_state act_state, ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-make-any */ { -#line 689 "src/libre/parser.act" +#line 691 "src/libre/parser.act" (ZIe) = ast_make_expr_any(); if ((ZIe) == NULL) { goto ZL1; } -#line 297 "src/libre/dialect/glob/parser.c" +#line 299 "src/libre/dialect/glob/parser.c" } /* END OF ACTION: ast-make-any */ } @@ -306,7 +308,7 @@ p_list_Hof_Hatoms_C_Catom(flags flags, lex_state lex_state, act_state act_state, /* BEGINNING OF EXTRACT: CHAR */ { -#line 414 "src/libre/parser.act" +#line 416 "src/libre/parser.act" /* the first byte may be '\x00' */ assert(lex_state->buf.a[1] == '\0'); @@ -316,20 +318,20 @@ p_list_Hof_Hatoms_C_Catom(flags flags, lex_state lex_state, act_state act_state, ZIc = lex_state->buf.a[0]; -#line 320 "src/libre/dialect/glob/parser.c" +#line 322 "src/libre/dialect/glob/parser.c" } /* END OF EXTRACT: CHAR */ ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-make-literal */ { -#line 678 "src/libre/parser.act" +#line 680 "src/libre/parser.act" (ZIe) = ast_make_expr_literal((ZIc)); if ((ZIe) == NULL) { goto ZL1; } -#line 333 "src/libre/dialect/glob/parser.c" +#line 335 "src/libre/dialect/glob/parser.c" } /* END OF ACTION: ast-make-literal */ } @@ -342,28 +344,28 @@ p_list_Hof_Hatoms_C_Catom(flags flags, lex_state lex_state, act_state act_state, ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-make-any */ { -#line 689 "src/libre/parser.act" +#line 691 "src/libre/parser.act" (ZIg) = ast_make_expr_any(); if ((ZIg) == NULL) { goto ZL1; } -#line 353 "src/libre/dialect/glob/parser.c" +#line 355 "src/libre/dialect/glob/parser.c" } /* END OF ACTION: ast-make-any */ /* BEGINNING OF ACTION: count-zero-or-more */ { -#line 590 "src/libre/parser.act" +#line 592 "src/libre/parser.act" (ZIc) = ast_make_count(0, NULL, AST_COUNT_UNBOUNDED, NULL); -#line 362 "src/libre/dialect/glob/parser.c" +#line 364 "src/libre/dialect/glob/parser.c" } /* END OF ACTION: count-zero-or-more */ /* BEGINNING OF ACTION: ast-make-piece */ { -#line 696 "src/libre/parser.act" +#line 698 "src/libre/parser.act" if ((ZIc).min == 0 && (ZIc).max == 0) { (ZIe) = ast_make_expr_empty(); @@ -377,7 +379,7 @@ p_list_Hof_Hatoms_C_Catom(flags flags, lex_state lex_state, act_state act_state, goto ZL1; } -#line 381 "src/libre/dialect/glob/parser.c" +#line 383 "src/libre/dialect/glob/parser.c" } /* END OF ACTION: ast-make-piece */ } @@ -392,26 +394,26 @@ ZL1:; { /* BEGINNING OF ACTION: err-expected-atom */ { -#line 483 "src/libre/parser.act" +#line 485 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXATOM; } goto ZL2; -#line 403 "src/libre/dialect/glob/parser.c" +#line 405 "src/libre/dialect/glob/parser.c" } /* END OF ACTION: err-expected-atom */ /* BEGINNING OF ACTION: ast-make-any */ { -#line 689 "src/libre/parser.act" +#line 691 "src/libre/parser.act" (ZIe) = ast_make_expr_any(); if ((ZIe) == NULL) { goto ZL2; } -#line 415 "src/libre/dialect/glob/parser.c" +#line 417 "src/libre/dialect/glob/parser.c" } /* END OF ACTION: ast-make-any */ } @@ -439,14 +441,14 @@ p_re__glob(flags flags, lex_state lex_state, act_state act_state, err err, t_ast { /* BEGINNING OF ACTION: ast-make-concat */ { -#line 664 "src/libre/parser.act" +#line 666 "src/libre/parser.act" (ZInode) = ast_make_expr_concat(); if ((ZInode) == NULL) { goto ZL1; } -#line 450 "src/libre/dialect/glob/parser.c" +#line 452 "src/libre/dialect/glob/parser.c" } /* END OF ACTION: ast-make-concat */ p_list_Hof_Hatoms (flags, lex_state, act_state, err, ZInode); @@ -460,14 +462,14 @@ p_re__glob(flags flags, lex_state lex_state, act_state act_state, err err, t_ast { /* BEGINNING OF ACTION: ast-make-empty */ { -#line 657 "src/libre/parser.act" +#line 659 "src/libre/parser.act" (ZInode) = ast_make_expr_empty(); if ((ZInode) == NULL) { goto ZL1; } -#line 471 "src/libre/dialect/glob/parser.c" +#line 473 "src/libre/dialect/glob/parser.c" } /* END OF ACTION: ast-make-empty */ } @@ -491,14 +493,14 @@ p_re__glob(flags flags, lex_state lex_state, act_state act_state, err err, t_ast { /* BEGINNING OF ACTION: err-expected-eof */ { -#line 532 "src/libre/parser.act" +#line 534 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXEOF; } goto ZL1; -#line 502 "src/libre/dialect/glob/parser.c" +#line 504 "src/libre/dialect/glob/parser.c" } /* END OF ACTION: err-expected-eof */ } @@ -516,7 +518,7 @@ ZL0:; /* BEGINNING OF TRAILER */ -#line 976 "src/libre/parser.act" +#line 978 "src/libre/parser.act" static int @@ -659,6 +661,6 @@ ZL0:; return NULL; } -#line 663 "src/libre/dialect/glob/parser.c" +#line 665 "src/libre/dialect/glob/parser.c" /* END OF FILE */ diff --git a/src/libre/dialect/glob/parser.h b/src/libre/dialect/glob/parser.h index 11c0d9ec5..5003a9ed8 100644 --- a/src/libre/dialect/glob/parser.h +++ b/src/libre/dialect/glob/parser.h @@ -9,7 +9,7 @@ /* BEGINNING OF HEADER */ -#line 232 "src/libre/parser.act" +#line 234 "src/libre/parser.act" #include @@ -28,7 +28,7 @@ extern void p_re__glob(flags, lex_state, act_state, err, t_ast__expr *); /* BEGINNING OF TRAILER */ -#line 978 "src/libre/parser.act" +#line 980 "src/libre/parser.act" #line 35 "src/libre/dialect/glob/parser.h" diff --git a/src/libre/dialect/like/parser.c b/src/libre/dialect/like/parser.c index 8a64b3e3a..71873438a 100644 --- a/src/libre/dialect/like/parser.c +++ b/src/libre/dialect/like/parser.c @@ -9,7 +9,7 @@ /* BEGINNING OF HEADER */ -#line 142 "src/libre/parser.act" +#line 144 "src/libre/parser.act" #include @@ -21,6 +21,8 @@ #include #include + #include + #include #include "libre/class.h" @@ -209,7 +211,7 @@ return s; } -#line 213 "src/libre/dialect/like/parser.c" +#line 215 "src/libre/dialect/like/parser.c" #ifndef ERROR_TERMINAL @@ -244,13 +246,13 @@ ZL2_list_Hof_Hatoms:; } /* BEGINNING OF ACTION: ast-add-concat */ { -#line 823 "src/libre/parser.act" +#line 825 "src/libre/parser.act" if (!ast_add_expr_concat((ZIcat), (ZIa))) { goto ZL1; } -#line 254 "src/libre/dialect/like/parser.c" +#line 256 "src/libre/dialect/like/parser.c" } /* END OF ACTION: ast-add-concat */ /* BEGINNING OF INLINE: 98 */ @@ -286,14 +288,14 @@ p_list_Hof_Hatoms_C_Catom(flags flags, lex_state lex_state, act_state act_state, ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-make-any */ { -#line 689 "src/libre/parser.act" +#line 691 "src/libre/parser.act" (ZIe) = ast_make_expr_any(); if ((ZIe) == NULL) { goto ZL1; } -#line 297 "src/libre/dialect/like/parser.c" +#line 299 "src/libre/dialect/like/parser.c" } /* END OF ACTION: ast-make-any */ } @@ -306,7 +308,7 @@ p_list_Hof_Hatoms_C_Catom(flags flags, lex_state lex_state, act_state act_state, /* BEGINNING OF EXTRACT: CHAR */ { -#line 414 "src/libre/parser.act" +#line 416 "src/libre/parser.act" /* the first byte may be '\x00' */ assert(lex_state->buf.a[1] == '\0'); @@ -316,20 +318,20 @@ p_list_Hof_Hatoms_C_Catom(flags flags, lex_state lex_state, act_state act_state, ZIc = lex_state->buf.a[0]; -#line 320 "src/libre/dialect/like/parser.c" +#line 322 "src/libre/dialect/like/parser.c" } /* END OF EXTRACT: CHAR */ ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-make-literal */ { -#line 678 "src/libre/parser.act" +#line 680 "src/libre/parser.act" (ZIe) = ast_make_expr_literal((ZIc)); if ((ZIe) == NULL) { goto ZL1; } -#line 333 "src/libre/dialect/like/parser.c" +#line 335 "src/libre/dialect/like/parser.c" } /* END OF ACTION: ast-make-literal */ } @@ -342,28 +344,28 @@ p_list_Hof_Hatoms_C_Catom(flags flags, lex_state lex_state, act_state act_state, ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-make-any */ { -#line 689 "src/libre/parser.act" +#line 691 "src/libre/parser.act" (ZIg) = ast_make_expr_any(); if ((ZIg) == NULL) { goto ZL1; } -#line 353 "src/libre/dialect/like/parser.c" +#line 355 "src/libre/dialect/like/parser.c" } /* END OF ACTION: ast-make-any */ /* BEGINNING OF ACTION: count-zero-or-more */ { -#line 590 "src/libre/parser.act" +#line 592 "src/libre/parser.act" (ZIc) = ast_make_count(0, NULL, AST_COUNT_UNBOUNDED, NULL); -#line 362 "src/libre/dialect/like/parser.c" +#line 364 "src/libre/dialect/like/parser.c" } /* END OF ACTION: count-zero-or-more */ /* BEGINNING OF ACTION: ast-make-piece */ { -#line 696 "src/libre/parser.act" +#line 698 "src/libre/parser.act" if ((ZIc).min == 0 && (ZIc).max == 0) { (ZIe) = ast_make_expr_empty(); @@ -377,7 +379,7 @@ p_list_Hof_Hatoms_C_Catom(flags flags, lex_state lex_state, act_state act_state, goto ZL1; } -#line 381 "src/libre/dialect/like/parser.c" +#line 383 "src/libre/dialect/like/parser.c" } /* END OF ACTION: ast-make-piece */ } @@ -392,26 +394,26 @@ ZL1:; { /* BEGINNING OF ACTION: err-expected-atom */ { -#line 483 "src/libre/parser.act" +#line 485 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXATOM; } goto ZL2; -#line 403 "src/libre/dialect/like/parser.c" +#line 405 "src/libre/dialect/like/parser.c" } /* END OF ACTION: err-expected-atom */ /* BEGINNING OF ACTION: ast-make-any */ { -#line 689 "src/libre/parser.act" +#line 691 "src/libre/parser.act" (ZIe) = ast_make_expr_any(); if ((ZIe) == NULL) { goto ZL2; } -#line 415 "src/libre/dialect/like/parser.c" +#line 417 "src/libre/dialect/like/parser.c" } /* END OF ACTION: ast-make-any */ } @@ -439,14 +441,14 @@ p_re__like(flags flags, lex_state lex_state, act_state act_state, err err, t_ast { /* BEGINNING OF ACTION: ast-make-concat */ { -#line 664 "src/libre/parser.act" +#line 666 "src/libre/parser.act" (ZInode) = ast_make_expr_concat(); if ((ZInode) == NULL) { goto ZL1; } -#line 450 "src/libre/dialect/like/parser.c" +#line 452 "src/libre/dialect/like/parser.c" } /* END OF ACTION: ast-make-concat */ p_list_Hof_Hatoms (flags, lex_state, act_state, err, ZInode); @@ -460,14 +462,14 @@ p_re__like(flags flags, lex_state lex_state, act_state act_state, err err, t_ast { /* BEGINNING OF ACTION: ast-make-empty */ { -#line 657 "src/libre/parser.act" +#line 659 "src/libre/parser.act" (ZInode) = ast_make_expr_empty(); if ((ZInode) == NULL) { goto ZL1; } -#line 471 "src/libre/dialect/like/parser.c" +#line 473 "src/libre/dialect/like/parser.c" } /* END OF ACTION: ast-make-empty */ } @@ -491,14 +493,14 @@ p_re__like(flags flags, lex_state lex_state, act_state act_state, err err, t_ast { /* BEGINNING OF ACTION: err-expected-eof */ { -#line 532 "src/libre/parser.act" +#line 534 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXEOF; } goto ZL1; -#line 502 "src/libre/dialect/like/parser.c" +#line 504 "src/libre/dialect/like/parser.c" } /* END OF ACTION: err-expected-eof */ } @@ -516,7 +518,7 @@ ZL0:; /* BEGINNING OF TRAILER */ -#line 976 "src/libre/parser.act" +#line 978 "src/libre/parser.act" static int @@ -659,6 +661,6 @@ ZL0:; return NULL; } -#line 663 "src/libre/dialect/like/parser.c" +#line 665 "src/libre/dialect/like/parser.c" /* END OF FILE */ diff --git a/src/libre/dialect/like/parser.h b/src/libre/dialect/like/parser.h index 8eaffdc53..6b638ecf0 100644 --- a/src/libre/dialect/like/parser.h +++ b/src/libre/dialect/like/parser.h @@ -9,7 +9,7 @@ /* BEGINNING OF HEADER */ -#line 232 "src/libre/parser.act" +#line 234 "src/libre/parser.act" #include @@ -28,7 +28,7 @@ extern void p_re__like(flags, lex_state, act_state, err, t_ast__expr *); /* BEGINNING OF TRAILER */ -#line 978 "src/libre/parser.act" +#line 980 "src/libre/parser.act" #line 35 "src/libre/dialect/like/parser.h" diff --git a/src/libre/dialect/literal/parser.c b/src/libre/dialect/literal/parser.c index 152403940..bb5743ae2 100644 --- a/src/libre/dialect/literal/parser.c +++ b/src/libre/dialect/literal/parser.c @@ -9,7 +9,7 @@ /* BEGINNING OF HEADER */ -#line 142 "src/libre/parser.act" +#line 144 "src/libre/parser.act" #include @@ -21,6 +21,8 @@ #include #include + #include + #include #include "libre/class.h" @@ -209,7 +211,7 @@ return s; } -#line 213 "src/libre/dialect/literal/parser.c" +#line 215 "src/libre/dialect/literal/parser.c" #ifndef ERROR_TERMINAL @@ -244,13 +246,13 @@ ZL2_list_Hof_Hatoms:; } /* BEGINNING OF ACTION: ast-add-concat */ { -#line 823 "src/libre/parser.act" +#line 825 "src/libre/parser.act" if (!ast_add_expr_concat((ZIcat), (ZIa))) { goto ZL1; } -#line 254 "src/libre/dialect/literal/parser.c" +#line 256 "src/libre/dialect/literal/parser.c" } /* END OF ACTION: ast-add-concat */ /* BEGINNING OF INLINE: 97 */ @@ -291,14 +293,14 @@ p_re__literal(flags flags, lex_state lex_state, act_state act_state, err err, t_ { /* BEGINNING OF ACTION: ast-make-concat */ { -#line 664 "src/libre/parser.act" +#line 666 "src/libre/parser.act" (ZInode) = ast_make_expr_concat(); if ((ZInode) == NULL) { goto ZL1; } -#line 302 "src/libre/dialect/literal/parser.c" +#line 304 "src/libre/dialect/literal/parser.c" } /* END OF ACTION: ast-make-concat */ p_list_Hof_Hatoms (flags, lex_state, act_state, err, ZInode); @@ -312,14 +314,14 @@ p_re__literal(flags flags, lex_state lex_state, act_state act_state, err err, t_ { /* BEGINNING OF ACTION: ast-make-empty */ { -#line 657 "src/libre/parser.act" +#line 659 "src/libre/parser.act" (ZInode) = ast_make_expr_empty(); if ((ZInode) == NULL) { goto ZL1; } -#line 323 "src/libre/dialect/literal/parser.c" +#line 325 "src/libre/dialect/literal/parser.c" } /* END OF ACTION: ast-make-empty */ } @@ -343,14 +345,14 @@ p_re__literal(flags flags, lex_state lex_state, act_state act_state, err err, t_ { /* BEGINNING OF ACTION: err-expected-eof */ { -#line 532 "src/libre/parser.act" +#line 534 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXEOF; } goto ZL1; -#line 354 "src/libre/dialect/literal/parser.c" +#line 356 "src/libre/dialect/literal/parser.c" } /* END OF ACTION: err-expected-eof */ } @@ -383,7 +385,7 @@ p_list_Hof_Hatoms_C_Catom(flags flags, lex_state lex_state, act_state act_state, case (TOK_CHAR): /* BEGINNING OF EXTRACT: CHAR */ { -#line 414 "src/libre/parser.act" +#line 416 "src/libre/parser.act" /* the first byte may be '\x00' */ assert(lex_state->buf.a[1] == '\0'); @@ -393,7 +395,7 @@ p_list_Hof_Hatoms_C_Catom(flags flags, lex_state lex_state, act_state act_state, ZIc = lex_state->buf.a[0]; -#line 397 "src/libre/dialect/literal/parser.c" +#line 399 "src/libre/dialect/literal/parser.c" } /* END OF EXTRACT: CHAR */ break; @@ -403,14 +405,14 @@ p_list_Hof_Hatoms_C_Catom(flags flags, lex_state lex_state, act_state act_state, ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-make-literal */ { -#line 678 "src/libre/parser.act" +#line 680 "src/libre/parser.act" (ZInode) = ast_make_expr_literal((ZIc)); if ((ZInode) == NULL) { goto ZL1; } -#line 414 "src/libre/dialect/literal/parser.c" +#line 416 "src/libre/dialect/literal/parser.c" } /* END OF ACTION: ast-make-literal */ } @@ -419,26 +421,26 @@ ZL1:; { /* BEGINNING OF ACTION: err-expected-atom */ { -#line 483 "src/libre/parser.act" +#line 485 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXATOM; } goto ZL2; -#line 430 "src/libre/dialect/literal/parser.c" +#line 432 "src/libre/dialect/literal/parser.c" } /* END OF ACTION: err-expected-atom */ /* BEGINNING OF ACTION: ast-make-any */ { -#line 689 "src/libre/parser.act" +#line 691 "src/libre/parser.act" (ZInode) = ast_make_expr_any(); if ((ZInode) == NULL) { goto ZL2; } -#line 442 "src/libre/dialect/literal/parser.c" +#line 444 "src/libre/dialect/literal/parser.c" } /* END OF ACTION: ast-make-any */ } @@ -452,7 +454,7 @@ ZL0:; /* BEGINNING OF TRAILER */ -#line 976 "src/libre/parser.act" +#line 978 "src/libre/parser.act" static int @@ -595,6 +597,6 @@ ZL0:; return NULL; } -#line 599 "src/libre/dialect/literal/parser.c" +#line 601 "src/libre/dialect/literal/parser.c" /* END OF FILE */ diff --git a/src/libre/dialect/literal/parser.h b/src/libre/dialect/literal/parser.h index 65837fd41..b27386a6a 100644 --- a/src/libre/dialect/literal/parser.h +++ b/src/libre/dialect/literal/parser.h @@ -9,7 +9,7 @@ /* BEGINNING OF HEADER */ -#line 232 "src/libre/parser.act" +#line 234 "src/libre/parser.act" #include @@ -28,7 +28,7 @@ extern void p_re__literal(flags, lex_state, act_state, err, t_ast__expr *); /* BEGINNING OF TRAILER */ -#line 978 "src/libre/parser.act" +#line 980 "src/libre/parser.act" #line 35 "src/libre/dialect/literal/parser.h" diff --git a/src/libre/dialect/native/parser.c b/src/libre/dialect/native/parser.c index 3886d39d2..82c9465d4 100644 --- a/src/libre/dialect/native/parser.c +++ b/src/libre/dialect/native/parser.c @@ -9,7 +9,7 @@ /* BEGINNING OF HEADER */ -#line 142 "src/libre/parser.act" +#line 144 "src/libre/parser.act" #include @@ -21,6 +21,8 @@ #include #include + #include + #include #include "libre/class.h" @@ -209,7 +211,7 @@ return s; } -#line 213 "src/libre/dialect/native/parser.c" +#line 215 "src/libre/dialect/native/parser.c" #ifndef ERROR_TERMINAL @@ -250,17 +252,17 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hhead(flags flags, lex_state lex_state, act_ /* BEGINNING OF EXTRACT: INVERT */ { -#line 237 "src/libre/parser.act" +#line 239 "src/libre/parser.act" ZI107 = '^'; -#line 258 "src/libre/dialect/native/parser.c" +#line 260 "src/libre/dialect/native/parser.c" } /* END OF EXTRACT: INVERT */ ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-make-invert */ { -#line 773 "src/libre/parser.act" +#line 775 "src/libre/parser.act" struct ast_expr *any; @@ -298,7 +300,7 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hhead(flags flags, lex_state lex_state, act_ goto ZL1; } -#line 302 "src/libre/dialect/native/parser.c" +#line 304 "src/libre/dialect/native/parser.c" } /* END OF ACTION: ast-make-invert */ } @@ -334,13 +336,13 @@ ZL2_expr_C_Ccharacter_Hclass_C_Clist_Hof_Hclass_Hterms:; } /* BEGINNING OF ACTION: ast-add-alt */ { -#line 829 "src/libre/parser.act" +#line 831 "src/libre/parser.act" if (!ast_add_expr_alt((ZIclass), (ZInode))) { goto ZL4; } -#line 344 "src/libre/dialect/native/parser.c" +#line 346 "src/libre/dialect/native/parser.c" } /* END OF ACTION: ast-add-alt */ } @@ -349,14 +351,14 @@ ZL2_expr_C_Ccharacter_Hclass_C_Clist_Hof_Hclass_Hterms:; { /* BEGINNING OF ACTION: err-expected-term */ { -#line 469 "src/libre/parser.act" +#line 471 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXTERM; } goto ZL1; -#line 360 "src/libre/dialect/native/parser.c" +#line 362 "src/libre/dialect/native/parser.c" } /* END OF ACTION: err-expected-term */ } @@ -403,13 +405,13 @@ ZL2_expr_C_Clist_Hof_Hpieces:; } /* BEGINNING OF ACTION: ast-add-concat */ { -#line 823 "src/libre/parser.act" +#line 825 "src/libre/parser.act" if (!ast_add_expr_concat((ZIcat), (ZIa))) { goto ZL1; } -#line 413 "src/libre/dialect/native/parser.c" +#line 415 "src/libre/dialect/native/parser.c" } /* END OF ACTION: ast-add-concat */ /* BEGINNING OF INLINE: 177 */ @@ -457,7 +459,7 @@ p_expr_C_Cliteral(flags flags, lex_state lex_state, act_state act_state, err err /* BEGINNING OF EXTRACT: CHAR */ { -#line 414 "src/libre/parser.act" +#line 416 "src/libre/parser.act" /* the first byte may be '\x00' */ assert(lex_state->buf.a[1] == '\0'); @@ -467,7 +469,7 @@ p_expr_C_Cliteral(flags flags, lex_state lex_state, act_state act_state, err err ZIc = lex_state->buf.a[0]; -#line 471 "src/libre/dialect/native/parser.c" +#line 473 "src/libre/dialect/native/parser.c" } /* END OF EXTRACT: CHAR */ ADVANCE_LEXER; @@ -480,7 +482,7 @@ p_expr_C_Cliteral(flags flags, lex_state lex_state, act_state act_state, err err /* BEGINNING OF EXTRACT: ESC */ { -#line 287 "src/libre/parser.act" +#line 289 "src/libre/parser.act" assert(lex_state->buf.a[0] == '\\'); assert(lex_state->buf.a[1] != '\0'); @@ -501,7 +503,7 @@ p_expr_C_Cliteral(flags flags, lex_state lex_state, act_state act_state, err err ZI94 = lex_state->lx.start; ZI95 = lex_state->lx.end; -#line 505 "src/libre/dialect/native/parser.c" +#line 507 "src/libre/dialect/native/parser.c" } /* END OF EXTRACT: ESC */ ADVANCE_LEXER; @@ -514,7 +516,7 @@ p_expr_C_Cliteral(flags flags, lex_state lex_state, act_state act_state, err err /* BEGINNING OF EXTRACT: HEX */ { -#line 378 "src/libre/parser.act" +#line 380 "src/libre/parser.act" unsigned long u; char *s, *e; @@ -554,7 +556,7 @@ p_expr_C_Cliteral(flags flags, lex_state lex_state, act_state act_state, err err ZIc = (char) (unsigned char) u; -#line 558 "src/libre/dialect/native/parser.c" +#line 560 "src/libre/dialect/native/parser.c" } /* END OF EXTRACT: HEX */ ADVANCE_LEXER; @@ -567,7 +569,7 @@ p_expr_C_Cliteral(flags flags, lex_state lex_state, act_state act_state, err err /* BEGINNING OF EXTRACT: OCT */ { -#line 338 "src/libre/parser.act" +#line 340 "src/libre/parser.act" unsigned long u; char *s, *e; @@ -607,7 +609,7 @@ p_expr_C_Cliteral(flags flags, lex_state lex_state, act_state act_state, err err ZIc = (char) (unsigned char) u; -#line 611 "src/libre/dialect/native/parser.c" +#line 613 "src/libre/dialect/native/parser.c" } /* END OF EXTRACT: OCT */ ADVANCE_LEXER; @@ -620,14 +622,14 @@ p_expr_C_Cliteral(flags flags, lex_state lex_state, act_state act_state, err err /* END OF INLINE: 92 */ /* BEGINNING OF ACTION: ast-make-literal */ { -#line 678 "src/libre/parser.act" +#line 680 "src/libre/parser.act" (ZInode) = ast_make_expr_literal((ZIc)); if ((ZInode) == NULL) { goto ZL1; } -#line 631 "src/libre/dialect/native/parser.c" +#line 633 "src/libre/dialect/native/parser.c" } /* END OF ACTION: ast-make-literal */ } @@ -653,7 +655,7 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hterm(flags flags, lex_state lex_state, act_ /* BEGINNING OF EXTRACT: CHAR */ { -#line 414 "src/libre/parser.act" +#line 416 "src/libre/parser.act" /* the first byte may be '\x00' */ assert(lex_state->buf.a[1] == '\0'); @@ -663,7 +665,7 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hterm(flags flags, lex_state lex_state, act_ ZI209 = lex_state->buf.a[0]; -#line 667 "src/libre/dialect/native/parser.c" +#line 669 "src/libre/dialect/native/parser.c" } /* END OF EXTRACT: CHAR */ ADVANCE_LEXER; @@ -682,7 +684,7 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hterm(flags flags, lex_state lex_state, act_ /* BEGINNING OF EXTRACT: ESC */ { -#line 287 "src/libre/parser.act" +#line 289 "src/libre/parser.act" assert(lex_state->buf.a[0] == '\\'); assert(lex_state->buf.a[1] != '\0'); @@ -703,7 +705,7 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hterm(flags flags, lex_state lex_state, act_ ZI198 = lex_state->lx.start; ZI199 = lex_state->lx.end; -#line 707 "src/libre/dialect/native/parser.c" +#line 709 "src/libre/dialect/native/parser.c" } /* END OF EXTRACT: ESC */ ADVANCE_LEXER; @@ -722,7 +724,7 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hterm(flags flags, lex_state lex_state, act_ /* BEGINNING OF EXTRACT: HEX */ { -#line 378 "src/libre/parser.act" +#line 380 "src/libre/parser.act" unsigned long u; char *s, *e; @@ -762,7 +764,7 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hterm(flags flags, lex_state lex_state, act_ ZI205 = (char) (unsigned char) u; -#line 766 "src/libre/dialect/native/parser.c" +#line 768 "src/libre/dialect/native/parser.c" } /* END OF EXTRACT: HEX */ ADVANCE_LEXER; @@ -781,7 +783,7 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hterm(flags flags, lex_state lex_state, act_ /* BEGINNING OF EXTRACT: OCT */ { -#line 338 "src/libre/parser.act" +#line 340 "src/libre/parser.act" unsigned long u; char *s, *e; @@ -821,7 +823,7 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hterm(flags flags, lex_state lex_state, act_ ZI201 = (char) (unsigned char) u; -#line 825 "src/libre/dialect/native/parser.c" +#line 827 "src/libre/dialect/native/parser.c" } /* END OF EXTRACT: OCT */ ADVANCE_LEXER; @@ -872,12 +874,12 @@ p_expr_C_Ccharacter_Hclass(flags flags, lex_state lex_state, act_state act_state case (TOK_OPENGROUP): /* BEGINNING OF EXTRACT: OPENGROUP */ { -#line 247 "src/libre/parser.act" +#line 249 "src/libre/parser.act" ZIstart = lex_state->lx.start; ZI153 = lex_state->lx.end; -#line 881 "src/libre/dialect/native/parser.c" +#line 883 "src/libre/dialect/native/parser.c" } /* END OF EXTRACT: OPENGROUP */ break; @@ -887,14 +889,14 @@ p_expr_C_Ccharacter_Hclass(flags flags, lex_state lex_state, act_state act_state ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-make-alt */ { -#line 671 "src/libre/parser.act" +#line 673 "src/libre/parser.act" (ZInode) = ast_make_expr_alt(); if ((ZInode) == NULL) { goto ZL1; } -#line 898 "src/libre/dialect/native/parser.c" +#line 900 "src/libre/dialect/native/parser.c" } /* END OF ACTION: ast-make-alt */ ZItmp = ZInode; @@ -914,13 +916,13 @@ p_expr_C_Ccharacter_Hclass(flags flags, lex_state lex_state, act_state act_state case (TOK_CLOSEGROUP): /* BEGINNING OF EXTRACT: CLOSEGROUP */ { -#line 267 "src/libre/parser.act" +#line 269 "src/libre/parser.act" ZI157 = ']'; ZI158 = lex_state->lx.start; ZIend = lex_state->lx.end; -#line 924 "src/libre/dialect/native/parser.c" +#line 926 "src/libre/dialect/native/parser.c" } /* END OF EXTRACT: CLOSEGROUP */ break; @@ -930,12 +932,12 @@ p_expr_C_Ccharacter_Hclass(flags flags, lex_state lex_state, act_state act_state ADVANCE_LEXER; /* BEGINNING OF ACTION: mark-group */ { -#line 543 "src/libre/parser.act" +#line 545 "src/libre/parser.act" mark(&act_state->groupstart, &(ZIstart)); mark(&act_state->groupend, &(ZIend)); -#line 939 "src/libre/dialect/native/parser.c" +#line 941 "src/libre/dialect/native/parser.c" } /* END OF ACTION: mark-group */ } @@ -944,14 +946,14 @@ p_expr_C_Ccharacter_Hclass(flags flags, lex_state lex_state, act_state act_state { /* BEGINNING OF ACTION: err-expected-closegroup */ { -#line 504 "src/libre/parser.act" +#line 506 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXCLOSEGROUP; } goto ZL1; -#line 955 "src/libre/dialect/native/parser.c" +#line 957 "src/libre/dialect/native/parser.c" } /* END OF ACTION: err-expected-closegroup */ ZIend = ZIstart; @@ -961,7 +963,7 @@ p_expr_C_Ccharacter_Hclass(flags flags, lex_state lex_state, act_state act_state /* END OF INLINE: 156 */ /* BEGINNING OF ACTION: mark-expr */ { -#line 560 "src/libre/parser.act" +#line 562 "src/libre/parser.act" struct ast_pos ast_start, ast_end; @@ -976,7 +978,7 @@ p_expr_C_Ccharacter_Hclass(flags flags, lex_state lex_state, act_state act_state (ZItmp)->u.class.end = ast_end; */ -#line 980 "src/libre/dialect/native/parser.c" +#line 982 "src/libre/dialect/native/parser.c" } /* END OF ACTION: mark-expr */ } @@ -1008,7 +1010,7 @@ p_expr_C_Cpiece(flags flags, lex_state lex_state, act_state act_state, err err, } /* BEGINNING OF ACTION: ast-make-piece */ { -#line 696 "src/libre/parser.act" +#line 698 "src/libre/parser.act" if ((ZIc).min == 0 && (ZIc).max == 0) { (ZInode) = ast_make_expr_empty(); @@ -1022,7 +1024,7 @@ p_expr_C_Cpiece(flags flags, lex_state lex_state, act_state act_state, err err, goto ZL1; } -#line 1026 "src/libre/dialect/native/parser.c" +#line 1028 "src/libre/dialect/native/parser.c" } /* END OF ACTION: ast-make-piece */ } @@ -1046,14 +1048,14 @@ p_expr(flags flags, lex_state lex_state, act_state act_state, err err, t_ast__ex { /* BEGINNING OF ACTION: ast-make-alt */ { -#line 671 "src/libre/parser.act" +#line 673 "src/libre/parser.act" (ZInode) = ast_make_expr_alt(); if ((ZInode) == NULL) { goto ZL1; } -#line 1057 "src/libre/dialect/native/parser.c" +#line 1059 "src/libre/dialect/native/parser.c" } /* END OF ACTION: ast-make-alt */ p_expr_C_Clist_Hof_Halts (flags, lex_state, act_state, err, ZInode); @@ -1067,14 +1069,14 @@ p_expr(flags flags, lex_state lex_state, act_state act_state, err err, t_ast__ex { /* BEGINNING OF ACTION: ast-make-empty */ { -#line 657 "src/libre/parser.act" +#line 659 "src/libre/parser.act" (ZInode) = ast_make_expr_empty(); if ((ZInode) == NULL) { goto ZL1; } -#line 1078 "src/libre/dialect/native/parser.c" +#line 1080 "src/libre/dialect/native/parser.c" } /* END OF ACTION: ast-make-empty */ } @@ -1087,26 +1089,26 @@ ZL1:; { /* BEGINNING OF ACTION: err-expected-alts */ { -#line 490 "src/libre/parser.act" +#line 492 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXALTS; } goto ZL2; -#line 1098 "src/libre/dialect/native/parser.c" +#line 1100 "src/libre/dialect/native/parser.c" } /* END OF ACTION: err-expected-alts */ /* BEGINNING OF ACTION: ast-make-empty */ { -#line 657 "src/libre/parser.act" +#line 659 "src/libre/parser.act" (ZInode) = ast_make_expr_empty(); if ((ZInode) == NULL) { goto ZL2; } -#line 1110 "src/libre/dialect/native/parser.c" +#line 1112 "src/libre/dialect/native/parser.c" } /* END OF ACTION: ast-make-empty */ } @@ -1154,14 +1156,14 @@ p_re__native(flags flags, lex_state lex_state, act_state act_state, err err, t_a { /* BEGINNING OF ACTION: err-expected-eof */ { -#line 532 "src/libre/parser.act" +#line 534 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXEOF; } goto ZL1; -#line 1165 "src/libre/dialect/native/parser.c" +#line 1167 "src/libre/dialect/native/parser.c" } /* END OF ACTION: err-expected-eof */ } @@ -1187,14 +1189,14 @@ p_212(flags flags, lex_state lex_state, act_state act_state, err err, t_char *ZI { /* BEGINNING OF ACTION: ast-make-literal */ { -#line 678 "src/libre/parser.act" +#line 680 "src/libre/parser.act" (ZInode) = ast_make_expr_literal((*ZI209)); if ((ZInode) == NULL) { goto ZL1; } -#line 1198 "src/libre/dialect/native/parser.c" +#line 1200 "src/libre/dialect/native/parser.c" } /* END OF ACTION: ast-make-literal */ } @@ -1208,12 +1210,12 @@ p_212(flags flags, lex_state lex_state, act_state act_state, err err, t_char *ZI /* BEGINNING OF ACTION: ast-range-endpoint-literal */ { -#line 626 "src/libre/parser.act" +#line 628 "src/libre/parser.act" (ZIa).type = AST_ENDPOINT_LITERAL; (ZIa).u.literal.c = (*ZI209); -#line 1217 "src/libre/dialect/native/parser.c" +#line 1219 "src/libre/dialect/native/parser.c" } /* END OF ACTION: ast-range-endpoint-literal */ /* BEGINNING OF INLINE: 129 */ @@ -1227,13 +1229,13 @@ p_212(flags flags, lex_state lex_state, act_state act_state, err err, t_char *ZI case (TOK_RANGE): /* BEGINNING OF EXTRACT: RANGE */ { -#line 241 "src/libre/parser.act" +#line 243 "src/libre/parser.act" ZI130 = '-'; ZI131 = lex_state->lx.start; ZI132 = lex_state->lx.end; -#line 1237 "src/libre/dialect/native/parser.c" +#line 1239 "src/libre/dialect/native/parser.c" } /* END OF EXTRACT: RANGE */ break; @@ -1247,14 +1249,14 @@ p_212(flags flags, lex_state lex_state, act_state act_state, err err, t_char *ZI { /* BEGINNING OF ACTION: err-expected-range */ { -#line 497 "src/libre/parser.act" +#line 499 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXRANGE; } goto ZL1; -#line 1258 "src/libre/dialect/native/parser.c" +#line 1260 "src/libre/dialect/native/parser.c" } /* END OF ACTION: err-expected-range */ } @@ -1270,7 +1272,7 @@ p_212(flags flags, lex_state lex_state, act_state act_state, err err, t_char *ZI /* BEGINNING OF EXTRACT: CHAR */ { -#line 414 "src/libre/parser.act" +#line 416 "src/libre/parser.act" /* the first byte may be '\x00' */ assert(lex_state->buf.a[1] == '\0'); @@ -1280,7 +1282,7 @@ p_212(flags flags, lex_state lex_state, act_state act_state, err err, t_char *ZI ZIcz = lex_state->buf.a[0]; -#line 1284 "src/libre/dialect/native/parser.c" +#line 1286 "src/libre/dialect/native/parser.c" } /* END OF EXTRACT: CHAR */ ADVANCE_LEXER; @@ -1292,7 +1294,7 @@ p_212(flags flags, lex_state lex_state, act_state act_state, err err, t_char *ZI /* BEGINNING OF EXTRACT: ESC */ { -#line 287 "src/libre/parser.act" +#line 289 "src/libre/parser.act" assert(lex_state->buf.a[0] == '\\'); assert(lex_state->buf.a[1] != '\0'); @@ -1313,7 +1315,7 @@ p_212(flags flags, lex_state lex_state, act_state act_state, err err, t_char *ZI ZI135 = lex_state->lx.start; ZIend = lex_state->lx.end; -#line 1317 "src/libre/dialect/native/parser.c" +#line 1319 "src/libre/dialect/native/parser.c" } /* END OF EXTRACT: ESC */ ADVANCE_LEXER; @@ -1325,7 +1327,7 @@ p_212(flags flags, lex_state lex_state, act_state act_state, err err, t_char *ZI /* BEGINNING OF EXTRACT: HEX */ { -#line 378 "src/libre/parser.act" +#line 380 "src/libre/parser.act" unsigned long u; char *s, *e; @@ -1365,7 +1367,7 @@ p_212(flags flags, lex_state lex_state, act_state act_state, err err, t_char *ZI ZIcz = (char) (unsigned char) u; -#line 1369 "src/libre/dialect/native/parser.c" +#line 1371 "src/libre/dialect/native/parser.c" } /* END OF EXTRACT: HEX */ ADVANCE_LEXER; @@ -1377,7 +1379,7 @@ p_212(flags flags, lex_state lex_state, act_state act_state, err err, t_char *ZI /* BEGINNING OF EXTRACT: OCT */ { -#line 338 "src/libre/parser.act" +#line 340 "src/libre/parser.act" unsigned long u; char *s, *e; @@ -1417,7 +1419,7 @@ p_212(flags flags, lex_state lex_state, act_state act_state, err err, t_char *ZI ZIcz = (char) (unsigned char) u; -#line 1421 "src/libre/dialect/native/parser.c" +#line 1423 "src/libre/dialect/native/parser.c" } /* END OF EXTRACT: OCT */ ADVANCE_LEXER; @@ -1429,13 +1431,13 @@ p_212(flags flags, lex_state lex_state, act_state act_state, err err, t_char *ZI /* BEGINNING OF EXTRACT: RANGE */ { -#line 241 "src/libre/parser.act" +#line 243 "src/libre/parser.act" ZIcz = '-'; ZI140 = lex_state->lx.start; ZIend = lex_state->lx.end; -#line 1439 "src/libre/dialect/native/parser.c" +#line 1441 "src/libre/dialect/native/parser.c" } /* END OF EXTRACT: RANGE */ ADVANCE_LEXER; @@ -1448,27 +1450,27 @@ p_212(flags flags, lex_state lex_state, act_state act_state, err err, t_char *ZI /* END OF INLINE: 133 */ /* BEGINNING OF ACTION: ast-range-endpoint-literal */ { -#line 626 "src/libre/parser.act" +#line 628 "src/libre/parser.act" (ZIz).type = AST_ENDPOINT_LITERAL; (ZIz).u.literal.c = (ZIcz); -#line 1457 "src/libre/dialect/native/parser.c" +#line 1459 "src/libre/dialect/native/parser.c" } /* END OF ACTION: ast-range-endpoint-literal */ /* BEGINNING OF ACTION: mark-range */ { -#line 548 "src/libre/parser.act" +#line 550 "src/libre/parser.act" mark(&act_state->rangestart, &(*ZI210)); mark(&act_state->rangeend, &(ZIend)); -#line 1467 "src/libre/dialect/native/parser.c" +#line 1469 "src/libre/dialect/native/parser.c" } /* END OF ACTION: mark-range */ /* BEGINNING OF ACTION: ast-range-distinct */ { -#line 638 "src/libre/parser.act" +#line 640 "src/libre/parser.act" struct ast_pos ast_start, ast_end; @@ -1485,12 +1487,12 @@ p_212(flags flags, lex_state lex_state, act_state act_state, err err, t_char *ZI goto ZL1; } -#line 1489 "src/libre/dialect/native/parser.c" +#line 1491 "src/libre/dialect/native/parser.c" } /* END OF ACTION: ast-range-distinct */ /* BEGINNING OF ACTION: ast-make-range */ { -#line 786 "src/libre/parser.act" +#line 788 "src/libre/parser.act" struct ast_pos ast_start, ast_end; unsigned char lower, upper; @@ -1523,7 +1525,7 @@ p_212(flags flags, lex_state lex_state, act_state act_state, err err, t_char *ZI goto ZL1; } -#line 1527 "src/libre/dialect/native/parser.c" +#line 1529 "src/libre/dialect/native/parser.c" } /* END OF ACTION: ast-make-range */ } @@ -1552,28 +1554,28 @@ p_215(flags flags, lex_state lex_state, act_state act_state, err err, t_pos *ZI2 /* BEGINNING OF EXTRACT: CLOSECOUNT */ { -#line 278 "src/libre/parser.act" +#line 280 "src/libre/parser.act" ZI170 = lex_state->lx.start; ZIend = lex_state->lx.end; -#line 1561 "src/libre/dialect/native/parser.c" +#line 1563 "src/libre/dialect/native/parser.c" } /* END OF EXTRACT: CLOSECOUNT */ ADVANCE_LEXER; /* BEGINNING OF ACTION: mark-count */ { -#line 553 "src/libre/parser.act" +#line 555 "src/libre/parser.act" mark(&act_state->countstart, &(*ZI213)); mark(&act_state->countend, &(ZIend)); -#line 1572 "src/libre/dialect/native/parser.c" +#line 1574 "src/libre/dialect/native/parser.c" } /* END OF ACTION: mark-count */ /* BEGINNING OF ACTION: count-range */ { -#line 608 "src/libre/parser.act" +#line 610 "src/libre/parser.act" struct ast_pos ast_start, ast_end; @@ -1593,7 +1595,7 @@ p_215(flags flags, lex_state lex_state, act_state act_state, err err, t_pos *ZI2 (ZIc) = ast_make_count((*ZIm), &ast_start, (*ZIm), &ast_end); -#line 1597 "src/libre/dialect/native/parser.c" +#line 1599 "src/libre/dialect/native/parser.c" } /* END OF ACTION: count-range */ } @@ -1609,7 +1611,7 @@ p_215(flags flags, lex_state lex_state, act_state act_state, err err, t_pos *ZI2 case (TOK_COUNT): /* BEGINNING OF EXTRACT: COUNT */ { -#line 429 "src/libre/parser.act" +#line 431 "src/libre/parser.act" unsigned long u; char *e; @@ -1629,7 +1631,7 @@ p_215(flags flags, lex_state lex_state, act_state act_state, err err, t_pos *ZI2 ZIn = (unsigned int) u; -#line 1633 "src/libre/dialect/native/parser.c" +#line 1635 "src/libre/dialect/native/parser.c" } /* END OF EXTRACT: COUNT */ break; @@ -1641,12 +1643,12 @@ p_215(flags flags, lex_state lex_state, act_state act_state, err err, t_pos *ZI2 case (TOK_CLOSECOUNT): /* BEGINNING OF EXTRACT: CLOSECOUNT */ { -#line 278 "src/libre/parser.act" +#line 280 "src/libre/parser.act" ZI173 = lex_state->lx.start; ZIend = lex_state->lx.end; -#line 1650 "src/libre/dialect/native/parser.c" +#line 1652 "src/libre/dialect/native/parser.c" } /* END OF EXTRACT: CLOSECOUNT */ break; @@ -1656,17 +1658,17 @@ p_215(flags flags, lex_state lex_state, act_state act_state, err err, t_pos *ZI2 ADVANCE_LEXER; /* BEGINNING OF ACTION: mark-count */ { -#line 553 "src/libre/parser.act" +#line 555 "src/libre/parser.act" mark(&act_state->countstart, &(*ZI213)); mark(&act_state->countend, &(ZIend)); -#line 1665 "src/libre/dialect/native/parser.c" +#line 1667 "src/libre/dialect/native/parser.c" } /* END OF ACTION: mark-count */ /* BEGINNING OF ACTION: count-range */ { -#line 608 "src/libre/parser.act" +#line 610 "src/libre/parser.act" struct ast_pos ast_start, ast_end; @@ -1686,7 +1688,7 @@ p_215(flags flags, lex_state lex_state, act_state act_state, err err, t_pos *ZI2 (ZIc) = ast_make_count((*ZIm), &ast_start, (ZIn), &ast_end); -#line 1690 "src/libre/dialect/native/parser.c" +#line 1692 "src/libre/dialect/native/parser.c" } /* END OF ACTION: count-range */ } @@ -1721,13 +1723,13 @@ ZL2_expr_C_Clist_Hof_Halts:; } /* BEGINNING OF ACTION: ast-add-alt */ { -#line 829 "src/libre/parser.act" +#line 831 "src/libre/parser.act" if (!ast_add_expr_alt((ZIalts), (ZIa))) { goto ZL1; } -#line 1731 "src/libre/dialect/native/parser.c" +#line 1733 "src/libre/dialect/native/parser.c" } /* END OF ACTION: ast-add-alt */ /* BEGINNING OF INLINE: 183 */ @@ -1752,14 +1754,14 @@ ZL1:; { /* BEGINNING OF ACTION: err-expected-alts */ { -#line 490 "src/libre/parser.act" +#line 492 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXALTS; } goto ZL4; -#line 1763 "src/libre/dialect/native/parser.c" +#line 1765 "src/libre/dialect/native/parser.c" } /* END OF ACTION: err-expected-alts */ } @@ -1784,12 +1786,12 @@ p_expr_C_Cpiece_C_Ccount(flags flags, lex_state lex_state, act_state act_state, /* BEGINNING OF EXTRACT: OPENCOUNT */ { -#line 273 "src/libre/parser.act" +#line 275 "src/libre/parser.act" ZI213 = lex_state->lx.start; ZI214 = lex_state->lx.end; -#line 1793 "src/libre/dialect/native/parser.c" +#line 1795 "src/libre/dialect/native/parser.c" } /* END OF EXTRACT: OPENCOUNT */ ADVANCE_LEXER; @@ -1797,7 +1799,7 @@ p_expr_C_Cpiece_C_Ccount(flags flags, lex_state lex_state, act_state act_state, case (TOK_COUNT): /* BEGINNING OF EXTRACT: COUNT */ { -#line 429 "src/libre/parser.act" +#line 431 "src/libre/parser.act" unsigned long u; char *e; @@ -1817,7 +1819,7 @@ p_expr_C_Cpiece_C_Ccount(flags flags, lex_state lex_state, act_state act_state, ZIm = (unsigned int) u; -#line 1821 "src/libre/dialect/native/parser.c" +#line 1823 "src/libre/dialect/native/parser.c" } /* END OF EXTRACT: COUNT */ break; @@ -1837,11 +1839,11 @@ p_expr_C_Cpiece_C_Ccount(flags flags, lex_state lex_state, act_state act_state, ADVANCE_LEXER; /* BEGINNING OF ACTION: count-zero-or-one */ { -#line 598 "src/libre/parser.act" +#line 600 "src/libre/parser.act" (ZIc) = ast_make_count(0, NULL, 1, NULL); -#line 1845 "src/libre/dialect/native/parser.c" +#line 1847 "src/libre/dialect/native/parser.c" } /* END OF ACTION: count-zero-or-one */ } @@ -1851,11 +1853,11 @@ p_expr_C_Cpiece_C_Ccount(flags flags, lex_state lex_state, act_state act_state, ADVANCE_LEXER; /* BEGINNING OF ACTION: count-one-or-more */ { -#line 594 "src/libre/parser.act" +#line 596 "src/libre/parser.act" (ZIc) = ast_make_count(1, NULL, AST_COUNT_UNBOUNDED, NULL); -#line 1859 "src/libre/dialect/native/parser.c" +#line 1861 "src/libre/dialect/native/parser.c" } /* END OF ACTION: count-one-or-more */ } @@ -1865,11 +1867,11 @@ p_expr_C_Cpiece_C_Ccount(flags flags, lex_state lex_state, act_state act_state, ADVANCE_LEXER; /* BEGINNING OF ACTION: count-zero-or-more */ { -#line 590 "src/libre/parser.act" +#line 592 "src/libre/parser.act" (ZIc) = ast_make_count(0, NULL, AST_COUNT_UNBOUNDED, NULL); -#line 1873 "src/libre/dialect/native/parser.c" +#line 1875 "src/libre/dialect/native/parser.c" } /* END OF ACTION: count-zero-or-more */ } @@ -1878,11 +1880,11 @@ p_expr_C_Cpiece_C_Ccount(flags flags, lex_state lex_state, act_state act_state, { /* BEGINNING OF ACTION: count-one */ { -#line 602 "src/libre/parser.act" +#line 604 "src/libre/parser.act" (ZIc) = ast_make_count(1, NULL, 1, NULL); -#line 1886 "src/libre/dialect/native/parser.c" +#line 1888 "src/libre/dialect/native/parser.c" } /* END OF ACTION: count-one */ } @@ -1895,23 +1897,23 @@ ZL1:; { /* BEGINNING OF ACTION: err-expected-count */ { -#line 476 "src/libre/parser.act" +#line 478 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXCOUNT; } goto ZL2; -#line 1906 "src/libre/dialect/native/parser.c" +#line 1908 "src/libre/dialect/native/parser.c" } /* END OF ACTION: err-expected-count */ /* BEGINNING OF ACTION: count-one */ { -#line 602 "src/libre/parser.act" +#line 604 "src/libre/parser.act" (ZIc) = ast_make_count(1, NULL, 1, NULL); -#line 1915 "src/libre/dialect/native/parser.c" +#line 1917 "src/libre/dialect/native/parser.c" } /* END OF ACTION: count-one */ } @@ -1934,14 +1936,14 @@ p_expr_C_Cpiece_C_Catom(flags flags, lex_state lex_state, act_state act_state, e ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-make-any */ { -#line 689 "src/libre/parser.act" +#line 691 "src/libre/parser.act" (ZIe) = ast_make_expr_any(); if ((ZIe) == NULL) { goto ZL1; } -#line 1945 "src/libre/dialect/native/parser.c" +#line 1947 "src/libre/dialect/native/parser.c" } /* END OF ACTION: ast-make-any */ } @@ -1951,14 +1953,14 @@ p_expr_C_Cpiece_C_Catom(flags flags, lex_state lex_state, act_state act_state, e ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-make-anchor-end */ { -#line 731 "src/libre/parser.act" +#line 733 "src/libre/parser.act" (ZIe) = ast_make_expr_anchor(AST_ANCHOR_END); if ((ZIe) == NULL) { goto ZL1; } -#line 1962 "src/libre/dialect/native/parser.c" +#line 1964 "src/libre/dialect/native/parser.c" } /* END OF ACTION: ast-make-anchor-end */ } @@ -1975,14 +1977,14 @@ p_expr_C_Cpiece_C_Catom(flags flags, lex_state lex_state, act_state act_state, e } /* BEGINNING OF ACTION: ast-make-group */ { -#line 710 "src/libre/parser.act" +#line 712 "src/libre/parser.act" (ZIe) = ast_make_expr_group((ZIg)); if ((ZIe) == NULL) { goto ZL1; } -#line 1986 "src/libre/dialect/native/parser.c" +#line 1988 "src/libre/dialect/native/parser.c" } /* END OF ACTION: ast-make-group */ switch (CURRENT_TERMINAL) { @@ -1999,14 +2001,14 @@ p_expr_C_Cpiece_C_Catom(flags flags, lex_state lex_state, act_state act_state, e ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-make-anchor-start */ { -#line 724 "src/libre/parser.act" +#line 726 "src/libre/parser.act" (ZIe) = ast_make_expr_anchor(AST_ANCHOR_START); if ((ZIe) == NULL) { goto ZL1; } -#line 2010 "src/libre/dialect/native/parser.c" +#line 2012 "src/libre/dialect/native/parser.c" } /* END OF ACTION: ast-make-anchor-start */ } @@ -2039,26 +2041,26 @@ ZL1:; { /* BEGINNING OF ACTION: err-expected-atom */ { -#line 483 "src/libre/parser.act" +#line 485 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXATOM; } goto ZL2; -#line 2050 "src/libre/dialect/native/parser.c" +#line 2052 "src/libre/dialect/native/parser.c" } /* END OF ACTION: err-expected-atom */ /* BEGINNING OF ACTION: ast-make-any */ { -#line 689 "src/libre/parser.act" +#line 691 "src/libre/parser.act" (ZIe) = ast_make_expr_any(); if ((ZIe) == NULL) { goto ZL2; } -#line 2062 "src/libre/dialect/native/parser.c" +#line 2064 "src/libre/dialect/native/parser.c" } /* END OF ACTION: ast-make-any */ } @@ -2087,7 +2089,7 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hnamed(flags flags, lex_state lex_state, act case (TOK_NAMED__CLASS): /* BEGINNING OF EXTRACT: NAMED_CLASS */ { -#line 441 "src/libre/parser.act" +#line 443 "src/libre/parser.act" ZIid = DIALECT_CLASS(lex_state->buf.a); if (ZIid == NULL) { @@ -2098,7 +2100,7 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hnamed(flags flags, lex_state lex_state, act ZI145 = lex_state->lx.start; ZI146 = lex_state->lx.end; -#line 2102 "src/libre/dialect/native/parser.c" +#line 2104 "src/libre/dialect/native/parser.c" } /* END OF EXTRACT: NAMED_CLASS */ break; @@ -2108,14 +2110,14 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hnamed(flags flags, lex_state lex_state, act ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-make-named */ { -#line 816 "src/libre/parser.act" +#line 818 "src/libre/parser.act" (ZInode) = ast_make_expr_named((ZIid)); if ((ZInode) == NULL) { goto ZL1; } -#line 2119 "src/libre/dialect/native/parser.c" +#line 2121 "src/libre/dialect/native/parser.c" } /* END OF ACTION: ast-make-named */ } @@ -2138,14 +2140,14 @@ p_expr_C_Calt(flags flags, lex_state lex_state, act_state act_state, err err, t_ { /* BEGINNING OF ACTION: ast-make-concat */ { -#line 664 "src/libre/parser.act" +#line 666 "src/libre/parser.act" (ZInode) = ast_make_expr_concat(); if ((ZInode) == NULL) { goto ZL1; } -#line 2149 "src/libre/dialect/native/parser.c" +#line 2151 "src/libre/dialect/native/parser.c" } /* END OF ACTION: ast-make-concat */ p_expr_C_Clist_Hof_Hpieces (flags, lex_state, act_state, err, ZInode); @@ -2164,7 +2166,7 @@ ZL0:; /* BEGINNING OF TRAILER */ -#line 976 "src/libre/parser.act" +#line 978 "src/libre/parser.act" static int @@ -2307,6 +2309,6 @@ ZL0:; return NULL; } -#line 2311 "src/libre/dialect/native/parser.c" +#line 2313 "src/libre/dialect/native/parser.c" /* END OF FILE */ diff --git a/src/libre/dialect/native/parser.h b/src/libre/dialect/native/parser.h index 9400bf7ff..3d103bdc8 100644 --- a/src/libre/dialect/native/parser.h +++ b/src/libre/dialect/native/parser.h @@ -9,7 +9,7 @@ /* BEGINNING OF HEADER */ -#line 232 "src/libre/parser.act" +#line 234 "src/libre/parser.act" #include @@ -28,7 +28,7 @@ extern void p_re__native(flags, lex_state, act_state, err, t_ast__expr *); /* BEGINNING OF TRAILER */ -#line 978 "src/libre/parser.act" +#line 980 "src/libre/parser.act" #line 35 "src/libre/dialect/native/parser.h" diff --git a/src/libre/dialect/pcre/parser.c b/src/libre/dialect/pcre/parser.c index ac1dcbe27..15b42ad81 100644 --- a/src/libre/dialect/pcre/parser.c +++ b/src/libre/dialect/pcre/parser.c @@ -9,7 +9,7 @@ /* BEGINNING OF HEADER */ -#line 142 "src/libre/parser.act" +#line 144 "src/libre/parser.act" #include @@ -21,6 +21,8 @@ #include #include + #include + #include #include "libre/class.h" @@ -209,7 +211,7 @@ return s; } -#line 213 "src/libre/dialect/pcre/parser.c" +#line 215 "src/libre/dialect/pcre/parser.c" #ifndef ERROR_TERMINAL @@ -264,17 +266,17 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hhead(flags flags, lex_state lex_state, act_ /* BEGINNING OF EXTRACT: INVERT */ { -#line 237 "src/libre/parser.act" +#line 239 "src/libre/parser.act" ZI111 = '^'; -#line 272 "src/libre/dialect/pcre/parser.c" +#line 274 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: INVERT */ ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-make-invert */ { -#line 773 "src/libre/parser.act" +#line 775 "src/libre/parser.act" struct ast_expr *any; @@ -312,7 +314,7 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hhead(flags flags, lex_state lex_state, act_ goto ZL1; } -#line 316 "src/libre/dialect/pcre/parser.c" +#line 318 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-make-invert */ } @@ -340,21 +342,21 @@ p_expr_C_Cflags_C_Cflag__set(flags flags, lex_state lex_state, act_state act_sta /* BEGINNING OF EXTRACT: FLAG_INSENSITIVE */ { -#line 452 "src/libre/parser.act" +#line 454 "src/libre/parser.act" ZIc = RE_ICASE; -#line 348 "src/libre/dialect/pcre/parser.c" +#line 350 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: FLAG_INSENSITIVE */ ADVANCE_LEXER; /* BEGINNING OF ACTION: re-flag-union */ { -#line 582 "src/libre/parser.act" +#line 584 "src/libre/parser.act" (ZIo) = (ZIi) | (ZIc); -#line 358 "src/libre/dialect/pcre/parser.c" +#line 360 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: re-flag-union */ } @@ -365,14 +367,14 @@ p_expr_C_Cflags_C_Cflag__set(flags flags, lex_state lex_state, act_state act_sta ZIo = ZIi; /* BEGINNING OF ACTION: err-unknown-flag */ { -#line 518 "src/libre/parser.act" +#line 520 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EFLAG; } goto ZL1; -#line 376 "src/libre/dialect/pcre/parser.c" +#line 378 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: err-unknown-flag */ } @@ -410,7 +412,7 @@ p_expr_C_Ccharacter_Hclass_C_Crange_Hendpoint_C_Crange_Hendpoint_Hliteral(flags { /* BEGINNING OF EXTRACT: CHAR */ { -#line 414 "src/libre/parser.act" +#line 416 "src/libre/parser.act" /* the first byte may be '\x00' */ assert(lex_state->buf.a[1] == '\0'); @@ -420,7 +422,7 @@ p_expr_C_Ccharacter_Hclass_C_Crange_Hendpoint_C_Crange_Hendpoint_Hliteral(flags ZIc = lex_state->buf.a[0]; -#line 424 "src/libre/dialect/pcre/parser.c" +#line 426 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: CHAR */ ADVANCE_LEXER; @@ -430,7 +432,7 @@ p_expr_C_Ccharacter_Hclass_C_Crange_Hendpoint_C_Crange_Hendpoint_Hliteral(flags { /* BEGINNING OF EXTRACT: CONTROL */ { -#line 320 "src/libre/parser.act" +#line 322 "src/libre/parser.act" assert(lex_state->buf.a[0] == '\\'); assert(lex_state->buf.a[1] == 'c'); @@ -446,20 +448,20 @@ p_expr_C_Ccharacter_Hclass_C_Crange_Hendpoint_C_Crange_Hendpoint_Hliteral(flags ZIstart = lex_state->lx.start; ZIend = lex_state->lx.end; -#line 450 "src/libre/dialect/pcre/parser.c" +#line 452 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: CONTROL */ ADVANCE_LEXER; /* BEGINNING OF ACTION: err-unsupported */ { -#line 539 "src/libre/parser.act" +#line 541 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXUNSUPPORTD; } goto ZL1; -#line 463 "src/libre/dialect/pcre/parser.c" +#line 465 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: err-unsupported */ } @@ -468,7 +470,7 @@ p_expr_C_Ccharacter_Hclass_C_Crange_Hendpoint_C_Crange_Hendpoint_Hliteral(flags { /* BEGINNING OF EXTRACT: ESC */ { -#line 287 "src/libre/parser.act" +#line 289 "src/libre/parser.act" assert(lex_state->buf.a[0] == '\\'); assert(lex_state->buf.a[1] != '\0'); @@ -489,7 +491,7 @@ p_expr_C_Ccharacter_Hclass_C_Crange_Hendpoint_C_Crange_Hendpoint_Hliteral(flags ZIstart = lex_state->lx.start; ZIend = lex_state->lx.end; -#line 493 "src/libre/dialect/pcre/parser.c" +#line 495 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: ESC */ ADVANCE_LEXER; @@ -499,7 +501,7 @@ p_expr_C_Ccharacter_Hclass_C_Crange_Hendpoint_C_Crange_Hendpoint_Hliteral(flags { /* BEGINNING OF EXTRACT: HEX */ { -#line 378 "src/libre/parser.act" +#line 380 "src/libre/parser.act" unsigned long u; char *s, *e; @@ -539,7 +541,7 @@ p_expr_C_Ccharacter_Hclass_C_Crange_Hendpoint_C_Crange_Hendpoint_Hliteral(flags ZIc = (char) (unsigned char) u; -#line 543 "src/libre/dialect/pcre/parser.c" +#line 545 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: HEX */ ADVANCE_LEXER; @@ -549,7 +551,7 @@ p_expr_C_Ccharacter_Hclass_C_Crange_Hendpoint_C_Crange_Hendpoint_Hliteral(flags { /* BEGINNING OF EXTRACT: OCT */ { -#line 338 "src/libre/parser.act" +#line 340 "src/libre/parser.act" unsigned long u; char *s, *e; @@ -589,7 +591,7 @@ p_expr_C_Ccharacter_Hclass_C_Crange_Hendpoint_C_Crange_Hendpoint_Hliteral(flags ZIc = (char) (unsigned char) u; -#line 593 "src/libre/dialect/pcre/parser.c" +#line 595 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: OCT */ ADVANCE_LEXER; @@ -602,12 +604,12 @@ p_expr_C_Ccharacter_Hclass_C_Crange_Hendpoint_C_Crange_Hendpoint_Hliteral(flags /* END OF INLINE: 136 */ /* BEGINNING OF ACTION: ast-range-endpoint-literal */ { -#line 626 "src/libre/parser.act" +#line 628 "src/libre/parser.act" (ZIr).type = AST_ENDPOINT_LITERAL; (ZIr).u.literal.c = (ZIc); -#line 611 "src/libre/dialect/pcre/parser.c" +#line 613 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-range-endpoint-literal */ } @@ -631,14 +633,14 @@ p_269(flags flags, lex_state lex_state, act_state act_state, err err, t_ast__cla { /* BEGINNING OF ACTION: ast-make-named */ { -#line 816 "src/libre/parser.act" +#line 818 "src/libre/parser.act" (ZInode) = ast_make_expr_named((*ZI266)); if ((ZInode) == NULL) { goto ZL1; } -#line 642 "src/libre/dialect/pcre/parser.c" +#line 644 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-make-named */ } @@ -651,12 +653,12 @@ p_269(flags flags, lex_state lex_state, act_state act_state, err err, t_ast__cla /* BEGINNING OF ACTION: ast-range-endpoint-class */ { -#line 631 "src/libre/parser.act" +#line 633 "src/libre/parser.act" (ZIlower).type = AST_ENDPOINT_NAMED; (ZIlower).u.named.class = (*ZI266); -#line 660 "src/libre/dialect/pcre/parser.c" +#line 662 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-range-endpoint-class */ p_149 (flags, lex_state, act_state, err); @@ -667,17 +669,17 @@ p_269(flags flags, lex_state lex_state, act_state act_state, err err, t_ast__cla } /* BEGINNING OF ACTION: mark-range */ { -#line 548 "src/libre/parser.act" +#line 550 "src/libre/parser.act" mark(&act_state->rangestart, &(*ZI267)); mark(&act_state->rangeend, &(ZIend)); -#line 676 "src/libre/dialect/pcre/parser.c" +#line 678 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: mark-range */ /* BEGINNING OF ACTION: ast-make-range */ { -#line 786 "src/libre/parser.act" +#line 788 "src/libre/parser.act" struct ast_pos ast_start, ast_end; unsigned char lower, upper; @@ -710,7 +712,7 @@ p_269(flags flags, lex_state lex_state, act_state act_state, err err, t_ast__cla goto ZL1; } -#line 714 "src/libre/dialect/pcre/parser.c" +#line 716 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-make-range */ } @@ -746,13 +748,13 @@ ZL2_expr_C_Ccharacter_Hclass_C_Clist_Hof_Hclass_Hterms:; } /* BEGINNING OF ACTION: ast-add-alt */ { -#line 829 "src/libre/parser.act" +#line 831 "src/libre/parser.act" if (!ast_add_expr_alt((ZIclass), (ZInode))) { goto ZL4; } -#line 756 "src/libre/dialect/pcre/parser.c" +#line 758 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-add-alt */ } @@ -761,14 +763,14 @@ ZL2_expr_C_Ccharacter_Hclass_C_Clist_Hof_Hclass_Hterms:; { /* BEGINNING OF ACTION: err-expected-term */ { -#line 469 "src/libre/parser.act" +#line 471 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXTERM; } goto ZL1; -#line 772 "src/libre/dialect/pcre/parser.c" +#line 774 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: err-expected-term */ } @@ -802,13 +804,13 @@ p_149(flags flags, lex_state lex_state, act_state act_state, err err) case (TOK_RANGE): /* BEGINNING OF EXTRACT: RANGE */ { -#line 241 "src/libre/parser.act" +#line 243 "src/libre/parser.act" ZI150 = '-'; ZI151 = lex_state->lx.start; ZI152 = lex_state->lx.end; -#line 812 "src/libre/dialect/pcre/parser.c" +#line 814 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: RANGE */ break; @@ -822,14 +824,14 @@ ZL1:; { /* BEGINNING OF ACTION: err-expected-range */ { -#line 497 "src/libre/parser.act" +#line 499 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXRANGE; } goto ZL2; -#line 833 "src/libre/dialect/pcre/parser.c" +#line 835 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: err-expected-range */ } @@ -850,14 +852,14 @@ p_289(flags flags, lex_state lex_state, act_state act_state, err err, t_char *ZI { /* BEGINNING OF ACTION: ast-make-literal */ { -#line 678 "src/libre/parser.act" +#line 680 "src/libre/parser.act" (ZInode) = ast_make_expr_literal((*ZI286)); if ((ZInode) == NULL) { goto ZL1; } -#line 861 "src/libre/dialect/pcre/parser.c" +#line 863 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-make-literal */ } @@ -870,12 +872,12 @@ p_289(flags flags, lex_state lex_state, act_state act_state, err err, t_char *ZI /* BEGINNING OF ACTION: ast-range-endpoint-literal */ { -#line 626 "src/libre/parser.act" +#line 628 "src/libre/parser.act" (ZIlower).type = AST_ENDPOINT_LITERAL; (ZIlower).u.literal.c = (*ZI286); -#line 879 "src/libre/dialect/pcre/parser.c" +#line 881 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-range-endpoint-literal */ p_149 (flags, lex_state, act_state, err); @@ -886,17 +888,17 @@ p_289(flags flags, lex_state lex_state, act_state act_state, err err, t_char *ZI } /* BEGINNING OF ACTION: mark-range */ { -#line 548 "src/libre/parser.act" +#line 550 "src/libre/parser.act" mark(&act_state->rangestart, &(*ZI287)); mark(&act_state->rangeend, &(ZIend)); -#line 895 "src/libre/dialect/pcre/parser.c" +#line 897 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: mark-range */ /* BEGINNING OF ACTION: ast-make-range */ { -#line 786 "src/libre/parser.act" +#line 788 "src/libre/parser.act" struct ast_pos ast_start, ast_end; unsigned char lower, upper; @@ -929,7 +931,7 @@ p_289(flags flags, lex_state lex_state, act_state act_state, err err, t_char *ZI goto ZL1; } -#line 933 "src/libre/dialect/pcre/parser.c" +#line 935 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-make-range */ } @@ -958,28 +960,28 @@ p_292(flags flags, lex_state lex_state, act_state act_state, err err, t_pos *ZI2 /* BEGINNING OF EXTRACT: CLOSECOUNT */ { -#line 278 "src/libre/parser.act" +#line 280 "src/libre/parser.act" ZI233 = lex_state->lx.start; ZIend = lex_state->lx.end; -#line 967 "src/libre/dialect/pcre/parser.c" +#line 969 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: CLOSECOUNT */ ADVANCE_LEXER; /* BEGINNING OF ACTION: mark-count */ { -#line 553 "src/libre/parser.act" +#line 555 "src/libre/parser.act" mark(&act_state->countstart, &(*ZI290)); mark(&act_state->countend, &(ZIend)); -#line 978 "src/libre/dialect/pcre/parser.c" +#line 980 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: mark-count */ /* BEGINNING OF ACTION: count-range */ { -#line 608 "src/libre/parser.act" +#line 610 "src/libre/parser.act" struct ast_pos ast_start, ast_end; @@ -999,7 +1001,7 @@ p_292(flags flags, lex_state lex_state, act_state act_state, err err, t_pos *ZI2 (ZIc) = ast_make_count((*ZIm), &ast_start, (*ZIm), &ast_end); -#line 1003 "src/libre/dialect/pcre/parser.c" +#line 1005 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: count-range */ } @@ -1044,13 +1046,13 @@ ZL2_expr_C_Clist_Hof_Hpieces:; } /* BEGINNING OF ACTION: ast-add-concat */ { -#line 823 "src/libre/parser.act" +#line 825 "src/libre/parser.act" if (!ast_add_expr_concat((ZIcat), (ZIa))) { goto ZL1; } -#line 1054 "src/libre/dialect/pcre/parser.c" +#line 1056 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-add-concat */ /* BEGINNING OF INLINE: 247 */ @@ -1066,7 +1068,7 @@ ZL2_expr_C_Clist_Hof_Hpieces:; goto ZL2_expr_C_Clist_Hof_Hpieces; /* END OF INLINE: expr::list-of-pieces */ } - /* UNREACHED */ + /*UNREACHED*/ default: break; } @@ -1093,37 +1095,37 @@ p_293(flags flags, lex_state lex_state, act_state act_state, err err, t_pos *ZI2 /* BEGINNING OF EXTRACT: CLOSECOUNT */ { -#line 278 "src/libre/parser.act" +#line 280 "src/libre/parser.act" ZI238 = lex_state->lx.start; ZIend = lex_state->lx.end; -#line 1102 "src/libre/dialect/pcre/parser.c" +#line 1104 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: CLOSECOUNT */ ADVANCE_LEXER; /* BEGINNING OF ACTION: mark-count */ { -#line 553 "src/libre/parser.act" +#line 555 "src/libre/parser.act" mark(&act_state->countstart, &(*ZI290)); mark(&act_state->countend, &(ZIend)); -#line 1113 "src/libre/dialect/pcre/parser.c" +#line 1115 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: mark-count */ /* BEGINNING OF ACTION: count-unbounded */ { -#line 586 "src/libre/parser.act" +#line 588 "src/libre/parser.act" (ZIn) = AST_COUNT_UNBOUNDED; -#line 1122 "src/libre/dialect/pcre/parser.c" +#line 1124 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: count-unbounded */ /* BEGINNING OF ACTION: count-range */ { -#line 608 "src/libre/parser.act" +#line 610 "src/libre/parser.act" struct ast_pos ast_start, ast_end; @@ -1143,7 +1145,7 @@ p_293(flags flags, lex_state lex_state, act_state act_state, err err, t_pos *ZI2 (ZIc) = ast_make_count((*ZIm), &ast_start, (ZIn), &ast_end); -#line 1147 "src/libre/dialect/pcre/parser.c" +#line 1149 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: count-range */ } @@ -1156,7 +1158,7 @@ p_293(flags flags, lex_state lex_state, act_state act_state, err err, t_pos *ZI2 /* BEGINNING OF EXTRACT: COUNT */ { -#line 429 "src/libre/parser.act" +#line 431 "src/libre/parser.act" unsigned long u; char *e; @@ -1176,7 +1178,7 @@ p_293(flags flags, lex_state lex_state, act_state act_state, err err, t_pos *ZI2 ZIn = (unsigned int) u; -#line 1180 "src/libre/dialect/pcre/parser.c" +#line 1182 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: COUNT */ ADVANCE_LEXER; @@ -1184,12 +1186,12 @@ p_293(flags flags, lex_state lex_state, act_state act_state, err err, t_pos *ZI2 case (TOK_CLOSECOUNT): /* BEGINNING OF EXTRACT: CLOSECOUNT */ { -#line 278 "src/libre/parser.act" +#line 280 "src/libre/parser.act" ZI236 = lex_state->lx.start; ZIend = lex_state->lx.end; -#line 1193 "src/libre/dialect/pcre/parser.c" +#line 1195 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: CLOSECOUNT */ break; @@ -1199,17 +1201,17 @@ p_293(flags flags, lex_state lex_state, act_state act_state, err err, t_pos *ZI2 ADVANCE_LEXER; /* BEGINNING OF ACTION: mark-count */ { -#line 553 "src/libre/parser.act" +#line 555 "src/libre/parser.act" mark(&act_state->countstart, &(*ZI290)); mark(&act_state->countend, &(ZIend)); -#line 1208 "src/libre/dialect/pcre/parser.c" +#line 1210 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: mark-count */ /* BEGINNING OF ACTION: count-range */ { -#line 608 "src/libre/parser.act" +#line 610 "src/libre/parser.act" struct ast_pos ast_start, ast_end; @@ -1229,7 +1231,7 @@ p_293(flags flags, lex_state lex_state, act_state act_state, err err, t_pos *ZI2 (ZIc) = ast_make_count((*ZIm), &ast_start, (ZIn), &ast_end); -#line 1233 "src/libre/dialect/pcre/parser.c" +#line 1235 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: count-range */ } @@ -1268,7 +1270,7 @@ p_expr_C_Cliteral(flags flags, lex_state lex_state, act_state act_state, err err /* BEGINNING OF EXTRACT: CHAR */ { -#line 414 "src/libre/parser.act" +#line 416 "src/libre/parser.act" /* the first byte may be '\x00' */ assert(lex_state->buf.a[1] == '\0'); @@ -1278,7 +1280,7 @@ p_expr_C_Cliteral(flags flags, lex_state lex_state, act_state act_state, err err ZIc = lex_state->buf.a[0]; -#line 1282 "src/libre/dialect/pcre/parser.c" +#line 1284 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: CHAR */ ADVANCE_LEXER; @@ -1291,7 +1293,7 @@ p_expr_C_Cliteral(flags flags, lex_state lex_state, act_state act_state, err err /* BEGINNING OF EXTRACT: ESC */ { -#line 287 "src/libre/parser.act" +#line 289 "src/libre/parser.act" assert(lex_state->buf.a[0] == '\\'); assert(lex_state->buf.a[1] != '\0'); @@ -1312,7 +1314,7 @@ p_expr_C_Cliteral(flags flags, lex_state lex_state, act_state act_state, err err ZI96 = lex_state->lx.start; ZI97 = lex_state->lx.end; -#line 1316 "src/libre/dialect/pcre/parser.c" +#line 1318 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: ESC */ ADVANCE_LEXER; @@ -1325,7 +1327,7 @@ p_expr_C_Cliteral(flags flags, lex_state lex_state, act_state act_state, err err /* BEGINNING OF EXTRACT: HEX */ { -#line 378 "src/libre/parser.act" +#line 380 "src/libre/parser.act" unsigned long u; char *s, *e; @@ -1365,7 +1367,7 @@ p_expr_C_Cliteral(flags flags, lex_state lex_state, act_state act_state, err err ZIc = (char) (unsigned char) u; -#line 1369 "src/libre/dialect/pcre/parser.c" +#line 1371 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: HEX */ ADVANCE_LEXER; @@ -1378,7 +1380,7 @@ p_expr_C_Cliteral(flags flags, lex_state lex_state, act_state act_state, err err /* BEGINNING OF EXTRACT: NOESC */ { -#line 308 "src/libre/parser.act" +#line 310 "src/libre/parser.act" assert(lex_state->buf.a[0] == '\\'); assert(lex_state->buf.a[1] != '\0'); @@ -1389,7 +1391,7 @@ p_expr_C_Cliteral(flags flags, lex_state lex_state, act_state act_state, err err ZI98 = lex_state->lx.start; ZI99 = lex_state->lx.end; -#line 1393 "src/libre/dialect/pcre/parser.c" +#line 1395 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: NOESC */ ADVANCE_LEXER; @@ -1402,7 +1404,7 @@ p_expr_C_Cliteral(flags flags, lex_state lex_state, act_state act_state, err err /* BEGINNING OF EXTRACT: OCT */ { -#line 338 "src/libre/parser.act" +#line 340 "src/libre/parser.act" unsigned long u; char *s, *e; @@ -1442,7 +1444,7 @@ p_expr_C_Cliteral(flags flags, lex_state lex_state, act_state act_state, err err ZIc = (char) (unsigned char) u; -#line 1446 "src/libre/dialect/pcre/parser.c" +#line 1448 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: OCT */ ADVANCE_LEXER; @@ -1455,14 +1457,14 @@ p_expr_C_Cliteral(flags flags, lex_state lex_state, act_state act_state, err err /* END OF INLINE: 94 */ /* BEGINNING OF ACTION: ast-make-literal */ { -#line 678 "src/libre/parser.act" +#line 680 "src/libre/parser.act" (ZInode) = ast_make_expr_literal((ZIc)); if ((ZInode) == NULL) { goto ZL1; } -#line 1466 "src/libre/dialect/pcre/parser.c" +#line 1468 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-make-literal */ } @@ -1488,7 +1490,7 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hterm(flags flags, lex_state lex_state, act_ /* BEGINNING OF EXTRACT: CHAR */ { -#line 414 "src/libre/parser.act" +#line 416 "src/libre/parser.act" /* the first byte may be '\x00' */ assert(lex_state->buf.a[1] == '\0'); @@ -1498,7 +1500,7 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hterm(flags flags, lex_state lex_state, act_ ZI282 = lex_state->buf.a[0]; -#line 1502 "src/libre/dialect/pcre/parser.c" +#line 1504 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: CHAR */ ADVANCE_LEXER; @@ -1517,7 +1519,7 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hterm(flags flags, lex_state lex_state, act_ /* BEGINNING OF EXTRACT: CONTROL */ { -#line 320 "src/libre/parser.act" +#line 322 "src/libre/parser.act" assert(lex_state->buf.a[0] == '\\'); assert(lex_state->buf.a[1] == 'c'); @@ -1533,20 +1535,20 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hterm(flags flags, lex_state lex_state, act_ ZI287 = lex_state->lx.start; ZI288 = lex_state->lx.end; -#line 1537 "src/libre/dialect/pcre/parser.c" +#line 1539 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: CONTROL */ ADVANCE_LEXER; /* BEGINNING OF ACTION: err-unsupported */ { -#line 539 "src/libre/parser.act" +#line 541 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXUNSUPPORTD; } goto ZL1; -#line 1550 "src/libre/dialect/pcre/parser.c" +#line 1552 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: err-unsupported */ p_289 (flags, lex_state, act_state, err, &ZI286, &ZI287, &ZInode); @@ -1564,7 +1566,7 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hterm(flags flags, lex_state lex_state, act_ /* BEGINNING OF EXTRACT: ESC */ { -#line 287 "src/libre/parser.act" +#line 289 "src/libre/parser.act" assert(lex_state->buf.a[0] == '\\'); assert(lex_state->buf.a[1] != '\0'); @@ -1585,7 +1587,7 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hterm(flags flags, lex_state lex_state, act_ ZI271 = lex_state->lx.start; ZI272 = lex_state->lx.end; -#line 1589 "src/libre/dialect/pcre/parser.c" +#line 1591 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: ESC */ ADVANCE_LEXER; @@ -1604,7 +1606,7 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hterm(flags flags, lex_state lex_state, act_ /* BEGINNING OF EXTRACT: HEX */ { -#line 378 "src/libre/parser.act" +#line 380 "src/libre/parser.act" unsigned long u; char *s, *e; @@ -1644,7 +1646,7 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hterm(flags flags, lex_state lex_state, act_ ZI278 = (char) (unsigned char) u; -#line 1648 "src/libre/dialect/pcre/parser.c" +#line 1650 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: HEX */ ADVANCE_LEXER; @@ -1663,7 +1665,7 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hterm(flags flags, lex_state lex_state, act_ /* BEGINNING OF EXTRACT: NAMED_CLASS */ { -#line 441 "src/libre/parser.act" +#line 443 "src/libre/parser.act" ZI266 = DIALECT_CLASS(lex_state->buf.a); if (ZI266 == NULL) { @@ -1674,7 +1676,7 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hterm(flags flags, lex_state lex_state, act_ ZI267 = lex_state->lx.start; ZI268 = lex_state->lx.end; -#line 1678 "src/libre/dialect/pcre/parser.c" +#line 1680 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: NAMED_CLASS */ ADVANCE_LEXER; @@ -1693,7 +1695,7 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hterm(flags flags, lex_state lex_state, act_ /* BEGINNING OF EXTRACT: NOESC */ { -#line 308 "src/libre/parser.act" +#line 310 "src/libre/parser.act" assert(lex_state->buf.a[0] == '\\'); assert(lex_state->buf.a[1] != '\0'); @@ -1704,20 +1706,20 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hterm(flags flags, lex_state lex_state, act_ ZI117 = lex_state->lx.start; ZI118 = lex_state->lx.end; -#line 1708 "src/libre/dialect/pcre/parser.c" +#line 1710 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: NOESC */ ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-make-literal */ { -#line 678 "src/libre/parser.act" +#line 680 "src/libre/parser.act" (ZInode) = ast_make_expr_literal((ZIc)); if ((ZInode) == NULL) { goto ZL1; } -#line 1721 "src/libre/dialect/pcre/parser.c" +#line 1723 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-make-literal */ } @@ -1730,7 +1732,7 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hterm(flags flags, lex_state lex_state, act_ /* BEGINNING OF EXTRACT: OCT */ { -#line 338 "src/libre/parser.act" +#line 340 "src/libre/parser.act" unsigned long u; char *s, *e; @@ -1770,7 +1772,7 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hterm(flags flags, lex_state lex_state, act_ ZI274 = (char) (unsigned char) u; -#line 1774 "src/libre/dialect/pcre/parser.c" +#line 1776 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: OCT */ ADVANCE_LEXER; @@ -1811,7 +1813,7 @@ p_expr_C_Ccharacter_Hclass_C_Crange_Hendpoint_C_Crange_Hendpoint_Hclass(flags fl case (TOK_NAMED__CLASS): /* BEGINNING OF EXTRACT: NAMED_CLASS */ { -#line 441 "src/libre/parser.act" +#line 443 "src/libre/parser.act" ZIid = DIALECT_CLASS(lex_state->buf.a); if (ZIid == NULL) { @@ -1822,7 +1824,7 @@ p_expr_C_Ccharacter_Hclass_C_Crange_Hendpoint_C_Crange_Hendpoint_Hclass(flags fl ZIstart = lex_state->lx.start; ZIend = lex_state->lx.end; -#line 1826 "src/libre/dialect/pcre/parser.c" +#line 1828 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: NAMED_CLASS */ break; @@ -1832,12 +1834,12 @@ p_expr_C_Ccharacter_Hclass_C_Crange_Hendpoint_C_Crange_Hendpoint_Hclass(flags fl ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-range-endpoint-class */ { -#line 631 "src/libre/parser.act" +#line 633 "src/libre/parser.act" (ZIr).type = AST_ENDPOINT_NAMED; (ZIr).u.named.class = (ZIid); -#line 1841 "src/libre/dialect/pcre/parser.c" +#line 1843 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-range-endpoint-class */ } @@ -1864,13 +1866,13 @@ p_177(flags flags, lex_state lex_state, act_state act_state, err err, t_ast__exp /* BEGINNING OF EXTRACT: RANGE */ { -#line 241 "src/libre/parser.act" +#line 243 "src/libre/parser.act" ZIc = '-'; ZIrstart = lex_state->lx.start; ZI178 = lex_state->lx.end; -#line 1874 "src/libre/dialect/pcre/parser.c" +#line 1876 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: RANGE */ ADVANCE_LEXER; @@ -1881,14 +1883,14 @@ p_177(flags flags, lex_state lex_state, act_state act_state, err err, t_ast__exp { /* BEGINNING OF ACTION: ast-make-literal */ { -#line 678 "src/libre/parser.act" +#line 680 "src/libre/parser.act" (ZInode1) = ast_make_expr_literal((ZIc)); if ((ZInode1) == NULL) { goto ZL1; } -#line 1892 "src/libre/dialect/pcre/parser.c" +#line 1894 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-make-literal */ } @@ -1904,23 +1906,23 @@ p_177(flags flags, lex_state lex_state, act_state act_state, err err, t_ast__exp /* BEGINNING OF ACTION: ast-range-endpoint-literal */ { -#line 626 "src/libre/parser.act" +#line 628 "src/libre/parser.act" (ZIlower).type = AST_ENDPOINT_LITERAL; (ZIlower).u.literal.c = (ZIc); -#line 1913 "src/libre/dialect/pcre/parser.c" +#line 1915 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-range-endpoint-literal */ /* BEGINNING OF EXTRACT: RANGE */ { -#line 241 "src/libre/parser.act" +#line 243 "src/libre/parser.act" ZI180 = '-'; ZI181 = lex_state->lx.start; ZI182 = lex_state->lx.end; -#line 1924 "src/libre/dialect/pcre/parser.c" +#line 1926 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: RANGE */ ADVANCE_LEXER; @@ -1931,7 +1933,7 @@ p_177(flags flags, lex_state lex_state, act_state act_state, err err, t_ast__exp } /* BEGINNING OF ACTION: ast-make-range */ { -#line 786 "src/libre/parser.act" +#line 788 "src/libre/parser.act" struct ast_pos ast_start, ast_end; unsigned char lower, upper; @@ -1964,7 +1966,7 @@ p_177(flags flags, lex_state lex_state, act_state act_state, err err, t_ast__exp goto ZL1; } -#line 1968 "src/libre/dialect/pcre/parser.c" +#line 1970 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-make-range */ } @@ -1974,13 +1976,13 @@ p_177(flags flags, lex_state lex_state, act_state act_state, err err, t_ast__exp /* END OF INLINE: 179 */ /* BEGINNING OF ACTION: ast-add-alt */ { -#line 829 "src/libre/parser.act" +#line 831 "src/libre/parser.act" if (!ast_add_expr_alt((*ZItmp), (ZInode1))) { goto ZL1; } -#line 1984 "src/libre/dialect/pcre/parser.c" +#line 1986 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-add-alt */ p_198 (flags, lex_state, act_state, err, ZItmp); @@ -2033,25 +2035,25 @@ p_expr_C_Ccharacter_Hclass(flags flags, lex_state lex_state, act_state act_state /* BEGINNING OF EXTRACT: OPENGROUP */ { -#line 247 "src/libre/parser.act" +#line 249 "src/libre/parser.act" ZIstart = lex_state->lx.start; ZI163 = lex_state->lx.end; -#line 2042 "src/libre/dialect/pcre/parser.c" +#line 2044 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: OPENGROUP */ ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-make-alt */ { -#line 671 "src/libre/parser.act" +#line 673 "src/libre/parser.act" (ZInode) = ast_make_expr_alt(); if ((ZInode) == NULL) { goto ZL1; } -#line 2055 "src/libre/dialect/pcre/parser.c" +#line 2057 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-make-alt */ ZItmp = ZInode; @@ -2071,35 +2073,35 @@ p_expr_C_Ccharacter_Hclass(flags flags, lex_state lex_state, act_state act_state /* BEGINNING OF EXTRACT: OPENGROUPCB */ { -#line 257 "src/libre/parser.act" +#line 259 "src/libre/parser.act" ZIstart = lex_state->lx.start; ZI184 = lex_state->lx.end; -#line 2080 "src/libre/dialect/pcre/parser.c" +#line 2082 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: OPENGROUPCB */ ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-make-alt */ { -#line 671 "src/libre/parser.act" +#line 673 "src/libre/parser.act" (ZInode) = ast_make_expr_alt(); if ((ZInode) == NULL) { goto ZL1; } -#line 2093 "src/libre/dialect/pcre/parser.c" +#line 2095 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-make-alt */ ZItmp = ZInode; /* BEGINNING OF ACTION: make-literal-cbrak */ { -#line 685 "src/libre/parser.act" +#line 687 "src/libre/parser.act" (ZIcbrak) = ']'; -#line 2103 "src/libre/dialect/pcre/parser.c" +#line 2105 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: make-literal-cbrak */ p_194 (flags, lex_state, act_state, err, &ZIstart, &ZIcbrak, &ZInode1); @@ -2109,13 +2111,13 @@ p_expr_C_Ccharacter_Hclass(flags flags, lex_state lex_state, act_state act_state } /* BEGINNING OF ACTION: ast-add-alt */ { -#line 829 "src/libre/parser.act" +#line 831 "src/libre/parser.act" if (!ast_add_expr_alt((ZItmp), (ZInode1))) { goto ZL1; } -#line 2119 "src/libre/dialect/pcre/parser.c" +#line 2121 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-add-alt */ p_198 (flags, lex_state, act_state, err, &ZItmp); @@ -2131,31 +2133,31 @@ p_expr_C_Ccharacter_Hclass(flags flags, lex_state lex_state, act_state act_state /* BEGINNING OF EXTRACT: OPENGROUPINV */ { -#line 252 "src/libre/parser.act" +#line 254 "src/libre/parser.act" ZIstart = lex_state->lx.start; ZI175 = lex_state->lx.end; -#line 2140 "src/libre/dialect/pcre/parser.c" +#line 2142 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: OPENGROUPINV */ ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-make-alt */ { -#line 671 "src/libre/parser.act" +#line 673 "src/libre/parser.act" (ZInode) = ast_make_expr_alt(); if ((ZInode) == NULL) { goto ZL1; } -#line 2153 "src/libre/dialect/pcre/parser.c" +#line 2155 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-make-alt */ ZItmp = ZInode; /* BEGINNING OF ACTION: ast-make-invert */ { -#line 773 "src/libre/parser.act" +#line 775 "src/libre/parser.act" struct ast_expr *any; @@ -2193,7 +2195,7 @@ p_expr_C_Ccharacter_Hclass(flags flags, lex_state lex_state, act_state act_state goto ZL1; } -#line 2197 "src/libre/dialect/pcre/parser.c" +#line 2199 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-make-invert */ p_177 (flags, lex_state, act_state, err, &ZItmp); @@ -2211,31 +2213,31 @@ p_expr_C_Ccharacter_Hclass(flags flags, lex_state lex_state, act_state act_state /* BEGINNING OF EXTRACT: OPENGROUPINVCB */ { -#line 262 "src/libre/parser.act" +#line 264 "src/libre/parser.act" ZIstart = lex_state->lx.start; ZI192 = lex_state->lx.end; -#line 2220 "src/libre/dialect/pcre/parser.c" +#line 2222 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: OPENGROUPINVCB */ ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-make-alt */ { -#line 671 "src/libre/parser.act" +#line 673 "src/libre/parser.act" (ZInode) = ast_make_expr_alt(); if ((ZInode) == NULL) { goto ZL1; } -#line 2233 "src/libre/dialect/pcre/parser.c" +#line 2235 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-make-alt */ ZItmp = ZInode; /* BEGINNING OF ACTION: ast-make-invert */ { -#line 773 "src/libre/parser.act" +#line 775 "src/libre/parser.act" struct ast_expr *any; @@ -2273,16 +2275,16 @@ p_expr_C_Ccharacter_Hclass(flags flags, lex_state lex_state, act_state act_state goto ZL1; } -#line 2277 "src/libre/dialect/pcre/parser.c" +#line 2279 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-make-invert */ /* BEGINNING OF ACTION: make-literal-cbrak */ { -#line 685 "src/libre/parser.act" +#line 687 "src/libre/parser.act" (ZIcbrak) = ']'; -#line 2286 "src/libre/dialect/pcre/parser.c" +#line 2288 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: make-literal-cbrak */ p_194 (flags, lex_state, act_state, err, &ZIstart, &ZIcbrak, &ZInode1); @@ -2292,13 +2294,13 @@ p_expr_C_Ccharacter_Hclass(flags flags, lex_state lex_state, act_state act_state } /* BEGINNING OF ACTION: ast-add-alt */ { -#line 829 "src/libre/parser.act" +#line 831 "src/libre/parser.act" if (!ast_add_expr_alt((ZItmp), (ZInode1))) { goto ZL1; } -#line 2302 "src/libre/dialect/pcre/parser.c" +#line 2304 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-add-alt */ p_198 (flags, lex_state, act_state, err, &ZItmp); @@ -2323,13 +2325,13 @@ p_expr_C_Ccharacter_Hclass(flags flags, lex_state lex_state, act_state act_state case (TOK_CLOSEGROUP): /* BEGINNING OF EXTRACT: CLOSEGROUP */ { -#line 267 "src/libre/parser.act" +#line 269 "src/libre/parser.act" ZI200 = ']'; ZI201 = lex_state->lx.start; ZIend = lex_state->lx.end; -#line 2333 "src/libre/dialect/pcre/parser.c" +#line 2335 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: CLOSEGROUP */ break; @@ -2339,12 +2341,12 @@ p_expr_C_Ccharacter_Hclass(flags flags, lex_state lex_state, act_state act_state ADVANCE_LEXER; /* BEGINNING OF ACTION: mark-group */ { -#line 543 "src/libre/parser.act" +#line 545 "src/libre/parser.act" mark(&act_state->groupstart, &(ZIstart)); mark(&act_state->groupend, &(ZIend)); -#line 2348 "src/libre/dialect/pcre/parser.c" +#line 2350 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: mark-group */ } @@ -2353,14 +2355,14 @@ p_expr_C_Ccharacter_Hclass(flags flags, lex_state lex_state, act_state act_state { /* BEGINNING OF ACTION: err-expected-closegroup */ { -#line 504 "src/libre/parser.act" +#line 506 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXCLOSEGROUP; } goto ZL1; -#line 2364 "src/libre/dialect/pcre/parser.c" +#line 2366 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: err-expected-closegroup */ ZIend = ZIstart; @@ -2370,7 +2372,7 @@ p_expr_C_Ccharacter_Hclass(flags flags, lex_state lex_state, act_state act_state /* END OF INLINE: 199 */ /* BEGINNING OF ACTION: mark-expr */ { -#line 560 "src/libre/parser.act" +#line 562 "src/libre/parser.act" struct ast_pos ast_start, ast_end; @@ -2385,7 +2387,7 @@ p_expr_C_Ccharacter_Hclass(flags flags, lex_state lex_state, act_state act_state (ZItmp)->u.class.end = ast_end; */ -#line 2389 "src/libre/dialect/pcre/parser.c" +#line 2391 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: mark-expr */ } @@ -2417,24 +2419,24 @@ p_expr_C_Ccharacter_Hclass_C_Crange_Hendpoint_Hend(flags flags, lex_state lex_st /* BEGINNING OF EXTRACT: RANGE */ { -#line 241 "src/libre/parser.act" +#line 243 "src/libre/parser.act" ZIc = '-'; ZI144 = lex_state->lx.start; ZIend = lex_state->lx.end; -#line 2427 "src/libre/dialect/pcre/parser.c" +#line 2429 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: RANGE */ ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-range-endpoint-literal */ { -#line 626 "src/libre/parser.act" +#line 628 "src/libre/parser.act" (ZIr).type = AST_ENDPOINT_LITERAL; (ZIr).u.literal.c = (ZIc); -#line 2438 "src/libre/dialect/pcre/parser.c" +#line 2440 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-range-endpoint-literal */ } @@ -2496,16 +2498,16 @@ p_expr_C_Cpiece(flags flags, lex_state lex_state, act_state act_state, err err, /* BEGINNING OF ACTION: count-one */ { -#line 602 "src/libre/parser.act" +#line 604 "src/libre/parser.act" (ZIc) = ast_make_count(1, NULL, 1, NULL); -#line 2504 "src/libre/dialect/pcre/parser.c" +#line 2506 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: count-one */ /* BEGINNING OF ACTION: ast-make-piece */ { -#line 696 "src/libre/parser.act" +#line 698 "src/libre/parser.act" if ((ZIc).min == 0 && (ZIc).max == 0) { (ZInode) = ast_make_expr_empty(); @@ -2519,7 +2521,7 @@ p_expr_C_Cpiece(flags flags, lex_state lex_state, act_state act_state, err err, goto ZL1; } -#line 2523 "src/libre/dialect/pcre/parser.c" +#line 2525 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-make-piece */ } @@ -2550,14 +2552,14 @@ p_expr(flags flags, lex_state lex_state, act_state act_state, err err, t_ast__ex { /* BEGINNING OF ACTION: ast-make-alt */ { -#line 671 "src/libre/parser.act" +#line 673 "src/libre/parser.act" (ZInode) = ast_make_expr_alt(); if ((ZInode) == NULL) { goto ZL1; } -#line 2561 "src/libre/dialect/pcre/parser.c" +#line 2563 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-make-alt */ p_expr_C_Clist_Hof_Halts (flags, lex_state, act_state, err, ZInode); @@ -2571,26 +2573,26 @@ ZL1:; { /* BEGINNING OF ACTION: err-expected-alts */ { -#line 490 "src/libre/parser.act" +#line 492 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXALTS; } goto ZL2; -#line 2582 "src/libre/dialect/pcre/parser.c" +#line 2584 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: err-expected-alts */ /* BEGINNING OF ACTION: ast-make-empty */ { -#line 657 "src/libre/parser.act" +#line 659 "src/libre/parser.act" (ZInode) = ast_make_expr_empty(); if ((ZInode) == NULL) { goto ZL2; } -#line 2594 "src/libre/dialect/pcre/parser.c" +#line 2596 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-make-empty */ } @@ -2612,14 +2614,14 @@ p_194(flags flags, lex_state lex_state, act_state act_state, err err, t_pos *ZIs { /* BEGINNING OF ACTION: ast-make-literal */ { -#line 678 "src/libre/parser.act" +#line 680 "src/libre/parser.act" (ZInode1) = ast_make_expr_literal((*ZIcbrak)); if ((ZInode1) == NULL) { goto ZL1; } -#line 2623 "src/libre/dialect/pcre/parser.c" +#line 2625 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-make-literal */ } @@ -2636,23 +2638,23 @@ p_194(flags flags, lex_state lex_state, act_state act_state, err err, t_pos *ZIs /* BEGINNING OF ACTION: ast-range-endpoint-literal */ { -#line 626 "src/libre/parser.act" +#line 628 "src/libre/parser.act" (ZIr).type = AST_ENDPOINT_LITERAL; (ZIr).u.literal.c = (*ZIcbrak); -#line 2645 "src/libre/dialect/pcre/parser.c" +#line 2647 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-range-endpoint-literal */ /* BEGINNING OF EXTRACT: RANGE */ { -#line 241 "src/libre/parser.act" +#line 243 "src/libre/parser.act" ZI195 = '-'; ZI196 = lex_state->lx.start; ZI197 = lex_state->lx.end; -#line 2656 "src/libre/dialect/pcre/parser.c" +#line 2658 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: RANGE */ ADVANCE_LEXER; @@ -2663,17 +2665,17 @@ p_194(flags flags, lex_state lex_state, act_state act_state, err err, t_pos *ZIs } /* BEGINNING OF ACTION: ast-range-endpoint-literal */ { -#line 626 "src/libre/parser.act" +#line 628 "src/libre/parser.act" (ZIlower).type = AST_ENDPOINT_LITERAL; (ZIlower).u.literal.c = (*ZIcbrak); -#line 2672 "src/libre/dialect/pcre/parser.c" +#line 2674 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-range-endpoint-literal */ /* BEGINNING OF ACTION: ast-make-range */ { -#line 786 "src/libre/parser.act" +#line 788 "src/libre/parser.act" struct ast_pos ast_start, ast_end; unsigned char lower, upper; @@ -2706,7 +2708,7 @@ p_194(flags flags, lex_state lex_state, act_state act_state, err err, t_pos *ZIs goto ZL1; } -#line 2710 "src/libre/dialect/pcre/parser.c" +#line 2712 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-make-range */ } @@ -2745,13 +2747,13 @@ ZL2_198:; } /* BEGINNING OF ACTION: ast-add-alt */ { -#line 829 "src/libre/parser.act" +#line 831 "src/libre/parser.act" if (!ast_add_expr_alt((*ZItmp), (ZInode))) { goto ZL5; } -#line 2755 "src/libre/dialect/pcre/parser.c" +#line 2757 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-add-alt */ } @@ -2760,14 +2762,14 @@ ZL2_198:; { /* BEGINNING OF ACTION: err-expected-term */ { -#line 469 "src/libre/parser.act" +#line 471 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXTERM; } goto ZL1; -#line 2771 "src/libre/dialect/pcre/parser.c" +#line 2773 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: err-expected-term */ } @@ -2778,11 +2780,11 @@ ZL2_198:; goto ZL2_198; /* END OF INLINE: 198 */ } - /* UNREACHED */ + /*UNREACHED*/ } /* END OF INLINE: expr::character-class::list-of-class-terms */ } - /* UNREACHED */ + /*UNREACHED*/ case (ERROR_TERMINAL): return; default: @@ -2817,20 +2819,20 @@ p_expr_C_Cflags(flags flags, lex_state lex_state, act_state act_state, err err, ADVANCE_LEXER; /* BEGINNING OF ACTION: re-flag-none */ { -#line 578 "src/libre/parser.act" +#line 580 "src/libre/parser.act" (ZIempty__pos) = RE_FLAGS_NONE; -#line 2825 "src/libre/dialect/pcre/parser.c" +#line 2827 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: re-flag-none */ /* BEGINNING OF ACTION: re-flag-none */ { -#line 578 "src/libre/parser.act" +#line 580 "src/libre/parser.act" (ZIempty__neg) = RE_FLAGS_NONE; -#line 2834 "src/libre/dialect/pcre/parser.c" +#line 2836 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: re-flag-none */ /* BEGINNING OF INLINE: 214 */ @@ -2886,14 +2888,14 @@ p_expr_C_Cflags(flags flags, lex_state lex_state, act_state act_state, err err, ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-make-re-flags */ { -#line 717 "src/libre/parser.act" +#line 719 "src/libre/parser.act" (ZInode) = ast_make_expr_re_flags((ZIpos), (ZIneg)); if ((ZInode) == NULL) { goto ZL5; } -#line 2897 "src/libre/dialect/pcre/parser.c" +#line 2899 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-make-re-flags */ } @@ -2902,26 +2904,26 @@ p_expr_C_Cflags(flags flags, lex_state lex_state, act_state act_state, err err, { /* BEGINNING OF ACTION: err-expected-closeflags */ { -#line 525 "src/libre/parser.act" +#line 527 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXCLOSEFLAGS; } goto ZL1; -#line 2913 "src/libre/dialect/pcre/parser.c" +#line 2915 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: err-expected-closeflags */ /* BEGINNING OF ACTION: ast-make-empty */ { -#line 657 "src/libre/parser.act" +#line 659 "src/libre/parser.act" (ZInode) = ast_make_expr_empty(); if ((ZInode) == NULL) { goto ZL1; } -#line 2925 "src/libre/dialect/pcre/parser.c" +#line 2927 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-make-empty */ } @@ -2955,7 +2957,7 @@ p_expr_C_Cpiece_C_Clist_Hof_Hcounts(flags flags, lex_state lex_state, act_state } /* BEGINNING OF ACTION: ast-make-piece */ { -#line 696 "src/libre/parser.act" +#line 698 "src/libre/parser.act" if ((ZIc).min == 0 && (ZIc).max == 0) { (ZInode) = ast_make_expr_empty(); @@ -2969,7 +2971,7 @@ p_expr_C_Cpiece_C_Clist_Hof_Hcounts(flags flags, lex_state lex_state, act_state goto ZL1; } -#line 2973 "src/libre/dialect/pcre/parser.c" +#line 2975 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-make-piece */ /* BEGINNING OF INLINE: 241 */ @@ -3064,7 +3066,7 @@ p_class_Hnamed(flags flags, lex_state lex_state, act_state act_state, err err, t case (TOK_NAMED__CLASS): /* BEGINNING OF EXTRACT: NAMED_CLASS */ { -#line 441 "src/libre/parser.act" +#line 443 "src/libre/parser.act" ZIid = DIALECT_CLASS(lex_state->buf.a); if (ZIid == NULL) { @@ -3075,7 +3077,7 @@ p_class_Hnamed(flags flags, lex_state lex_state, act_state act_state, err err, t ZIstart = lex_state->lx.start; ZIend = lex_state->lx.end; -#line 3079 "src/libre/dialect/pcre/parser.c" +#line 3081 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: NAMED_CLASS */ break; @@ -3085,14 +3087,14 @@ p_class_Hnamed(flags flags, lex_state lex_state, act_state act_state, err err, t ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-make-named */ { -#line 816 "src/libre/parser.act" +#line 818 "src/libre/parser.act" (ZInode) = ast_make_expr_named((ZIid)); if ((ZInode) == NULL) { goto ZL1; } -#line 3096 "src/libre/dialect/pcre/parser.c" +#line 3098 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-make-named */ } @@ -3123,13 +3125,13 @@ ZL2_expr_C_Clist_Hof_Halts:; } /* BEGINNING OF ACTION: ast-add-alt */ { -#line 829 "src/libre/parser.act" +#line 831 "src/libre/parser.act" if (!ast_add_expr_alt((ZIalts), (ZIa))) { goto ZL1; } -#line 3133 "src/libre/dialect/pcre/parser.c" +#line 3135 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-add-alt */ /* BEGINNING OF INLINE: 253 */ @@ -3142,7 +3144,7 @@ ZL2_expr_C_Clist_Hof_Halts:; goto ZL2_expr_C_Clist_Hof_Halts; /* END OF INLINE: expr::list-of-alts */ } - /* UNREACHED */ + /*UNREACHED*/ default: break; } @@ -3154,14 +3156,14 @@ ZL1:; { /* BEGINNING OF ACTION: err-expected-alts */ { -#line 490 "src/libre/parser.act" +#line 492 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXALTS; } goto ZL4; -#line 3165 "src/libre/dialect/pcre/parser.c" +#line 3167 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: err-expected-alts */ } @@ -3186,12 +3188,12 @@ p_expr_C_Cpiece_C_Ccount(flags flags, lex_state lex_state, act_state act_state, /* BEGINNING OF EXTRACT: OPENCOUNT */ { -#line 273 "src/libre/parser.act" +#line 275 "src/libre/parser.act" ZI290 = lex_state->lx.start; ZI291 = lex_state->lx.end; -#line 3195 "src/libre/dialect/pcre/parser.c" +#line 3197 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: OPENCOUNT */ ADVANCE_LEXER; @@ -3199,7 +3201,7 @@ p_expr_C_Cpiece_C_Ccount(flags flags, lex_state lex_state, act_state act_state, case (TOK_COUNT): /* BEGINNING OF EXTRACT: COUNT */ { -#line 429 "src/libre/parser.act" +#line 431 "src/libre/parser.act" unsigned long u; char *e; @@ -3219,7 +3221,7 @@ p_expr_C_Cpiece_C_Ccount(flags flags, lex_state lex_state, act_state act_state, ZIm = (unsigned int) u; -#line 3223 "src/libre/dialect/pcre/parser.c" +#line 3225 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: COUNT */ break; @@ -3239,11 +3241,11 @@ p_expr_C_Cpiece_C_Ccount(flags flags, lex_state lex_state, act_state act_state, ADVANCE_LEXER; /* BEGINNING OF ACTION: count-zero-or-one */ { -#line 598 "src/libre/parser.act" +#line 600 "src/libre/parser.act" (ZIc) = ast_make_count(0, NULL, 1, NULL); -#line 3247 "src/libre/dialect/pcre/parser.c" +#line 3249 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: count-zero-or-one */ } @@ -3253,11 +3255,11 @@ p_expr_C_Cpiece_C_Ccount(flags flags, lex_state lex_state, act_state act_state, ADVANCE_LEXER; /* BEGINNING OF ACTION: count-one-or-more */ { -#line 594 "src/libre/parser.act" +#line 596 "src/libre/parser.act" (ZIc) = ast_make_count(1, NULL, AST_COUNT_UNBOUNDED, NULL); -#line 3261 "src/libre/dialect/pcre/parser.c" +#line 3263 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: count-one-or-more */ } @@ -3267,11 +3269,11 @@ p_expr_C_Cpiece_C_Ccount(flags flags, lex_state lex_state, act_state act_state, ADVANCE_LEXER; /* BEGINNING OF ACTION: count-zero-or-more */ { -#line 590 "src/libre/parser.act" +#line 592 "src/libre/parser.act" (ZIc) = ast_make_count(0, NULL, AST_COUNT_UNBOUNDED, NULL); -#line 3275 "src/libre/dialect/pcre/parser.c" +#line 3277 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: count-zero-or-more */ } @@ -3286,23 +3288,23 @@ ZL1:; { /* BEGINNING OF ACTION: err-expected-count */ { -#line 476 "src/libre/parser.act" +#line 478 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXCOUNT; } goto ZL2; -#line 3297 "src/libre/dialect/pcre/parser.c" +#line 3299 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: err-expected-count */ /* BEGINNING OF ACTION: count-one */ { -#line 602 "src/libre/parser.act" +#line 604 "src/libre/parser.act" (ZIc) = ast_make_count(1, NULL, 1, NULL); -#line 3306 "src/libre/dialect/pcre/parser.c" +#line 3308 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: count-one */ } @@ -3350,14 +3352,14 @@ p_re__pcre(flags flags, lex_state lex_state, act_state act_state, err err, t_ast { /* BEGINNING OF ACTION: err-expected-eof */ { -#line 532 "src/libre/parser.act" +#line 534 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXEOF; } goto ZL1; -#line 3361 "src/libre/dialect/pcre/parser.c" +#line 3363 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: err-expected-eof */ } @@ -3384,14 +3386,14 @@ p_expr_C_Cpiece_C_Catom(flags flags, lex_state lex_state, act_state act_state, e ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-make-any */ { -#line 689 "src/libre/parser.act" +#line 691 "src/libre/parser.act" (ZIe) = ast_make_expr_any(); if ((ZIe) == NULL) { goto ZL1; } -#line 3395 "src/libre/dialect/pcre/parser.c" +#line 3397 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-make-any */ } @@ -3404,7 +3406,7 @@ p_expr_C_Cpiece_C_Catom(flags flags, lex_state lex_state, act_state act_state, e /* BEGINNING OF EXTRACT: CONTROL */ { -#line 320 "src/libre/parser.act" +#line 322 "src/libre/parser.act" assert(lex_state->buf.a[0] == '\\'); assert(lex_state->buf.a[1] == 'c'); @@ -3420,32 +3422,32 @@ p_expr_C_Cpiece_C_Catom(flags flags, lex_state lex_state, act_state act_state, e ZI226 = lex_state->lx.start; ZI227 = lex_state->lx.end; -#line 3424 "src/libre/dialect/pcre/parser.c" +#line 3426 "src/libre/dialect/pcre/parser.c" } /* END OF EXTRACT: CONTROL */ ADVANCE_LEXER; /* BEGINNING OF ACTION: err-unsupported */ { -#line 539 "src/libre/parser.act" +#line 541 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXUNSUPPORTD; } goto ZL1; -#line 3437 "src/libre/dialect/pcre/parser.c" +#line 3439 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: err-unsupported */ /* BEGINNING OF ACTION: ast-make-empty */ { -#line 657 "src/libre/parser.act" +#line 659 "src/libre/parser.act" (ZIe) = ast_make_expr_empty(); if ((ZIe) == NULL) { goto ZL1; } -#line 3449 "src/libre/dialect/pcre/parser.c" +#line 3451 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-make-empty */ } @@ -3455,14 +3457,14 @@ p_expr_C_Cpiece_C_Catom(flags flags, lex_state lex_state, act_state act_state, e ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-make-anchor-end */ { -#line 731 "src/libre/parser.act" +#line 733 "src/libre/parser.act" (ZIe) = ast_make_expr_anchor(AST_ANCHOR_END); if ((ZIe) == NULL) { goto ZL1; } -#line 3466 "src/libre/dialect/pcre/parser.c" +#line 3468 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-make-anchor-end */ } @@ -3479,14 +3481,14 @@ p_expr_C_Cpiece_C_Catom(flags flags, lex_state lex_state, act_state act_state, e } /* BEGINNING OF ACTION: ast-make-group */ { -#line 710 "src/libre/parser.act" +#line 712 "src/libre/parser.act" (ZIe) = ast_make_expr_group((ZIg)); if ((ZIe) == NULL) { goto ZL1; } -#line 3490 "src/libre/dialect/pcre/parser.c" +#line 3492 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-make-group */ switch (CURRENT_TERMINAL) { @@ -3519,14 +3521,14 @@ p_expr_C_Cpiece_C_Catom(flags flags, lex_state lex_state, act_state act_state, e ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-make-anchor-start */ { -#line 724 "src/libre/parser.act" +#line 726 "src/libre/parser.act" (ZIe) = ast_make_expr_anchor(AST_ANCHOR_START); if ((ZIe) == NULL) { goto ZL1; } -#line 3530 "src/libre/dialect/pcre/parser.c" +#line 3532 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-make-anchor-start */ } @@ -3578,26 +3580,26 @@ ZL1:; { /* BEGINNING OF ACTION: err-expected-atom */ { -#line 483 "src/libre/parser.act" +#line 485 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXATOM; } goto ZL2; -#line 3589 "src/libre/dialect/pcre/parser.c" +#line 3591 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: err-expected-atom */ /* BEGINNING OF ACTION: ast-make-any */ { -#line 689 "src/libre/parser.act" +#line 691 "src/libre/parser.act" (ZIe) = ast_make_expr_any(); if ((ZIe) == NULL) { goto ZL2; } -#line 3601 "src/libre/dialect/pcre/parser.c" +#line 3603 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-make-any */ } @@ -3623,14 +3625,14 @@ p_expr_C_Calt(flags flags, lex_state lex_state, act_state act_state, err err, t_ { /* BEGINNING OF ACTION: ast-make-concat */ { -#line 664 "src/libre/parser.act" +#line 666 "src/libre/parser.act" (ZInode) = ast_make_expr_concat(); if ((ZInode) == NULL) { goto ZL1; } -#line 3634 "src/libre/dialect/pcre/parser.c" +#line 3636 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-make-concat */ p_expr_C_Clist_Hof_Hpieces (flags, lex_state, act_state, err, ZInode); @@ -3644,14 +3646,14 @@ p_expr_C_Calt(flags flags, lex_state lex_state, act_state act_state, err err, t_ { /* BEGINNING OF ACTION: ast-make-empty */ { -#line 657 "src/libre/parser.act" +#line 659 "src/libre/parser.act" (ZInode) = ast_make_expr_empty(); if ((ZInode) == NULL) { goto ZL1; } -#line 3655 "src/libre/dialect/pcre/parser.c" +#line 3657 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-make-empty */ } @@ -3687,30 +3689,30 @@ p_expr_C_Ctype(flags flags, lex_state lex_state, act_state act_state, err err, t } /* BEGINNING OF ACTION: ast-make-alt */ { -#line 671 "src/libre/parser.act" +#line 673 "src/libre/parser.act" (ZInode) = ast_make_expr_alt(); if ((ZInode) == NULL) { goto ZL1; } -#line 3698 "src/libre/dialect/pcre/parser.c" +#line 3700 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-make-alt */ /* BEGINNING OF ACTION: ast-add-alt */ { -#line 829 "src/libre/parser.act" +#line 831 "src/libre/parser.act" if (!ast_add_expr_alt((ZInode), (ZIclass))) { goto ZL1; } -#line 3709 "src/libre/dialect/pcre/parser.c" +#line 3711 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: ast-add-alt */ /* BEGINNING OF ACTION: mark-expr */ { -#line 560 "src/libre/parser.act" +#line 562 "src/libre/parser.act" struct ast_pos ast_start, ast_end; @@ -3725,7 +3727,7 @@ p_expr_C_Ctype(flags flags, lex_state lex_state, act_state act_state, err err, t (ZInode)->u.class.end = ast_end; */ -#line 3729 "src/libre/dialect/pcre/parser.c" +#line 3731 "src/libre/dialect/pcre/parser.c" } /* END OF ACTION: mark-expr */ } @@ -3739,7 +3741,7 @@ ZL0:; /* BEGINNING OF TRAILER */ -#line 976 "src/libre/parser.act" +#line 978 "src/libre/parser.act" static int @@ -3882,6 +3884,6 @@ ZL0:; return NULL; } -#line 3886 "src/libre/dialect/pcre/parser.c" +#line 3888 "src/libre/dialect/pcre/parser.c" /* END OF FILE */ diff --git a/src/libre/dialect/pcre/parser.h b/src/libre/dialect/pcre/parser.h index 238a758a9..45eebdb57 100644 --- a/src/libre/dialect/pcre/parser.h +++ b/src/libre/dialect/pcre/parser.h @@ -9,7 +9,7 @@ /* BEGINNING OF HEADER */ -#line 232 "src/libre/parser.act" +#line 234 "src/libre/parser.act" #include @@ -28,7 +28,7 @@ extern void p_re__pcre(flags, lex_state, act_state, err, t_ast__expr *); /* BEGINNING OF TRAILER */ -#line 978 "src/libre/parser.act" +#line 980 "src/libre/parser.act" #line 35 "src/libre/dialect/pcre/parser.h" diff --git a/src/libre/dialect/sql/parser.c b/src/libre/dialect/sql/parser.c index 811c6061d..22d32cd4a 100644 --- a/src/libre/dialect/sql/parser.c +++ b/src/libre/dialect/sql/parser.c @@ -9,7 +9,7 @@ /* BEGINNING OF HEADER */ -#line 142 "src/libre/parser.act" +#line 144 "src/libre/parser.act" #include @@ -21,6 +21,8 @@ #include #include + #include + #include #include "libre/class.h" @@ -209,7 +211,7 @@ return s; } -#line 213 "src/libre/dialect/sql/parser.c" +#line 215 "src/libre/dialect/sql/parser.c" #ifndef ERROR_TERMINAL @@ -251,11 +253,11 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hhead(flags flags, lex_state lex_state, act_ /* BEGINNING OF EXTRACT: INVERT */ { -#line 237 "src/libre/parser.act" +#line 239 "src/libre/parser.act" ZI188 = '^'; -#line 259 "src/libre/dialect/sql/parser.c" +#line 261 "src/libre/dialect/sql/parser.c" } /* END OF EXTRACT: INVERT */ ADVANCE_LEXER; @@ -275,37 +277,37 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hhead(flags flags, lex_state lex_state, act_ /* BEGINNING OF EXTRACT: RANGE */ { -#line 241 "src/libre/parser.act" +#line 243 "src/libre/parser.act" ZIc = '-'; ZI97 = lex_state->lx.start; ZI98 = lex_state->lx.end; -#line 285 "src/libre/dialect/sql/parser.c" +#line 287 "src/libre/dialect/sql/parser.c" } /* END OF EXTRACT: RANGE */ ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-make-literal */ { -#line 678 "src/libre/parser.act" +#line 680 "src/libre/parser.act" (ZInode) = ast_make_expr_literal((ZIc)); if ((ZInode) == NULL) { goto ZL1; } -#line 298 "src/libre/dialect/sql/parser.c" +#line 300 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: ast-make-literal */ /* BEGINNING OF ACTION: ast-add-alt */ { -#line 829 "src/libre/parser.act" +#line 831 "src/libre/parser.act" if (!ast_add_expr_alt((*ZIclass), (ZInode))) { goto ZL1; } -#line 309 "src/libre/dialect/sql/parser.c" +#line 311 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: ast-add-alt */ } @@ -357,14 +359,14 @@ p_re__sql(flags flags, lex_state lex_state, act_state act_state, err err, t_ast_ { /* BEGINNING OF ACTION: err-expected-eof */ { -#line 532 "src/libre/parser.act" +#line 534 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXEOF; } goto ZL1; -#line 368 "src/libre/dialect/sql/parser.c" +#line 370 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: err-expected-eof */ } @@ -400,13 +402,13 @@ ZL2_expr_C_Ccharacter_Hclass_C_Clist_Hof_Hclass_Hterms:; } /* BEGINNING OF ACTION: ast-add-alt */ { -#line 829 "src/libre/parser.act" +#line 831 "src/libre/parser.act" if (!ast_add_expr_alt((ZIclass), (ZInode))) { goto ZL4; } -#line 410 "src/libre/dialect/sql/parser.c" +#line 412 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: ast-add-alt */ } @@ -415,14 +417,14 @@ ZL2_expr_C_Ccharacter_Hclass_C_Clist_Hof_Hclass_Hterms:; { /* BEGINNING OF ACTION: err-expected-term */ { -#line 469 "src/libre/parser.act" +#line 471 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXTERM; } goto ZL1; -#line 426 "src/libre/dialect/sql/parser.c" +#line 428 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: err-expected-term */ } @@ -476,13 +478,13 @@ ZL2_expr_C_Clist_Hof_Hpieces:; } /* BEGINNING OF ACTION: ast-add-concat */ { -#line 823 "src/libre/parser.act" +#line 825 "src/libre/parser.act" if (!ast_add_expr_concat((ZIcat), (ZIa))) { goto ZL1; } -#line 486 "src/libre/dialect/sql/parser.c" +#line 488 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: ast-add-concat */ /* BEGINNING OF INLINE: 168 */ @@ -522,7 +524,7 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hterm(flags flags, lex_state lex_state, act_ /* BEGINNING OF EXTRACT: CHAR */ { -#line 414 "src/libre/parser.act" +#line 416 "src/libre/parser.act" /* the first byte may be '\x00' */ assert(lex_state->buf.a[1] == '\0'); @@ -532,7 +534,7 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hterm(flags flags, lex_state lex_state, act_ ZI190 = lex_state->buf.a[0]; -#line 536 "src/libre/dialect/sql/parser.c" +#line 538 "src/libre/dialect/sql/parser.c" } /* END OF EXTRACT: CHAR */ ADVANCE_LEXER; @@ -583,12 +585,12 @@ p_expr_C_Ccharacter_Hclass(flags flags, lex_state lex_state, act_state act_state case (TOK_OPENGROUP): /* BEGINNING OF EXTRACT: OPENGROUP */ { -#line 247 "src/libre/parser.act" +#line 249 "src/libre/parser.act" ZIopen__start = lex_state->lx.start; ZIopen__end = lex_state->lx.end; -#line 592 "src/libre/dialect/sql/parser.c" +#line 594 "src/libre/dialect/sql/parser.c" } /* END OF EXTRACT: OPENGROUP */ break; @@ -598,14 +600,14 @@ p_expr_C_Ccharacter_Hclass(flags flags, lex_state lex_state, act_state act_state ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-make-alt */ { -#line 671 "src/libre/parser.act" +#line 673 "src/libre/parser.act" (ZIclass) = ast_make_expr_alt(); if ((ZIclass) == NULL) { goto ZL1; } -#line 609 "src/libre/dialect/sql/parser.c" +#line 611 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: ast-make-alt */ ZItmp = ZIclass; @@ -623,29 +625,29 @@ p_expr_C_Ccharacter_Hclass(flags flags, lex_state lex_state, act_state act_state /* BEGINNING OF EXTRACT: CLOSEGROUP */ { -#line 267 "src/libre/parser.act" +#line 269 "src/libre/parser.act" ZI137 = ']'; ZIclose__start = lex_state->lx.start; ZIclose__end = lex_state->lx.end; -#line 633 "src/libre/dialect/sql/parser.c" +#line 635 "src/libre/dialect/sql/parser.c" } /* END OF EXTRACT: CLOSEGROUP */ ADVANCE_LEXER; /* BEGINNING OF ACTION: mark-group */ { -#line 543 "src/libre/parser.act" +#line 545 "src/libre/parser.act" mark(&act_state->groupstart, &(ZIopen__start)); mark(&act_state->groupend, &(ZIopen__end)); -#line 644 "src/libre/dialect/sql/parser.c" +#line 646 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: mark-group */ /* BEGINNING OF ACTION: mark-expr */ { -#line 560 "src/libre/parser.act" +#line 562 "src/libre/parser.act" struct ast_pos ast_start, ast_end; @@ -660,7 +662,7 @@ p_expr_C_Ccharacter_Hclass(flags flags, lex_state lex_state, act_state act_state (ZItmp)->u.class.end = ast_end; */ -#line 664 "src/libre/dialect/sql/parser.c" +#line 666 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: mark-expr */ ZInode = ZIclass; @@ -675,24 +677,24 @@ p_expr_C_Ccharacter_Hclass(flags flags, lex_state lex_state, act_state act_state /* BEGINNING OF EXTRACT: INVERT */ { -#line 237 "src/libre/parser.act" +#line 239 "src/libre/parser.act" ZI141 = '^'; -#line 683 "src/libre/dialect/sql/parser.c" +#line 685 "src/libre/dialect/sql/parser.c" } /* END OF EXTRACT: INVERT */ ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-make-alt */ { -#line 671 "src/libre/parser.act" +#line 673 "src/libre/parser.act" (ZImask) = ast_make_expr_alt(); if ((ZImask) == NULL) { goto ZL3; } -#line 696 "src/libre/dialect/sql/parser.c" +#line 698 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: ast-make-alt */ ZImask__tmp = ZImask; @@ -713,13 +715,13 @@ p_expr_C_Ccharacter_Hclass(flags flags, lex_state lex_state, act_state act_state case (TOK_CLOSEGROUP): /* BEGINNING OF EXTRACT: CLOSEGROUP */ { -#line 267 "src/libre/parser.act" +#line 269 "src/libre/parser.act" ZI146 = ']'; ZIclose__start = lex_state->lx.start; ZIclose__end = lex_state->lx.end; -#line 723 "src/libre/dialect/sql/parser.c" +#line 725 "src/libre/dialect/sql/parser.c" } /* END OF EXTRACT: CLOSEGROUP */ break; @@ -729,12 +731,12 @@ p_expr_C_Ccharacter_Hclass(flags flags, lex_state lex_state, act_state act_state ADVANCE_LEXER; /* BEGINNING OF ACTION: mark-group */ { -#line 543 "src/libre/parser.act" +#line 545 "src/libre/parser.act" mark(&act_state->groupstart, &(ZIclose__start)); mark(&act_state->groupend, &(ZIclose__end)); -#line 738 "src/libre/dialect/sql/parser.c" +#line 740 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: mark-group */ } @@ -745,14 +747,14 @@ p_expr_C_Ccharacter_Hclass(flags flags, lex_state lex_state, act_state act_state /* BEGINNING OF ACTION: err-expected-closegroup */ { -#line 504 "src/libre/parser.act" +#line 506 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXCLOSEGROUP; } goto ZL3; -#line 756 "src/libre/dialect/sql/parser.c" +#line 758 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: err-expected-closegroup */ ZIclose__start = ZIopen__end; @@ -763,7 +765,7 @@ p_expr_C_Ccharacter_Hclass(flags flags, lex_state lex_state, act_state act_state /* END OF INLINE: 145 */ /* BEGINNING OF ACTION: mark-expr */ { -#line 560 "src/libre/parser.act" +#line 562 "src/libre/parser.act" struct ast_pos ast_start, ast_end; @@ -778,12 +780,12 @@ p_expr_C_Ccharacter_Hclass(flags flags, lex_state lex_state, act_state act_state (ZItmp)->u.class.end = ast_end; */ -#line 782 "src/libre/dialect/sql/parser.c" +#line 784 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: mark-expr */ /* BEGINNING OF ACTION: mark-expr */ { -#line 560 "src/libre/parser.act" +#line 562 "src/libre/parser.act" struct ast_pos ast_start, ast_end; @@ -798,19 +800,19 @@ p_expr_C_Ccharacter_Hclass(flags flags, lex_state lex_state, act_state act_state (ZImask__tmp)->u.class.end = ast_end; */ -#line 802 "src/libre/dialect/sql/parser.c" +#line 804 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: mark-expr */ /* BEGINNING OF ACTION: ast-make-subtract */ { -#line 738 "src/libre/parser.act" +#line 740 "src/libre/parser.act" (ZInode) = ast_make_expr_subtract((ZIclass), (ZImask)); if ((ZInode) == NULL) { goto ZL3; } -#line 814 "src/libre/dialect/sql/parser.c" +#line 816 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: ast-make-subtract */ } @@ -826,26 +828,26 @@ p_expr_C_Ccharacter_Hclass(flags flags, lex_state lex_state, act_state act_state { /* BEGINNING OF ACTION: err-expected-closegroup */ { -#line 504 "src/libre/parser.act" +#line 506 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXCLOSEGROUP; } goto ZL1; -#line 837 "src/libre/dialect/sql/parser.c" +#line 839 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: err-expected-closegroup */ /* BEGINNING OF ACTION: ast-make-empty */ { -#line 657 "src/libre/parser.act" +#line 659 "src/libre/parser.act" (ZInode) = ast_make_expr_empty(); if ((ZInode) == NULL) { goto ZL1; } -#line 849 "src/libre/dialect/sql/parser.c" +#line 851 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: ast-make-empty */ } @@ -874,42 +876,42 @@ p_189(flags flags, lex_state lex_state, act_state act_state, err err, t_ast__exp /* BEGINNING OF EXTRACT: RANGE */ { -#line 241 "src/libre/parser.act" +#line 243 "src/libre/parser.act" ZIc = '-'; ZI100 = lex_state->lx.start; ZI101 = lex_state->lx.end; -#line 884 "src/libre/dialect/sql/parser.c" +#line 886 "src/libre/dialect/sql/parser.c" } /* END OF EXTRACT: RANGE */ ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-make-literal */ { -#line 678 "src/libre/parser.act" +#line 680 "src/libre/parser.act" (ZInode) = ast_make_expr_literal((ZIc)); if ((ZInode) == NULL) { goto ZL1; } -#line 897 "src/libre/dialect/sql/parser.c" +#line 899 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: ast-make-literal */ /* BEGINNING OF ACTION: ast-add-alt */ { -#line 829 "src/libre/parser.act" +#line 831 "src/libre/parser.act" if (!ast_add_expr_alt((*ZIclass), (ZInode))) { goto ZL1; } -#line 908 "src/libre/dialect/sql/parser.c" +#line 910 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: ast-add-alt */ /* BEGINNING OF ACTION: ast-make-invert */ { -#line 773 "src/libre/parser.act" +#line 775 "src/libre/parser.act" struct ast_expr *any; @@ -947,7 +949,7 @@ p_189(flags flags, lex_state lex_state, act_state act_state, err err, t_ast__exp goto ZL1; } -#line 951 "src/libre/dialect/sql/parser.c" +#line 953 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: ast-make-invert */ } @@ -956,7 +958,7 @@ p_189(flags flags, lex_state lex_state, act_state act_state, err err, t_ast__exp { /* BEGINNING OF ACTION: ast-make-invert */ { -#line 773 "src/libre/parser.act" +#line 775 "src/libre/parser.act" struct ast_expr *any; @@ -994,7 +996,7 @@ p_189(flags flags, lex_state lex_state, act_state act_state, err err, t_ast__exp goto ZL1; } -#line 998 "src/libre/dialect/sql/parser.c" +#line 1000 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: ast-make-invert */ } @@ -1028,7 +1030,7 @@ p_expr_C_Cpiece(flags flags, lex_state lex_state, act_state act_state, err err, } /* BEGINNING OF ACTION: ast-make-piece */ { -#line 696 "src/libre/parser.act" +#line 698 "src/libre/parser.act" if ((ZIc).min == 0 && (ZIc).max == 0) { (ZInode) = ast_make_expr_empty(); @@ -1042,7 +1044,7 @@ p_expr_C_Cpiece(flags flags, lex_state lex_state, act_state act_state, err err, goto ZL1; } -#line 1046 "src/libre/dialect/sql/parser.c" +#line 1048 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: ast-make-piece */ } @@ -1064,14 +1066,14 @@ p_193(flags flags, lex_state lex_state, act_state act_state, err err, t_char *ZI { /* BEGINNING OF ACTION: ast-make-literal */ { -#line 678 "src/libre/parser.act" +#line 680 "src/libre/parser.act" (ZInode) = ast_make_expr_literal((*ZI190)); if ((ZInode) == NULL) { goto ZL1; } -#line 1075 "src/libre/dialect/sql/parser.c" +#line 1077 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: ast-make-literal */ } @@ -1089,23 +1091,23 @@ p_193(flags flags, lex_state lex_state, act_state act_state, err err, t_char *ZI /* BEGINNING OF ACTION: ast-range-endpoint-literal */ { -#line 626 "src/libre/parser.act" +#line 628 "src/libre/parser.act" (ZIa).type = AST_ENDPOINT_LITERAL; (ZIa).u.literal.c = (*ZI190); -#line 1098 "src/libre/dialect/sql/parser.c" +#line 1100 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: ast-range-endpoint-literal */ /* BEGINNING OF EXTRACT: RANGE */ { -#line 241 "src/libre/parser.act" +#line 243 "src/libre/parser.act" ZI119 = '-'; ZI120 = lex_state->lx.start; ZI121 = lex_state->lx.end; -#line 1109 "src/libre/dialect/sql/parser.c" +#line 1111 "src/libre/dialect/sql/parser.c" } /* END OF EXTRACT: RANGE */ ADVANCE_LEXER; @@ -1113,7 +1115,7 @@ p_193(flags flags, lex_state lex_state, act_state act_state, err err, t_char *ZI case (TOK_CHAR): /* BEGINNING OF EXTRACT: CHAR */ { -#line 414 "src/libre/parser.act" +#line 416 "src/libre/parser.act" /* the first byte may be '\x00' */ assert(lex_state->buf.a[1] == '\0'); @@ -1123,7 +1125,7 @@ p_193(flags flags, lex_state lex_state, act_state act_state, err err, t_char *ZI ZIcz = lex_state->buf.a[0]; -#line 1127 "src/libre/dialect/sql/parser.c" +#line 1129 "src/libre/dialect/sql/parser.c" } /* END OF EXTRACT: CHAR */ break; @@ -1133,27 +1135,27 @@ p_193(flags flags, lex_state lex_state, act_state act_state, err err, t_char *ZI ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-range-endpoint-literal */ { -#line 626 "src/libre/parser.act" +#line 628 "src/libre/parser.act" (ZIz).type = AST_ENDPOINT_LITERAL; (ZIz).u.literal.c = (ZIcz); -#line 1142 "src/libre/dialect/sql/parser.c" +#line 1144 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: ast-range-endpoint-literal */ /* BEGINNING OF ACTION: mark-range */ { -#line 548 "src/libre/parser.act" +#line 550 "src/libre/parser.act" mark(&act_state->rangestart, &(*ZI191)); mark(&act_state->rangeend, &(ZIend)); -#line 1152 "src/libre/dialect/sql/parser.c" +#line 1154 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: mark-range */ /* BEGINNING OF ACTION: ast-make-range */ { -#line 786 "src/libre/parser.act" +#line 788 "src/libre/parser.act" struct ast_pos ast_start, ast_end; unsigned char lower, upper; @@ -1186,7 +1188,7 @@ p_193(flags flags, lex_state lex_state, act_state act_state, err err, t_char *ZI goto ZL1; } -#line 1190 "src/libre/dialect/sql/parser.c" +#line 1192 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: ast-make-range */ } @@ -1213,14 +1215,14 @@ p_expr(flags flags, lex_state lex_state, act_state act_state, err err, t_ast__ex { /* BEGINNING OF ACTION: ast-make-alt */ { -#line 671 "src/libre/parser.act" +#line 673 "src/libre/parser.act" (ZInode) = ast_make_expr_alt(); if ((ZInode) == NULL) { goto ZL1; } -#line 1224 "src/libre/dialect/sql/parser.c" +#line 1226 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: ast-make-alt */ p_expr_C_Clist_Hof_Halts (flags, lex_state, act_state, err, ZInode); @@ -1234,26 +1236,26 @@ ZL1:; { /* BEGINNING OF ACTION: err-expected-alts */ { -#line 490 "src/libre/parser.act" +#line 492 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXALTS; } goto ZL2; -#line 1245 "src/libre/dialect/sql/parser.c" +#line 1247 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: err-expected-alts */ /* BEGINNING OF ACTION: ast-make-empty */ { -#line 657 "src/libre/parser.act" +#line 659 "src/libre/parser.act" (ZInode) = ast_make_expr_empty(); if ((ZInode) == NULL) { goto ZL2; } -#line 1257 "src/libre/dialect/sql/parser.c" +#line 1259 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: ast-make-empty */ } @@ -1278,28 +1280,28 @@ p_196(flags flags, lex_state lex_state, act_state act_state, err err, t_pos *ZI1 /* BEGINNING OF EXTRACT: CLOSECOUNT */ { -#line 278 "src/libre/parser.act" +#line 280 "src/libre/parser.act" ZI161 = lex_state->lx.start; ZIend = lex_state->lx.end; -#line 1287 "src/libre/dialect/sql/parser.c" +#line 1289 "src/libre/dialect/sql/parser.c" } /* END OF EXTRACT: CLOSECOUNT */ ADVANCE_LEXER; /* BEGINNING OF ACTION: mark-count */ { -#line 553 "src/libre/parser.act" +#line 555 "src/libre/parser.act" mark(&act_state->countstart, &(*ZI194)); mark(&act_state->countend, &(ZIend)); -#line 1298 "src/libre/dialect/sql/parser.c" +#line 1300 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: mark-count */ /* BEGINNING OF ACTION: count-range */ { -#line 608 "src/libre/parser.act" +#line 610 "src/libre/parser.act" struct ast_pos ast_start, ast_end; @@ -1319,7 +1321,7 @@ p_196(flags flags, lex_state lex_state, act_state act_state, err err, t_pos *ZI1 (ZIc) = ast_make_count((*ZIm), &ast_start, (*ZIm), &ast_end); -#line 1323 "src/libre/dialect/sql/parser.c" +#line 1325 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: count-range */ } @@ -1335,7 +1337,7 @@ p_196(flags flags, lex_state lex_state, act_state act_state, err err, t_pos *ZI1 case (TOK_COUNT): /* BEGINNING OF EXTRACT: COUNT */ { -#line 429 "src/libre/parser.act" +#line 431 "src/libre/parser.act" unsigned long u; char *e; @@ -1355,7 +1357,7 @@ p_196(flags flags, lex_state lex_state, act_state act_state, err err, t_pos *ZI1 ZIn = (unsigned int) u; -#line 1359 "src/libre/dialect/sql/parser.c" +#line 1361 "src/libre/dialect/sql/parser.c" } /* END OF EXTRACT: COUNT */ break; @@ -1367,12 +1369,12 @@ p_196(flags flags, lex_state lex_state, act_state act_state, err err, t_pos *ZI1 case (TOK_CLOSECOUNT): /* BEGINNING OF EXTRACT: CLOSECOUNT */ { -#line 278 "src/libre/parser.act" +#line 280 "src/libre/parser.act" ZI164 = lex_state->lx.start; ZIend = lex_state->lx.end; -#line 1376 "src/libre/dialect/sql/parser.c" +#line 1378 "src/libre/dialect/sql/parser.c" } /* END OF EXTRACT: CLOSECOUNT */ break; @@ -1382,17 +1384,17 @@ p_196(flags flags, lex_state lex_state, act_state act_state, err err, t_pos *ZI1 ADVANCE_LEXER; /* BEGINNING OF ACTION: mark-count */ { -#line 553 "src/libre/parser.act" +#line 555 "src/libre/parser.act" mark(&act_state->countstart, &(*ZI194)); mark(&act_state->countend, &(ZIend)); -#line 1391 "src/libre/dialect/sql/parser.c" +#line 1393 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: mark-count */ /* BEGINNING OF ACTION: count-range */ { -#line 608 "src/libre/parser.act" +#line 610 "src/libre/parser.act" struct ast_pos ast_start, ast_end; @@ -1412,7 +1414,7 @@ p_196(flags flags, lex_state lex_state, act_state act_state, err err, t_pos *ZI1 (ZIc) = ast_make_count((*ZIm), &ast_start, (ZIn), &ast_end); -#line 1416 "src/libre/dialect/sql/parser.c" +#line 1418 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: count-range */ } @@ -1447,13 +1449,13 @@ ZL2_expr_C_Clist_Hof_Halts:; } /* BEGINNING OF ACTION: ast-add-alt */ { -#line 829 "src/libre/parser.act" +#line 831 "src/libre/parser.act" if (!ast_add_expr_alt((ZIalts), (ZIa))) { goto ZL1; } -#line 1457 "src/libre/dialect/sql/parser.c" +#line 1459 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: ast-add-alt */ /* BEGINNING OF INLINE: 174 */ @@ -1478,14 +1480,14 @@ ZL1:; { /* BEGINNING OF ACTION: err-expected-alts */ { -#line 490 "src/libre/parser.act" +#line 492 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXALTS; } goto ZL4; -#line 1489 "src/libre/dialect/sql/parser.c" +#line 1491 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: err-expected-alts */ } @@ -1510,12 +1512,12 @@ p_expr_C_Cpiece_C_Ccount(flags flags, lex_state lex_state, act_state act_state, /* BEGINNING OF EXTRACT: OPENCOUNT */ { -#line 273 "src/libre/parser.act" +#line 275 "src/libre/parser.act" ZI194 = lex_state->lx.start; ZI195 = lex_state->lx.end; -#line 1519 "src/libre/dialect/sql/parser.c" +#line 1521 "src/libre/dialect/sql/parser.c" } /* END OF EXTRACT: OPENCOUNT */ ADVANCE_LEXER; @@ -1523,7 +1525,7 @@ p_expr_C_Cpiece_C_Ccount(flags flags, lex_state lex_state, act_state act_state, case (TOK_COUNT): /* BEGINNING OF EXTRACT: COUNT */ { -#line 429 "src/libre/parser.act" +#line 431 "src/libre/parser.act" unsigned long u; char *e; @@ -1543,7 +1545,7 @@ p_expr_C_Cpiece_C_Ccount(flags flags, lex_state lex_state, act_state act_state, ZIm = (unsigned int) u; -#line 1547 "src/libre/dialect/sql/parser.c" +#line 1549 "src/libre/dialect/sql/parser.c" } /* END OF EXTRACT: COUNT */ break; @@ -1563,11 +1565,11 @@ p_expr_C_Cpiece_C_Ccount(flags flags, lex_state lex_state, act_state act_state, ADVANCE_LEXER; /* BEGINNING OF ACTION: count-zero-or-one */ { -#line 598 "src/libre/parser.act" +#line 600 "src/libre/parser.act" (ZIc) = ast_make_count(0, NULL, 1, NULL); -#line 1571 "src/libre/dialect/sql/parser.c" +#line 1573 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: count-zero-or-one */ } @@ -1577,11 +1579,11 @@ p_expr_C_Cpiece_C_Ccount(flags flags, lex_state lex_state, act_state act_state, ADVANCE_LEXER; /* BEGINNING OF ACTION: count-one-or-more */ { -#line 594 "src/libre/parser.act" +#line 596 "src/libre/parser.act" (ZIc) = ast_make_count(1, NULL, AST_COUNT_UNBOUNDED, NULL); -#line 1585 "src/libre/dialect/sql/parser.c" +#line 1587 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: count-one-or-more */ } @@ -1591,11 +1593,11 @@ p_expr_C_Cpiece_C_Ccount(flags flags, lex_state lex_state, act_state act_state, ADVANCE_LEXER; /* BEGINNING OF ACTION: count-zero-or-more */ { -#line 590 "src/libre/parser.act" +#line 592 "src/libre/parser.act" (ZIc) = ast_make_count(0, NULL, AST_COUNT_UNBOUNDED, NULL); -#line 1599 "src/libre/dialect/sql/parser.c" +#line 1601 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: count-zero-or-more */ } @@ -1604,11 +1606,11 @@ p_expr_C_Cpiece_C_Ccount(flags flags, lex_state lex_state, act_state act_state, { /* BEGINNING OF ACTION: count-one */ { -#line 602 "src/libre/parser.act" +#line 604 "src/libre/parser.act" (ZIc) = ast_make_count(1, NULL, 1, NULL); -#line 1612 "src/libre/dialect/sql/parser.c" +#line 1614 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: count-one */ } @@ -1621,23 +1623,23 @@ ZL1:; { /* BEGINNING OF ACTION: err-expected-count */ { -#line 476 "src/libre/parser.act" +#line 478 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXCOUNT; } goto ZL2; -#line 1632 "src/libre/dialect/sql/parser.c" +#line 1634 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: err-expected-count */ /* BEGINNING OF ACTION: count-one */ { -#line 602 "src/libre/parser.act" +#line 604 "src/libre/parser.act" (ZIc) = ast_make_count(1, NULL, 1, NULL); -#line 1641 "src/libre/dialect/sql/parser.c" +#line 1643 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: count-one */ } @@ -1660,14 +1662,14 @@ p_expr_C_Cpiece_C_Catom(flags flags, lex_state lex_state, act_state act_state, e ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-make-any */ { -#line 689 "src/libre/parser.act" +#line 691 "src/libre/parser.act" (ZIe) = ast_make_expr_any(); if ((ZIe) == NULL) { goto ZL1; } -#line 1671 "src/libre/dialect/sql/parser.c" +#line 1673 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: ast-make-any */ } @@ -1680,7 +1682,7 @@ p_expr_C_Cpiece_C_Catom(flags flags, lex_state lex_state, act_state act_state, e /* BEGINNING OF EXTRACT: CHAR */ { -#line 414 "src/libre/parser.act" +#line 416 "src/libre/parser.act" /* the first byte may be '\x00' */ assert(lex_state->buf.a[1] == '\0'); @@ -1690,20 +1692,20 @@ p_expr_C_Cpiece_C_Catom(flags flags, lex_state lex_state, act_state act_state, e ZIa = lex_state->buf.a[0]; -#line 1694 "src/libre/dialect/sql/parser.c" +#line 1696 "src/libre/dialect/sql/parser.c" } /* END OF EXTRACT: CHAR */ ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-make-literal */ { -#line 678 "src/libre/parser.act" +#line 680 "src/libre/parser.act" (ZIe) = ast_make_expr_literal((ZIa)); if ((ZIe) == NULL) { goto ZL1; } -#line 1707 "src/libre/dialect/sql/parser.c" +#line 1709 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: ast-make-literal */ } @@ -1716,28 +1718,28 @@ p_expr_C_Cpiece_C_Catom(flags flags, lex_state lex_state, act_state act_state, e ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-make-any */ { -#line 689 "src/libre/parser.act" +#line 691 "src/libre/parser.act" (ZIg) = ast_make_expr_any(); if ((ZIg) == NULL) { goto ZL1; } -#line 1727 "src/libre/dialect/sql/parser.c" +#line 1729 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: ast-make-any */ /* BEGINNING OF ACTION: count-zero-or-more */ { -#line 590 "src/libre/parser.act" +#line 592 "src/libre/parser.act" (ZIc) = ast_make_count(0, NULL, AST_COUNT_UNBOUNDED, NULL); -#line 1736 "src/libre/dialect/sql/parser.c" +#line 1738 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: count-zero-or-more */ /* BEGINNING OF ACTION: ast-make-piece */ { -#line 696 "src/libre/parser.act" +#line 698 "src/libre/parser.act" if ((ZIc).min == 0 && (ZIc).max == 0) { (ZIe) = ast_make_expr_empty(); @@ -1751,7 +1753,7 @@ p_expr_C_Cpiece_C_Catom(flags flags, lex_state lex_state, act_state act_state, e goto ZL1; } -#line 1755 "src/libre/dialect/sql/parser.c" +#line 1757 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: ast-make-piece */ } @@ -1768,14 +1770,14 @@ p_expr_C_Cpiece_C_Catom(flags flags, lex_state lex_state, act_state act_state, e } /* BEGINNING OF ACTION: ast-make-group */ { -#line 710 "src/libre/parser.act" +#line 712 "src/libre/parser.act" (ZIe) = ast_make_expr_group((ZIg)); if ((ZIe) == NULL) { goto ZL1; } -#line 1779 "src/libre/dialect/sql/parser.c" +#line 1781 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: ast-make-group */ switch (CURRENT_TERMINAL) { @@ -1806,26 +1808,26 @@ ZL1:; { /* BEGINNING OF ACTION: err-expected-atom */ { -#line 483 "src/libre/parser.act" +#line 485 "src/libre/parser.act" if (err->e == RE_ESUCCESS) { err->e = RE_EXATOM; } goto ZL2; -#line 1817 "src/libre/dialect/sql/parser.c" +#line 1819 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: err-expected-atom */ /* BEGINNING OF ACTION: ast-make-any */ { -#line 689 "src/libre/parser.act" +#line 691 "src/libre/parser.act" (ZIe) = ast_make_expr_any(); if ((ZIe) == NULL) { goto ZL2; } -#line 1829 "src/libre/dialect/sql/parser.c" +#line 1831 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: ast-make-any */ } @@ -1854,7 +1856,7 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hnamed(flags flags, lex_state lex_state, act case (TOK_NAMED__CLASS): /* BEGINNING OF EXTRACT: NAMED_CLASS */ { -#line 441 "src/libre/parser.act" +#line 443 "src/libre/parser.act" ZIid = DIALECT_CLASS(lex_state->buf.a); if (ZIid == NULL) { @@ -1865,7 +1867,7 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hnamed(flags flags, lex_state lex_state, act ZI111 = lex_state->lx.start; ZI112 = lex_state->lx.end; -#line 1869 "src/libre/dialect/sql/parser.c" +#line 1871 "src/libre/dialect/sql/parser.c" } /* END OF EXTRACT: NAMED_CLASS */ break; @@ -1875,14 +1877,14 @@ p_expr_C_Ccharacter_Hclass_C_Cclass_Hnamed(flags flags, lex_state lex_state, act ADVANCE_LEXER; /* BEGINNING OF ACTION: ast-make-named */ { -#line 816 "src/libre/parser.act" +#line 818 "src/libre/parser.act" (ZInode) = ast_make_expr_named((ZIid)); if ((ZInode) == NULL) { goto ZL1; } -#line 1886 "src/libre/dialect/sql/parser.c" +#line 1888 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: ast-make-named */ } @@ -1905,14 +1907,14 @@ p_expr_C_Calt(flags flags, lex_state lex_state, act_state act_state, err err, t_ { /* BEGINNING OF ACTION: ast-make-concat */ { -#line 664 "src/libre/parser.act" +#line 666 "src/libre/parser.act" (ZInode) = ast_make_expr_concat(); if ((ZInode) == NULL) { goto ZL1; } -#line 1916 "src/libre/dialect/sql/parser.c" +#line 1918 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: ast-make-concat */ p_expr_C_Clist_Hof_Hpieces (flags, lex_state, act_state, err, ZInode); @@ -1926,14 +1928,14 @@ p_expr_C_Calt(flags flags, lex_state lex_state, act_state act_state, err err, t_ { /* BEGINNING OF ACTION: ast-make-empty */ { -#line 657 "src/libre/parser.act" +#line 659 "src/libre/parser.act" (ZInode) = ast_make_expr_empty(); if ((ZInode) == NULL) { goto ZL1; } -#line 1937 "src/libre/dialect/sql/parser.c" +#line 1939 "src/libre/dialect/sql/parser.c" } /* END OF ACTION: ast-make-empty */ } @@ -1951,7 +1953,7 @@ ZL0:; /* BEGINNING OF TRAILER */ -#line 976 "src/libre/parser.act" +#line 978 "src/libre/parser.act" static int @@ -2094,6 +2096,6 @@ ZL0:; return NULL; } -#line 2098 "src/libre/dialect/sql/parser.c" +#line 2100 "src/libre/dialect/sql/parser.c" /* END OF FILE */ diff --git a/src/libre/dialect/sql/parser.h b/src/libre/dialect/sql/parser.h index 68b1a41bd..715080259 100644 --- a/src/libre/dialect/sql/parser.h +++ b/src/libre/dialect/sql/parser.h @@ -9,7 +9,7 @@ /* BEGINNING OF HEADER */ -#line 232 "src/libre/parser.act" +#line 234 "src/libre/parser.act" #include @@ -28,7 +28,7 @@ extern void p_re__sql(flags, lex_state, act_state, err, t_ast__expr *); /* BEGINNING OF TRAILER */ -#line 978 "src/libre/parser.act" +#line 980 "src/libre/parser.act" #line 35 "src/libre/dialect/sql/parser.h" diff --git a/src/lx/parser.c b/src/lx/parser.c index 6fa199b93..a67d157db 100644 --- a/src/lx/parser.c +++ b/src/lx/parser.c @@ -1947,7 +1947,7 @@ p_200(lex_state lex_state, act_state act_state, fsm *ZOr) assert((ZIa) != NULL); assert((ZIa)->p != NULL); - (ZIr) = re_comp(RE_NATIVE, act_agetc, (ZIa), act_state->opt, (ZIf), &err); + (ZIr) = re_comp_new(RE_NATIVE, act_agetc, (ZIa), act_state->opt, (ZIf), &err); if ((ZIr) == NULL) { assert(err.e != RE_EBADDIALECT); /* TODO: pass filename for .lx source */ @@ -2013,7 +2013,7 @@ p_200(lex_state lex_state, act_state act_state, fsm *ZOr) assert((ZIa) != NULL); assert((ZIa)->p != NULL); - (ZIr) = re_comp(RE_LITERAL, act_agetc, (ZIa), act_state->opt, 0, &err); + (ZIr) = re_comp_new(RE_LITERAL, act_agetc, (ZIa), act_state->opt, 0, &err); if ((ZIr) == NULL) { assert(err.e != RE_EBADDIALECT); /* TODO: pass filename for .lx source */ From a1924a46ee450b7010349ec7e6ae62cb410a3ffd Mon Sep 17 00:00:00 2001 From: Kate F Date: Mon, 6 Jul 2020 21:18:02 -0700 Subject: [PATCH 05/23] Catch-all for when `-DNDEBUG` is absent. --- src/libre/ast.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libre/ast.c b/src/libre/ast.c index 4f09f0d50..2fe34aaf0 100644 --- a/src/libre/ast.c +++ b/src/libre/ast.c @@ -192,6 +192,7 @@ ast_endpoint_cmp(const struct ast_endpoint *a, const struct ast_endpoint *b) default: assert(!"unreached"); + abort(); } } From 58a54437a7ca1e8185bfa3360689310195c17a2b Mon Sep 17 00:00:00 2001 From: Kate F Date: Mon, 6 Jul 2020 23:09:48 -0700 Subject: [PATCH 06/23] Clarification. --- include/re/strings.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/include/re/strings.h b/include/re/strings.h index a477ea6e2..f64479d32 100644 --- a/include/re/strings.h +++ b/include/re/strings.h @@ -31,6 +31,10 @@ enum re_strings_flags { RE_STRINGS_AC_AUTOMATON = 1 << 2 }; +/* + * A convenience to iterate over an array of strings, and call + * re_strings_add_str() for each. + */ struct fsm * re_strings(const struct fsm_options *opt, const char *a[], size_t n, enum re_strings_flags flags); From 97c9cdefe072b153b80680ea7845098faa02dd1a Mon Sep 17 00:00:00 2001 From: Kate F Date: Mon, 6 Jul 2020 23:24:53 -0700 Subject: [PATCH 07/23] No need for `re_strings_build_new()`; we can construct an fsm inside `re_strings()`, which is already a convenience. --- include/re/strings.h | 4 ---- src/libre/re_strings.c | 36 ++++++++---------------------------- 2 files changed, 8 insertions(+), 32 deletions(-) diff --git a/include/re/strings.h b/include/re/strings.h index f64479d32..5b91660c7 100644 --- a/include/re/strings.h +++ b/include/re/strings.h @@ -55,9 +55,5 @@ int re_strings_build(struct fsm *fsm, struct re_strings *g, enum re_strings_flags flags); -struct fsm * -re_strings_build_new(struct re_strings *g, - const struct fsm_options *opt, enum re_strings_flags flags); - #endif diff --git a/src/libre/re_strings.c b/src/libre/re_strings.c index ecc7e84be..85ce8cf83 100644 --- a/src/libre/re_strings.c +++ b/src/libre/re_strings.c @@ -26,8 +26,14 @@ re_strings(const struct fsm_options *opt, const char *a[], size_t n, struct fsm *fsm; size_t i; + fsm = fsm_new(opt); + if (fsm == NULL) { + return NULL; + } + g = re_strings_new(); if (g == NULL) { + fsm_free(fsm); return NULL; } @@ -37,8 +43,7 @@ re_strings(const struct fsm_options *opt, const char *a[], size_t n, } } - fsm = re_strings_build(g, opt, flags); - if (fsm == NULL) { + if (!re_strings_build(fsm, g, flags)) { goto error; } @@ -46,6 +51,7 @@ re_strings(const struct fsm_options *opt, const char *a[], size_t n, error: + fsm_free(fsm); re_strings_free(g); return NULL; @@ -127,29 +133,3 @@ re_strings_build(struct fsm *fsm, struct re_strings *g, return 0; } -struct fsm * -re_strings_build_new(struct re_strings *g, - const struct fsm_options *opt, enum re_strings_flags flags) -{ - struct fsm *fsm; - - fsm = fsm_new(opt); - if (fsm == NULL) { - goto error; - } - - if (!re_strings_build(fsm, g, flags)) { - goto error; - } - - return fsm; - -error: - - if (fsm != NULL) { - fsm_free(fsm); - } - - return NULL; -} - From 31c7d578a37be93c58400943e9c63b8db6522abc Mon Sep 17 00:00:00 2001 From: Kate F Date: Tue, 7 Jul 2020 00:15:59 -0700 Subject: [PATCH 08/23] Missing free. --- src/libre/re_strings.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libre/re_strings.c b/src/libre/re_strings.c index 85ce8cf83..c33171277 100644 --- a/src/libre/re_strings.c +++ b/src/libre/re_strings.c @@ -47,6 +47,8 @@ re_strings(const struct fsm_options *opt, const char *a[], size_t n, goto error; } + re_strings_free(g); + return fsm; error: From fd67a02afc495115df54fd3769d6f4f68d20f6b0 Mon Sep 17 00:00:00 2001 From: Kate F Date: Tue, 7 Jul 2020 00:46:02 -0700 Subject: [PATCH 09/23] Oops... the start state here should have been exposed when passing in an fsm. --- examples/words/main.c | 5 ++++- include/re/strings.h | 4 ++-- src/libre/re_strings.c | 16 +++++++++------- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/examples/words/main.c b/examples/words/main.c index 6cbd23a56..eb0f8df46 100644 --- a/examples/words/main.c +++ b/examples/words/main.c @@ -161,6 +161,7 @@ int main(int argc, char *argv[]) { if (ahocorasick) { struct timespec pre, post; + fsm_state_t start; if (-1 == clock_gettime(CLOCK_MONOTONIC, &pre)) { perror("clock_gettime"); @@ -173,7 +174,7 @@ int main(int argc, char *argv[]) { exit(EXIT_FAILURE); } - if (!re_strings_build(fsm, g, + if (!re_strings_build(fsm, &start, g, unanchored ? 0 : (RE_STRINGS_ANCHOR_LEFT | RE_STRINGS_ANCHOR_RIGHT))) { perror("re_strings_builder_build"); @@ -181,6 +182,8 @@ int main(int argc, char *argv[]) { exit(EXIT_FAILURE); } + fsm_setstart(fsm, start); + if (-1 == clock_gettime(CLOCK_MONOTONIC, &post)) { perror("clock_gettime"); exit(EXIT_FAILURE); diff --git a/include/re/strings.h b/include/re/strings.h index 5b91660c7..34997d956 100644 --- a/include/re/strings.h +++ b/include/re/strings.h @@ -52,8 +52,8 @@ int re_strings_add_str(struct re_strings *g, const char *s); int -re_strings_build(struct fsm *fsm, struct re_strings *g, - enum re_strings_flags flags); +re_strings_build(struct fsm *fsm, fsm_state_t *start, + struct re_strings *g, enum re_strings_flags flags); #endif diff --git a/src/libre/re_strings.c b/src/libre/re_strings.c index c33171277..bb70fce43 100644 --- a/src/libre/re_strings.c +++ b/src/libre/re_strings.c @@ -24,6 +24,7 @@ re_strings(const struct fsm_options *opt, const char *a[], size_t n, { struct re_strings *g; struct fsm *fsm; + fsm_state_t start; size_t i; fsm = fsm_new(opt); @@ -43,12 +44,14 @@ re_strings(const struct fsm_options *opt, const char *a[], size_t n, } } - if (!re_strings_build(fsm, g, flags)) { + if (!re_strings_build(fsm, &start, g, flags)) { goto error; } re_strings_free(g); + fsm_setstart(fsm, start); + return fsm; error: @@ -91,13 +94,14 @@ re_strings_add_str(struct re_strings *g, const char *s) } int -re_strings_build(struct fsm *fsm, struct re_strings *g, - enum re_strings_flags flags) +re_strings_build(struct fsm *fsm, fsm_state_t *start, + struct re_strings *g, enum re_strings_flags flags) { - fsm_state_t start, end; + fsm_state_t end; int have_end; assert(fsm != NULL); + assert(start != NULL); if ((flags & RE_STRINGS_ANCHOR_LEFT) == 0) { if (trie_add_failure_edges((struct trie_graph *) g) < 0) { @@ -122,12 +126,10 @@ re_strings_build(struct fsm *fsm, struct re_strings *g, end = (unsigned) -1; /* appease clang */ } - if (!trie_to_fsm(fsm, &start, (struct trie_graph *) g, have_end, end)) { + if (!trie_to_fsm(fsm, start, (struct trie_graph *) g, have_end, end)) { goto error; } - fsm_setstart(fsm, start); - return 1; error: From 469f77d5bd6773b85c9f19993f27c36116efa97f Mon Sep 17 00:00:00 2001 From: Kate F Date: Tue, 7 Jul 2020 01:14:07 -0700 Subject: [PATCH 10/23] Whitespace. --- src/libre/re.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/libre/re.c b/src/libre/re.c index 4aec82af6..9e48a4e10 100644 --- a/src/libre/re.c +++ b/src/libre/re.c @@ -102,7 +102,9 @@ re_parse(enum re_dialect dialect, int (*getc)(void *opaque), void *opaque, m = re_dialect(dialect); if (m == NULL) { - if (err != NULL) { err->e = RE_EBADDIALECT; } + if (err != NULL) { + err->e = RE_EBADDIALECT; + } return NULL; } @@ -122,7 +124,9 @@ re_parse(enum re_dialect dialect, int (*getc)(void *opaque), void *opaque, if (res < 0) { ast_free(ast); - if (err != NULL) { err->e = RE_EERRNO; } + if (err != NULL) { + err->e = RE_EERRNO; + } return NULL; } From 4023754f0fcca6793b9349bbbc5bdb69ec0dfd1f Mon Sep 17 00:00:00 2001 From: Kate F Date: Tue, 14 Jul 2020 01:07:29 -0700 Subject: [PATCH 11/23] A bugfix; `fsm_unionxy()` may modify the start state due to `fsm_merge()`. This was neglected for the previous commit (of passing in an fsm for `ast_compile()`). Here I am attempting to rectify that by passing along the start states explicitly. --- src/libre/ast_compile.c | 54 +++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/src/libre/ast_compile.c b/src/libre/ast_compile.c index 704cc7653..bd1d45812 100644 --- a/src/libre/ast_compile.c +++ b/src/libre/ast_compile.c @@ -125,31 +125,25 @@ utf8(uint32_t cp, char c[]) } /* TODO: centralise as fsm_unionxy() perhaps */ -static int -fsm_unionxy(struct fsm *a, struct fsm *b, fsm_state_t x, fsm_state_t y) +static struct fsm * +fsm_unionxy(struct fsm *a, struct fsm *b, fsm_state_t *sa, fsm_state_t *sb, + fsm_state_t x, fsm_state_t y) { - fsm_state_t sa, sb; - fsm_state_t end; struct fsm *q; + fsm_state_t end; fsm_state_t base_b; assert(a != NULL); assert(b != NULL); + assert(sa != NULL); + assert(sb != NULL); /* x,y both belong to a */ assert(x < a->statecount); assert(y < a->statecount); - if (!fsm_getstart(a, &sa)) { - return 0; - } - - if (!fsm_getstart(b, &sb)) { - return 0; - } - if (!fsm_collate(b, &end, fsm_isend)) { - return 0; + return NULL; } /* TODO: centralise as fsm_clearends() or somesuch */ @@ -163,23 +157,21 @@ fsm_unionxy(struct fsm *a, struct fsm *b, fsm_state_t x, fsm_state_t y) q = fsm_mergeab(a, b, &base_b); if (q == NULL) { - return 0; + return NULL; } - sb += base_b; + *sb += base_b; end += base_b; - fsm_setstart(q, sa); - - if (!fsm_addedge_epsilon(q, x, sb)) { - return 0; + if (!fsm_addedge_epsilon(q, x, *sb)) { + return NULL; } if (!fsm_addedge_epsilon(q, end, y)) { - return 0; + return NULL; } - return 1; + return q; } static struct fsm * @@ -944,8 +936,20 @@ comp_iter(struct comp_env *env, break; } - if (!fsm_unionxy(env->fsm, q, x, y)) { - return 0; + { + fsm_state_t sb; + struct fsm *z; + + if (!fsm_getstart(q, &sb)) { + return 0; + } + + z = fsm_unionxy(env->fsm, q, &env->start, &sb, x, y); + if (z == NULL) { + return 0; + } + + (void) z; } break; @@ -1000,7 +1004,6 @@ ast_compile(const struct ast *ast, return 0; } - *start = x; fsm_setend(fsm, y, 1); { @@ -1018,6 +1021,9 @@ ast_compile(const struct ast *ast, if (!comp_iter(&env, x, y, ast->expr)) { return 0; } + + /* env.start may have been modified by fsm_unionxy() during iteration */ + *start = env.start; } /* XXX: From bb9124cdd0ec39465a8e6ec396ebaff80c86c405 Mon Sep 17 00:00:00 2001 From: Kate F Date: Wed, 15 Jul 2020 00:29:30 -0700 Subject: [PATCH 12/23] An interface to add a trie entry by walking an array of AST nodes. This avoids needing to construct an intermediate string, and allocating storage for it. --- src/libre/Makefile | 2 +- src/libre/ac.c | 51 +++++++++++++++++++++++++++++++++++++++++- src/libre/ac.h | 4 ++++ src/libre/ast.h | 4 ++++ src/libre/re_strings.c | 10 +++++++++ 5 files changed, 69 insertions(+), 2 deletions(-) diff --git a/src/libre/Makefile b/src/libre/Makefile index 1c7cf346b..0bc03c5ab 100644 --- a/src/libre/Makefile +++ b/src/libre/Makefile @@ -18,7 +18,7 @@ CFLAGS.${src} += -I src # XXX: for internal.h DFLAGS.${src} += -I src # XXX: for internal.h .endfor -.for src in ${SRC:Msrc/libre/ast.c} ${SRC:Msrc/libre/ast_analysis.c} ${SRC:Msrc/libre/ast_compile.c} ${SRC:Msrc/libre/re.c} +.for src in ${SRC:Msrc/libre/ast.c} ${SRC:Msrc/libre/ast_analysis.c} ${SRC:Msrc/libre/ast_compile.c} ${SRC:Msrc/libre/re.c} ${SRC:Msrc/libre/ac.c} CFLAGS.${src} += -std=c99 # XXX: for ast.h DFLAGS.${src} += -std=c99 # XXX: for ast.h .endfor diff --git a/src/libre/ac.c b/src/libre/ac.c index 9c7df556c..280d97413 100644 --- a/src/libre/ac.c +++ b/src/libre/ac.c @@ -6,6 +6,7 @@ #include #include +#include #include #include #include @@ -14,7 +15,10 @@ #include +#include + #include "ac.h" +#include "ast.h" enum { POOL_BLOCK_SIZE = 256 }; @@ -162,8 +166,53 @@ trie_add_word(struct trie_graph *g, const char *w, size_t n) return g; } +/* internal convenience to avoid constructing a string */ +struct trie_graph * +trie_add_concat(struct trie_graph *g, const struct ast_expr **a, size_t n) +{ + struct trie_state *st; + size_t i; + + assert(g != NULL); + assert(a != NULL); + assert(n > 0); + + st = g->root; + + assert(st != NULL); + + for (i = 0; i < n; i++) { + struct trie_state *nx; + int idx; + + assert(a[i]->type == AST_EXPR_LITERAL); + + idx = (unsigned char)a[i]->u.literal.c; + nx = st->children[idx]; + + if (nx == NULL) { + nx = newstate(g); + if (nx == NULL) { + return NULL; + } + + st->children[idx] = nx; + } + + st = nx; + } + + st->output = 1; + if (g->depth < n) { + g->depth = n; + } + + return g; +} + int -trie_add_failure_edges(struct trie_graph *g) { +trie_add_failure_edges(struct trie_graph *g) +{ struct trie_state **q; size_t top,bot; int sym; diff --git a/src/libre/ac.h b/src/libre/ac.h index dfa977ebe..2b5d3871c 100644 --- a/src/libre/ac.h +++ b/src/libre/ac.h @@ -11,6 +11,7 @@ struct fsm; struct fsm_state; struct fsm_options; +struct ast_expr; struct trie_graph; struct trie_graph * @@ -22,6 +23,9 @@ trie_free(struct trie_graph *g); struct trie_graph * trie_add_word(struct trie_graph *g, const char *w, size_t n); +struct trie_graph * +trie_add_concat(struct trie_graph *g, const struct ast_expr **a, size_t n); + int trie_add_failure_edges(struct trie_graph *g); diff --git a/src/libre/ast.h b/src/libre/ast.h index 5717b1061..376d6519b 100644 --- a/src/libre/ast.h +++ b/src/libre/ast.h @@ -266,4 +266,8 @@ re_parse(enum re_dialect dialect, int (*getc)(void *opaque), void *opaque, const struct fsm_options *opt, enum re_flags flags, struct re_err *err, int *unsatisfiable); +struct re_strings; +int +re_strings_add_concat(struct re_strings *g, const struct ast_expr **a, size_t n); + #endif diff --git a/src/libre/re_strings.c b/src/libre/re_strings.c index bb70fce43..c60a165ca 100644 --- a/src/libre/re_strings.c +++ b/src/libre/re_strings.c @@ -93,6 +93,16 @@ re_strings_add_str(struct re_strings *g, const char *s) return re_strings_add_raw(g, s, strlen(s)); } +/* internal convenience to avoid constructing a string */ +int +re_strings_add_concat(struct re_strings *g, const struct ast_expr **a, size_t n) +{ + assert(a != NULL); + assert(n > 0); + + return trie_add_concat((struct trie_graph *) g, a, n) != NULL; +} + int re_strings_build(struct fsm *fsm, fsm_state_t *start, struct re_strings *g, enum re_strings_flags flags) From 83c3eaa6bc84d2168cccbe8d58e5323da0f6acf8 Mon Sep 17 00:00:00 2001 From: Kate F Date: Thu, 16 Jul 2020 00:53:24 -0700 Subject: [PATCH 13/23] No need to set an end state when the caller already does this. --- src/libre/ac.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libre/ac.c b/src/libre/ac.c index 280d97413..0b57b778e 100644 --- a/src/libre/ac.c +++ b/src/libre/ac.c @@ -362,7 +362,7 @@ trie_to_fsm_state(struct trie_state *ts, struct fsm *fsm, } } - if (ts->output) { + if (ts->output && !have_end) { fsm_setend(fsm, st, 1); } From 5e027ef20f311b0c4b5a71980c936f6bc0c5584f Mon Sep 17 00:00:00 2001 From: Kate F Date: Thu, 16 Jul 2020 03:05:55 -0700 Subject: [PATCH 14/23] Add `re_strings_build_into()`, to pass in a pre-existing end state. --- include/re/strings.h | 5 +++++ src/libre/re_strings.c | 49 ++++++++++++++++++++++++++---------------- 2 files changed, 35 insertions(+), 19 deletions(-) diff --git a/include/re/strings.h b/include/re/strings.h index 34997d956..7b6e407dc 100644 --- a/include/re/strings.h +++ b/include/re/strings.h @@ -51,6 +51,11 @@ re_strings_add_raw(struct re_strings *g, const void *p, size_t n); int re_strings_add_str(struct re_strings *g, const char *s); +int +re_strings_build_into(struct fsm *fsm, fsm_state_t *start, + int have_end, fsm_state_t end, + struct re_strings *g, enum re_strings_flags flags); + int re_strings_build(struct fsm *fsm, fsm_state_t *start, struct re_strings *g, enum re_strings_flags flags); diff --git a/src/libre/re_strings.c b/src/libre/re_strings.c index c60a165ca..ab91928a0 100644 --- a/src/libre/re_strings.c +++ b/src/libre/re_strings.c @@ -104,46 +104,57 @@ re_strings_add_concat(struct re_strings *g, const struct ast_expr **a, size_t n) } int -re_strings_build(struct fsm *fsm, fsm_state_t *start, +re_strings_build_into(struct fsm *fsm, fsm_state_t *start, + int have_end, fsm_state_t end, struct re_strings *g, enum re_strings_flags flags) { - fsm_state_t end; - int have_end; - assert(fsm != NULL); assert(start != NULL); if ((flags & RE_STRINGS_ANCHOR_LEFT) == 0) { if (trie_add_failure_edges((struct trie_graph *) g) < 0) { - goto error; + return 0; } } + if (have_end && (flags & RE_STRINGS_ANCHOR_RIGHT) == 0) { + if (!fsm_addedge_any(fsm, end, end)) { + return 0; + } + } + + if (!trie_to_fsm(fsm, start, (struct trie_graph *) g, have_end, end)) { + return 0; + } + + return 1; +} + + +int +re_strings_build(struct fsm *fsm, fsm_state_t *start, + struct re_strings *g, enum re_strings_flags flags) +{ + fsm_state_t end; + int have_end; + + assert(fsm != NULL); + assert(start != NULL); + have_end = 0; if ((flags & RE_STRINGS_AC_AUTOMATON) == 0 && (flags & RE_STRINGS_ANCHOR_RIGHT) == 0) { if (!fsm_addstate(fsm, &end)) { - goto error; + return 0; } have_end = 1; - fsm_setend(fsm, end, 1); - if (!fsm_addedge_any(fsm, end, end)) { - goto error; - } + fsm_setend(fsm, end, 1); } else { end = (unsigned) -1; /* appease clang */ } - if (!trie_to_fsm(fsm, start, (struct trie_graph *) g, have_end, end)) { - goto error; - } - - return 1; - -error: - - return 0; + return re_strings_build_into(fsm, start, have_end, end, g, flags); } From b418b9fed3cd45dca7b258606c631d95d5888a34 Mon Sep 17 00:00:00 2001 From: Kate F Date: Fri, 17 Jul 2020 23:32:36 -0700 Subject: [PATCH 15/23] Handling for accepting states which are not leaf nodes in the trie. When a single end state is provided, we cannot set these as accepting. So here I'm hooking them up with epsilons, instead. Yes, this means we don't always produce a DFA. To do this, we need to identify leaf nodes, so I've introduced `has_child()` for that. --- src/libre/ac.c | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/src/libre/ac.c b/src/libre/ac.c index 0b57b778e..6722419cf 100644 --- a/src/libre/ac.c +++ b/src/libre/ac.c @@ -316,6 +316,22 @@ find_next_state(struct trie_state *s, int sym) return nx; } +static int +has_child(const struct trie_state *ts) +{ + int sym; + + assert(ts != NULL); + + for (sym = 0; sym < 256; sym++) { + if (ts->children[sym] != NULL) { + return 1; + } + } + + return 0; +} + static int trie_to_fsm_state(struct trie_state *ts, struct fsm *fsm, int have_end, fsm_state_t single_end, @@ -327,7 +343,7 @@ trie_to_fsm_state(struct trie_state *ts, struct fsm *fsm, assert(fsm != NULL); assert(q != NULL); - if (ts->output && have_end) { + if (ts->output && have_end && !has_child(ts)) { *q = single_end; return 1; } @@ -362,8 +378,20 @@ trie_to_fsm_state(struct trie_state *ts, struct fsm *fsm, } } - if (ts->output && !have_end) { - fsm_setend(fsm, st, 1); + if (ts->output) { + if (!have_end) { + fsm_setend(fsm, st, 1); + } else { + /* + * What would usually be an end state in the middle of the trie + * needs an epsilon to hook it up to the single exit state. + * + * We can't set this as an end state, because the single_end + * itself might not actually accept - for example in the middle of + * recursive NFA construction when walking the regexp AST. + */ + fsm_addedge_epsilon(fsm, st, single_end); + } } *q = st; From 96c105501973c71885a7a5160d5ae91f8d261249 Mon Sep 17 00:00:00 2001 From: Kate F Date: Sat, 18 Jul 2020 01:28:42 -0700 Subject: [PATCH 16/23] A first attempt at using Aho Corasick for suitable alt nodes. --- src/libre/ast_compile.c | 175 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 169 insertions(+), 6 deletions(-) diff --git a/src/libre/ast_compile.c b/src/libre/ast_compile.c index bd1d45812..5649e02a0 100644 --- a/src/libre/ast_compile.c +++ b/src/libre/ast_compile.c @@ -19,6 +19,7 @@ #include #include +#include #include "class.h" #include "ast.h" @@ -26,6 +27,18 @@ #include "libfsm/internal.h" /* XXX */ +/* + * Aho-Corasick requires constructing a trie, and that has its own overhead. + * It's only worth doing this is the cost overall is lower. + * + * The parameters here bail out if the number of alts or the length of any + * particular string within an alt are below a threshold, especially because + * [xyz] is so common. The exact values only represent cost approximately. + * These are chosen just by trying it and seeing roughly how it goes. + */ +#define AC_COUNT_THRESHOLD 1 +#define AC_LENGTH_THRESHOLD 1 + #define LOG_LINKAGE 0 enum link_side { @@ -174,6 +187,108 @@ fsm_unionxy(struct fsm *a, struct fsm *b, fsm_state_t *sa, fsm_state_t *sb, return q; } +static int +is_dotstar(const struct ast_expr *n) +{ + assert(n != NULL); + + if (n->type != AST_EXPR_REPEAT) { + return 0; + } + + if (n->u.repeat.min != 0 || n->u.repeat.max != AST_COUNT_UNBOUNDED) { + return 0; + } + + if (n->u.repeat.e->type != AST_EXPR_ANY) { + return 0; + } + + return 1; +} + +static int +is_ac_candidate(const struct ast_expr *n, enum re_strings_flags *flags, + size_t *o_out, size_t *l_out) +{ + size_t o, count; + size_t i; + + assert(n != NULL); + assert(flags != NULL); + + o = 0; + count = n->u.concat.count; + + /* + * We're looking at a single literal in an alt: /...|x|.../ + * We could use AC here and treat this as a string anchored at both ends, + * but the interface here deals with offsets into the array of children + * for a concat node only. It's probably also overkill to involve AC for + * alts of single literals. So here we defer to the usual NFA construction. + */ + if (n->type == AST_EXPR_LITERAL) { + return 0; + } + + /* + * We're looking at some other kind of node in an alt: /...|x+|.../ + * where we wouldn't be able to use AC anyway. + */ + if (n->type != AST_EXPR_CONCAT) { + return 0; + } + + /* + * This should never happen; a single-node concat is optimised away. + */ + if (n->u.alt.count == 1) { + return is_ac_candidate(n->u.alt.n[0], flags, o_out, l_out); + } + + /* + * The general form here is an n-ary concat like [.*] a b c [.*] + * where .* is optional at either end. We're detecting the presence + * of those, moving the offset and length to skip them, and setting + * the appropriate RE_STRINGS_ANCHOR_LEFT/_RIGHT flags. + * + * "Anchor" here (as far as our implementation of Aho-Corasick cares) means + * the absence of .* at either end; this is not the same as the ^$ anchors + * in regexp syntax (because we're in the middle of an AST here). + */ + *flags = RE_STRINGS_ANCHOR_LEFT | RE_STRINGS_ANCHOR_RIGHT; + + if (count >= 1 && is_dotstar(n->u.concat.n[o])) { + o++; + count--; + *flags &= ~RE_STRINGS_ANCHOR_LEFT; + } + + if (count >= 1 && is_dotstar(n->u.concat.n[count + o - 1])) { + count--; + *flags &= ~RE_STRINGS_ANCHOR_RIGHT; + } + + if (count == 0) { + return 0; + } + + /* + * We also validate that the middle part contains a run of literals only, + * else we're not suitable for AC anyway. + */ + for (i = o; i < count; i++) { + if (n->u.concat.n[i]->type != AST_EXPR_LITERAL) { + return 0; + } + } + + *o_out = o; + *l_out = count; + + return 1; +} + static struct fsm * expr_compile(struct ast_expr *e, enum re_flags flags, const struct fsm_options *opt, struct re_err *err) @@ -799,6 +914,7 @@ comp_iter(struct comp_env *env, case AST_EXPR_ALT: { + struct re_strings *a[] = { NULL, NULL, NULL, NULL }; size_t i; const size_t count = n->u.alt.count; @@ -806,13 +922,60 @@ comp_iter(struct comp_env *env, assert(count >= 1); for (i = 0; i < count; i++) { - /* - * CONCAT handles adding extra states and - * epsilons when necessary, so there isn't much - * more to do here. - */ - RECURSE(x, y, n->u.alt.n[i]); + enum re_strings_flags flags; + size_t o, l; + + if (count < AC_COUNT_THRESHOLD) { + RECURSE(x, y, n->u.alt.n[i]); + continue; + } + + if (n->u.alt.n[i]->type != AST_EXPR_CONCAT || + n->u.alt.n[i]->u.concat.count < AC_LENGTH_THRESHOLD) + { + RECURSE(x, y, n->u.alt.n[i]); + continue; + } + + if (!is_ac_candidate(n->u.alt.n[i], &flags, &o, &l)) { + RECURSE(x, y, n->u.alt.n[i]); + continue; + } + + if (a[flags] == NULL) { + a[flags] = re_strings_new(); + if (a[flags] == NULL) { + return 0; + } + } + + /* XXX: i'm screwing up the const handling here, i'm sure */ + if (!re_strings_add_concat(a[flags], + (const struct ast_expr **) n->u.alt.n[i]->u.concat.n + o, l)) + { + return 0; + } } + + for (i = 0; i < sizeof a / sizeof *a; i++) { + fsm_state_t start; + + if (a[i] == NULL) { + continue; + } + + if (!re_strings_build_into(env->fsm, &start, 1, y, a[i], i)) { + return 0; + } + /* XXX: would love to avoid the epsilon here, for non-dotstar ac, + * maybe we could pass in x directly? */ + EPSILON(x, start); + } + + for (i = 0; i < sizeof a / sizeof *a; i++) { + re_strings_free(a[i]); + } + break; } From b74e7d8fa95134b54ac66ee2773fe0294061604b Mon Sep 17 00:00:00 2001 From: Kate F Date: Sat, 18 Jul 2020 20:05:28 -0700 Subject: [PATCH 17/23] Typo. --- src/libre/ast_compile.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libre/ast_compile.c b/src/libre/ast_compile.c index 5649e02a0..b1a6d72d7 100644 --- a/src/libre/ast_compile.c +++ b/src/libre/ast_compile.c @@ -29,7 +29,7 @@ /* * Aho-Corasick requires constructing a trie, and that has its own overhead. - * It's only worth doing this is the cost overall is lower. + * It's only worth doing this if the cost overall is lower. * * The parameters here bail out if the number of alts or the length of any * particular string within an alt are below a threshold, especially because From 0666f884dd42d75039e05f134618fa16bc8039da Mon Sep 17 00:00:00 2001 From: Kate F Date: Sat, 18 Jul 2020 23:24:10 -0700 Subject: [PATCH 18/23] Perhaps sensible thresholds? --- src/libre/ast_compile.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/libre/ast_compile.c b/src/libre/ast_compile.c index b1a6d72d7..7c720095a 100644 --- a/src/libre/ast_compile.c +++ b/src/libre/ast_compile.c @@ -34,10 +34,14 @@ * The parameters here bail out if the number of alts or the length of any * particular string within an alt are below a threshold, especially because * [xyz] is so common. The exact values only represent cost approximately. - * These are chosen just by trying it and seeing roughly how it goes. + * + * In practice I found it difficult to pick values for these, because for + * the lower end of the scale it's hard to see a meaningful difference, + * and for the upper end of the scale the time is dominated by + * determinisation anyway. */ -#define AC_COUNT_THRESHOLD 1 -#define AC_LENGTH_THRESHOLD 1 +#define AC_COUNT_THRESHOLD 5 +#define AC_LENGTH_THRESHOLD 5 #define LOG_LINKAGE 0 From 0d380c9a1966d667f8d565f3778e87e33371b73d Mon Sep 17 00:00:00 2001 From: Kate F Date: Fri, 31 Jul 2020 19:11:47 -0700 Subject: [PATCH 19/23] Sprinkle const. --- src/libre/ast_compile.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/libre/ast_compile.c b/src/libre/ast_compile.c index 7c720095a..4ef130e6b 100644 --- a/src/libre/ast_compile.c +++ b/src/libre/ast_compile.c @@ -100,7 +100,7 @@ struct comp_env { static int comp_iter(struct comp_env *env, fsm_state_t x, fsm_state_t y, - struct ast_expr *n); + const struct ast_expr *n); static int utf8(uint32_t cp, char c[]) @@ -484,7 +484,7 @@ can_skip_concat_state_and_epsilon(const struct ast_expr *l, static enum link_types decide_linking(struct comp_env *env, fsm_state_t x, fsm_state_t y, - struct ast_expr *n, enum link_side side) + const struct ast_expr *n, enum link_side side) { enum link_types res = LINK_NONE; @@ -632,7 +632,7 @@ print_linkage(enum link_types t) static int comp_iter_repeated(struct comp_env *env, fsm_state_t x, fsm_state_t y, - struct ast_expr_repeat *n) + const struct ast_expr_repeat *n) { fsm_state_t a, b; fsm_state_t na, nz; @@ -744,7 +744,7 @@ comp_iter_repeated(struct comp_env *env, static int comp_iter(struct comp_env *env, fsm_state_t x, fsm_state_t y, - struct ast_expr *n) + const struct ast_expr *n) { enum link_types link_start, link_end; @@ -868,8 +868,8 @@ comp_iter(struct comp_env *env, } for (i = 0; i < count; i++) { - struct ast_expr *curr = n->u.concat.n[i]; - struct ast_expr *next = i == count - 1 + const struct ast_expr *curr = n->u.concat.n[i]; + const struct ast_expr *next = i == count - 1 ? NULL : n->u.concat.n[i + 1]; From fc8a9675b8ba4bd44aaddf36f9029c8903621c60 Mon Sep 17 00:00:00 2001 From: Kate F Date: Fri, 31 Jul 2020 22:41:12 -0700 Subject: [PATCH 20/23] Move out `ast_compile_altlist()`. --- src/libre/ast_compile.c | 152 ++++++++++++++++++++-------------------- 1 file changed, 77 insertions(+), 75 deletions(-) diff --git a/src/libre/ast_compile.c b/src/libre/ast_compile.c index 4ef130e6b..437309832 100644 --- a/src/libre/ast_compile.c +++ b/src/libre/ast_compile.c @@ -98,7 +98,7 @@ struct comp_env { }; static int -comp_iter(struct comp_env *env, +ast_compile_expr(struct comp_env *env, fsm_state_t x, fsm_state_t y, const struct ast_expr *n); @@ -627,10 +627,10 @@ print_linkage(enum link_types t) if (!addedge_literal(env, (FROM), (TO), (C))) { return 0; } #define RECURSE(FROM, TO, NODE) \ - if (!comp_iter(env, (FROM), (TO), (NODE))) { return 0; } + if (!ast_compile_expr(env, (FROM), (TO), (NODE))) { return 0; } static int -comp_iter_repeated(struct comp_env *env, +ast_compile_repeat(struct comp_env *env, fsm_state_t x, fsm_state_t y, const struct ast_expr_repeat *n) { @@ -742,7 +742,75 @@ comp_iter_repeated(struct comp_env *env, } static int -comp_iter(struct comp_env *env, +ast_compile_altlist(struct comp_env *env, + fsm_state_t x, fsm_state_t y, + const struct ast_expr **n, size_t count) +{ + struct re_strings *a[] = { NULL, NULL, NULL, NULL }; + size_t i; + + assert(count >= 1); + + for (i = 0; i < count; i++) { + enum re_strings_flags flags; + size_t o, l; + + if (count < AC_COUNT_THRESHOLD) { + RECURSE(x, y, n[i]); + continue; + } + + if (n[i]->type != AST_EXPR_CONCAT || + n[i]->u.concat.count < AC_LENGTH_THRESHOLD) + { + RECURSE(x, y, n[i]); + continue; + } + + if (!is_ac_candidate(n[i], &flags, &o, &l)) { + RECURSE(x, y, n[i]); + continue; + } + + if (a[flags] == NULL) { + a[flags] = re_strings_new(); + if (a[flags] == NULL) { + return 0; + } + } + + /* XXX: i'm screwing up the const handling here, i'm sure */ + if (!re_strings_add_concat(a[flags], + (const struct ast_expr **) n[i]->u.concat.n + o, l)) + { + return 0; + } + } + + for (i = 0; i < sizeof a / sizeof *a; i++) { + fsm_state_t start; + + if (a[i] == NULL) { + continue; + } + + if (!re_strings_build_into(env->fsm, &start, 1, y, a[i], i)) { + return 0; + } + /* XXX: would love to avoid the epsilon here, for non-dotstar ac, + * maybe we could pass in x directly? */ + EPSILON(x, start); + } + + for (i = 0; i < sizeof a / sizeof *a; i++) { + re_strings_free(a[i]); + } + + return 1; +} + +static int +ast_compile_expr(struct comp_env *env, fsm_state_t x, fsm_state_t y, const struct ast_expr *n) { @@ -847,8 +915,7 @@ comp_iter(struct comp_env *env, EPSILON(x, y); break; - case AST_EXPR_CONCAT: - { + case AST_EXPR_CONCAT: { fsm_state_t base, z; fsm_state_t curr_x; enum re_flags saved; @@ -917,71 +984,10 @@ comp_iter(struct comp_env *env, } case AST_EXPR_ALT: - { - struct re_strings *a[] = { NULL, NULL, NULL, NULL }; - size_t i; - - const size_t count = n->u.alt.count; - - assert(count >= 1); - - for (i = 0; i < count; i++) { - enum re_strings_flags flags; - size_t o, l; - - if (count < AC_COUNT_THRESHOLD) { - RECURSE(x, y, n->u.alt.n[i]); - continue; - } - - if (n->u.alt.n[i]->type != AST_EXPR_CONCAT || - n->u.alt.n[i]->u.concat.count < AC_LENGTH_THRESHOLD) - { - RECURSE(x, y, n->u.alt.n[i]); - continue; - } - - if (!is_ac_candidate(n->u.alt.n[i], &flags, &o, &l)) { - RECURSE(x, y, n->u.alt.n[i]); - continue; - } - - if (a[flags] == NULL) { - a[flags] = re_strings_new(); - if (a[flags] == NULL) { - return 0; - } - } - - /* XXX: i'm screwing up the const handling here, i'm sure */ - if (!re_strings_add_concat(a[flags], - (const struct ast_expr **) n->u.alt.n[i]->u.concat.n + o, l)) - { - return 0; - } - } - - for (i = 0; i < sizeof a / sizeof *a; i++) { - fsm_state_t start; - - if (a[i] == NULL) { - continue; - } - - if (!re_strings_build_into(env->fsm, &start, 1, y, a[i], i)) { - return 0; - } - /* XXX: would love to avoid the epsilon here, for non-dotstar ac, - * maybe we could pass in x directly? */ - EPSILON(x, start); - } - - for (i = 0; i < sizeof a / sizeof *a; i++) { - re_strings_free(a[i]); + if (!ast_compile_altlist(env, x, y, n->u.alt.n, n->u.alt.count)) { + return 0; } - break; - } case AST_EXPR_LITERAL: LITERAL(x, y, n->u.literal.c); @@ -1024,11 +1030,7 @@ comp_iter(struct comp_env *env, break; case AST_EXPR_REPEAT: - /* - * REPEAT breaks out into its own function, because - * there are several special cases - */ - if (!comp_iter_repeated(env, x, y, &n->u.repeat)) { + if (!ast_compile_repeat(env, x, y, &n->u.repeat)) { return 0; } break; @@ -1185,7 +1187,7 @@ ast_compile(const struct ast *ast, env.start = x; env.end = y; - if (!comp_iter(&env, x, y, ast->expr)) { + if (!ast_compile_expr(&env, x, y, ast->expr)) { return 0; } From 076e0cada5ddcec64f0b87313217a03cd1ff0992 Mon Sep 17 00:00:00 2001 From: Kate F Date: Sun, 2 Aug 2020 03:14:21 -0700 Subject: [PATCH 21/23] Special case for using A-C for an anchored list of alts at the root node. This allows for accepting states in the middle of branches in the trie, rather than hooking them up using epsilons. --- src/libre/ast_compile.c | 43 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/src/libre/ast_compile.c b/src/libre/ast_compile.c index 437309832..cc30119e6 100644 --- a/src/libre/ast_compile.c +++ b/src/libre/ast_compile.c @@ -743,7 +743,7 @@ ast_compile_repeat(struct comp_env *env, static int ast_compile_altlist(struct comp_env *env, - fsm_state_t x, fsm_state_t y, + fsm_state_t x, int have_end, fsm_state_t y, const struct ast_expr **n, size_t count) { struct re_strings *a[] = { NULL, NULL, NULL, NULL }; @@ -794,7 +794,7 @@ ast_compile_altlist(struct comp_env *env, continue; } - if (!re_strings_build_into(env->fsm, &start, 1, y, a[i], i)) { + if (!re_strings_build_into(env->fsm, &start, have_end, y, a[i], i)) { return 0; } /* XXX: would love to avoid the epsilon here, for non-dotstar ac, @@ -984,7 +984,7 @@ ast_compile_expr(struct comp_env *env, } case AST_EXPR_ALT: - if (!ast_compile_altlist(env, x, y, n->u.alt.n, n->u.alt.count)) { + if (!ast_compile_altlist(env, x, 1, y, (const struct ast_expr **) n->u.alt.n, n->u.alt.count)) { return 0; } break; @@ -1148,6 +1148,41 @@ ast_compile_expr(struct comp_env *env, return 1; } +int +ast_compile_root(struct comp_env *env, + fsm_state_t x, fsm_state_t y, + const struct ast_expr *n) +{ + assert(env != NULL); + assert(n != NULL); + + /* + * The root node is handled specially when it's suitable for Aho-Corasick, + * because then we can construct a trie with accepting states in-situ along + * the branches, instead of hooking them up with epsilons to the y state. + * This reduces pressure on resolving those epsilons later on. + * + * To do this, we pass have_end=0 so that re_strings_build_into() does not + * use the shared end state we would normally use during the recursive + * Thompson NFA construction. + * + * For things which aren't suitable for Aho-Corasick, recursion will + * continue per usual, constructed alongside the trie (if present at all). + */ + + if (env->re_flags & RE_ANCHORED && n->type == AST_EXPR_ALT) { + return ast_compile_altlist(env, x, 0, y, + (const struct ast_expr **) n->u.alt.n, n->u.alt.count); + } + + /* XXX: this leaves a stray end state for y when we only have a trie, would prefer to avoid that */ + /* TODO: deal with ~RE_ANCHORED */ + /* TODO: special cases for ^...$ alts, too */ + /* TODO: also if we're inside nodes for groups, just tail recursion for those */ + + return ast_compile_expr(env, x, y, n); +} + #undef EPSILON #undef ANY #undef NEWSTATE @@ -1187,7 +1222,7 @@ ast_compile(const struct ast *ast, env.start = x; env.end = y; - if (!ast_compile_expr(&env, x, y, ast->expr)) { + if (!ast_compile_root(&env, x, y, ast->expr)) { return 0; } From 2d036550d0d4988115870e88f8f96be8d22a2fc5 Mon Sep 17 00:00:00 2001 From: Kate F Date: Sun, 2 Aug 2020 04:01:06 -0700 Subject: [PATCH 22/23] Recurr for special top-level handling of group nodes. --- src/libre/ast_compile.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/libre/ast_compile.c b/src/libre/ast_compile.c index cc30119e6..99059e665 100644 --- a/src/libre/ast_compile.c +++ b/src/libre/ast_compile.c @@ -1170,6 +1170,14 @@ ast_compile_root(struct comp_env *env, * continue per usual, constructed alongside the trie (if present at all). */ + /* + * Groups have no relevance on the structure being suitable for A-C, + * so we recurr into those. + */ + if (n->type == AST_EXPR_GROUP) { + return ast_compile_root(env, x, y, n->u.group.e); + } + if (env->re_flags & RE_ANCHORED && n->type == AST_EXPR_ALT) { return ast_compile_altlist(env, x, 0, y, (const struct ast_expr **) n->u.alt.n, n->u.alt.count); @@ -1178,7 +1186,6 @@ ast_compile_root(struct comp_env *env, /* XXX: this leaves a stray end state for y when we only have a trie, would prefer to avoid that */ /* TODO: deal with ~RE_ANCHORED */ /* TODO: special cases for ^...$ alts, too */ - /* TODO: also if we're inside nodes for groups, just tail recursion for those */ return ast_compile_expr(env, x, y, n); } From 69523b269da05d9de1611cba7aae54028f6b2264 Mon Sep 17 00:00:00 2001 From: Kate F Date: Tue, 4 Aug 2020 16:54:34 -0700 Subject: [PATCH 23/23] Some tests for top-level Aho Corasick behaviour. --- Makefile | 1 + tests/pcre-ac/Makefile | 49 +++++++++++++++++++++++++ tests/pcre-ac/in1.re | 1 + tests/pcre-ac/in2.re | 1 + tests/pcre-ac/in3.re | 1 + tests/pcre-ac/in4.re | 1 + tests/pcre-ac/in5.re | 1 + tests/pcre-ac/in6.re | 1 + tests/pcre-ac/in7.re | 1 + tests/pcre-ac/out1-anchored.fsm | 13 +++++++ tests/pcre-ac/out1-unanchored.fsm | 27 ++++++++++++++ tests/pcre-ac/out2-anchored.fsm | 45 +++++++++++++++++++++++ tests/pcre-ac/out2-unanchored.fsm | 55 ++++++++++++++++++++++++++++ tests/pcre-ac/out3-anchored.fsm | 28 +++++++++++++++ tests/pcre-ac/out3-unanchored.fsm | 38 ++++++++++++++++++++ tests/pcre-ac/out4-anchored.fsm | 49 +++++++++++++++++++++++++ tests/pcre-ac/out4-unanchored.fsm | 59 +++++++++++++++++++++++++++++++ tests/pcre-ac/out5-anchored.fsm | 28 +++++++++++++++ tests/pcre-ac/out5-unanchored.fsm | 1 + tests/pcre-ac/out6-anchored.fsm | 1 + tests/pcre-ac/out6-unanchored.fsm | 38 ++++++++++++++++++++ tests/pcre-ac/out7-anchored.fsm | 1 + tests/pcre-ac/out7-unanchored.fsm | 38 ++++++++++++++++++++ 23 files changed, 478 insertions(+) create mode 100644 tests/pcre-ac/Makefile create mode 100644 tests/pcre-ac/in1.re create mode 100644 tests/pcre-ac/in2.re create mode 100644 tests/pcre-ac/in3.re create mode 100644 tests/pcre-ac/in4.re create mode 100644 tests/pcre-ac/in5.re create mode 100644 tests/pcre-ac/in6.re create mode 100644 tests/pcre-ac/in7.re create mode 100644 tests/pcre-ac/out1-anchored.fsm create mode 100644 tests/pcre-ac/out1-unanchored.fsm create mode 100644 tests/pcre-ac/out2-anchored.fsm create mode 100644 tests/pcre-ac/out2-unanchored.fsm create mode 100644 tests/pcre-ac/out3-anchored.fsm create mode 100644 tests/pcre-ac/out3-unanchored.fsm create mode 100644 tests/pcre-ac/out4-anchored.fsm create mode 100644 tests/pcre-ac/out4-unanchored.fsm create mode 100644 tests/pcre-ac/out5-anchored.fsm create mode 120000 tests/pcre-ac/out5-unanchored.fsm create mode 120000 tests/pcre-ac/out6-anchored.fsm create mode 100644 tests/pcre-ac/out6-unanchored.fsm create mode 120000 tests/pcre-ac/out7-anchored.fsm create mode 100644 tests/pcre-ac/out7-unanchored.fsm diff --git a/Makefile b/Makefile index 8d0264c7e..977599f96 100644 --- a/Makefile +++ b/Makefile @@ -60,6 +60,7 @@ SUBDIR += tests/minimise SUBDIR += tests/native SUBDIR += tests/pcre SUBDIR += tests/pcre-classes +SUBDIR += tests/pcre-ac SUBDIR += tests/pcre-anchor SUBDIR += tests/pcre-repeat SUBDIR += tests/pred diff --git a/tests/pcre-ac/Makefile b/tests/pcre-ac/Makefile new file mode 100644 index 000000000..a684d1060 --- /dev/null +++ b/tests/pcre-ac/Makefile @@ -0,0 +1,49 @@ +.include "../../share/mk/top.mk" + +TEST.tests/pcre-ac != ls -1 tests/pcre-ac/out*-*.fsm +TEST_SRCDIR.tests/pcre-ac = tests/pcre-ac +TEST_OUTDIR.tests/pcre-ac-anchored = ${BUILD}/tests/pcre-ac-anchored +TEST_OUTDIR.tests/pcre-ac-unanchored = ${BUILD}/tests/pcre-ac-unanchored + +DIR += ${TEST_OUTDIR.tests/pcre-ac-anchored} +DIR += ${TEST_OUTDIR.tests/pcre-ac-unanchored} + +RE=${BUILD}/bin/re + +.for n in ${TEST.tests/pcre-ac:T:Mout*-anchored.fsm:R:C/^out//:C/-anchored$//} + +${TEST_OUTDIR.tests/pcre-ac-anchored}/got${n}.fsm: ${TEST_SRCDIR.tests/pcre-ac}/in${n}.re + ${RE} -b -r pcre -py ${.ALLSRC:M*.re} \ + > $@ + +${TEST_OUTDIR.tests/pcre-ac-anchored}/nfa${n}.fsm: ${TEST_SRCDIR.tests/pcre-ac}/in${n}.re + ${RE} -b -r pcre -n -py ${.ALLSRC:M*.re} \ + > $@ + +${TEST_OUTDIR.tests/pcre-ac-anchored}/res${n}: \ + ${TEST_SRCDIR.tests/pcre-ac}/out${n}-anchored.fsm \ + ${TEST_OUTDIR.tests/pcre-ac-anchored}/got${n}.fsm + +FSMTEST_RESULT += ${TEST_OUTDIR.tests/pcre-ac-anchored}/res${n} + +.endfor + +# note the absence of -b here +.for n in ${TEST.tests/pcre-ac:T:Mout*-unanchored.fsm:R:C/^out//:C/-unanchored$//} + +${TEST_OUTDIR.tests/pcre-ac-unanchored}/got${n}.fsm: ${TEST_SRCDIR.tests/pcre-ac}/in${n}.re + ${RE} -r pcre -py ${.ALLSRC:M*.re} \ + > $@ + +${TEST_OUTDIR.tests/pcre-ac-unanchored}/nfa${n}.fsm: ${TEST_SRCDIR.tests/pcre-ac}/in${n}.re + ${RE} -r pcre -n -py ${.ALLSRC:M*.re} \ + > $@ + +${TEST_OUTDIR.tests/pcre-ac-unanchored}/res${n}: \ + ${TEST_SRCDIR.tests/pcre-ac}/out${n}-unanchored.fsm \ + ${TEST_OUTDIR.tests/pcre-ac-unanchored}/got${n}.fsm + +FSMTEST_RESULT += ${TEST_OUTDIR.tests/pcre-ac-unanchored}/res${n} + +.endfor + diff --git a/tests/pcre-ac/in1.re b/tests/pcre-ac/in1.re new file mode 100644 index 000000000..b4d9c6166 --- /dev/null +++ b/tests/pcre-ac/in1.re @@ -0,0 +1 @@ +a|ab|abc|abcd|abcde|abcdef|abcdefg|abcdefgh|abcdefghi \ No newline at end of file diff --git a/tests/pcre-ac/in2.re b/tests/pcre-ac/in2.re new file mode 100644 index 000000000..164b62754 --- /dev/null +++ b/tests/pcre-ac/in2.re @@ -0,0 +1 @@ +abcdef|xyzabc|azbycz|xaybzc|fedcba \ No newline at end of file diff --git a/tests/pcre-ac/in3.re b/tests/pcre-ac/in3.re new file mode 100644 index 000000000..d585e20ac --- /dev/null +++ b/tests/pcre-ac/in3.re @@ -0,0 +1 @@ +abcdef|xyzabc|abcdefef|xyzabcef|fcdef \ No newline at end of file diff --git a/tests/pcre-ac/in4.re b/tests/pcre-ac/in4.re new file mode 100644 index 000000000..b0a070b9f --- /dev/null +++ b/tests/pcre-ac/in4.re @@ -0,0 +1 @@ +(?i)abcdef|xyzabc|abcdefef|xyzabcef|fcdef \ No newline at end of file diff --git a/tests/pcre-ac/in5.re b/tests/pcre-ac/in5.re new file mode 100644 index 000000000..2fc3bda27 --- /dev/null +++ b/tests/pcre-ac/in5.re @@ -0,0 +1 @@ +^(?:abcdef|xyzabc|abcdefef|xyzabcef|fcdef)$ \ No newline at end of file diff --git a/tests/pcre-ac/in6.re b/tests/pcre-ac/in6.re new file mode 100644 index 000000000..2fa2074c8 --- /dev/null +++ b/tests/pcre-ac/in6.re @@ -0,0 +1 @@ +^.*(?:abcdef|xyzabc|abcdefef|xyzabcef|fcdef).*$ \ No newline at end of file diff --git a/tests/pcre-ac/in7.re b/tests/pcre-ac/in7.re new file mode 100644 index 000000000..e8acc39a7 --- /dev/null +++ b/tests/pcre-ac/in7.re @@ -0,0 +1 @@ +.*(?:abcdef|xyzabc|abcdefef|xyzabcef|fcdef).* \ No newline at end of file diff --git a/tests/pcre-ac/out1-anchored.fsm b/tests/pcre-ac/out1-anchored.fsm new file mode 100644 index 000000000..a1258156c --- /dev/null +++ b/tests/pcre-ac/out1-anchored.fsm @@ -0,0 +1,13 @@ + +0 -> 1 "a"; +1 -> 2 "b"; +2 -> 3 "c"; +3 -> 4 "d"; +4 -> 5 "e"; +5 -> 6 "f"; +6 -> 7 "g"; +7 -> 8 "h"; +8 -> 9 "i"; + +start: 0; +end: 1, 1, 2, 3, 4, 5, 6, 7, 8, 9; diff --git a/tests/pcre-ac/out1-unanchored.fsm b/tests/pcre-ac/out1-unanchored.fsm new file mode 100644 index 000000000..30e0d0c6d --- /dev/null +++ b/tests/pcre-ac/out1-unanchored.fsm @@ -0,0 +1,27 @@ + +0 -> 0 ?; + +0 -> 1 "a"; +1 -> 2 "b"; +2 -> 3 "c"; +3 -> 4 "d"; +4 -> 5 "e"; +5 -> 6 "f"; +6 -> 7 "g"; +7 -> 8 "h"; +8 -> 9 "i"; + +1 -> x; +2 -> x; +3 -> x; +4 -> x; +5 -> x; +6 -> x; +7 -> x; +8 -> x; +9 -> x; + +x -> x ?; + +start: 0; +end: x; diff --git a/tests/pcre-ac/out2-anchored.fsm b/tests/pcre-ac/out2-anchored.fsm new file mode 100644 index 000000000..128fe8564 --- /dev/null +++ b/tests/pcre-ac/out2-anchored.fsm @@ -0,0 +1,45 @@ + +0 -> 00; +0 -> 10; +0 -> 20; +0 -> 30; +0 -> 40; + +00 -> 01 "a"; +01 -> 02 "b"; +02 -> 03 "c"; +03 -> 04 "d"; +04 -> 05 "e"; +05 -> 06 "f"; + +10 -> 11 "x"; +11 -> 12 "y"; +12 -> 13 "z"; +13 -> 14 "a"; +14 -> 15 "b"; +15 -> 16 "c"; + +20 -> 21 "a"; +21 -> 22 "z"; +22 -> 23 "b"; +23 -> 24 "y"; +24 -> 25 "c"; +25 -> 26 "z"; + +30 -> 31 "x"; +31 -> 32 "a"; +32 -> 33 "y"; +33 -> 34 "b"; +34 -> 35 "z"; +35 -> 36 "c"; + +40 -> 41 "f"; +41 -> 42 "e"; +42 -> 43 "d"; +43 -> 44 "c"; +44 -> 45 "b"; +45 -> 46 "a"; + +start: 0; +end: 06, 16, 26, 36, 46; + diff --git a/tests/pcre-ac/out2-unanchored.fsm b/tests/pcre-ac/out2-unanchored.fsm new file mode 100644 index 000000000..678faeefc --- /dev/null +++ b/tests/pcre-ac/out2-unanchored.fsm @@ -0,0 +1,55 @@ + +0 -> 00; +0 -> 10; +0 -> 20; +0 -> 30; +0 -> 40; + +0 -> 0 ?; + +00 -> 01 "a"; +01 -> 02 "b"; +02 -> 03 "c"; +03 -> 04 "d"; +04 -> 05 "e"; +05 -> 06 "f"; + +10 -> 11 "x"; +11 -> 12 "y"; +12 -> 13 "z"; +13 -> 14 "a"; +14 -> 15 "b"; +15 -> 16 "c"; + +20 -> 21 "a"; +21 -> 22 "z"; +22 -> 23 "b"; +23 -> 24 "y"; +24 -> 25 "c"; +25 -> 26 "z"; + +30 -> 31 "x"; +31 -> 32 "a"; +32 -> 33 "y"; +33 -> 34 "b"; +34 -> 35 "z"; +35 -> 36 "c"; + +40 -> 41 "f"; +41 -> 42 "e"; +42 -> 43 "d"; +43 -> 44 "c"; +44 -> 45 "b"; +45 -> 46 "a"; + +06 -> x; +16 -> x; +26 -> x; +36 -> x; +46 -> x; + +x -> x ?; + +start: 0; +end: x; + diff --git a/tests/pcre-ac/out3-anchored.fsm b/tests/pcre-ac/out3-anchored.fsm new file mode 100644 index 000000000..fc4e9f9ef --- /dev/null +++ b/tests/pcre-ac/out3-anchored.fsm @@ -0,0 +1,28 @@ + +0 -> 01 "a"; +01 -> 02 "b"; +02 -> 03 "c"; +03 -> 04 "d"; +04 -> 05 "e"; +05 -> 06 "f"; +06 -> 07 "e"; +07 -> 08 "f"; + +0 -> 10 "f"; +10 -> 11 "c"; +11 -> 12 "d"; +12 -> 13 "e"; +13 -> 14 "f"; + +0 -> 20 "x"; +20 -> 21 "y"; +21 -> 22 "z"; +22 -> 23 "a"; +23 -> 24 "b"; +24 -> 25 "c"; +25 -> 26 "e"; +26 -> 27 "f"; + +start: 0; +end: 06, 08, 14, 25, 27; + diff --git a/tests/pcre-ac/out3-unanchored.fsm b/tests/pcre-ac/out3-unanchored.fsm new file mode 100644 index 000000000..df8db384a --- /dev/null +++ b/tests/pcre-ac/out3-unanchored.fsm @@ -0,0 +1,38 @@ + +0 -> 0 ?; + +0 -> 01 "a"; +01 -> 02 "b"; +02 -> 03 "c"; +03 -> 04 "d"; +04 -> 05 "e"; +05 -> 06 "f"; +06 -> 07 "e"; +07 -> 08 "f"; + +0 -> 10 "f"; +10 -> 11 "c"; +11 -> 12 "d"; +12 -> 13 "e"; +13 -> 14 "f"; + +0 -> 20 "x"; +20 -> 21 "y"; +21 -> 22 "z"; +22 -> 23 "a"; +23 -> 24 "b"; +24 -> 25 "c"; +25 -> 26 "e"; +26 -> 27 "f"; + +06 -> x; +08 -> x; +14 -> x; +25 -> x; +27 -> x; + +x -> x ?; + +start: 0; +end: x; + diff --git a/tests/pcre-ac/out4-anchored.fsm b/tests/pcre-ac/out4-anchored.fsm new file mode 100644 index 000000000..8fb1c85d0 --- /dev/null +++ b/tests/pcre-ac/out4-anchored.fsm @@ -0,0 +1,49 @@ + +0 -> 01 "a"; +0 -> 01 "A"; +01 -> 02 "b"; +01 -> 02 "B"; +02 -> 03 "c"; +02 -> 03 "C"; +03 -> 04 "d"; +03 -> 04 "D"; +04 -> 05 "e"; +04 -> 05 "E"; +05 -> 06 "f"; +05 -> 06 "F"; +06 -> 07 "e"; +06 -> 07 "E"; +07 -> 08 "f"; +07 -> 08 "F"; + +0 -> 10 "f"; +0 -> 10 "F"; +10 -> 11 "c"; +10 -> 11 "C"; +11 -> 12 "d"; +11 -> 12 "D"; +12 -> 13 "e"; +12 -> 13 "E"; +13 -> 14 "f"; +13 -> 14 "F"; + +0 -> 20 "x"; +0 -> 20 "X"; +20 -> 21 "y"; +20 -> 21 "Y"; +21 -> 22 "z"; +21 -> 22 "Z"; +22 -> 23 "a"; +22 -> 23 "A"; +23 -> 24 "b"; +23 -> 24 "B"; +24 -> 25 "c"; +24 -> 25 "C"; +25 -> 26 "e"; +25 -> 26 "E"; +26 -> 27 "f"; +26 -> 27 "F"; + +start: 0; +end: 06, 08, 14, 25, 27; + diff --git a/tests/pcre-ac/out4-unanchored.fsm b/tests/pcre-ac/out4-unanchored.fsm new file mode 100644 index 000000000..03d6d7fc6 --- /dev/null +++ b/tests/pcre-ac/out4-unanchored.fsm @@ -0,0 +1,59 @@ + +0 -> 0 ?; + +0 -> 01 "a"; +0 -> 01 "A"; +01 -> 02 "b"; +01 -> 02 "B"; +02 -> 03 "c"; +02 -> 03 "C"; +03 -> 04 "d"; +03 -> 04 "D"; +04 -> 05 "e"; +04 -> 05 "E"; +05 -> 06 "f"; +05 -> 06 "F"; +06 -> 07 "e"; +06 -> 07 "E"; +07 -> 08 "f"; +07 -> 08 "F"; + +0 -> 10 "f"; +0 -> 10 "F"; +10 -> 11 "c"; +10 -> 11 "C"; +11 -> 12 "d"; +11 -> 12 "D"; +12 -> 13 "e"; +12 -> 13 "E"; +13 -> 14 "f"; +13 -> 14 "F"; + +0 -> 20 "x"; +0 -> 20 "X"; +20 -> 21 "y"; +20 -> 21 "Y"; +21 -> 22 "z"; +21 -> 22 "Z"; +22 -> 23 "a"; +22 -> 23 "A"; +23 -> 24 "b"; +23 -> 24 "B"; +24 -> 25 "c"; +24 -> 25 "C"; +25 -> 26 "e"; +25 -> 26 "E"; +26 -> 27 "f"; +26 -> 27 "F"; + +06 -> x; +08 -> x; +14 -> x; +25 -> x; +27 -> x; + +x -> x ?; + +start: 0; +end: x; + diff --git a/tests/pcre-ac/out5-anchored.fsm b/tests/pcre-ac/out5-anchored.fsm new file mode 100644 index 000000000..fc4e9f9ef --- /dev/null +++ b/tests/pcre-ac/out5-anchored.fsm @@ -0,0 +1,28 @@ + +0 -> 01 "a"; +01 -> 02 "b"; +02 -> 03 "c"; +03 -> 04 "d"; +04 -> 05 "e"; +05 -> 06 "f"; +06 -> 07 "e"; +07 -> 08 "f"; + +0 -> 10 "f"; +10 -> 11 "c"; +11 -> 12 "d"; +12 -> 13 "e"; +13 -> 14 "f"; + +0 -> 20 "x"; +20 -> 21 "y"; +21 -> 22 "z"; +22 -> 23 "a"; +23 -> 24 "b"; +24 -> 25 "c"; +25 -> 26 "e"; +26 -> 27 "f"; + +start: 0; +end: 06, 08, 14, 25, 27; + diff --git a/tests/pcre-ac/out5-unanchored.fsm b/tests/pcre-ac/out5-unanchored.fsm new file mode 120000 index 000000000..8e9833f75 --- /dev/null +++ b/tests/pcre-ac/out5-unanchored.fsm @@ -0,0 +1 @@ +out5-anchored.fsm \ No newline at end of file diff --git a/tests/pcre-ac/out6-anchored.fsm b/tests/pcre-ac/out6-anchored.fsm new file mode 120000 index 000000000..52c616bf1 --- /dev/null +++ b/tests/pcre-ac/out6-anchored.fsm @@ -0,0 +1 @@ +out6-unanchored.fsm \ No newline at end of file diff --git a/tests/pcre-ac/out6-unanchored.fsm b/tests/pcre-ac/out6-unanchored.fsm new file mode 100644 index 000000000..df8db384a --- /dev/null +++ b/tests/pcre-ac/out6-unanchored.fsm @@ -0,0 +1,38 @@ + +0 -> 0 ?; + +0 -> 01 "a"; +01 -> 02 "b"; +02 -> 03 "c"; +03 -> 04 "d"; +04 -> 05 "e"; +05 -> 06 "f"; +06 -> 07 "e"; +07 -> 08 "f"; + +0 -> 10 "f"; +10 -> 11 "c"; +11 -> 12 "d"; +12 -> 13 "e"; +13 -> 14 "f"; + +0 -> 20 "x"; +20 -> 21 "y"; +21 -> 22 "z"; +22 -> 23 "a"; +23 -> 24 "b"; +24 -> 25 "c"; +25 -> 26 "e"; +26 -> 27 "f"; + +06 -> x; +08 -> x; +14 -> x; +25 -> x; +27 -> x; + +x -> x ?; + +start: 0; +end: x; + diff --git a/tests/pcre-ac/out7-anchored.fsm b/tests/pcre-ac/out7-anchored.fsm new file mode 120000 index 000000000..b0c13e544 --- /dev/null +++ b/tests/pcre-ac/out7-anchored.fsm @@ -0,0 +1 @@ +out7-unanchored.fsm \ No newline at end of file diff --git a/tests/pcre-ac/out7-unanchored.fsm b/tests/pcre-ac/out7-unanchored.fsm new file mode 100644 index 000000000..df8db384a --- /dev/null +++ b/tests/pcre-ac/out7-unanchored.fsm @@ -0,0 +1,38 @@ + +0 -> 0 ?; + +0 -> 01 "a"; +01 -> 02 "b"; +02 -> 03 "c"; +03 -> 04 "d"; +04 -> 05 "e"; +05 -> 06 "f"; +06 -> 07 "e"; +07 -> 08 "f"; + +0 -> 10 "f"; +10 -> 11 "c"; +11 -> 12 "d"; +12 -> 13 "e"; +13 -> 14 "f"; + +0 -> 20 "x"; +20 -> 21 "y"; +21 -> 22 "z"; +22 -> 23 "a"; +23 -> 24 "b"; +24 -> 25 "c"; +25 -> 26 "e"; +26 -> 27 "f"; + +06 -> x; +08 -> x; +14 -> x; +25 -> x; +27 -> x; + +x -> x ?; + +start: 0; +end: x; +