From: helly Date: Sun, 29 Apr 2007 15:36:42 +0000 (+0000) Subject: - Allow to have types inlined into generated .c file X-Git-Tag: 0.13.6~171 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=06d50a26bb2d22b7aca5120ed81c3058ca98d1bc;p=re2c - Allow to have types inlined into generated .c file - Allow to specify parameter inside YYFILL config - Add prefix to condition enum constants - Add/Fix tests - MFB Prevent build issues with strange compilers --- diff --git a/re2c/bootstrap/parser.cc b/re2c/bootstrap/parser.cc index 6238ab80..7b90c02d 100644 --- a/re2c/bootstrap/parser.cc +++ b/re2c/bootstrap/parser.cc @@ -1887,6 +1887,10 @@ void parse(Scanner& i, std::ostream& o, std::ostream* h) { genHeader(*h, 0, specMap); } + else + { + genTypes(typesInline, 0, specMap); + } } else if(spec) { diff --git a/re2c/bootstrap/scanner.cc b/re2c/bootstrap/scanner.cc index d31d82d3..d93b4e87 100644 --- a/re2c/bootstrap/scanner.cc +++ b/re2c/bootstrap/scanner.cc @@ -1,4 +1,4 @@ -/* Generated by re2c 0.13.0.dev on Sun Apr 22 14:24:30 2007 */ +/* Generated by re2c 0.13.0.dev on Sat Apr 28 15:49:28 2007 */ #line 1 "scanner.re" /* $Id$ */ #include @@ -114,7 +114,7 @@ echo: yych = *(YYMARKER = ++YYCURSOR); if(yych == '*') goto yy16; yy3: -#line 204 "scanner.re" +#line 221 "scanner.re" { goto echo; } @@ -125,7 +125,7 @@ yy4: goto yy3; yy5: ++YYCURSOR; -#line 180 "scanner.re" +#line 197 "scanner.re" { if (ignore_eoc) { @@ -142,7 +142,7 @@ yy5: #line 143 "scanner.cc" yy7: ++YYCURSOR; -#line 193 "scanner.re" +#line 210 "scanner.re" { if (!ignore_eoc) { @@ -164,7 +164,7 @@ yy10: if(yych == 0x0A) goto yy14; if(yych == 0x0D) goto yy12; yy11: -#line 163 "scanner.re" +#line 180 "scanner.re" { if (ignore_eoc) { @@ -195,7 +195,7 @@ yy13: } yy14: ++YYCURSOR; -#line 145 "scanner.re" +#line 162 "scanner.re" { cline++; if (ignore_eoc) @@ -220,25 +220,30 @@ yy16: if(yych != '!') goto yy13; yych = *++YYCURSOR; switch(yych) { - case 'g': goto yy19; - case 'i': goto yy18; - case 'm': goto yy20; - case 'r': goto yy21; + case 'g': goto yy20; + case 'i': goto yy19; + case 'm': goto yy21; + case 'r': goto yy22; + case 't': goto yy18; default: goto yy13; } yy18: yych = *++YYCURSOR; - if(yych == 'g') goto yy47; + if(yych == 'y') goto yy59; goto yy13; yy19: yych = *++YYCURSOR; - if(yych == 'e') goto yy34; + if(yych == 'g') goto yy48; goto yy13; yy20: yych = *++YYCURSOR; - if(yych == 'a') goto yy26; + if(yych == 'e') goto yy35; goto yy13; yy21: + yych = *++YYCURSOR; + if(yych == 'a') goto yy27; + goto yy13; +yy22: yych = *++YYCURSOR; if(yych != 'e') goto yy13; yych = *++YYCURSOR; @@ -256,8 +261,8 @@ yy21: tok = cursor; RETURN(1); } -#line 260 "scanner.cc" -yy26: +#line 265 "scanner.cc" +yy27: yych = *++YYCURSOR; if(yych != 'x') goto yy13; yych = *++YYCURSOR; @@ -283,8 +288,8 @@ yy26: bUsedYYMaxFill = true; goto echo; } -#line 287 "scanner.cc" -yy34: +#line 292 "scanner.cc" +yy35: yych = *++YYCURSOR; if(yych != 't') goto yy13; yych = *++YYCURSOR; @@ -315,8 +320,8 @@ yy34: ignore_eoc = true; goto echo; } -#line 319 "scanner.cc" -yy47: +#line 324 "scanner.cc" +yy48: yych = *++YYCURSOR; if(yych != 'n') goto yy13; yych = *++YYCURSOR; @@ -342,9 +347,46 @@ yy47: ignore_eoc = true; goto echo; } -#line 346 "scanner.cc" +#line 351 "scanner.cc" +yy59: + yych = *++YYCURSOR; + if(yych != 'p') goto yy13; + yych = *++YYCURSOR; + if(yych != 'e') goto yy13; + yych = *++YYCURSOR; + if(yych != 's') goto yy13; + yych = *++YYCURSOR; + if(yych != ':') goto yy13; + yych = *++YYCURSOR; + if(yych != 'r') goto yy13; + yych = *++YYCURSOR; + if(yych != 'e') goto yy13; + yych = *++YYCURSOR; + if(yych != '2') goto yy13; + yych = *++YYCURSOR; + if(yych != 'c') goto yy13; + ++YYCURSOR; +#line 145 "scanner.re" + { + if (bSinglePass) + { + fatal("cannot generate types inline in single pass mode"); + } + tok = pos = cursor; + ignore_eoc = true; + if (bLastPass) + { + out << outputFileInfo; + out << "\n"; + out << typesInline; + out << "\n"; + out << sourceFileInfo; + } + goto echo; + } +#line 388 "scanner.cc" } -#line 207 "scanner.re" +#line 224 "scanner.re" } @@ -367,7 +409,7 @@ scan: goto value; } -#line 371 "scanner.cc" +#line 413 "scanner.cc" { YYCTYPE yych; unsigned int yyaccept = 0; @@ -410,202 +452,202 @@ scan: if(yych <= '/') { if(yych <= '"') { if(yych <= 0x0C) { - if(yych <= 0x08) goto yy87; - if(yych <= 0x09) goto yy81; - if(yych <= 0x0A) goto yy83; - goto yy87; + if(yych <= 0x08) goto yy98; + if(yych <= 0x09) goto yy92; + if(yych <= 0x0A) goto yy94; + goto yy98; } else { if(yych <= 0x1F) { - if(yych <= 0x0D) goto yy85; - goto yy87; + if(yych <= 0x0D) goto yy96; + goto yy98; } else { - if(yych <= ' ') goto yy81; - if(yych <= '!') goto yy87; - goto yy66; + if(yych <= ' ') goto yy92; + if(yych <= '!') goto yy98; + goto yy77; } } } else { if(yych <= '*') { - if(yych <= '&') goto yy87; - if(yych <= '\'') goto yy68; - if(yych <= ')') goto yy73; - goto yy64; + if(yych <= '&') goto yy98; + if(yych <= '\'') goto yy79; + if(yych <= ')') goto yy84; + goto yy75; } else { if(yych <= ',') { - if(yych <= '+') goto yy74; - goto yy73; + if(yych <= '+') goto yy85; + goto yy84; } else { - if(yych <= '-') goto yy87; - if(yych <= '.') goto yy79; - goto yy62; + if(yych <= '-') goto yy98; + if(yych <= '.') goto yy90; + goto yy73; } } } } else { if(yych <= '\\') { if(yych <= '>') { - if(yych <= ':') goto yy87; - if(yych == '<') goto yy72; - goto yy73; + if(yych <= ':') goto yy98; + if(yych == '<') goto yy83; + goto yy84; } else { if(yych <= '@') { - if(yych <= '?') goto yy74; - goto yy87; + if(yych <= '?') goto yy85; + goto yy98; } else { - if(yych <= 'Z') goto yy78; - if(yych <= '[') goto yy70; - goto yy73; + if(yych <= 'Z') goto yy89; + if(yych <= '[') goto yy81; + goto yy84; } } } else { if(yych <= 'q') { - if(yych == '_') goto yy78; - if(yych <= '`') goto yy87; - goto yy78; + if(yych == '_') goto yy89; + if(yych <= '`') goto yy98; + goto yy89; } else { if(yych <= 'z') { - if(yych <= 'r') goto yy76; - goto yy78; + if(yych <= 'r') goto yy87; + goto yy89; } else { - if(yych <= '{') goto yy60; - if(yych <= '|') goto yy73; - goto yy87; + if(yych <= '{') goto yy71; + if(yych <= '|') goto yy84; + goto yy98; } } } } -yy60: +yy71: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if(yych <= '/') { - if(yych == ',') goto yy133; + if(yych == ',') goto yy144; } else { - if(yych <= '0') goto yy130; - if(yych <= '9') goto yy131; + if(yych <= '0') goto yy141; + if(yych <= '9') goto yy142; } -yy61: -#line 229 "scanner.re" +yy72: +#line 246 "scanner.re" { depth = 1; goto code; } -#line 493 "scanner.cc" -yy62: +#line 535 "scanner.cc" +yy73: ++YYCURSOR; - if((yych = *YYCURSOR) == '*') goto yy128; -yy63: -#line 282 "scanner.re" + if((yych = *YYCURSOR) == '*') goto yy139; +yy74: +#line 299 "scanner.re" { RETURN(*tok); } -#line 502 "scanner.cc" -yy64: +#line 544 "scanner.cc" +yy75: ++YYCURSOR; - if((yych = *YYCURSOR) == '/') goto yy126; -#line 286 "scanner.re" + if((yych = *YYCURSOR) == '/') goto yy137; +#line 303 "scanner.re" { yylval.op = *tok; RETURN(STAR); } -#line 511 "scanner.cc" -yy66: +#line 553 "scanner.cc" +yy77: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); - if(yych != 0x0A) goto yy122; -yy67: -#line 256 "scanner.re" + if(yych != 0x0A) goto yy133; +yy78: +#line 273 "scanner.re" { fatal("unterminated string constant (missing \")"); } -#line 521 "scanner.cc" -yy68: +#line 563 "scanner.cc" +yy79: yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); - if(yych != 0x0A) goto yy117; -yy69: -#line 259 "scanner.re" + if(yych != 0x0A) goto yy128; +yy80: +#line 276 "scanner.re" { fatal("unterminated string constant (missing ')"); } -#line 531 "scanner.cc" -yy70: +#line 573 "scanner.cc" +yy81: yyaccept = 3; yych = *(YYMARKER = ++YYCURSOR); - if(yych == 0x0A) goto yy71; - if(yych == '^') goto yy108; - goto yy107; -yy71: -#line 275 "scanner.re" + if(yych == 0x0A) goto yy82; + if(yych == '^') goto yy119; + goto yy118; +yy82: +#line 292 "scanner.re" { fatal("unterminated range (missing ])"); } -#line 543 "scanner.cc" -yy72: +#line 585 "scanner.cc" +yy83: yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); - if(yych == '>') goto yy101; - goto yy63; -yy73: + if(yych == '>') goto yy112; + goto yy74; +yy84: yych = *++YYCURSOR; - goto yy63; -yy74: + goto yy74; +yy85: ++YYCURSOR; -#line 290 "scanner.re" +#line 307 "scanner.re" { yylval.op = *tok; RETURN(CLOSE); } -#line 559 "scanner.cc" -yy76: +#line 601 "scanner.cc" +yy87: ++YYCURSOR; - if((yych = *YYCURSOR) == 'e') goto yy93; - goto yy92; -yy77: -#line 330 "scanner.re" + if((yych = *YYCURSOR) == 'e') goto yy104; + goto yy103; +yy88: +#line 347 "scanner.re" { cur = cursor; yylval.symbol = Symbol::find(token()); return ID; } -#line 571 "scanner.cc" -yy78: +#line 613 "scanner.cc" +yy89: yych = *++YYCURSOR; - goto yy92; -yy79: + goto yy103; +yy90: ++YYCURSOR; -#line 336 "scanner.re" +#line 353 "scanner.re" { cur = cursor; yylval.regexp = mkDot(); return RANGE; } -#line 583 "scanner.cc" -yy81: +#line 625 "scanner.cc" +yy92: ++YYCURSOR; yych = *YYCURSOR; - goto yy90; -yy82: -#line 342 "scanner.re" + goto yy101; +yy93: +#line 359 "scanner.re" { goto scan; } -#line 593 "scanner.cc" -yy83: +#line 635 "scanner.cc" +yy94: ++YYCURSOR; -yy84: -#line 346 "scanner.re" +yy95: +#line 363 "scanner.re" { if(cursor == eof) RETURN(0); pos = cursor; cline++; goto scan; } -#line 604 "scanner.cc" -yy85: +#line 646 "scanner.cc" +yy96: ++YYCURSOR; - if((yych = *YYCURSOR) == 0x0A) goto yy88; -yy86: -#line 353 "scanner.re" + if((yych = *YYCURSOR) == 0x0A) goto yy99; +yy97: +#line 370 "scanner.re" { std::ostringstream msg; msg << "unexpected character: "; @@ -613,103 +655,103 @@ yy86: fatal(msg.str().c_str()); goto scan; } -#line 617 "scanner.cc" -yy87: +#line 659 "scanner.cc" +yy98: yych = *++YYCURSOR; - goto yy86; -yy88: + goto yy97; +yy99: yych = *++YYCURSOR; - goto yy84; -yy89: + goto yy95; +yy100: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy90: +yy101: if(yybm[0+yych] & 2) { - goto yy89; + goto yy100; } - goto yy82; -yy91: + goto yy93; +yy102: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy92: +yy103: if(yybm[0+yych] & 4) { - goto yy91; + goto yy102; } - goto yy77; -yy93: + goto yy88; +yy104: yych = *++YYCURSOR; - if(yych != '2') goto yy92; + if(yych != '2') goto yy103; yych = *++YYCURSOR; - if(yych != 'c') goto yy92; + if(yych != 'c') goto yy103; yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); - if(yych != ':') goto yy92; -yy96: + if(yych != ':') goto yy103; +yy107: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yych <= '^') { - if(yych <= '@') goto yy97; - if(yych <= 'Z') goto yy98; + if(yych <= '@') goto yy108; + if(yych <= 'Z') goto yy109; } else { - if(yych == '`') goto yy97; - if(yych <= 'z') goto yy98; + if(yych == '`') goto yy108; + if(yych <= 'z') goto yy109; } -yy97: +yy108: YYCURSOR = YYMARKER; if(yyaccept <= 3) { if(yyaccept <= 1) { if(yyaccept <= 0) { - goto yy61; + goto yy72; } else { - goto yy67; + goto yy78; } } else { if(yyaccept <= 2) { - goto yy69; + goto yy80; } else { - goto yy71; + goto yy82; } } } else { if(yyaccept <= 5) { if(yyaccept <= 4) { - goto yy63; + goto yy74; } else { - goto yy77; + goto yy88; } } else { if(yyaccept <= 6) { - goto yy100; + goto yy111; } else { - goto yy134; + goto yy145; } } } -yy98: +yy109: yyaccept = 6; YYMARKER = ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yych <= 'Z') { if(yych <= '9') { - if(yych >= '0') goto yy98; + if(yych >= '0') goto yy109; } else { - if(yych <= ':') goto yy96; - if(yych >= 'A') goto yy98; + if(yych <= ':') goto yy107; + if(yych >= 'A') goto yy109; } } else { if(yych <= '_') { - if(yych >= '_') goto yy98; + if(yych >= '_') goto yy109; } else { - if(yych <= '`') goto yy100; - if(yych <= 'z') goto yy98; + if(yych <= '`') goto yy111; + if(yych <= 'z') goto yy109; } } -yy100: -#line 322 "scanner.re" +yy111: +#line 339 "scanner.re" { cur = cursor; tok+= 5; /* skip "re2c:" */ @@ -717,225 +759,225 @@ yy100: yylval.str = new Str(token()); return CONFIG; } -#line 721 "scanner.cc" -yy101: +#line 763 "scanner.cc" +yy112: YYCTXMARKER = YYCURSOR + 1; yych = *++YYCURSOR; - goto yy103; -yy102: + goto yy114; +yy113: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy103: +yy114: if(yybm[0+yych] & 8) { - goto yy102; + goto yy113; } - if(yych != '{') goto yy97; + if(yych != '{') goto yy108; ++YYCURSOR; YYCURSOR = YYCTXMARKER; -#line 279 "scanner.re" +#line 296 "scanner.re" { RETURN(NOCOND); } -#line 741 "scanner.cc" -yy106: +#line 783 "scanner.cc" +yy117: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy107: +yy118: if(yybm[0+yych] & 16) { - goto yy106; + goto yy117; } - if(yych <= '[') goto yy97; - if(yych <= '\\') goto yy110; - goto yy111; -yy108: + if(yych <= '[') goto yy108; + if(yych <= '\\') goto yy121; + goto yy122; +yy119: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yych <= '[') { - if(yych == 0x0A) goto yy97; - goto yy108; + if(yych == 0x0A) goto yy108; + goto yy119; } else { - if(yych <= '\\') goto yy113; - if(yych <= ']') goto yy114; - goto yy108; + if(yych <= '\\') goto yy124; + if(yych <= ']') goto yy125; + goto yy119; } -yy110: +yy121: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych == 0x0A) goto yy97; - goto yy106; -yy111: + if(yych == 0x0A) goto yy108; + goto yy117; +yy122: ++YYCURSOR; -#line 269 "scanner.re" +#line 286 "scanner.re" { cur = cursor; yylval.regexp = ranToRE(token()); return RANGE; } -#line 779 "scanner.cc" -yy113: +#line 821 "scanner.cc" +yy124: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych == 0x0A) goto yy97; - goto yy108; -yy114: + if(yych == 0x0A) goto yy108; + goto yy119; +yy125: ++YYCURSOR; -#line 263 "scanner.re" +#line 280 "scanner.re" { cur = cursor; yylval.regexp = invToRE(token()); return RANGE; } -#line 794 "scanner.cc" -yy116: +#line 836 "scanner.cc" +yy127: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy117: +yy128: if(yybm[0+yych] & 32) { - goto yy116; + goto yy127; } - if(yych <= '&') goto yy97; - if(yych <= '\'') goto yy119; + if(yych <= '&') goto yy108; + if(yych <= '\'') goto yy130; ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych == 0x0A) goto yy97; - goto yy116; -yy119: + if(yych == 0x0A) goto yy108; + goto yy127; +yy130: ++YYCURSOR; -#line 250 "scanner.re" +#line 267 "scanner.re" { cur = cursor; yylval.regexp = strToCaseInsensitiveRE(token()); return STRING; } -#line 818 "scanner.cc" -yy121: +#line 860 "scanner.cc" +yy132: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy122: +yy133: if(yybm[0+yych] & 64) { - goto yy121; + goto yy132; } - if(yych <= '!') goto yy97; - if(yych <= '"') goto yy124; + if(yych <= '!') goto yy108; + if(yych <= '"') goto yy135; ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych == 0x0A) goto yy97; - goto yy121; -yy124: + if(yych == 0x0A) goto yy108; + goto yy132; +yy135: ++YYCURSOR; -#line 244 "scanner.re" +#line 261 "scanner.re" { cur = cursor; yylval.regexp = strToRE(token()); return STRING; } -#line 842 "scanner.cc" -yy126: +#line 884 "scanner.cc" +yy137: ++YYCURSOR; -#line 239 "scanner.re" +#line 256 "scanner.re" { tok = cursor; RETURN(0); } -#line 850 "scanner.cc" -yy128: +#line 892 "scanner.cc" +yy139: ++YYCURSOR; -#line 234 "scanner.re" +#line 251 "scanner.re" { depth = 1; goto comment; } -#line 858 "scanner.cc" -yy130: +#line 900 "scanner.cc" +yy141: yych = *++YYCURSOR; - if(yych == ',') goto yy144; - goto yy132; -yy131: + if(yych == ',') goto yy155; + goto yy143; +yy142: ++YYCURSOR; if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; -yy132: +yy143: if(yybm[0+yych] & 128) { - goto yy131; + goto yy142; } - if(yych == ',') goto yy137; - if(yych == '}') goto yy135; - goto yy97; -yy133: + if(yych == ',') goto yy148; + if(yych == '}') goto yy146; + goto yy108; +yy144: ++YYCURSOR; -yy134: -#line 318 "scanner.re" +yy145: +#line 335 "scanner.re" { fatal("illegal closure form, use '{n}', '{n,}', '{n,m}' where n and m are numbers"); } -#line 881 "scanner.cc" -yy135: +#line 923 "scanner.cc" +yy146: ++YYCURSOR; -#line 300 "scanner.re" +#line 317 "scanner.re" { yylval.extop.minsize = atoi((char *)tok+1); yylval.extop.maxsize = atoi((char *)tok+1); RETURN(CLOSESIZE); } -#line 890 "scanner.cc" -yy137: +#line 932 "scanner.cc" +yy148: yyaccept = 7; yych = *(YYMARKER = ++YYCURSOR); - if(yych <= '/') goto yy134; - if(yych <= '9') goto yy140; - if(yych != '}') goto yy134; + if(yych <= '/') goto yy145; + if(yych <= '9') goto yy151; + if(yych != '}') goto yy145; ++YYCURSOR; -#line 312 "scanner.re" +#line 329 "scanner.re" { yylval.extop.minsize = atoi((char *)tok+1); yylval.extop.maxsize = -1; RETURN(CLOSESIZE); } -#line 904 "scanner.cc" -yy140: +#line 946 "scanner.cc" +yy151: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych <= '/') goto yy97; - if(yych <= '9') goto yy140; - if(yych != '}') goto yy97; + if(yych <= '/') goto yy108; + if(yych <= '9') goto yy151; + if(yych != '}') goto yy108; ++YYCURSOR; -#line 306 "scanner.re" +#line 323 "scanner.re" { yylval.extop.minsize = atoi((char *)tok+1); yylval.extop.maxsize = MAX(yylval.extop.minsize,atoi(strchr((char *)tok, ',')+1)); RETURN(CLOSESIZE); } -#line 919 "scanner.cc" -yy144: +#line 961 "scanner.cc" +yy155: yyaccept = 7; yych = *(YYMARKER = ++YYCURSOR); - if(yych <= '/') goto yy134; - if(yych <= '9') goto yy140; - if(yych != '}') goto yy134; + if(yych <= '/') goto yy145; + if(yych <= '9') goto yy151; + if(yych != '}') goto yy145; ++YYCURSOR; -#line 295 "scanner.re" +#line 312 "scanner.re" { yylval.op = '*'; RETURN(CLOSE); } -#line 932 "scanner.cc" +#line 974 "scanner.cc" } -#line 360 "scanner.re" +#line 377 "scanner.re" code: -#line 939 "scanner.cc" +#line 981 "scanner.cc" { YYCTYPE yych; static const unsigned char yybm[] = { @@ -976,24 +1018,24 @@ code: yych = *YYCURSOR; if(yych <= '&') { if(yych <= 0x0A) { - if(yych <= 0x00) goto yy155; - if(yych <= 0x09) goto yy157; - goto yy153; + if(yych <= 0x00) goto yy166; + if(yych <= 0x09) goto yy168; + goto yy164; } else { - if(yych == '"') goto yy159; - goto yy157; + if(yych == '"') goto yy170; + goto yy168; } } else { if(yych <= '{') { - if(yych <= '\'') goto yy160; - if(yych <= 'z') goto yy157; - goto yy151; + if(yych <= '\'') goto yy171; + if(yych <= 'z') goto yy168; + goto yy162; } else { - if(yych != '}') goto yy157; + if(yych != '}') goto yy168; } } ++YYCURSOR; -#line 364 "scanner.re" +#line 381 "scanner.re" { if(--depth == 0) { @@ -1003,18 +1045,18 @@ code: } goto code; } -#line 1007 "scanner.cc" -yy151: +#line 1049 "scanner.cc" +yy162: ++YYCURSOR; -#line 373 "scanner.re" +#line 390 "scanner.re" { ++depth; goto code; } -#line 1015 "scanner.cc" -yy153: +#line 1057 "scanner.cc" +yy164: ++YYCURSOR; -#line 377 "scanner.re" +#line 394 "scanner.re" { if(cursor == eof) { @@ -1024,10 +1066,10 @@ yy153: cline++; goto code; } -#line 1028 "scanner.cc" -yy155: +#line 1070 "scanner.cc" +yy166: ++YYCURSOR; -#line 386 "scanner.re" +#line 403 "scanner.re" { if(cursor == eof) { @@ -1039,82 +1081,82 @@ yy155: } goto code; } -#line 1043 "scanner.cc" -yy157: +#line 1085 "scanner.cc" +yy168: ++YYCURSOR; -yy158: -#line 397 "scanner.re" +yy169: +#line 414 "scanner.re" { goto code; } -#line 1051 "scanner.cc" -yy159: +#line 1093 "scanner.cc" +yy170: yych = *(YYMARKER = ++YYCURSOR); - if(yych == 0x0A) goto yy158; - goto yy166; -yy160: + if(yych == 0x0A) goto yy169; + goto yy177; +yy171: yych = *(YYMARKER = ++YYCURSOR); - if(yych == 0x0A) goto yy158; - goto yy162; -yy161: + if(yych == 0x0A) goto yy169; + goto yy173; +yy172: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy162: +yy173: if(yybm[0+yych] & 64) { - goto yy161; + goto yy172; } - if(yych <= '&') goto yy163; - if(yych <= '\'') goto yy157; - goto yy164; -yy163: + if(yych <= '&') goto yy174; + if(yych <= '\'') goto yy168; + goto yy175; +yy174: YYCURSOR = YYMARKER; - goto yy158; -yy164: + goto yy169; +yy175: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych == 0x0A) goto yy163; - goto yy161; -yy165: + if(yych == 0x0A) goto yy174; + goto yy172; +yy176: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy166: +yy177: if(yybm[0+yych] & 128) { - goto yy165; + goto yy176; } - if(yych <= '!') goto yy163; - if(yych <= '"') goto yy157; + if(yych <= '!') goto yy174; + if(yych <= '"') goto yy168; ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych == 0x0A) goto yy163; - goto yy165; + if(yych == 0x0A) goto yy174; + goto yy176; } -#line 400 "scanner.re" +#line 417 "scanner.re" comment: -#line 1101 "scanner.cc" +#line 1143 "scanner.cc" { YYCTYPE yych; if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; if(yych <= ')') { - if(yych == 0x0A) goto yy173; - goto yy175; + if(yych == 0x0A) goto yy184; + goto yy186; } else { - if(yych <= '*') goto yy170; - if(yych == '/') goto yy172; - goto yy175; + if(yych <= '*') goto yy181; + if(yych == '/') goto yy183; + goto yy186; } -yy170: +yy181: ++YYCURSOR; - if((yych = *YYCURSOR) == '/') goto yy178; -yy171: -#line 428 "scanner.re" + if((yych = *YYCURSOR) == '/') goto yy189; +yy182: +#line 445 "scanner.re" { if(cursor == eof) { @@ -1122,14 +1164,14 @@ yy171: } goto comment; } -#line 1126 "scanner.cc" -yy172: +#line 1168 "scanner.cc" +yy183: yych = *++YYCURSOR; - if(yych == '*') goto yy176; - goto yy171; -yy173: + if(yych == '*') goto yy187; + goto yy182; +yy184: ++YYCURSOR; -#line 419 "scanner.re" +#line 436 "scanner.re" { if(cursor == eof) { @@ -1139,22 +1181,22 @@ yy173: cline++; goto comment; } -#line 1143 "scanner.cc" -yy175: +#line 1185 "scanner.cc" +yy186: yych = *++YYCURSOR; - goto yy171; -yy176: + goto yy182; +yy187: ++YYCURSOR; -#line 414 "scanner.re" +#line 431 "scanner.re" { ++depth; fatal("ambiguous /* found"); goto comment; } -#line 1155 "scanner.cc" -yy178: +#line 1197 "scanner.cc" +yy189: ++YYCURSOR; -#line 404 "scanner.re" +#line 421 "scanner.re" { if(--depth == 0) { @@ -1165,14 +1207,14 @@ yy178: goto comment; } } -#line 1169 "scanner.cc" +#line 1211 "scanner.cc" } -#line 435 "scanner.re" +#line 452 "scanner.re" config: -#line 1176 "scanner.cc" +#line 1218 "scanner.cc" { YYCTYPE yych; static const unsigned char yybm[] = { @@ -1212,65 +1254,65 @@ config: if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; if(yych <= 0x1F) { - if(yych != 0x09) goto yy186; + if(yych != 0x09) goto yy197; } else { - if(yych <= ' ') goto yy182; - if(yych == '=') goto yy184; - goto yy186; + if(yych <= ' ') goto yy193; + if(yych == '=') goto yy195; + goto yy197; } -yy182: +yy193: ++YYCURSOR; yych = *YYCURSOR; - goto yy191; -yy183: -#line 439 "scanner.re" + goto yy202; +yy194: +#line 456 "scanner.re" { goto config; } -#line 1231 "scanner.cc" -yy184: +#line 1273 "scanner.cc" +yy195: ++YYCURSOR; yych = *YYCURSOR; - goto yy189; -yy185: -#line 442 "scanner.re" + goto yy200; +yy196: +#line 459 "scanner.re" { iscfg = 2; cur = cursor; RETURN('='); } -#line 1243 "scanner.cc" -yy186: +#line 1285 "scanner.cc" +yy197: ++YYCURSOR; -#line 447 "scanner.re" +#line 464 "scanner.re" { fatal("missing '='"); } -#line 1250 "scanner.cc" -yy188: +#line 1292 "scanner.cc" +yy199: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy189: +yy200: if(yybm[0+yych] & 128) { - goto yy188; + goto yy199; } - goto yy185; -yy190: + goto yy196; +yy201: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy191: - if(yych == 0x09) goto yy190; - if(yych == ' ') goto yy190; - goto yy183; +yy202: + if(yych == 0x09) goto yy201; + if(yych == ' ') goto yy201; + goto yy194; } -#line 450 "scanner.re" +#line 467 "scanner.re" value: -#line 1274 "scanner.cc" +#line 1316 "scanner.cc" { YYCTYPE yych; static const unsigned char yybm[] = { @@ -1311,197 +1353,197 @@ value: yych = *YYCURSOR; if(yych <= '&') { if(yych <= 0x0D) { - if(yych <= 0x08) goto yy200; - if(yych <= 0x0A) goto yy194; - if(yych <= 0x0C) goto yy200; + if(yych <= 0x08) goto yy211; + if(yych <= 0x0A) goto yy205; + if(yych <= 0x0C) goto yy211; } else { if(yych <= ' ') { - if(yych <= 0x1F) goto yy200; + if(yych <= 0x1F) goto yy211; } else { - if(yych == '"') goto yy202; - goto yy200; + if(yych == '"') goto yy213; + goto yy211; } } } else { if(yych <= '/') { - if(yych <= '\'') goto yy204; - if(yych == '-') goto yy197; - goto yy200; + if(yych <= '\'') goto yy215; + if(yych == '-') goto yy208; + goto yy211; } else { if(yych <= '9') { - if(yych <= '0') goto yy195; - goto yy198; + if(yych <= '0') goto yy206; + goto yy209; } else { - if(yych != ';') goto yy200; + if(yych != ';') goto yy211; } } } -yy194: -#line 460 "scanner.re" +yy205: +#line 477 "scanner.re" { cur = cursor; yylval.str = new Str(token()); iscfg = 0; return VALUE; } -#line 1348 "scanner.cc" -yy195: +#line 1390 "scanner.cc" +yy206: ++YYCURSOR; if(yybm[0+(yych = *YYCURSOR)] & 8) { - goto yy200; + goto yy211; } -yy196: -#line 454 "scanner.re" +yy207: +#line 471 "scanner.re" { cur = cursor; yylval.number = atoi(token().to_string().c_str()); iscfg = 0; return NUMBER; } -#line 1362 "scanner.cc" -yy197: +#line 1404 "scanner.cc" +yy208: yych = *++YYCURSOR; - if(yych <= '0') goto yy201; - if(yych >= ':') goto yy201; -yy198: + if(yych <= '0') goto yy212; + if(yych >= ':') goto yy212; +yy209: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yybm[0+yych] & 4) { - goto yy198; + goto yy209; } if(yych <= 0x0D) { - if(yych <= 0x08) goto yy200; - if(yych <= 0x0A) goto yy196; - if(yych >= 0x0D) goto yy196; + if(yych <= 0x08) goto yy211; + if(yych <= 0x0A) goto yy207; + if(yych >= 0x0D) goto yy207; } else { if(yych <= ' ') { - if(yych >= ' ') goto yy196; + if(yych >= ' ') goto yy207; } else { - if(yych == ';') goto yy196; + if(yych == ';') goto yy207; } } -yy200: +yy211: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy201: +yy212: if(yybm[0+yych] & 8) { - goto yy200; + goto yy211; } - goto yy194; -yy202: + goto yy205; +yy213: YYMARKER = ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yybm[0+yych] & 16) { - goto yy202; + goto yy213; } if(yych <= '!') { - if(yych == 0x0A) goto yy194; - goto yy212; + if(yych == 0x0A) goto yy205; + goto yy223; } else { - if(yych <= '"') goto yy200; - if(yych <= '[') goto yy212; - goto yy214; + if(yych <= '"') goto yy211; + if(yych <= '[') goto yy223; + goto yy225; } -yy204: +yy215: YYMARKER = ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yybm[0+yych] & 32) { - goto yy204; + goto yy215; } if(yych <= '&') { - if(yych == 0x0A) goto yy194; + if(yych == 0x0A) goto yy205; } else { - if(yych <= '\'') goto yy200; - if(yych >= '\\') goto yy209; + if(yych <= '\'') goto yy211; + if(yych >= '\\') goto yy220; } -yy206: +yy217: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yybm[0+yych] & 64) { - goto yy206; + goto yy217; } - if(yych <= '&') goto yy208; - if(yych <= '\'') goto yy210; - goto yy211; -yy208: + if(yych <= '&') goto yy219; + if(yych <= '\'') goto yy221; + goto yy222; +yy219: YYCURSOR = YYMARKER; - goto yy194; -yy209: + goto yy205; +yy220: YYMARKER = ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yych <= 0x0D) { if(yych <= 0x09) { - if(yych <= 0x08) goto yy204; - goto yy206; + if(yych <= 0x08) goto yy215; + goto yy217; } else { - if(yych <= 0x0A) goto yy194; - if(yych <= 0x0C) goto yy204; - goto yy206; + if(yych <= 0x0A) goto yy205; + if(yych <= 0x0C) goto yy215; + goto yy217; } } else { if(yych <= ' ') { - if(yych <= 0x1F) goto yy204; - goto yy206; + if(yych <= 0x1F) goto yy215; + goto yy217; } else { - if(yych == ';') goto yy206; - goto yy204; + if(yych == ';') goto yy217; + goto yy215; } } -yy210: +yy221: yych = *++YYCURSOR; - goto yy194; -yy211: + goto yy205; +yy222: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych == 0x0A) goto yy208; - goto yy206; -yy212: + if(yych == 0x0A) goto yy219; + goto yy217; +yy223: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yybm[0+yych] & 128) { - goto yy212; + goto yy223; } - if(yych <= '!') goto yy208; - if(yych <= '"') goto yy210; - goto yy215; -yy214: + if(yych <= '!') goto yy219; + if(yych <= '"') goto yy221; + goto yy226; +yy225: YYMARKER = ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yych <= 0x0D) { if(yych <= 0x09) { - if(yych <= 0x08) goto yy202; - goto yy212; + if(yych <= 0x08) goto yy213; + goto yy223; } else { - if(yych <= 0x0A) goto yy194; - if(yych <= 0x0C) goto yy202; - goto yy212; + if(yych <= 0x0A) goto yy205; + if(yych <= 0x0C) goto yy213; + goto yy223; } } else { if(yych <= ' ') { - if(yych <= 0x1F) goto yy202; - goto yy212; + if(yych <= 0x1F) goto yy213; + goto yy223; } else { - if(yych == ';') goto yy212; - goto yy202; + if(yych == ';') goto yy223; + goto yy213; } } -yy215: +yy226: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych == 0x0A) goto yy208; - goto yy212; + if(yych == 0x0A) goto yy219; + goto yy223; } -#line 466 "scanner.re" +#line 483 "scanner.re" } diff --git a/re2c/code.cc b/re2c/code.cc index d284e967..d01c2b30 100644 --- a/re2c/code.cc +++ b/re2c/code.cc @@ -313,6 +313,28 @@ void genIf(std::ostream &o, uint ind, const char *cmp, uint v, bool &readCh) o << ") "; } +static void genYyfill(std::ostream &o, uint ind, uint need) +{ + if (bUseYYFillParam) + { + o << mapCodeName["YYFILL"] << "(" << need << ")"; + } + else + { + std::string yyfill(mapCodeName["YYFILL"]); + std::string::size_type pos; + char cnt[16]; + + sprintf(cnt, "%d", need); + + while((pos = yyfill.find(yyfillLength)) != std::string::npos) + { + yyfill.replace(pos, yyfillLength.length(), cnt); + } + o << yyfill; + } +} + static void need(std::ostream &o, uint ind, uint n, bool & readCh, bool bSetMarker) { uint fillIndex = next_fill_index; @@ -327,15 +349,13 @@ static void need(std::ostream &o, uint ind, uint n, bool & readCh, bool bSetMark { if (n == 1) { - o << indent(ind) << "if(" << mapCodeName["YYLIMIT"] << " == " << mapCodeName["YYCURSOR"] << ") " << mapCodeName["YYFILL"]; + o << indent(ind) << "if(" << mapCodeName["YYLIMIT"] << " == " << mapCodeName["YYCURSOR"] << ") "; + genYyfill(o, ind, n); } else { - o << indent(ind) << "if((" << mapCodeName["YYLIMIT"] << " - " << mapCodeName["YYCURSOR"] << ") < " << n << ") " << mapCodeName["YYFILL"]; - } - if (bUseYYFillParam) - { - o << "(" << n << ")"; + o << indent(ind) << "if((" << mapCodeName["YYLIMIT"] << " - " << mapCodeName["YYCURSOR"] << ") < " << n << ") "; + genYyfill(o, ind, n); } o << ";\n"; } @@ -1721,7 +1741,7 @@ void genCondGoto(std::ostream &o, uint ind, const RegExpMap& specMap) for(RegExpMap::const_iterator it = specMap.begin(); it != specMap.end(); ++it) { - o << indent(ind) << "case " << it->first << ": goto " << condPrefix << it->first << ";\n"; + o << indent(ind) << "case " << condEnumPrefix << it->first << ": goto " << condPrefix << it->first << ";\n"; } o << indent(ind) << "}\n"; } @@ -1730,6 +1750,18 @@ void genCondGoto(std::ostream &o, uint ind, const RegExpMap& specMap) } } +void genTypes(std::string& o, uint ind, const RegExpMap& specMap) +{ + o.clear(); + + o += indent(ind++) + "enum " + mapCodeName["YYCONDTYPE"] + " {\n"; + for(RegExpMap::const_iterator it = specMap.begin(); it != specMap.end(); ++it) + { + o += indent(ind) + condEnumPrefix + it->first + ",\n"; + } + o += indent(--ind) + "};\n"; +} + void genHeader(std::ostream &o, uint ind, const RegExpMap& specMap) { o << "/* Generated by re2c " PACKAGE_VERSION; @@ -1743,12 +1775,8 @@ void genHeader(std::ostream &o, uint ind, const RegExpMap& specMap) o << headerFileInfo; o << "\n"; // now the type(s) - o << indent(ind++) << "enum " << mapCodeName["YYCONDTYPE"] << " {\n"; - for(RegExpMap::const_iterator it = specMap.begin(); it != specMap.end(); ++it) - { - o << indent(ind) << it->first << ",\n"; - } - o << indent(--ind) << "}\n"; + genTypes(typesInline, ind, specMap); + o << typesInline; } std::ostream& operator << (std::ostream& o, const file_info& li) @@ -1881,9 +1909,13 @@ void Scanner::config(const Str& cfg, const Str& val) { condPrefix = strVal; } - else if (cfg.to_string() == "yych:conversion") + else if (cfg.to_string() == "condenumprefix") + { + condEnumPrefix = strVal; + } + else if (cfg.to_string() == "define:YYFILL:len") { - yychConversion = mapCodeName["YYCTYPE"]; + yyfillLength = strVal; } else if (mapVariableKeys.find(cfg.to_string()) != mapVariableKeys.end()) { diff --git a/re2c/globals.h b/re2c/globals.h index 21dc7d7d..fea02d4b 100644 --- a/re2c/globals.h +++ b/re2c/globals.h @@ -41,7 +41,9 @@ extern bool bUseStartLabel; extern std::string startLabelName; extern std::string labelPrefix; extern std::string condPrefix; +extern std::string condEnumPrefix; extern std::string yychConversion; +extern std::string yyfillLength; extern uint maxFill; extern uint next_label; extern uint cGotoThreshold; @@ -52,10 +54,10 @@ extern std::string indString; extern bool yybmHexTable; extern bool bUseStateAbort; extern bool bUseStateNext; -extern bool bWroteGetState; -extern bool bWroteCondCheck; extern bool bUseYYFill; extern bool bUseYYFillParam; +extern bool bWroteGetState; +extern bool bWroteCondCheck; extern uint asc2ebc[256]; extern uint ebc2asc[256]; @@ -65,21 +67,13 @@ extern uint *xlat, *talx; extern uint next_fill_index; extern uint last_fill_index; extern std::set vUsedLabels; -extern re2c::CodeNames mapCodeName; +extern CodeNames mapCodeName; +extern std::string typesInline; extern uint nRealChars; -inline char octCh(uint c) -{ - return '0' + c % 8; -} - -inline char hexCh(uint c) -{ - static const char * sHex = "0123456789ABCDEF"; - - return sHex[c & 0x0F]; -} +extern char octCh(uint c); +extern char hexCh(uint c); } // end namespace re2c diff --git a/re2c/main.cc b/re2c/main.cc index e0980836..bced4c9d 100644 --- a/re2c/main.cc +++ b/re2c/main.cc @@ -51,7 +51,9 @@ bool bUseYYFillParam = true; std::string startLabelName; std::string labelPrefix("yy"); std::string condPrefix("yyc_"); +std::string condEnumPrefix("yyc"); std::string yychConversion(""); +std::string yyfillLength("@@"); uint maxFill = 1; uint next_label = 0; uint cGotoThreshold = 9; @@ -68,7 +70,8 @@ uint nRealChars = 256; uint next_fill_index = 0; uint last_fill_index = 0; std::set vUsedLabels; -re2c::CodeNames mapCodeName; +CodeNames mapCodeName; +std::string typesInline; free_list RegExp::vFreeList; free_list Range::vFreeList; diff --git a/re2c/parser.y b/re2c/parser.y index ec62df9f..2ea0175a 100644 --- a/re2c/parser.y +++ b/re2c/parser.y @@ -416,6 +416,10 @@ void parse(Scanner& i, std::ostream& o, std::ostream* h) { genHeader(*h, 0, specMap); } + else + { + genTypes(typesInline, 0, specMap); + } } else if(spec) { diff --git a/re2c/re.h b/re2c/re.h index 9dd67690..c6b927b6 100644 --- a/re2c/re.h +++ b/re2c/re.h @@ -7,6 +7,7 @@ #include #include #include +#include #include "token.h" #include "ins.h" #include "globals.h" @@ -495,9 +496,10 @@ typedef std::list RuleOpList; extern void genCode(std::ostream&, uint&, RegExp*, const RegExpMap*, const std::string&, bool); extern void genGetState(std::ostream&, uint&, uint); -extern void genCondTable(std::ostream &o, uint, const RegExpMap&); -extern void genCondGoto(std::ostream &o, uint, const RegExpMap&); -extern void genHeader(std::ostream &o, uint, const RegExpMap&); +extern void genCondTable(std::ostream&, uint, const RegExpMap&); +extern void genCondGoto(std::ostream&, uint, const RegExpMap&); +extern void genTypes(std::string&, uint, const RegExpMap&); +extern void genHeader(std::ostream&, uint, const RegExpMap&); extern RegExp *mkDiff(RegExp*, RegExp*); extern RegExp *mkAlt(RegExp*, RegExp*); diff --git a/re2c/scanner.re b/re2c/scanner.re index 38843f3c..b0f14dbb 100644 --- a/re2c/scanner.re +++ b/re2c/scanner.re @@ -142,6 +142,23 @@ echo: ignore_eoc = true; goto echo; } + "/*!types:re2c" { + if (bSinglePass) + { + fatal("cannot generate types inline in single pass mode"); + } + tok = pos = cursor; + ignore_eoc = true; + if (bLastPass) + { + out << outputFileInfo; + out << "\n"; + out << typesInline; + out << "\n"; + out << sourceFileInfo; + } + goto echo; + } "*" "/" "\r"? "\n" { cline++; if (ignore_eoc) diff --git a/re2c/test/condition_01.c.c b/re2c/test/condition_01.c.c index 0343dfaf..78557556 100755 --- a/re2c/test/condition_01.c.c +++ b/re2c/test/condition_01.c.c @@ -5,8 +5,8 @@ { YYCTYPE yych; switch(YYCONDITION) { - case a: goto yyc_a; - case b: goto yyc_b; + case yyca: goto yyc_a; + case yycb: goto yyc_b; } /* *********************************** */ yyc_a: diff --git a/re2c/test/condition_02.c.c b/re2c/test/condition_02.c.c index 7644fbcf..f9b152ec 100755 --- a/re2c/test/condition_02.c.c +++ b/re2c/test/condition_02.c.c @@ -5,9 +5,9 @@ { YYCTYPE yych; switch(YYCONDITION) { - case 0: goto yyc_0; - case r1: goto yyc_r1; - case r2: goto yyc_r2; + case yyc0: goto yyc_0; + case yycr1: goto yyc_r1; + case yycr2: goto yyc_r2; } /* *********************************** */ yyc_0: diff --git a/re2c/test/condition_05.cgitcondition_05.cgit.h.h b/re2c/test/condition_05.cgitcondition_05.cgit.h.h index 9cda0d78..74bc7ef9 100755 --- a/re2c/test/condition_05.cgitcondition_05.cgit.h.h +++ b/re2c/test/condition_05.cgitcondition_05.cgit.h.h @@ -1,6 +1,6 @@ /* Generated by re2c */ enum YYCONDTYPE { - comment, - normal, -} + yyccomment, + yycnormal, +}; diff --git a/re2c/test/condition_05.cgtcondition_05.cgt.h.h b/re2c/test/condition_05.cgtcondition_05.cgt.h.h index 9c472d7a..29a8d28b 100755 --- a/re2c/test/condition_05.cgtcondition_05.cgt.h.h +++ b/re2c/test/condition_05.cgtcondition_05.cgt.h.h @@ -2,6 +2,6 @@ #line 3 "condition_05.cgt.h" enum YYCONDTYPE { - comment, - normal, -} + yyccomment, + yycnormal, +}; diff --git a/re2c/test/condition_06.cs.c b/re2c/test/condition_06.cs.c new file mode 100755 index 00000000..9eef88da --- /dev/null +++ b/re2c/test/condition_06.cs.c @@ -0,0 +1,391 @@ +/* Generated by re2c */ +#line 1 "condition_06.cs.re" +#include +#include +#include + +#define BSIZE 8192 + +typedef struct Scanner +{ + FILE *fp; + unsigned char *cur, *tok, *lim, *eof; + unsigned char buffer[BSIZE]; +} Scanner; + +int fill(Scanner *s, int len) +{ + if (!len) + { + s->cur = s->tok = s->lim = s->buffer; + s->eof = 0; + } + if (!s->eof) + { + int got, cnt = s->tok - s->buffer; + + if (cnt > 0) + { + memcpy(s->buffer, s->tok, s->lim - s->tok); + s->tok -= cnt; + s->cur -= cnt; + s->lim -= cnt; + } + cnt = BSIZE - cnt; + if ((got = fread(s->lim, 1, cnt, s->fp)) != cnt) + { + s->eof = &s->lim[got]; + } + s->lim += got; + } + else if (s->cur + len > s->eof) + { + return 0; /* not enough input data */ + } + return -1; +} + +void fputl(const char *s, size_t len, FILE *stream) +{ + while(len-- > 0) + { + fputc(*s++, stream); + } +} + +#line 57 "" + +enum YYCONDTYPE { + EStateComment, + EStateNormal, + EStateSkiptoeol, + EStateString, +}; + +#line 54 "condition_06.cs.re" + +void scan(Scanner *s) +{ + int state = EStateNormal; + + fill(s, 0); + + for(;;) + { + s->tok = s->cur; + +#line 78 "" + { + unsigned char yych; + if (state < 2) { + if (state < 1) { + goto yyc_Comment; + } else { + goto yyc_Normal; + } + } else { + if (state < 3) { + goto yyc_Skiptoeol; + } else { + goto yyc_String; + } + } +/* *********************************** */ +yyc_Comment: + + if((s->lim - s->cur) < 2) { if(fill(s, 2) >= 0) break; }; + yych = *s->cur; + if(yych != '*') goto yy4; + ++s->cur; + if((yych = *s->cur) == '/') goto yy5; +yy3: +#line 147 "condition_06.cs.re" + { + goto yyc_Comment; + } +#line 107 "" +yy4: + yych = *++s->cur; + goto yy3; +yy5: + ++s->cur; +#line 143 "condition_06.cs.re" + { + continue; + } +#line 117 "" +/* *********************************** */ +yyc_Normal: + if((s->lim - s->cur) < 3) { if(fill(s, 3) >= 0) break; }; + yych = *s->cur; + if(yych <= '.') { + if(yych == '"') goto yy12; + goto yy14; + } else { + if(yych <= '/') goto yy11; + if(yych != '?') goto yy14; + } + yych = *(s->tok = ++s->cur); + if(yych == '?') goto yy19; +yy10: +#line 138 "condition_06.cs.re" + { + fputc(*s->tok, stdout); + continue; + } +#line 137 "" +yy11: + yych = *++s->cur; + if(yych == '*') goto yy17; + if(yych == '/') goto yy15; + goto yy10; +yy12: + ++s->cur; +#line 132 "condition_06.cs.re" + { + fputc(*s->tok, stdout); + state = EStateString; + continue; + } +#line 151 "" +yy14: + yych = *++s->cur; + goto yy10; +yy15: + ++s->cur; +#line 128 "condition_06.cs.re" + { + goto yyc_Skiptoeol; + } +#line 161 "" +yy17: + ++s->cur; +#line 124 "condition_06.cs.re" + { + goto yyc_Comment; + } +#line 168 "" +yy19: + yych = *++s->cur; + switch(yych) { + case '!': goto yy35; + case '\'': goto yy33; + case '(': goto yy21; + case ')': goto yy23; + case '-': goto yy37; + case '/': goto yy31; + case '<': goto yy25; + case '=': goto yy29; + case '>': goto yy27; + default: goto yy20; + } +yy20: + s->cur = s->tok; + goto yy10; +yy21: + ++s->cur; +#line 79 "condition_06.cs.re" + { + fputc('[', stdout); + continue; + } +#line 193 "" +yy23: + ++s->cur; +#line 84 "condition_06.cs.re" + { + fputc(']', stdout); + continue; + } +#line 201 "" +yy25: + ++s->cur; +#line 89 "condition_06.cs.re" + { + fputc('{', stdout); + continue; + } +#line 209 "" +yy27: + ++s->cur; +#line 94 "condition_06.cs.re" + { + fputc('}', stdout); + continue; + } +#line 217 "" +yy29: + ++s->cur; +#line 99 "condition_06.cs.re" + { + fputc('#', stdout); + continue; + } +#line 225 "" +yy31: + ++s->cur; +#line 104 "condition_06.cs.re" + { + fputc('\\', stdout); + continue; + } +#line 233 "" +yy33: + ++s->cur; +#line 109 "condition_06.cs.re" + { + fputc('^', stdout); + continue; + } +#line 241 "" +yy35: + ++s->cur; +#line 114 "condition_06.cs.re" + { + fputc('|', stdout); + continue; + } +#line 249 "" +yy37: + ++s->cur; +#line 119 "condition_06.cs.re" + { + fputc('~', stdout); + continue; + } +#line 257 "" +/* *********************************** */ +yyc_Skiptoeol: + if((s->lim - s->cur) < 5) { if(fill(s, 5) >= 0) break; }; + yych = *s->cur; + if(yych <= '>') { + if(yych == 0x0A) goto yy44; + goto yy46; + } else { + if(yych <= '?') goto yy41; + if(yych == '\\') goto yy43; + goto yy46; + } +yy41: + yych = *(s->tok = ++s->cur); + if(yych == '?') goto yy51; +yy42: +#line 163 "condition_06.cs.re" + { + goto yyc_Skiptoeol; + } +#line 278 "" +yy43: + yych = *(s->tok = ++s->cur); + if(yych == 0x0A) goto yy49; + if(yych == 0x0D) goto yy47; + goto yy42; +yy44: + ++s->cur; +#line 159 "condition_06.cs.re" + { + continue; + } +#line 290 "" +yy46: + yych = *++s->cur; + goto yy42; +yy47: + yych = *++s->cur; + if(yych == 0x0A) goto yy49; +yy48: + s->cur = s->tok; + goto yy42; +yy49: + ++s->cur; +#line 155 "condition_06.cs.re" + { + goto yyc_Skiptoeol; + } +#line 306 "" +yy51: + yych = *++s->cur; + if(yych != '/') goto yy48; + yych = *++s->cur; + if(yych == 0x0A) goto yy54; + if(yych != 0x0D) goto yy48; + yych = *++s->cur; + if(yych != 0x0A) goto yy48; +yy54: + ++s->cur; +#line 151 "condition_06.cs.re" + { + goto yyc_Skiptoeol; + } +#line 321 "" +/* *********************************** */ +yyc_String: + if((s->lim - s->cur) < 2) { if(fill(s, 2) >= 0) break; }; + yych = *s->cur; + if(yych == '"') goto yy60; + if(yych != '\\') goto yy62; + ++s->cur; + if((yych = *s->cur) != 0x0A) goto yy63; +yy59: +#line 177 "condition_06.cs.re" + { + fputc(*s->tok, stdout); + continue; + } +#line 336 "" +yy60: + ++s->cur; +#line 172 "condition_06.cs.re" + { + fputc(*s->tok, stdout); + continue; + } +#line 344 "" +yy62: + yych = *++s->cur; + goto yy59; +yy63: + ++s->cur; +#line 167 "condition_06.cs.re" + { + fputl((const char*)s->tok, 2, stdout); + continue; + } +#line 355 "" + } +#line 181 "condition_06.cs.re" + + } +} + +int main(int argc, char **argv) +{ + Scanner in; + char c; + + if (argc != 2) + { + fprintf(stderr, "%s \n", argv[0]); + return 1;; + } + + memset((char*) &in, 0, sizeof(in)); + + if (!strcmp(argv[1], "-")) + { + in.fp = stdin; + } + else if ((in.fp = fopen(argv[1], "r")) == NULL) + { + fprintf(stderr, "Cannot open file '%s'\n", argv[1]); + return 1; + } + + scan(&in); + + if (in.fp != stdin) + { + fclose(in.fp); + } + return 0; +} diff --git a/re2c/test/condition_06.cs.re b/re2c/test/condition_06.cs.re new file mode 100755 index 00000000..66152295 --- /dev/null +++ b/re2c/test/condition_06.cs.re @@ -0,0 +1,215 @@ +#include +#include +#include + +#define BSIZE 8192 + +typedef struct Scanner +{ + FILE *fp; + unsigned char *cur, *tok, *lim, *eof; + unsigned char buffer[BSIZE]; +} Scanner; + +int fill(Scanner *s, int len) +{ + if (!len) + { + s->cur = s->tok = s->lim = s->buffer; + s->eof = 0; + } + if (!s->eof) + { + int got, cnt = s->tok - s->buffer; + + if (cnt > 0) + { + memcpy(s->buffer, s->tok, s->lim - s->tok); + s->tok -= cnt; + s->cur -= cnt; + s->lim -= cnt; + } + cnt = BSIZE - cnt; + if ((got = fread(s->lim, 1, cnt, s->fp)) != cnt) + { + s->eof = &s->lim[got]; + } + s->lim += got; + } + else if (s->cur + len > s->eof) + { + return 0; /* not enough input data */ + } + return -1; +} + +void fputl(const char *s, size_t len, FILE *stream) +{ + while(len-- > 0) + { + fputc(*s++, stream); + } +} + +/*!types:re2c */ + +void scan(Scanner *s) +{ + int state = EStateNormal; + + fill(s, 0); + + for(;;) + { + s->tok = s->cur; +/*!re2c + +re2c:define:YYCTYPE = "unsigned char"; +re2c:define:YYCURSOR = s->cur; +re2c:define:YYLIMIT = s->lim; +re2c:define:YYMARKER = s->tok; +re2c:define:YYFILL:len = #; +re2c:define:YYFILL = "{ if(fill(s, #) >= 0) break; }"; +re2c:define:YYCONDITION = state; +re2c:yyfill:parameter = 0; +re2c:indent:top = 2; +re2c:condenumprefix = EState; + + "??(" + { + fputc('[', stdout); + continue; + } + "??)" + { + fputc(']', stdout); + continue; + } + "??<" + { + fputc('{', stdout); + continue; + } + "??>" + { + fputc('}', stdout); + continue; + } + "??=" + { + fputc('#', stdout); + continue; + } + "??/" + { + fputc('\\', stdout); + continue; + } + "??'" + { + fputc('^', stdout); + continue; + } + "??!" + { + fputc('|', stdout); + continue; + } + "??-" + { + fputc('~', stdout); + continue; + } + "/*" + { + goto yyc_Comment; + } + "//" + { + goto yyc_Skiptoeol; + } + '"' + { + fputc(*s->tok, stdout); + state = EStateString; + continue; + } + [^] + { + fputc(*s->tok, stdout); + continue; + } + "*" "/" + { + continue; + } + [^] + { + goto yyc_Comment; + } + "??/" "\r"? "\n" + { + goto yyc_Skiptoeol; + } + "\\" "\r"? "\n" + { + goto yyc_Skiptoeol; + } + "\n" + { + continue; + } + [^] + { + goto yyc_Skiptoeol; + } + '\\' . + { + fputl((const char*)s->tok, 2, stdout); + continue; + } + '"' + { + fputc(*s->tok, stdout); + continue; + } + [^] + { + fputc(*s->tok, stdout); + continue; + } +*/ + } +} + +int main(int argc, char **argv) +{ + Scanner in; + char c; + + if (argc != 2) + { + fprintf(stderr, "%s \n", argv[0]); + return 1;; + } + + memset((char*) &in, 0, sizeof(in)); + + if (!strcmp(argv[1], "-")) + { + in.fp = stdin; + } + else if ((in.fp = fopen(argv[1], "r")) == NULL) + { + fprintf(stderr, "Cannot open file '%s'\n", argv[1]); + return 1; + } + + scan(&in); + + if (in.fp != stdin) + { + fclose(in.fp); + } + return 0; +} diff --git a/re2c/translate.cc b/re2c/translate.cc index a8be85ed..ef690ca5 100644 --- a/re2c/translate.cc +++ b/re2c/translate.cc @@ -4,6 +4,18 @@ namespace re2c { +char octCh(uint c) +{ + return '0' + c % 8; +} + +static const char * sHex = "0123456789ABCDEF"; + +char hexCh(uint c) +{ + return sHex[c & 0x0F]; +} + uint asc2asc[256] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,