if (s->link)
{
- need(o, ind, readCh, s->depth, initial.setMarker && bUsedYYMarker);
+ need(o, ind, readCh, s->depth, initial.setMarker);
}
else
{
- if (initial.setMarker && bUsedYYMarker)
+ if (initial.setMarker)
{
o << input_api.stmt_backup (ind);
}
if (s->link)
{
- if (bUsedYYMarker)
- {
- o << input_api.stmt_skip_backup (ind);
- }
+ o << input_api.stmt_skip_backup (ind);
need(o, ind, readCh, s->depth, false);
}
else
{
- if (bUsedYYMarker)
- {
- o << input_api.stmt_skip_backup_peek (ind);
- }
- else
- {
- o << input_api.stmt_skip_peek (ind);
- }
+ o << input_api.stmt_skip_backup_peek (ind);
readCh = false;
}
}
{
if (accept.size() > 0)
{
- bUsedYYMarker = true;
if (!DFlag)
{
o << input_api.stmt_restore (ind);
memset(saves, ~0, (nRules)*sizeof(*saves));
// mark backtracking points
- bSaveOnHead = false;
-
+ std::vector<State *> backup_states;
for (State * s = head; s; s = s->next)
{
if (s->rule)
{
saves[s->rule->accept] = nSaves++;
}
-
- bSaveOnHead |= s == head;
- s->action.set_save (saves[s->rule->accept]);
+ backup_states.push_back (s);
}
}
}
if (accfixup)
{
+ // insert backup actions
+ for (std::vector<State *>::iterator i = backup_states.begin (); i != backup_states.end (); ++i)
+ {
+ (*i)->action.set_save (saves[(*i)->rule->accept]);
+ }
+ // backup action for initial state must be saved explicitly
+ // because it will be overwritten by initial action
+ bSaveOnHead = !backup_states.empty () && backup_states.front () == head;
for (uint32_t i = 0; i < nRules; ++i)
{
if (saves[i] != ~0u)
extern bool flag_skeleton;
extern bool bNoGenerationDate;
-extern bool bUsedYYMarker;
extern bool bUsedYYBitmap;
extern std::string labelPrefix;
bool bNoGenerationDate = false;
bool bUsedYYBitmap = false;
-bool bUsedYYMarker = true;
bool bEmitYYCh = true;
bool bUseStateNext = false;
bool bUseYYFill = true;
--- /dev/null
+/* Generated by re2c */
+
+{
+ YYCTYPE yych;
+ switch (YYGETCONDITION()) {
+ case yycc1: goto yyc_c1;
+ case yycc2: goto yyc_c2;
+ }
+/* *********************************** */
+yyc_c1:
+ if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
+ yych = *YYCURSOR;
+ switch (yych) {
+ case 'b': goto yy5;
+ default: goto yy3;
+ }
+yy3:
+ ++YYCURSOR;
+ if (YYLIMIT <= YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+yy4:
+ switch (yych) {
+ case 'a': goto yy7;
+ default: goto yy3;
+ }
+yy5:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+ goto yy4;
+ {}
+yy7:
+ ++YYCURSOR;
+ if (YYLIMIT <= YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+ switch (yych) {
+ case 'a': goto yy7;
+ default: goto yy3;
+ }
+ {}
+/* *********************************** */
+yyc_c2:
+ if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
+ yych = *YYCURSOR;
+ switch (yych) {
+ case 'd': goto yy13;
+ default: goto yy12;
+ }
+yy12:
+ YYCURSOR = YYMARKER;
+ goto yy14;
+yy13:
+ yych = *(YYMARKER = ++YYCURSOR);
+ switch (yych) {
+ case 'd': goto yy15;
+ default: goto yy14;
+ }
+yy14:
+ {}
+yy15:
+ yych = *++YYCURSOR;
+ switch (yych) {
+ case 'd': goto yy16;
+ default: goto yy12;
+ }
+yy16:
+ ++YYCURSOR;
+ {}
+}
+
--- /dev/null
+/*!re2c
+
+<c1> [^]+ "a" {}
+<c1> "b" {}
+
+<c2> "d" {}
+<c2> "ddd" {}
+
+*/
}
yy5:
YYDEBUG(5, *YYCURSOR);
- yych = *(YYMARKER = ++YYCURSOR);
+ ++YYCURSOR;
+ yych = *YYCURSOR;
goto yy64;
yy6:
YYDEBUG(6, *YYCURSOR);
goto yy8;
yy10:
YYDEBUG(10, *YYCURSOR);
- yych = *(YYMARKER = ++YYCURSOR);
+ yych = *++YYCURSOR;
{
static void *yytarget[256] = {
&&yy26, &&yy26, &&yy26, &&yy26, &&yy26, &&yy26, &&yy26, &&yy26,
goto yy26;
yy14:
YYDEBUG(14, *YYCURSOR);
- yych = *(YYMARKER = ++YYCURSOR);
+ ++YYCURSOR;
+ yych = *YYCURSOR;
goto yy59;
YYDEBUG(15, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
goto yy61;
yy63:
YYDEBUG(63, *YYCURSOR);
- YYMARKER = ++YYCURSOR;
+ ++YYCURSOR;
YYFILL(2);
yych = *YYCURSOR;
yy64:
}
yy65:
YYDEBUG(65, *YYCURSOR);
- YYMARKER = ++YYCURSOR;
+ ++YYCURSOR;
YYFILL(2);
yych = *YYCURSOR;
YYDEBUG(66, *YYCURSOR);
}
yy137:
YYDEBUG(137, *YYCURSOR);
- yych = *(YYMARKER = ++YYCURSOR);
+ yych = *++YYCURSOR;
{
static void *yytarget[256] = {
&&yy136, &&yy136, &&yy136, &&yy136, &&yy136, &&yy136, &&yy136, &&yy136,
goto yy139;
yy141:
YYDEBUG(141, *YYCURSOR);
- yych = *(YYMARKER = ++YYCURSOR);
+ yych = *++YYCURSOR;
goto yy143;
yy142:
YYDEBUG(142, *YYCURSOR);
goto yy139;
yy148:
YYDEBUG(148, *YYCURSOR);
- YYMARKER = ++YYCURSOR;
+ ++YYCURSOR;
YYFILL(2);
yych = *YYCURSOR;
yy149: