From d02661df0a008e6fc4c7e09bd966a9d1658728c5 Mon Sep 17 00:00:00 2001 From: Ulya Trofimovich Date: Fri, 13 May 2016 14:35:10 +0100 Subject: [PATCH] Moved dispatch on fixed/variable tags inside of tag-printing function. --- re2c/bootstrap/src/codegen/subst_tags.cc | 13 +++++------ re2c/src/codegen/input_api.cc | 28 ++++++++++++++---------- re2c/src/codegen/input_api.h | 6 +++-- re2c/src/codegen/subst_tags.re | 7 ++---- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/re2c/bootstrap/src/codegen/subst_tags.cc b/re2c/bootstrap/src/codegen/subst_tags.cc index 1cf27ee1..211fcc99 100644 --- a/re2c/bootstrap/src/codegen/subst_tags.cc +++ b/re2c/bootstrap/src/codegen/subst_tags.cc @@ -1,4 +1,4 @@ -/* Generated by re2c 0.16 on Fri May 13 13:49:35 2016 */ +/* Generated by re2c 0.16 on Fri May 13 14:25:27 2016 */ #line 1 "../src/codegen/subst_tags.re" #include "src/codegen/emit.h" #include "src/codegen/input_api.h" @@ -113,21 +113,18 @@ yy7: { const std::string name((base + yytag1name), head); for (size_t i = ltag; i < htag; ++i) { - const Tag &t = tags[i]; - if (name == *t.name) { + if (name == *tags[i].name) { result.append(tail, base); - result.append(t.type == Tag::VAR - ? opts->input_api.expr_tag(vartag_expr(t.name, t.rule)) - : opts->input_api.expr_tag_fix(t, tags)); + result.append(opts->input_api.expr_tag(tags, i)); tail = head; break; } } goto loop; } -#line 129 "src/codegen/subst_tags.cc" +#line 126 "src/codegen/subst_tags.cc" } -#line 56 "../src/codegen/subst_tags.re" +#line 53 "../src/codegen/subst_tags.re" } diff --git a/re2c/src/codegen/input_api.cc b/re2c/src/codegen/input_api.cc index b61269d4..b02e1c85 100644 --- a/re2c/src/codegen/input_api.cc +++ b/re2c/src/codegen/input_api.cc @@ -121,34 +121,38 @@ std::string InputAPI::stmt_dist (uint32_t ind, const bool *mask, return s + expr_dist() + ";\n"; } -std::string InputAPI::expr_tag(const std::string &var) const +std::string InputAPI::expr_tag_var(const std::string &expr) const { switch (type_) { - case DEFAULT: return "(" + opts->yyctxmarker + " + " + var + ")"; - case CUSTOM: return opts->tags_yytag + "(" + var + ")"; + case DEFAULT: return "(" + opts->yyctxmarker + " + " + expr + ")"; + case CUSTOM: return opts->tags_yytag + "(" + expr + ")"; default: assert(false); } } -std::string InputAPI::expr_tag_fix(const Tag &tag, const std::valarray &tags) const +std::string InputAPI::expr_tag(const std::valarray &tags, size_t idx) const { - std::ostringstream s; - if (tag.fix.base == Tag::NONE) { + const Tag &t = tags[idx]; + if (t.type == Tag::VAR) { + return expr_tag_var(vartag_expr(t.name, t.rule)); + } else if (t.fix.base != Tag::NONE) { + const Tag &o = tags[tags[t.fix.base].var.orig]; + std::ostringstream s; + s << "(" << vartag_expr(o.name, o.rule) << " - " << t.fix.dist << ")"; + return expr_tag_var(s.str()); + } else { + std::ostringstream s; switch (type_) { case DEFAULT: // optimize '(YYCTXMARKER + ((YYCURSOR - YCTXMARKER) - yyctx))' // to '(YYCURSOR - yytag)' - s << "(" << opts->yycursor << " - " << tag.fix.dist << ")"; + s << "(" << opts->yycursor << " - " << t.fix.dist << ")"; break; case CUSTOM: - s << opts->tags_yytag << "(" << opts->tags_yydist << "() - " << tag.fix.dist << ")"; + s << opts->tags_yytag << "(" << opts->tags_yydist << "() - " << t.fix.dist << ")"; break; } return s.str(); - } else { - const Tag &t = tags[tags[tag.fix.base].var.orig]; - s << "(" << vartag_expr(t.name, t.rule) << " - " << tag.fix.dist << ")"; - return expr_tag(s.str()); } } diff --git a/re2c/src/codegen/input_api.h b/re2c/src/codegen/input_api.h index b05f9911..e698f896 100644 --- a/re2c/src/codegen/input_api.h +++ b/re2c/src/codegen/input_api.h @@ -35,8 +35,7 @@ public: std::string expr_dist () const; std::string stmt_dist (uint32_t ind, const bool *tagmask, const std::valarray &tags) const; - std::string expr_tag(const std::string &var) const; - std::string expr_tag_fix(const Tag &tag, const std::valarray &tags) const; + std::string expr_tag(const std::valarray &tags, size_t idx) const; std::string stmt_restore (uint32_t ind) const; std::string stmt_restorectx_fix (uint32_t ind, size_t dist) const; std::string stmt_restorectx_var (uint32_t ind) const; @@ -47,6 +46,9 @@ public: std::string stmt_skip_backup_peek (uint32_t ind) const; std::string expr_lessthan_one () const; std::string expr_lessthan (size_t n) const; + +private: + std::string expr_tag_var(const std::string &expr) const; }; } // end namespace re2c diff --git a/re2c/src/codegen/subst_tags.re b/re2c/src/codegen/subst_tags.re index 940aa8a8..81f28048 100644 --- a/re2c/src/codegen/subst_tags.re +++ b/re2c/src/codegen/subst_tags.re @@ -41,12 +41,9 @@ std::string subst_tags(const std::string &action, "@" @name [a-zA-Z0-9_]+ { const std::string name(@name, head); for (size_t i = ltag; i < htag; ++i) { - const Tag &t = tags[i]; - if (name == *t.name) { + if (name == *tags[i].name) { result.append(tail, base); - result.append(t.type == Tag::VAR - ? opts->input_api.expr_tag(vartag_expr(t.name, t.rule)) - : opts->input_api.expr_tag_fix(t, tags)); + result.append(opts->input_api.expr_tag(tags, i)); tail = head; break; } -- 2.40.0