for (size_t i = 0; i < rule.ctxfix.size(); ++i) {
const CtxFix &ctx = rule.ctxfix[i];
- const std::string basename = (ctx.base == CtxFix::RIGHTMOST)
- ? opts->input_api.expr_dist()
- : contexts[ctx.base].fullname;
- std::ostringstream offs;
- offs << "(" << basename << " - " << ctx.dist << ")";
- const std::string ctx_value = opts->input_api.expr_ctx(offs.str());
- rreplace_substr(action, "@" + *ctx.name, ctx_value);
+ rreplace_substr(action, "@" + *ctx.name,
+ opts->input_api.expr_ctx_fix(ctx, contexts));
}
}
return s + expr_dist() + ";\n";
}
-std::string InputAPI::expr_ctx (const std::string &ctx) const
+std::string InputAPI::expr_ctx(const std::string &ctx) const
{
- std::string s;
switch (type_) {
- case DEFAULT:
- s = "(" + opts->yyctxmarker + " + " + ctx + ")";
- break;
- case CUSTOM:
- s = opts->yyctx + "(" + ctx + ")";
- break;
+ case DEFAULT: return "(" + opts->yyctxmarker + " + " + ctx + ")";
+ case CUSTOM: return opts->yyctx + "(" + ctx + ")";
+ default: assert(false);
+ }
+}
+
+std::string InputAPI::expr_ctx_fix(const CtxFix &ctx, const std::vector<CtxVar> &ctxvars) const
+{
+ std::ostringstream s;
+ if (ctx.base == CtxFix::RIGHTMOST) {
+ switch (type_) {
+ case DEFAULT:
+ // optimize '(YYCTXMARKER + ((YYCURSOR - YCTXMARKER) - yyctx))'
+ // to '(YYCURSOR - yyctx)'
+ s << "(" << opts->yycursor << " - " << ctx.dist << ")";
+ break;
+ case CUSTOM:
+ s << opts->yyctx << "(" << opts->yydist << "() - " << ctx.dist << ")";
+ break;
+ }
+ return s.str();
+ } else {
+ s << "(" << ctxvars[ctx.base].fullname << " - " << ctx.dist << ")";
+ return expr_ctx(s.str());
}
- return s;
}
std::string InputAPI::stmt_restore (uint32_t ind) const
#include <string>
#include <vector>
+#include "src/ir/ctx.h"
+
namespace re2c
{
-struct CtxVar;
-
class InputAPI
{
public:
std::string stmt_dist (uint32_t ind, const std::set<size_t> &ctxs,
const std::vector<CtxVar> &contexts) const;
std::string expr_ctx (const std::string &ctx) const;
+ std::string expr_ctx_fix (const CtxFix &ctx, const std::vector<CtxVar> &ctxvars) 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;
++YYCURSOR;
{
printf("'%.*s', '%.*s', '%.*s', '%.*s', '%.*s'\n",
- (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 14)) - YYCTXMARKER, YYCTXMARKER,
- (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 12)) - (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 14)), (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 14)),
- (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 9)) - (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 12)), (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 12)),
- (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 5)) - (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 9)), (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 9)),
- YYCURSOR - (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 5)), (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 5)));
+ (YYCURSOR - 14) - YYCTXMARKER, YYCTXMARKER,
+ (YYCURSOR - 12) - (YYCURSOR - 14), (YYCURSOR - 14),
+ (YYCURSOR - 9) - (YYCURSOR - 12), (YYCURSOR - 12),
+ (YYCURSOR - 5) - (YYCURSOR - 9), (YYCURSOR - 9),
+ YYCURSOR - (YYCURSOR - 5), (YYCURSOR - 5));
return;
}
}
YYRESTORECTX (YYDIST() - 5);
{
printf("'%.*s', '%.*s', '%.*s', '%.*s', '%s'\n",
- YYCTX((YYDIST() - 9)) - YYCTXMARKER, YYCTXMARKER,
- YYCTX((YYDIST() - 7)) - YYCTX((YYDIST() - 9)), YYCTX((YYDIST() - 9)),
- YYCTX((YYDIST() - 4)) - YYCTX((YYDIST() - 7)), YYCTX((YYDIST() - 7)),
- YYCURSOR - YYCTX((YYDIST() - 4)), YYCTX((YYDIST() - 4)),
+ YYCTX(YYDIST() - 9) - YYCTXMARKER, YYCTXMARKER,
+ YYCTX(YYDIST() - 7) - YYCTX(YYDIST() - 9), YYCTX(YYDIST() - 9),
+ YYCTX(YYDIST() - 4) - YYCTX(YYDIST() - 7), YYCTX(YYDIST() - 7),
+ YYCURSOR - YYCTX(YYDIST() - 4), YYCTX(YYDIST() - 4),
YYCURSOR);
return;
}
YYCURSOR -= 5;
{
printf("'%.*s', '%.*s', '%.*s', '%.*s', '%s'\n",
- (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 9)) - YYCTXMARKER, YYCTXMARKER,
- (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 7)) - (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 9)), (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 9)),
- (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 4)) - (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 7)), (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 7)),
- YYCURSOR - (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 4)), (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 4)),
+ (YYCURSOR - 9) - YYCTXMARKER, YYCTXMARKER,
+ (YYCURSOR - 7) - (YYCURSOR - 9), (YYCURSOR - 9),
+ (YYCURSOR - 4) - (YYCURSOR - 7), (YYCURSOR - 7),
+ YYCURSOR - (YYCURSOR - 4), (YYCURSOR - 4),
YYCURSOR);
return;
}
(YYCTXMARKER + yyctx0p1) - YYCTXMARKER, YYCTXMARKER,
(YYCTXMARKER + (yyctx0p3 - 1)) - (YYCTXMARKER + yyctx0p1), (YYCTXMARKER + yyctx0p1),
(YYCTXMARKER + yyctx0p3) - (YYCTXMARKER + (yyctx0p3 - 1)), (YYCTXMARKER + (yyctx0p3 - 1)),
- (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 1)) - (YYCTXMARKER + yyctx0p3), (YYCTXMARKER + yyctx0p3),
- YYCURSOR - (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 1)), (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 1)));
+ (YYCURSOR - 1) - (YYCTXMARKER + yyctx0p3), (YYCTXMARKER + yyctx0p3),
+ YYCURSOR - (YYCURSOR - 1), (YYCURSOR - 1));
return;
}
}