-/* 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"
{
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"
}
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<Tag> &tags) const
+std::string InputAPI::expr_tag(const std::valarray<Tag> &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());
}
}
std::string expr_dist () const;
std::string stmt_dist (uint32_t ind, const bool *tagmask,
const std::valarray<Tag> &tags) const;
- std::string expr_tag(const std::string &var) const;
- std::string expr_tag_fix(const Tag &tag, const std::valarray<Tag> &tags) const;
+ std::string expr_tag(const std::valarray<Tag> &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;
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
"@" @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;
}