From 9c2ee72734b2965a16d88d93a9fe14b7dd2dc6e3 Mon Sep 17 00:00:00 2001 From: helly Date: Fri, 20 Jan 2006 20:42:14 +0000 Subject: [PATCH] - Applied #1411087 variable length trailing context. --- CHANGELOG | 1 + actions.cc | 14 +++- bootstrap/scanner.cc | 97 ++++++++++----------- code.cc | 17 +++- dfa.cc | 11 ++- dfa.h | 1 + globals.h | 1 + main.cc | 1 + test/ctx.b.c | 190 +++++++++++++++++++++++++++++++++++++++++ test/ctx.b.re | 75 +++++++++++++++++ test/ctx.c | 196 +++++++++++++++++++++++++++++++++++++++++++ test/ctx.re | 75 +++++++++++++++++ test/ctx.s.c | 153 +++++++++++++++++++++++++++++++++ test/ctx.s.re | 75 +++++++++++++++++ test/modula.c | 177 +++++++++++++++++++------------------- 15 files changed, 942 insertions(+), 142 deletions(-) create mode 100755 test/ctx.b.c create mode 100755 test/ctx.b.re create mode 100755 test/ctx.c create mode 100755 test/ctx.re create mode 100755 test/ctx.s.c create mode 100755 test/ctx.s.re diff --git a/CHANGELOG b/CHANGELOG index 96f928fe..3c60edc2 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -9,6 +9,7 @@ Version 0.10.0 (????-??-??) - Added support for DOS line endings. - Added experimental unicode support. - Added config_w32.h to build out of the box on windows (using msvc 2002+). +- Applied #1411087 variable length trailing context. - Applied #1408326 do not generate goto next state. - Applied #1408282 CharSet initialization fix. - Applied #1408278 readsome with MSVC. diff --git a/actions.cc b/actions.cc index 4795ac6d..c38da901 100644 --- a/actions.cc +++ b/actions.cc @@ -59,7 +59,7 @@ void showIns(std::ostream &o, const Ins &i, const Ins &base) break; case CTXT: - o << "term " << ((RuleOp*) i.i.link)->accept; + o << "ctxt"; break; case TERM: @@ -888,7 +888,7 @@ void RuleOp::calcSize(Char *rep) { exp->calcSize(rep); ctx->calcSize(rep); - size = exp->size + ctx->size + 1; + size = exp->size + (ctx->size ? ctx->size + 2 : 1); } void RuleOp::compile(Char *rep, Ins *i) @@ -896,8 +896,14 @@ void RuleOp::compile(Char *rep, Ins *i) ins = i; exp->compile(rep, &i[0]); i += exp->size; - ctx->compile(rep, &i[0]); - i += ctx->size; + if (ctx->size) + { + i->i.tag = CTXT; + i->i.link = &i[1]; + i++; + ctx->compile(rep, &i[0]); + i += ctx->size; + } i->i.tag = TERM; i->i.link = this; } diff --git a/bootstrap/scanner.cc b/bootstrap/scanner.cc index e05504f8..d4a87c02 100644 --- a/bootstrap/scanner.cc +++ b/bootstrap/scanner.cc @@ -1,4 +1,4 @@ -/* Generated by re2c 0.10.0.dev on Thu Jan 19 23:45:52 2006 */ +/* Generated by re2c 0.10.0.dev on Fri Jan 20 21:17:47 2006 */ #line 1 "scanner.re" /* $Id$ */ #include @@ -92,6 +92,7 @@ echo: { YYCTYPE yych; unsigned int yyaccept = 0; +yy0: if((YYLIMIT - YYCURSOR) < 11) YYFILL(11); yych = *YYCURSOR; if(yych <= ')') { @@ -110,7 +111,7 @@ yy3: { goto echo; } -#line 114 "scanner.cc" +#line 115 "scanner.cc" yy4: yych = *++YYCURSOR; if(yych == '/') goto yy10; @@ -123,7 +124,7 @@ yy5: tok = pos = cursor; cline++; oline++; goto echo; } -#line 127 "scanner.cc" +#line 128 "scanner.cc" yy7: ++YYCURSOR; #line 131 "scanner.re" @@ -133,7 +134,7 @@ yy7: RETURN(0); } } -#line 137 "scanner.cc" +#line 138 "scanner.cc" yy9: yych = *++YYCURSOR; goto yy3; @@ -149,7 +150,7 @@ yy10: tok = pos = cursor; goto echo; } -#line 153 "scanner.cc" +#line 154 "scanner.cc" yy12: yych = *++YYCURSOR; if(yych == '!') goto yy14; @@ -181,7 +182,7 @@ yy16: tok = cursor; RETURN(1); } -#line 185 "scanner.cc" +#line 186 "scanner.cc" yy21: yych = *++YYCURSOR; if(yych != 'x') goto yy13; @@ -203,7 +204,7 @@ yy21: ignore_eoc = true; goto echo; } -#line 207 "scanner.cc" +#line 208 "scanner.cc" } #line 140 "scanner.re" @@ -228,7 +229,7 @@ scan: goto value; } -#line 232 "scanner.cc" +#line 233 "scanner.cc" { YYCTYPE yych; unsigned int yyaccept = 0; @@ -306,14 +307,14 @@ yy32: { depth = 1; goto code; } -#line 310 "scanner.cc" +#line 311 "scanner.cc" yy33: ++YYCURSOR; if((yych = *YYCURSOR) == '*') goto yy92; yy34: #line 192 "scanner.re" { RETURN(*tok); } -#line 317 "scanner.cc" +#line 318 "scanner.cc" yy35: ++YYCURSOR; if((yych = *YYCURSOR) == '/') goto yy90; @@ -321,7 +322,7 @@ yy36: #line 194 "scanner.re" { yylval.op = *tok; RETURN(CLOSE); } -#line 325 "scanner.cc" +#line 326 "scanner.cc" yy37: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); @@ -329,7 +330,7 @@ yy37: yy38: #line 179 "scanner.re" { fatal("unterminated string constant (missing \")"); } -#line 333 "scanner.cc" +#line 334 "scanner.cc" yy39: yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); @@ -337,7 +338,7 @@ yy39: yy40: #line 180 "scanner.re" { fatal("unterminated string constant (missing ')"); } -#line 341 "scanner.cc" +#line 342 "scanner.cc" yy41: yyaccept = 3; yych = *(YYMARKER = ++YYCURSOR); @@ -347,7 +348,7 @@ yy41: yy42: #line 190 "scanner.re" { fatal("unterminated range (missing ])"); } -#line 351 "scanner.cc" +#line 352 "scanner.cc" yy43: yych = *++YYCURSOR; goto yy34; @@ -363,7 +364,7 @@ yy46: { cur = cursor; yylval.symbol = Symbol::find(token()); return ID; } -#line 367 "scanner.cc" +#line 368 "scanner.cc" yy47: yych = *++YYCURSOR; goto yy61; @@ -374,7 +375,7 @@ yy48: yylval.regexp = mkDot(); return RANGE; } -#line 378 "scanner.cc" +#line 379 "scanner.cc" yy50: ++YYCURSOR; yych = *YYCURSOR; @@ -382,7 +383,7 @@ yy50: yy51: #line 230 "scanner.re" { goto scan; } -#line 386 "scanner.cc" +#line 387 "scanner.cc" yy52: ++YYCURSOR; yy53: @@ -391,7 +392,7 @@ yy53: pos = cursor; cline++; goto scan; } -#line 395 "scanner.cc" +#line 396 "scanner.cc" yy54: ++YYCURSOR; if((yych = *YYCURSOR) == 0x0A) goto yy57; @@ -409,7 +410,7 @@ yy55: } goto scan; } -#line 413 "scanner.cc" +#line 414 "scanner.cc" yy56: yych = *++YYCURSOR; goto yy55; @@ -494,7 +495,7 @@ yy69: yylval.str = new Str(token()); return CONFIG; } -#line 498 "scanner.cc" +#line 499 "scanner.cc" yy70: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); @@ -532,7 +533,7 @@ yy75: { cur = cursor; yylval.regexp = ranToRE(token()); return RANGE; } -#line 536 "scanner.cc" +#line 537 "scanner.cc" yy77: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); @@ -545,7 +546,7 @@ yy78: { cur = cursor; yylval.regexp = invToRE(token()); return RANGE; } -#line 549 "scanner.cc" +#line 550 "scanner.cc" yy80: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); @@ -569,7 +570,7 @@ yy83: { cur = cursor; yylval.regexp = strToCaseInsensitiveRE(token()); return STRING; } -#line 573 "scanner.cc" +#line 574 "scanner.cc" yy85: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); @@ -593,19 +594,19 @@ yy88: { cur = cursor; yylval.regexp = strToRE(token()); return STRING; } -#line 597 "scanner.cc" +#line 598 "scanner.cc" yy90: ++YYCURSOR; #line 168 "scanner.re" { tok = cursor; RETURN(0); } -#line 603 "scanner.cc" +#line 604 "scanner.cc" yy92: ++YYCURSOR; #line 165 "scanner.re" { depth = 1; goto comment; } -#line 609 "scanner.cc" +#line 610 "scanner.cc" yy94: yych = *++YYCURSOR; if(yych == ',') goto yy108; @@ -628,14 +629,14 @@ yy97: yy98: #line 212 "scanner.re" { fatal("illegal closure form, use '{n}', '{n,}', '{n,m}' where n and m are numbers"); } -#line 632 "scanner.cc" +#line 633 "scanner.cc" yy99: ++YYCURSOR; #line 200 "scanner.re" { yylval.extop.minsize = atoi((char *)tok+1); yylval.extop.maxsize = atoi((char *)tok+1); RETURN(CLOSESIZE); } -#line 639 "scanner.cc" +#line 640 "scanner.cc" yy101: yyaccept = 6; yych = *(YYMARKER = ++YYCURSOR); @@ -647,7 +648,7 @@ yy101: { yylval.extop.minsize = atoi((char *)tok+1); yylval.extop.maxsize = -1; RETURN(CLOSESIZE); } -#line 651 "scanner.cc" +#line 652 "scanner.cc" yy104: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); @@ -660,7 +661,7 @@ yy104: { yylval.extop.minsize = atoi((char *)tok+1); yylval.extop.maxsize = MAX(yylval.extop.minsize,atoi(strchr((char *)tok, ',')+1)); RETURN(CLOSESIZE); } -#line 664 "scanner.cc" +#line 665 "scanner.cc" yy108: yyaccept = 6; yych = *(YYMARKER = ++YYCURSOR); @@ -671,14 +672,14 @@ yy108: #line 197 "scanner.re" { yylval.op = '*'; RETURN(CLOSE); } -#line 675 "scanner.cc" +#line 676 "scanner.cc" } #line 249 "scanner.re" code: -#line 682 "scanner.cc" +#line 683 "scanner.cc" { YYCTYPE yych; unsigned int yyaccept = 0; @@ -709,13 +710,13 @@ code: return CODE; } goto code; } -#line 713 "scanner.cc" +#line 714 "scanner.cc" yy115: ++YYCURSOR; #line 259 "scanner.re" { ++depth; goto code; } -#line 719 "scanner.cc" +#line 720 "scanner.cc" yy117: ++YYCURSOR; #line 261 "scanner.re" @@ -723,13 +724,13 @@ yy117: pos = cursor; cline++; goto code; } -#line 727 "scanner.cc" +#line 728 "scanner.cc" yy119: ++YYCURSOR; yy120: #line 265 "scanner.re" { goto code; } -#line 733 "scanner.cc" +#line 734 "scanner.cc" yy121: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); @@ -786,7 +787,7 @@ yy128: comment: -#line 790 "scanner.cc" +#line 791 "scanner.cc" { YYCTYPE yych; if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); @@ -805,7 +806,7 @@ yy132: yy133: #line 281 "scanner.re" { goto comment; } -#line 809 "scanner.cc" +#line 810 "scanner.cc" yy134: yych = *++YYCURSOR; if(yych == '*') goto yy138; @@ -817,7 +818,7 @@ yy135: tok = pos = cursor; cline++; goto comment; } -#line 821 "scanner.cc" +#line 822 "scanner.cc" yy137: yych = *++YYCURSOR; goto yy133; @@ -827,7 +828,7 @@ yy138: { ++depth; fatal("ambiguous /* found"); goto comment; } -#line 831 "scanner.cc" +#line 832 "scanner.cc" yy140: ++YYCURSOR; #line 270 "scanner.re" @@ -835,14 +836,14 @@ yy140: goto scan; else goto comment; } -#line 839 "scanner.cc" +#line 840 "scanner.cc" } #line 282 "scanner.re" config: -#line 846 "scanner.cc" +#line 847 "scanner.cc" { YYCTYPE yych; if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); @@ -861,7 +862,7 @@ yy144: yy145: #line 286 "scanner.re" { goto config; } -#line 865 "scanner.cc" +#line 866 "scanner.cc" yy146: ++YYCURSOR; yych = *YYCURSOR; @@ -872,12 +873,12 @@ yy147: cur = cursor; RETURN('='); } -#line 876 "scanner.cc" +#line 877 "scanner.cc" yy148: ++YYCURSOR; #line 291 "scanner.re" { fatal("missing '='"); } -#line 881 "scanner.cc" +#line 882 "scanner.cc" yy150: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); @@ -900,7 +901,7 @@ yy153: value: -#line 904 "scanner.cc" +#line 905 "scanner.cc" { YYCTYPE yych; unsigned int yyaccept = 0; @@ -940,7 +941,7 @@ yy156: iscfg = 0; return VALUE; } -#line 944 "scanner.cc" +#line 945 "scanner.cc" yy157: ++YYCURSOR; if((yych = *YYCURSOR) <= 0x0D) { @@ -961,7 +962,7 @@ yy158: iscfg = 0; return NUMBER; } -#line 965 "scanner.cc" +#line 966 "scanner.cc" yy159: yych = *++YYCURSOR; if(yych <= '0') goto yy163; diff --git a/code.cc b/code.cc index cde4772e..250bdcda 100644 --- a/code.cc +++ b/code.cc @@ -482,9 +482,10 @@ void Rule::emit(std::ostream &o, uint ind, bool &) const { uint back = rule->ctx->fixedLength(); - if (back != ~0u && back > 0u) + if (back != 0u) { - o << indent(ind) << "YYCURSOR -= " << back << ";"; + o << indent(ind) << "YYCURSOR = yyctxmarker;\n"; + oline++; } line_source(rule->code->line, o); @@ -892,6 +893,12 @@ void State::emit(std::ostream &o, uint ind, bool &readCh) const o << indent(ind) << "YYDEBUG(" << label << ", *YYCURSOR);\n"; oline++; } + if (isPreCtxt) + { + o << indent(ind) << "yyctxmarker = YYCURSOR + 1;\n"; + oline++; + bUsedCtxMarker = true; + } action->emit(o, ind, readCh); } @@ -1411,6 +1418,12 @@ void DFA::emit(std::ostream &o, uint ind) oline += 2; } + if (bUsedCtxMarker) + { + o << indent(ind) << "YYCTYPE *yyctxmarker = YYCURSOR;\n"; + oline++; + } + if (hasFillLabels == true) { vUsedLabels.insert(start_label); diff --git a/dfa.cc b/dfa.cc index 74e9d7ff..68ab6b79 100644 --- a/dfa.cc +++ b/dfa.cc @@ -183,7 +183,8 @@ State::State() , depth(0) , kCount(0) , kernel(NULL) - , isBase(0) + , isPreCtxt(false) + , isBase(false) , go() , action(NULL) { @@ -207,7 +208,7 @@ static Ins **closure(Ins **cP, Ins *i) cP = closure(cP, i + 1); i = (Ins*) i->i.link; } - else if (i->i.tag == GOTO) + else if (i->i.tag == GOTO || i->i.tag == CTXT) { i = (Ins*) i->i.link; } @@ -267,6 +268,10 @@ DFA::DFA(Ins *ins, uint ni, uint lb, uint ub, Char *rep) if (!s->rule || ((RuleOp*) i->i.link)->accept < s->rule->accept) s->rule = (RuleOp*) i->i.link; } + else if (i->i.tag == CTXT) + { + s->isPreCtxt = true; + } } for (j = 0; j < nGoTos; ++j) @@ -343,7 +348,7 @@ State *DFA::findState(Ins **kernel, uint kCount) for (iP = kernel; (i = *iP); ++iP) { - if (i->i.tag == CHAR || i->i.tag == TERM) + if (i->i.tag == CHAR || i->i.tag == TERM || i->i.tag == CTXT) { *cP++ = i; } diff --git a/dfa.h b/dfa.h index b3959564..5a855664 100644 --- a/dfa.h +++ b/dfa.h @@ -194,6 +194,7 @@ public: uint kCount; Ins **kernel; + bool isPreCtxt; bool isBase; Go go; Action *action; diff --git a/globals.h b/globals.h index 95d5a807..18b590b7 100644 --- a/globals.h +++ b/globals.h @@ -20,6 +20,7 @@ extern bool sFlag; extern bool wFlag; extern bool bUsedYYAccept; +extern bool bUsedCtxMarker; extern bool bUseStartLabel; extern std::string startLabelName; extern unsigned int oline; diff --git a/main.cc b/main.cc index 9c5828e5..5e1a6e86 100644 --- a/main.cc +++ b/main.cc @@ -27,6 +27,7 @@ bool iFlag = false; bool sFlag = false; bool wFlag = false; bool bUsedYYAccept = false; +bool bUsedCtxMarker= false; bool bUseStartLabel= true; std::string startLabelName; unsigned int oline = 1; diff --git a/test/ctx.b.c b/test/ctx.b.c new file mode 100755 index 00000000..9da2f5d7 --- /dev/null +++ b/test/ctx.b.c @@ -0,0 +1,190 @@ +/* Generated by re2c */ +#line 1 "ctx.b.re" +#include +#include + +struct Scanner +{ + Scanner(char *txt) + : cur(txt), lim(txt + strlen(txt)) + { + } + + char *cur; + char *lim; + char *ptr; + char *tok; +}; + +#define YYCTYPE char +#define YYCURSOR s.cur +#define YYLIMIT s.lim +#define YYMARKER s.ptr +#define YYFILL(n) + +enum What +{ + UNEXPECTED, + KEYWORD, + NUMBER, + EOI +}; + +char * tokens[] = { "UNEXPECTED", "KEYWORD", "NUMBER", "EOI" }; + + +int scan(Scanner &s) +{ + YYCTYPE *cursor = s.cur; + + if(cursor == s.lim) + return EOI; + +std: + s.tok = cursor; + +{ + static unsigned char yybm[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + +#line 83 "" + { + YYCTYPE yych; + YYCTYPE *yyctxmarker = YYCURSOR; +yy0: + if((YYLIMIT - YYCURSOR) < 3) YYFILL(3); + yych = *YYCURSOR; + if(yych <= ' ') { + if(yych <= 0x09) { + if(yych <= 0x08) goto yy9; + goto yy6; + } else { + if(yych <= 0x0A) goto yy8; + if(yych <= 0x1F) goto yy9; + goto yy6; + } + } else { + if(yych <= '9') { + if(yych <= '/') goto yy9; + goto yy4; + } else { + if(yych <= '`') goto yy9; + if(yych >= 'c') goto yy9; + } + } + yyctxmarker = YYCURSOR + 1; + ++YYCURSOR; + if((yych = *YYCURSOR) <= '/') goto yy3; + if(yych == '1') goto yy15; + if(yych <= '9') goto yy12; +yy3: +#line 58 "ctx.b.re" + { + return UNEXPECTED; + } +#line 118 "" +yy4: + ++YYCURSOR; + yych = *YYCURSOR; + goto yy11; +yy5: +#line 48 "ctx.b.re" + { return NUMBER; } +#line 126 "" +yy6: + ++YYCURSOR; +yy7: +#line 51 "ctx.b.re" + { + if(s.cur == s.lim) + return EOI; + cursor = s.cur; + goto std; + } +#line 137 "" +yy8: + yych = *++YYCURSOR; + goto yy7; +yy9: + yych = *++YYCURSOR; + goto yy3; +yy10: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; +yy11: + if(yybm[0+yych] & 128) { + goto yy10; + } + goto yy5; +yy12: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if(yych <= '/') goto yy14; + if(yych <= '9') goto yy12; +yy14: + YYCURSOR = yyctxmarker; +#line 47 "ctx.b.re" + { return KEYWORD; } +#line 163 "" +yy15: + ++YYCURSOR; + if((yych = *YYCURSOR) <= '/') goto yy16; + if(yych <= '9') goto yy12; +yy16: + YYCURSOR = yyctxmarker; +#line 46 "ctx.b.re" + { return KEYWORD; } +#line 172 "" + } +} +#line 61 "ctx.b.re" + +} + +#define YYMAXFILL 3 + + +int main(int,char**) +{ + Scanner s("a77 a1 b8 b1"); + + int t, n = 0; + while ((t = scan(s)) != EOI) + { + std::cout << (++n) << ": " << tokens[t] << " = \""; std::cout.write(s.tok, s.cur-s.tok); std::cout << "\"" << std::endl; + } +} diff --git a/test/ctx.b.re b/test/ctx.b.re new file mode 100755 index 00000000..6187526b --- /dev/null +++ b/test/ctx.b.re @@ -0,0 +1,75 @@ +#include +#include + +struct Scanner +{ + Scanner(char *txt) + : cur(txt), lim(txt + strlen(txt)) + { + } + + char *cur; + char *lim; + char *ptr; + char *tok; +}; + +#define YYCTYPE char +#define YYCURSOR s.cur +#define YYLIMIT s.lim +#define YYMARKER s.ptr +#define YYFILL(n) + +enum What +{ + UNEXPECTED, + KEYWORD, + NUMBER, + EOI +}; + +char * tokens[] = { "UNEXPECTED", "KEYWORD", "NUMBER", "EOI" }; + + +int scan(Scanner &s) +{ + YYCTYPE *cursor = s.cur; + + if(cursor == s.lim) + return EOI; + +std: + s.tok = cursor; + +/*!re2c + +("a"|"b")/[1] { return KEYWORD; } +("a"|"b")/[0-9]+ { return KEYWORD; } +[0-9]+ { return NUMBER; } + +[ \t\n] + { + if(s.cur == s.lim) + return EOI; + cursor = s.cur; + goto std; + } +. + { + return UNEXPECTED; + } +*/ +} + +/*!max:re2c */ + +int main(int,char**) +{ + Scanner s("a77 a1 b8 b1"); + + int t, n = 0; + while ((t = scan(s)) != EOI) + { + std::cout << (++n) << ": " << tokens[t] << " = \""; std::cout.write(s.tok, s.cur-s.tok); std::cout << "\"" << std::endl; + } +} diff --git a/test/ctx.c b/test/ctx.c new file mode 100755 index 00000000..c338779d --- /dev/null +++ b/test/ctx.c @@ -0,0 +1,196 @@ +/* Generated by re2c */ +#line 1 "ctx.re" +#include +#include + +struct Scanner +{ + Scanner(char *txt) + : cur(txt), lim(txt + strlen(txt)) + { + } + + char *cur; + char *lim; + char *ptr; + char *tok; +}; + +#define YYCTYPE char +#define YYCURSOR s.cur +#define YYLIMIT s.lim +#define YYMARKER s.ptr +#define YYFILL(n) + +enum What +{ + UNEXPECTED, + KEYWORD, + NUMBER, + EOI +}; + +char * tokens[] = { "UNEXPECTED", "KEYWORD", "NUMBER", "EOI" }; + + +int scan(Scanner &s) +{ + YYCTYPE *cursor = s.cur; + + if(cursor == s.lim) + return EOI; + +std: + s.tok = cursor; + + +#line 48 "" +{ + YYCTYPE yych; + YYCTYPE *yyctxmarker = YYCURSOR; +yy0: + if((YYLIMIT - YYCURSOR) < 3) YYFILL(3); + yych = *YYCURSOR; + switch(yych){ + case 0x09: + case ' ': goto yy6; + case 0x0A: goto yy8; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy4; + case 'a': + case 'b': goto yy2; + default: goto yy9; + } +yy2: + yyctxmarker = YYCURSOR + 1; + ++YYCURSOR; + switch((yych = *YYCURSOR)) { + case '0': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy12; + case '1': goto yy15; + default: goto yy3; + } +yy3: +#line 58 "ctx.re" + { + return UNEXPECTED; + } +#line 92 "" +yy4: + ++YYCURSOR; + yych = *YYCURSOR; + goto yy11; +yy5: +#line 48 "ctx.re" + { return NUMBER; } +#line 100 "" +yy6: + ++YYCURSOR; +yy7: +#line 51 "ctx.re" + { + if(s.cur == s.lim) + return EOI; + cursor = s.cur; + goto std; + } +#line 111 "" +yy8: + yych = *++YYCURSOR; + goto yy7; +yy9: + yych = *++YYCURSOR; + goto yy3; +yy10: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; +yy11: + switch(yych){ + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy10; + default: goto yy5; + } +yy12: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch(yych){ + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy12; + default: goto yy14; + } +yy14: + YYCURSOR = yyctxmarker; +#line 47 "ctx.re" + { return KEYWORD; } +#line 157 "" +yy15: + ++YYCURSOR; + switch((yych = *YYCURSOR)) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy12; + default: goto yy16; + } +yy16: + YYCURSOR = yyctxmarker; +#line 46 "ctx.re" + { return KEYWORD; } +#line 177 "" +} +#line 61 "ctx.re" + +} + +#define YYMAXFILL 3 + + +int main(int,char**) +{ + Scanner s("a77 a1 b8 b1"); + + int t, n = 0; + while ((t = scan(s)) != EOI) + { + std::cout << (++n) << ": " << tokens[t] << " = \""; std::cout.write(s.tok, s.cur-s.tok); std::cout << "\"" << std::endl; + } +} diff --git a/test/ctx.re b/test/ctx.re new file mode 100755 index 00000000..6187526b --- /dev/null +++ b/test/ctx.re @@ -0,0 +1,75 @@ +#include +#include + +struct Scanner +{ + Scanner(char *txt) + : cur(txt), lim(txt + strlen(txt)) + { + } + + char *cur; + char *lim; + char *ptr; + char *tok; +}; + +#define YYCTYPE char +#define YYCURSOR s.cur +#define YYLIMIT s.lim +#define YYMARKER s.ptr +#define YYFILL(n) + +enum What +{ + UNEXPECTED, + KEYWORD, + NUMBER, + EOI +}; + +char * tokens[] = { "UNEXPECTED", "KEYWORD", "NUMBER", "EOI" }; + + +int scan(Scanner &s) +{ + YYCTYPE *cursor = s.cur; + + if(cursor == s.lim) + return EOI; + +std: + s.tok = cursor; + +/*!re2c + +("a"|"b")/[1] { return KEYWORD; } +("a"|"b")/[0-9]+ { return KEYWORD; } +[0-9]+ { return NUMBER; } + +[ \t\n] + { + if(s.cur == s.lim) + return EOI; + cursor = s.cur; + goto std; + } +. + { + return UNEXPECTED; + } +*/ +} + +/*!max:re2c */ + +int main(int,char**) +{ + Scanner s("a77 a1 b8 b1"); + + int t, n = 0; + while ((t = scan(s)) != EOI) + { + std::cout << (++n) << ": " << tokens[t] << " = \""; std::cout.write(s.tok, s.cur-s.tok); std::cout << "\"" << std::endl; + } +} diff --git a/test/ctx.s.c b/test/ctx.s.c new file mode 100755 index 00000000..754c4c64 --- /dev/null +++ b/test/ctx.s.c @@ -0,0 +1,153 @@ +/* Generated by re2c */ +#line 1 "ctx.s.re" +#include +#include + +struct Scanner +{ + Scanner(char *txt) + : cur(txt), lim(txt + strlen(txt)) + { + } + + char *cur; + char *lim; + char *ptr; + char *tok; +}; + +#define YYCTYPE char +#define YYCURSOR s.cur +#define YYLIMIT s.lim +#define YYMARKER s.ptr +#define YYFILL(n) + +enum What +{ + UNEXPECTED, + KEYWORD, + NUMBER, + EOI +}; + +char * tokens[] = { "UNEXPECTED", "KEYWORD", "NUMBER", "EOI" }; + + +int scan(Scanner &s) +{ + YYCTYPE *cursor = s.cur; + + if(cursor == s.lim) + return EOI; + +std: + s.tok = cursor; + + +#line 48 "" +{ + YYCTYPE yych; + YYCTYPE *yyctxmarker = YYCURSOR; +yy0: + if((YYLIMIT - YYCURSOR) < 3) YYFILL(3); + yych = *YYCURSOR; + if(yych <= ' ') { + if(yych <= 0x09) { + if(yych <= 0x08) goto yy9; + goto yy6; + } else { + if(yych <= 0x0A) goto yy8; + if(yych <= 0x1F) goto yy9; + goto yy6; + } + } else { + if(yych <= '9') { + if(yych <= '/') goto yy9; + goto yy4; + } else { + if(yych <= '`') goto yy9; + if(yych >= 'c') goto yy9; + } + } + yyctxmarker = YYCURSOR + 1; + ++YYCURSOR; + if((yych = *YYCURSOR) <= '/') goto yy3; + if(yych == '1') goto yy15; + if(yych <= '9') goto yy12; +yy3: +#line 58 "ctx.s.re" + { + return UNEXPECTED; + } +#line 83 "" +yy4: + ++YYCURSOR; + yych = *YYCURSOR; + goto yy11; +yy5: +#line 48 "ctx.s.re" + { return NUMBER; } +#line 91 "" +yy6: + ++YYCURSOR; +yy7: +#line 51 "ctx.s.re" + { + if(s.cur == s.lim) + return EOI; + cursor = s.cur; + goto std; + } +#line 102 "" +yy8: + yych = *++YYCURSOR; + goto yy7; +yy9: + yych = *++YYCURSOR; + goto yy3; +yy10: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; +yy11: + if(yych <= '/') goto yy5; + if(yych <= '9') goto yy10; + goto yy5; +yy12: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if(yych <= '/') goto yy14; + if(yych <= '9') goto yy12; +yy14: + YYCURSOR = yyctxmarker; +#line 47 "ctx.s.re" + { return KEYWORD; } +#line 127 "" +yy15: + ++YYCURSOR; + if((yych = *YYCURSOR) <= '/') goto yy16; + if(yych <= '9') goto yy12; +yy16: + YYCURSOR = yyctxmarker; +#line 46 "ctx.s.re" + { return KEYWORD; } +#line 136 "" +} +#line 61 "ctx.s.re" + +} + +#define YYMAXFILL 3 + + +int main(int,char**) +{ + Scanner s("a77 a1 b8 b1"); + + int t, n = 0; + while ((t = scan(s)) != EOI) + { + std::cout << (++n) << ": " << tokens[t] << " = \""; std::cout.write(s.tok, s.cur-s.tok); std::cout << "\"" << std::endl; + } +} diff --git a/test/ctx.s.re b/test/ctx.s.re new file mode 100755 index 00000000..6187526b --- /dev/null +++ b/test/ctx.s.re @@ -0,0 +1,75 @@ +#include +#include + +struct Scanner +{ + Scanner(char *txt) + : cur(txt), lim(txt + strlen(txt)) + { + } + + char *cur; + char *lim; + char *ptr; + char *tok; +}; + +#define YYCTYPE char +#define YYCURSOR s.cur +#define YYLIMIT s.lim +#define YYMARKER s.ptr +#define YYFILL(n) + +enum What +{ + UNEXPECTED, + KEYWORD, + NUMBER, + EOI +}; + +char * tokens[] = { "UNEXPECTED", "KEYWORD", "NUMBER", "EOI" }; + + +int scan(Scanner &s) +{ + YYCTYPE *cursor = s.cur; + + if(cursor == s.lim) + return EOI; + +std: + s.tok = cursor; + +/*!re2c + +("a"|"b")/[1] { return KEYWORD; } +("a"|"b")/[0-9]+ { return KEYWORD; } +[0-9]+ { return NUMBER; } + +[ \t\n] + { + if(s.cur == s.lim) + return EOI; + cursor = s.cur; + goto std; + } +. + { + return UNEXPECTED; + } +*/ +} + +/*!max:re2c */ + +int main(int,char**) +{ + Scanner s("a77 a1 b8 b1"); + + int t, n = 0; + while ((t = scan(s)) != EOI) + { + std::cout << (++n) << ": " << tokens[t] << " = \""; std::cout.write(s.tok, s.cur-s.tok); std::cout << "\"" << std::endl; + } +} diff --git a/test/modula.c b/test/modula.c index 05fb5790..1a359078 100644 --- a/test/modula.c +++ b/test/modula.c @@ -67,6 +67,7 @@ std: { YYCTYPE yych; unsigned int yyaccept = 0; + YYCTYPE *yyctxmarker = YYCURSOR; yy0: if((YYLIMIT - YYCURSOR) < 15) YYFILL(15); yych = *YYCURSOR; @@ -171,16 +172,18 @@ yy2: yy3: #line 79 "modula.re" {RETURN(9);} -#line 171 "" +#line 172 "" yy4: + yyctxmarker = YYCURSOR + 1; yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); goto yy292; yy5: #line 69 "modula.re" {RETURN(1);} -#line 179 "" +#line 181 "" yy6: + yyctxmarker = YYCURSOR + 1; yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); goto yy278; @@ -197,7 +200,7 @@ yy8: printf("unexpected character: %c\n", *s->tok); goto std; } -#line 197 "" +#line 200 "" yy9: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); @@ -209,37 +212,37 @@ yy10: ++YYCURSOR; #line 77 "modula.re" {RETURN(7);} -#line 209 "" +#line 212 "" yy12: ++YYCURSOR; #line 78 "modula.re" {RETURN(8);} -#line 214 "" +#line 217 "" yy14: ++YYCURSOR; #line 80 "modula.re" {RETURN(10);} -#line 219 "" +#line 222 "" yy16: ++YYCURSOR; #line 81 "modula.re" {RETURN(11);} -#line 224 "" +#line 227 "" yy18: ++YYCURSOR; #line 82 "modula.re" {RETURN(12);} -#line 229 "" +#line 232 "" yy20: ++YYCURSOR; #line 83 "modula.re" {RETURN(13);} -#line 234 "" +#line 237 "" yy22: ++YYCURSOR; #line 84 "modula.re" {RETURN(14);} -#line 239 "" +#line 242 "" yy24: ++YYCURSOR; switch((yych = *YYCURSOR)) { @@ -249,12 +252,12 @@ yy24: yy25: #line 85 "modula.re" {RETURN(15);} -#line 249 "" +#line 252 "" yy26: ++YYCURSOR; #line 87 "modula.re" {RETURN(17);} -#line 254 "" +#line 257 "" yy28: ++YYCURSOR; switch((yych = *YYCURSOR)) { @@ -264,12 +267,12 @@ yy28: yy29: #line 88 "modula.re" {RETURN(18);} -#line 264 "" +#line 267 "" yy30: ++YYCURSOR; #line 90 "modula.re" {RETURN(20);} -#line 269 "" +#line 272 "" yy32: ++YYCURSOR; switch((yych = *YYCURSOR)) { @@ -280,12 +283,12 @@ yy32: yy33: #line 91 "modula.re" {RETURN(21);} -#line 280 "" +#line 283 "" yy34: ++YYCURSOR; #line 94 "modula.re" {RETURN(24);} -#line 285 "" +#line 288 "" yy36: ++YYCURSOR; switch((yych = *YYCURSOR)) { @@ -295,42 +298,42 @@ yy36: yy37: #line 95 "modula.re" {RETURN(25);} -#line 295 "" +#line 298 "" yy38: ++YYCURSOR; #line 97 "modula.re" {RETURN(27);} -#line 300 "" +#line 303 "" yy40: ++YYCURSOR; #line 98 "modula.re" {RETURN(28);} -#line 305 "" +#line 308 "" yy42: ++YYCURSOR; #line 99 "modula.re" {RETURN(29);} -#line 310 "" +#line 313 "" yy44: ++YYCURSOR; #line 100 "modula.re" {RETURN(30);} -#line 315 "" +#line 318 "" yy46: ++YYCURSOR; #line 101 "modula.re" {RETURN(31);} -#line 320 "" +#line 323 "" yy48: ++YYCURSOR; #line 102 "modula.re" {RETURN(32);} -#line 325 "" +#line 328 "" yy50: ++YYCURSOR; #line 103 "modula.re" {RETURN(33);} -#line 330 "" +#line 333 "" yy52: ++YYCURSOR; switch((yych = *YYCURSOR)) { @@ -341,7 +344,7 @@ yy52: yy53: #line 146 "modula.re" {RETURN(74);} -#line 341 "" +#line 344 "" yy54: yych = *++YYCURSOR; switch(yych){ @@ -474,7 +477,7 @@ yy73: yy74: #line 148 "modula.re" { goto std; } -#line 474 "" +#line 477 "" yy75: ++YYCURSOR; #line 151 "modula.re" @@ -483,7 +486,7 @@ yy75: s->pos = cursor; s->line++; goto std; } -#line 483 "" +#line 486 "" yy77: yych = *++YYCURSOR; goto yy8; @@ -655,7 +658,7 @@ yy85: yy86: #line 144 "modula.re" {RETURN(73);} -#line 650 "" +#line 653 "" yy87: yych = *++YYCURSOR; switch(yych){ @@ -738,7 +741,7 @@ yy89: yy90: #line 143 "modula.re" {RETURN(72);} -#line 731 "" +#line 734 "" yy91: yych = *++YYCURSOR; switch(yych){ @@ -815,7 +818,7 @@ yy92: yy93: #line 142 "modula.re" {RETURN(71);} -#line 806 "" +#line 809 "" yy94: yych = *++YYCURSOR; switch(yych){ @@ -904,7 +907,7 @@ yy97: yy98: #line 141 "modula.re" {RETURN(70);} -#line 893 "" +#line 896 "" yy99: yych = *++YYCURSOR; switch(yych){ @@ -981,7 +984,7 @@ yy100: yy101: #line 139 "modula.re" {RETURN(68);} -#line 968 "" +#line 971 "" yy102: yych = *++YYCURSOR; switch(yych){ @@ -1064,7 +1067,7 @@ yy104: yy105: #line 140 "modula.re" {RETURN(69);} -#line 1049 "" +#line 1052 "" yy106: yych = *++YYCURSOR; switch(yych){ @@ -1141,7 +1144,7 @@ yy107: yy108: #line 138 "modula.re" {RETURN(67);} -#line 1124 "" +#line 1127 "" yy109: yych = *++YYCURSOR; switch(yych){ @@ -1218,7 +1221,7 @@ yy110: yy111: #line 137 "modula.re" {RETURN(66);} -#line 1199 "" +#line 1202 "" yy112: yych = *++YYCURSOR; switch(yych){ @@ -1327,7 +1330,7 @@ yy118: yy119: #line 136 "modula.re" {RETURN(65);} -#line 1306 "" +#line 1309 "" yy120: yych = *++YYCURSOR; switch(yych){ @@ -1410,7 +1413,7 @@ yy122: yy123: #line 135 "modula.re" {RETURN(64);} -#line 1387 "" +#line 1390 "" yy124: yych = *++YYCURSOR; switch(yych){ @@ -1493,7 +1496,7 @@ yy126: yy127: #line 134 "modula.re" {RETURN(63);} -#line 1468 "" +#line 1471 "" yy128: yych = *++YYCURSOR; switch(yych){ @@ -1606,7 +1609,7 @@ yy135: yy136: #line 133 "modula.re" {RETURN(62);} -#line 1579 "" +#line 1582 "" yy137: yych = *++YYCURSOR; switch(yych){ @@ -1725,7 +1728,7 @@ yy145: yy146: #line 132 "modula.re" {RETURN(61);} -#line 1696 "" +#line 1699 "" yy147: yych = *++YYCURSOR; switch(yych){ @@ -1820,7 +1823,7 @@ yy151: yy152: #line 131 "modula.re" {RETURN(60);} -#line 1789 "" +#line 1792 "" yy153: ++YYCURSOR; switch((yych = *YYCURSOR)) { @@ -1891,7 +1894,7 @@ yy153: yy154: #line 129 "modula.re" {RETURN(58);} -#line 1858 "" +#line 1861 "" yy155: ++YYCURSOR; switch((yych = *YYCURSOR)) { @@ -1962,7 +1965,7 @@ yy155: yy156: #line 130 "modula.re" {RETURN(59);} -#line 1927 "" +#line 1930 "" yy157: yych = *++YYCURSOR; switch(yych){ @@ -2039,7 +2042,7 @@ yy158: yy159: #line 128 "modula.re" {RETURN(57);} -#line 2002 "" +#line 2005 "" yy160: yych = *++YYCURSOR; switch(yych){ @@ -2116,7 +2119,7 @@ yy161: yy162: #line 126 "modula.re" {RETURN(55);} -#line 2076 "" +#line 2079 "" yy163: yych = *++YYCURSOR; switch(yych){ @@ -2199,7 +2202,7 @@ yy165: yy166: #line 127 "modula.re" {RETURN(56);} -#line 2157 "" +#line 2160 "" yy167: yych = *++YYCURSOR; switch(yych){ @@ -2282,7 +2285,7 @@ yy169: yy170: #line 125 "modula.re" {RETURN(54);} -#line 2238 "" +#line 2241 "" yy171: ++YYCURSOR; switch((yych = *YYCURSOR)) { @@ -2353,7 +2356,7 @@ yy171: yy172: #line 121 "modula.re" {RETURN(50);} -#line 2307 "" +#line 2310 "" yy173: yych = *++YYCURSOR; switch(yych){ @@ -2430,7 +2433,7 @@ yy174: yy175: #line 124 "modula.re" {RETURN(53);} -#line 2382 "" +#line 2385 "" yy176: yych = *++YYCURSOR; switch(yych){ @@ -2526,7 +2529,7 @@ yy180: yy181: #line 123 "modula.re" {RETURN(52);} -#line 2476 "" +#line 2479 "" yy182: yych = *++YYCURSOR; switch(yych){ @@ -2651,7 +2654,7 @@ yy191: yy192: #line 122 "modula.re" {RETURN(51);} -#line 2599 "" +#line 2602 "" yy193: yych = *++YYCURSOR; switch(yych){ @@ -2740,7 +2743,7 @@ yy196: yy197: #line 120 "modula.re" {RETURN(49);} -#line 2686 "" +#line 2689 "" yy198: ++YYCURSOR; switch((yych = *YYCURSOR)) { @@ -2811,7 +2814,7 @@ yy198: yy199: #line 119 "modula.re" {RETURN(48);} -#line 2755 "" +#line 2758 "" yy200: yych = *++YYCURSOR; switch(yych){ @@ -2925,7 +2928,7 @@ yy207: yy208: #line 118 "modula.re" {RETURN(47);} -#line 2867 "" +#line 2870 "" yy209: ++YYCURSOR; switch((yych = *YYCURSOR)) { @@ -2996,7 +2999,7 @@ yy209: yy210: #line 117 "modula.re" {RETURN(46);} -#line 2936 "" +#line 2939 "" yy211: ++YYCURSOR; switch((yych = *YYCURSOR)) { @@ -3067,7 +3070,7 @@ yy211: yy212: #line 116 "modula.re" {RETURN(45);} -#line 3005 "" +#line 3008 "" yy213: yych = *++YYCURSOR; switch(yych){ @@ -3145,7 +3148,7 @@ yy214: yy215: #line 114 "modula.re" {RETURN(43);} -#line 3081 "" +#line 3084 "" yy216: yych = *++YYCURSOR; switch(yych){ @@ -3222,7 +3225,7 @@ yy217: yy218: #line 115 "modula.re" {RETURN(44);} -#line 3156 "" +#line 3159 "" yy219: yych = *++YYCURSOR; switch(yych){ @@ -3305,7 +3308,7 @@ yy221: yy222: #line 113 "modula.re" {RETURN(42);} -#line 3237 "" +#line 3240 "" yy223: ++YYCURSOR; switch((yych = *YYCURSOR)) { @@ -3376,7 +3379,7 @@ yy223: yy224: #line 112 "modula.re" {RETURN(41);} -#line 3306 "" +#line 3309 "" yy225: yych = *++YYCURSOR; switch(yych){ @@ -3489,7 +3492,7 @@ yy232: yy233: #line 111 "modula.re" {RETURN(40);} -#line 3417 "" +#line 3420 "" yy234: yych = *++YYCURSOR; switch(yych){ @@ -3584,7 +3587,7 @@ yy238: yy239: #line 110 "modula.re" {RETURN(39);} -#line 3510 "" +#line 3513 "" yy240: yych = *++YYCURSOR; switch(yych){ @@ -3661,7 +3664,7 @@ yy241: yy242: #line 109 "modula.re" {RETURN(38);} -#line 3585 "" +#line 3588 "" yy243: yych = *++YYCURSOR; switch(yych){ @@ -3738,7 +3741,7 @@ yy244: yy245: #line 108 "modula.re" {RETURN(37);} -#line 3660 "" +#line 3663 "" yy246: yych = *++YYCURSOR; switch(yych){ @@ -3821,7 +3824,7 @@ yy248: yy249: #line 107 "modula.re" {RETURN(36);} -#line 3741 "" +#line 3744 "" yy250: yych = *++YYCURSOR; switch(yych){ @@ -3916,7 +3919,7 @@ yy254: yy255: #line 106 "modula.re" {RETURN(35);} -#line 3834 "" +#line 3837 "" yy256: ++YYCURSOR; switch((yych = *YYCURSOR)) { @@ -3987,32 +3990,32 @@ yy256: yy257: #line 105 "modula.re" {RETURN(34);} -#line 3903 "" +#line 3906 "" yy258: ++YYCURSOR; #line 96 "modula.re" {RETURN(26);} -#line 3908 "" +#line 3911 "" yy260: ++YYCURSOR; #line 93 "modula.re" {RETURN(23);} -#line 3913 "" +#line 3916 "" yy262: ++YYCURSOR; #line 92 "modula.re" {RETURN(22);} -#line 3918 "" +#line 3921 "" yy264: ++YYCURSOR; #line 89 "modula.re" {RETURN(19);} -#line 3923 "" +#line 3926 "" yy266: ++YYCURSOR; #line 86 "modula.re" {RETURN(16);} -#line 3928 "" +#line 3931 "" yy268: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); @@ -4036,7 +4039,7 @@ yy271: ++YYCURSOR; #line 75 "modula.re" {RETURN(6);} -#line 3952 "" +#line 3955 "" yy273: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); @@ -4057,8 +4060,9 @@ yy275: yy276: #line 74 "modula.re" {RETURN(5);} -#line 3973 "" +#line 3976 "" yy277: + yyctxmarker = YYCURSOR + 1; yyaccept = 0; YYMARKER = ++YYCURSOR; if((YYLIMIT - YYCURSOR) < 4) YYFILL(4); @@ -4113,12 +4117,13 @@ yy281: ++YYCURSOR; #line 73 "modula.re" {RETURN(4);} -#line 4028 "" +#line 4032 "" yy283: ++YYCURSOR; - YYCURSOR -= 2;#line 70 "modula.re" + YYCURSOR = yyctxmarker; +#line 70 "modula.re" {RETURN(1);} -#line 4033 "" +#line 4038 "" yy285: yyaccept = 2; YYMARKER = ++YYCURSOR; @@ -4189,6 +4194,7 @@ yy289: default: goto yy276; } yy291: + yyctxmarker = YYCURSOR + 1; yyaccept = 0; YYMARKER = ++YYCURSOR; if((YYLIMIT - YYCURSOR) < 4) YYFILL(4); @@ -4241,7 +4247,7 @@ yy293: yy294: #line 71 "modula.re" {RETURN(2);} -#line 4153 "" +#line 4159 "" yy295: yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); @@ -4268,20 +4274,21 @@ yy295: yy296: #line 72 "modula.re" {RETURN(3);} -#line 4179 "" +#line 4185 "" yy297: ++YYCURSOR; #line 67 "modula.re" { depth = 1; goto comment; } -#line 4184 "" +#line 4190 "" } #line 162 "modula.re" comment: -#line 4190 "" +#line 4196 "" { YYCTYPE yych; + YYCTYPE *yyctxmarker = YYCURSOR; if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; switch(yych){ @@ -4299,7 +4306,7 @@ yy301: yy302: #line 179 "modula.re" { goto comment; } -#line 4210 "" +#line 4217 "" yy303: yych = *++YYCURSOR; switch(yych){ @@ -4314,7 +4321,7 @@ yy304: s->tok = s->pos = cursor; s->line++; goto comment; } -#line 4225 "" +#line 4232 "" yy306: yych = *++YYCURSOR; goto yy302; @@ -4322,7 +4329,7 @@ yy307: ++YYCURSOR; #line 172 "modula.re" { ++depth; goto comment; } -#line 4233 "" +#line 4240 "" yy309: ++YYCURSOR; #line 166 "modula.re" @@ -4332,7 +4339,7 @@ yy309: else goto comment; } -#line 4243 "" +#line 4250 "" } #line 180 "modula.re" -- 2.50.1