From: helly Date: Sun, 13 Jan 2008 17:46:06 +0000 (+0000) Subject: - Add support for ':=' and '=>' in '<>' rules X-Git-Tag: 0.13.6~115 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=470e3d8bf136ef8d3c7e0e53621895fc9636875b;p=re2c - Add support for ':=' and '=>' in '<>' rules --- diff --git a/re2c/bootstrap/parser.cc b/re2c/bootstrap/parser.cc index 0f0ecce0..5a459023 100644 --- a/re2c/bootstrap/parser.cc +++ b/re2c/bootstrap/parser.cc @@ -417,7 +417,7 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 2 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 69 +#define YYLAST 71 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 24 @@ -426,7 +426,7 @@ union yyalloc /* YYNRULES -- Number of rules. */ #define YYNRULES 39 /* YYNRULES -- Number of states. */ -#define YYNSTATES 68 +#define YYNSTATES 71 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 @@ -473,9 +473,9 @@ static const yytype_uint8 yytranslate[] = static const yytype_uint8 yyprhs[] = { 0, 0, 3, 4, 7, 10, 15, 20, 25, 30, - 34, 42, 48, 56, 62, 65, 66, 68, 70, 74, - 75, 79, 80, 83, 85, 89, 91, 95, 97, 100, - 102, 105, 108, 110, 112, 115, 118, 120, 122, 124 + 34, 42, 49, 57, 64, 68, 69, 71, 73, 77, + 78, 82, 83, 86, 88, 92, 94, 98, 100, 103, + 105, 108, 111, 113, 115, 118, 121, 123, 125, 127 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ @@ -485,24 +485,25 @@ static const yytype_int8 yyrhs[] = 7, 14, 32, 15, -1, 7, 14, 32, 16, -1, 11, 14, 12, 15, -1, 11, 14, 13, 15, -1, 32, 31, 8, -1, 17, 28, 18, 32, 31, 30, - 8, -1, 17, 28, 18, 31, 8, -1, 17, 5, - 18, 32, 31, 30, 8, -1, 17, 5, 18, 31, - 8, -1, 6, 8, -1, -1, 29, -1, 7, -1, - 29, 19, 7, -1, -1, 14, 18, 7, -1, -1, - 16, 32, -1, 33, -1, 32, 20, 33, -1, 34, - -1, 33, 21, 34, -1, 35, -1, 34, 35, -1, - 37, -1, 37, 36, -1, 37, 3, -1, 4, -1, - 5, -1, 36, 4, -1, 36, 5, -1, 7, -1, - 9, -1, 10, -1, 22, 32, 23, -1 + 8, -1, 17, 28, 18, 31, 30, 8, -1, 17, + 5, 18, 32, 31, 30, 8, -1, 17, 5, 18, + 31, 30, 8, -1, 6, 30, 8, -1, -1, 29, + -1, 7, -1, 29, 19, 7, -1, -1, 14, 18, + 7, -1, -1, 16, 32, -1, 33, -1, 32, 20, + 33, -1, 34, -1, 33, 21, 34, -1, 35, -1, + 34, 35, -1, 37, -1, 37, 36, -1, 37, 3, + -1, 4, -1, 5, -1, 36, 4, -1, 36, 5, + -1, 7, -1, 9, -1, 10, -1, 22, 32, 23, + -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { 0, 92, 92, 96, 97, 101, 109, 113, 119, 127, - 136, 165, 174, 183, 191, 207, 210, 217, 222, 231, - 234, 242, 245, 252, 256, 263, 267, 278, 282, 289, - 293, 308, 315, 319, 323, 327, 334, 342, 346, 350 + 136, 165, 174, 183, 191, 208, 211, 218, 223, 232, + 235, 243, 246, 253, 257, 264, 268, 279, 283, 290, + 294, 309, 316, 320, 324, 328, 335, 343, 347, 351 }; #endif @@ -543,7 +544,7 @@ static const yytype_uint8 yyr1[] = static const yytype_uint8 yyr2[] = { 0, 2, 0, 2, 2, 4, 4, 4, 4, 3, - 7, 5, 7, 5, 2, 0, 1, 1, 3, 0, + 7, 6, 7, 6, 3, 0, 1, 1, 3, 0, 3, 0, 2, 1, 3, 1, 3, 1, 2, 1, 2, 2, 1, 1, 2, 2, 1, 1, 1, 3 }; @@ -553,20 +554,21 @@ static const yytype_uint8 yyr2[] = means the default is an error. */ static const yytype_uint8 yydefact[] = { - 2, 0, 1, 0, 36, 37, 38, 0, 15, 0, - 4, 3, 21, 23, 25, 27, 29, 14, 0, 0, - 0, 17, 0, 16, 36, 0, 0, 0, 0, 0, - 28, 31, 32, 33, 30, 0, 0, 0, 21, 21, - 0, 39, 22, 24, 9, 26, 34, 35, 5, 6, - 7, 8, 0, 21, 0, 21, 18, 13, 19, 11, - 19, 0, 0, 0, 0, 12, 10, 20 + 2, 0, 1, 19, 36, 37, 38, 0, 15, 0, + 4, 3, 21, 23, 25, 27, 29, 0, 0, 0, + 0, 0, 17, 0, 16, 36, 0, 0, 0, 0, + 0, 28, 31, 32, 33, 30, 0, 14, 0, 0, + 0, 21, 21, 0, 39, 22, 24, 9, 26, 34, + 35, 20, 5, 6, 7, 8, 19, 21, 19, 21, + 18, 0, 19, 0, 19, 13, 0, 11, 0, 12, + 10 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = { - -1, 1, 10, 11, 22, 23, 62, 28, 12, 13, - 14, 15, 34, 16 + -1, 1, 10, 11, 23, 24, 18, 29, 12, 13, + 14, 15, 35, 16 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing @@ -574,20 +576,21 @@ static const yytype_int8 yydefgoto[] = #define YYPACT_NINF -38 static const yytype_int8 yypact[] = { - -38, 4, -38, 9, 22, -38, -38, 30, 38, 28, - -38, -38, -11, 27, 28, -38, 3, -38, 28, 11, - 21, -38, 29, 32, -38, -1, 28, 28, 41, 28, - -38, -38, -38, -38, 25, 26, 37, 39, 18, 18, - 46, -38, 35, 27, -38, 28, -38, -38, -38, -38, - -38, -38, 48, -11, 49, -11, -38, -38, 44, -38, - 44, 42, 51, 53, 55, -38, -38, -38 + -38, 1, -38, -12, -8, -38, -38, -5, 25, 7, + -38, -38, -1, 10, 7, -38, 45, 19, 33, 7, + 39, 37, -38, 38, 26, -38, 5, 7, 7, 50, + 7, -38, -38, -38, -38, 49, 52, -38, 27, 42, + 46, 17, 17, 53, -38, 43, 10, -38, 7, -38, + -38, -38, -38, -38, -38, -38, -12, -1, -12, -1, + -38, 54, -12, 56, -12, -38, 57, -38, 58, -38, + -38 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { - -38, -38, -38, -38, -38, -38, 5, -37, -6, 36, - 40, -14, -38, -38 + -38, -38, -38, -38, -38, -38, -18, -37, -6, 40, + 41, -14, -38, -38 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If @@ -597,24 +600,26 @@ static const yytype_int8 yypgoto[] = #define YYTABLE_NINF -1 static const yytype_uint8 yytable[] = { - 30, 52, 54, 25, 2, 26, 31, 32, 33, 27, - 3, 4, 35, 5, 6, 7, 58, 17, 60, 27, - 42, 8, 41, 36, 37, 24, 9, 5, 6, 46, - 47, 30, 53, 55, 26, 24, 18, 5, 6, 38, - 9, 48, 49, 20, 19, 21, 27, 39, 29, 44, - 9, 40, 50, 56, 51, 27, 57, 59, 61, 65, - 64, 66, 67, 43, 0, 63, 0, 0, 0, 45 + 31, 2, 17, 26, 56, 58, 19, 3, 4, 20, + 5, 6, 7, 38, 25, 27, 5, 6, 8, 28, + 62, 45, 64, 9, 25, 28, 5, 6, 44, 9, + 21, 30, 22, 27, 31, 57, 59, 36, 61, 9, + 63, 37, 52, 53, 66, 43, 68, 28, 32, 33, + 34, 39, 40, 49, 50, 41, 42, 54, 47, 51, + 60, 55, 65, 28, 67, 69, 70, 0, 46, 0, + 0, 48 }; static const yytype_int8 yycheck[] = { - 14, 38, 39, 9, 0, 16, 3, 4, 5, 20, - 6, 7, 18, 9, 10, 11, 53, 8, 55, 20, - 26, 17, 23, 12, 13, 7, 22, 9, 10, 4, - 5, 45, 38, 39, 16, 7, 14, 9, 10, 18, - 22, 15, 16, 5, 14, 7, 20, 18, 21, 8, - 22, 19, 15, 7, 15, 20, 8, 8, 14, 8, - 18, 8, 7, 27, -1, 60, -1, -1, -1, 29 + 14, 0, 14, 9, 41, 42, 14, 6, 7, 14, + 9, 10, 11, 19, 7, 16, 9, 10, 17, 20, + 57, 27, 59, 22, 7, 20, 9, 10, 23, 22, + 5, 21, 7, 16, 48, 41, 42, 18, 56, 22, + 58, 8, 15, 16, 62, 19, 64, 20, 3, 4, + 5, 12, 13, 4, 5, 18, 18, 15, 8, 7, + 7, 15, 8, 20, 8, 8, 8, -1, 28, -1, + -1, 30 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing @@ -622,12 +627,13 @@ static const yytype_int8 yycheck[] = static const yytype_uint8 yystos[] = { 0, 25, 0, 6, 7, 9, 10, 11, 17, 22, - 26, 27, 32, 33, 34, 35, 37, 8, 14, 14, - 5, 7, 28, 29, 7, 32, 16, 20, 31, 21, - 35, 3, 4, 5, 36, 32, 12, 13, 18, 18, - 19, 23, 32, 33, 8, 34, 4, 5, 15, 16, - 15, 15, 31, 32, 31, 32, 7, 8, 31, 8, - 31, 14, 30, 30, 18, 8, 8, 7 + 26, 27, 32, 33, 34, 35, 37, 14, 30, 14, + 14, 5, 7, 28, 29, 7, 32, 16, 20, 31, + 21, 35, 3, 4, 5, 36, 18, 8, 32, 12, + 13, 18, 18, 19, 23, 32, 33, 8, 34, 4, + 5, 7, 15, 16, 15, 15, 31, 32, 31, 32, + 7, 30, 31, 30, 31, 8, 30, 8, 30, 8, + 8 }; #define yyerrok (yyerrstatus = 0) @@ -1531,7 +1537,7 @@ yyreduce: case 11: #line 166 "parser.y" { - delete (yyvsp[(2) - (5)].clist); + delete (yyvsp[(2) - (6)].clist); if (!cFlag) { in->fatal("conditions are only allowed when using -c switch"); @@ -1574,26 +1580,27 @@ yyreduce: { in->fatal("code to handle illegal condition already defined"); } - (yyval.regexp) = specNone = new RuleOp(new NullOp(), new NullOp(), (yyvsp[(2) - (2)].token), accept++); + (yyvsp[(3) - (3)].token)->newcond = (yyvsp[(2) - (3)].str); + (yyval.regexp) = specNone = new RuleOp(new NullOp(), new NullOp(), (yyvsp[(3) - (3)].token), accept++); } break; case 15: -#line 207 "parser.y" +#line 208 "parser.y" { in->fatal("unnamed condition not supported"); } break; case 16: -#line 211 "parser.y" +#line 212 "parser.y" { (yyval.clist) = (yyvsp[(1) - (1)].clist); } break; case 17: -#line 218 "parser.y" +#line 219 "parser.y" { (yyval.clist) = new CondList(); (yyval.clist)->insert((yyvsp[(1) - (1)].symbol)->GetName().to_string()); @@ -1601,7 +1608,7 @@ yyreduce: break; case 18: -#line 223 "parser.y" +#line 224 "parser.y" { (yyvsp[(1) - (3)].clist)->insert((yyvsp[(3) - (3)].symbol)->GetName().to_string()); (yyval.clist) = (yyvsp[(1) - (3)].clist); @@ -1609,56 +1616,56 @@ yyreduce: break; case 19: -#line 231 "parser.y" +#line 232 "parser.y" { (yyval.str) = NULL; } break; case 20: -#line 235 "parser.y" +#line 236 "parser.y" { (yyval.str) = new Str((yyvsp[(3) - (3)].symbol)->GetName().to_string().c_str()); } break; case 21: -#line 242 "parser.y" +#line 243 "parser.y" { (yyval.regexp) = new NullOp; } break; case 22: -#line 246 "parser.y" +#line 247 "parser.y" { (yyval.regexp) = (yyvsp[(2) - (2)].regexp); } break; case 23: -#line 253 "parser.y" +#line 254 "parser.y" { (yyval.regexp) = (yyvsp[(1) - (1)].regexp); } break; case 24: -#line 257 "parser.y" +#line 258 "parser.y" { (yyval.regexp) = mkAlt((yyvsp[(1) - (3)].regexp), (yyvsp[(3) - (3)].regexp)); } break; case 25: -#line 264 "parser.y" +#line 265 "parser.y" { (yyval.regexp) = (yyvsp[(1) - (1)].regexp); } break; case 26: -#line 268 "parser.y" +#line 269 "parser.y" { (yyval.regexp) = mkDiff((yyvsp[(1) - (3)].regexp), (yyvsp[(3) - (3)].regexp)); if(!(yyval.regexp)) @@ -1669,28 +1676,28 @@ yyreduce: break; case 27: -#line 279 "parser.y" +#line 280 "parser.y" { (yyval.regexp) = (yyvsp[(1) - (1)].regexp); } break; case 28: -#line 283 "parser.y" +#line 284 "parser.y" { (yyval.regexp) = new CatOp((yyvsp[(1) - (2)].regexp), (yyvsp[(2) - (2)].regexp)); } break; case 29: -#line 290 "parser.y" +#line 291 "parser.y" { (yyval.regexp) = (yyvsp[(1) - (1)].regexp); } break; case 30: -#line 294 "parser.y" +#line 295 "parser.y" { switch((yyvsp[(2) - (2)].op)) { @@ -1708,42 +1715,42 @@ yyreduce: break; case 31: -#line 309 "parser.y" +#line 310 "parser.y" { (yyval.regexp) = new CloseVOp((yyvsp[(1) - (2)].regexp), (yyvsp[(2) - (2)].extop).minsize, (yyvsp[(2) - (2)].extop).maxsize); } break; case 32: -#line 316 "parser.y" +#line 317 "parser.y" { (yyval.op) = (yyvsp[(1) - (1)].op); } break; case 33: -#line 320 "parser.y" +#line 321 "parser.y" { (yyval.op) = (yyvsp[(1) - (1)].op); } break; case 34: -#line 324 "parser.y" +#line 325 "parser.y" { (yyval.op) = ((yyvsp[(1) - (2)].op) == (yyvsp[(2) - (2)].op)) ? (yyvsp[(1) - (2)].op) : '*'; } break; case 35: -#line 328 "parser.y" +#line 329 "parser.y" { (yyval.op) = ((yyvsp[(1) - (2)].op) == (yyvsp[(2) - (2)].op)) ? (yyvsp[(1) - (2)].op) : '*'; } break; case 36: -#line 335 "parser.y" +#line 336 "parser.y" { if(!(yyvsp[(1) - (1)].symbol)->re) { @@ -1754,21 +1761,21 @@ yyreduce: break; case 37: -#line 343 "parser.y" +#line 344 "parser.y" { (yyval.regexp) = (yyvsp[(1) - (1)].regexp); } break; case 38: -#line 347 "parser.y" +#line 348 "parser.y" { (yyval.regexp) = (yyvsp[(1) - (1)].regexp); } break; case 39: -#line 351 "parser.y" +#line 352 "parser.y" { (yyval.regexp) = (yyvsp[(2) - (3)].regexp); } @@ -1776,7 +1783,7 @@ yyreduce: /* Line 1267 of yacc.c. */ -#line 1780 "parser.cc" +#line 1787 "parser.cc" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); @@ -1990,7 +1997,7 @@ yyreturn: } -#line 356 "parser.y" +#line 357 "parser.y" extern "C" { diff --git a/re2c/bootstrap/scanner.cc b/re2c/bootstrap/scanner.cc index d903d86f..98ac6ed8 100644 --- a/re2c/bootstrap/scanner.cc +++ b/re2c/bootstrap/scanner.cc @@ -1,4 +1,4 @@ -/* Generated by re2c 0.13.2.dev on Sun Jan 13 17:51:50 2008 */ +/* Generated by re2c 0.13.2.dev on Sun Jan 13 18:42:09 2008 */ /* $Id$ */ #include #include @@ -500,10 +500,10 @@ yy71: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if(yych <= '/') { - if(yych == ',') goto yy150; + if(yych == ',') goto yy152; } else { - if(yych <= '0') goto yy147; - if(yych <= '9') goto yy148; + if(yych <= '0') goto yy149; + if(yych <= '9') goto yy150; } yy72: { @@ -512,7 +512,7 @@ yy72: } yy73: ++YYCURSOR; - if((yych = *YYCURSOR) == '=') goto yy145; + if((yych = *YYCURSOR) == '=') goto yy147; yy74: { std::ostringstream msg; @@ -523,14 +523,14 @@ yy74: } yy75: ++YYCURSOR; - if((yych = *YYCURSOR) == '*') goto yy143; + if((yych = *YYCURSOR) == '*') goto yy145; yy76: { RETURN(*tok); } yy77: ++YYCURSOR; - if((yych = *YYCURSOR) == '/') goto yy141; + if((yych = *YYCURSOR) == '/') goto yy143; { yylval.op = *tok; RETURN(STAR); @@ -538,7 +538,7 @@ yy77: yy79: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); - if(yych != 0x0A) goto yy137; + if(yych != 0x0A) goto yy139; yy80: { fatal("unterminated string constant (missing \")"); @@ -546,7 +546,7 @@ yy80: yy81: yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); - if(yych != 0x0A) goto yy132; + if(yych != 0x0A) goto yy134; yy82: { fatal("unterminated string constant (missing ')"); @@ -555,8 +555,8 @@ yy83: yyaccept = 3; yych = *(YYMARKER = ++YYCURSOR); if(yych == 0x0A) goto yy84; - if(yych == '^') goto yy123; - goto yy122; + if(yych == '^') goto yy125; + goto yy124; yy84: { fatal("unterminated range (missing ])"); @@ -686,7 +686,7 @@ yy109: if(yyaccept <= 6) { goto yy112; } else { - goto yy151; + goto yy153; } } } @@ -753,124 +753,139 @@ yy116: goto yy118; yy117: ++YYCURSOR; - if(YYLIMIT == YYCURSOR) YYFILL(1); + if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; yy118: if(yybm[0+yych] & 8) { goto yy117; } - if(yych != '{') goto yy109; + if(yych <= '<') { + if(yych == ':') goto yy122; + goto yy109; + } else { + if(yych <= '=') goto yy121; + if(yych != '{') goto yy109; + } +yy119: ++YYCURSOR; YYCURSOR = YYCTXMARKER; { RETURN(NOCOND); } yy121: + yych = *++YYCURSOR; + if(yych == '>') goto yy119; + goto yy109; +yy122: + yych = *++YYCURSOR; + if(yych == '=') goto yy119; + goto yy109; +yy123: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy122: +yy124: if(yybm[0+yych] & 16) { - goto yy121; + goto yy123; } if(yych <= '[') goto yy109; - if(yych <= '\\') goto yy125; - goto yy126; -yy123: + if(yych <= '\\') goto yy127; + goto yy128; +yy125: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yych <= '[') { if(yych == 0x0A) goto yy109; - goto yy123; + goto yy125; } else { - if(yych <= '\\') goto yy128; - if(yych <= ']') goto yy129; - goto yy123; + if(yych <= '\\') goto yy130; + if(yych <= ']') goto yy131; + goto yy125; } -yy125: +yy127: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yych == 0x0A) goto yy109; - goto yy121; -yy126: + goto yy123; +yy128: ++YYCURSOR; { cur = cursor; yylval.regexp = ranToRE(token()); return RANGE; } -yy128: +yy130: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yych == 0x0A) goto yy109; - goto yy123; -yy129: + goto yy125; +yy131: ++YYCURSOR; { cur = cursor; yylval.regexp = invToRE(token()); return RANGE; } -yy131: +yy133: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy132: +yy134: if(yybm[0+yych] & 32) { - goto yy131; + goto yy133; } if(yych <= '&') goto yy109; - if(yych <= '\'') goto yy134; + if(yych <= '\'') goto yy136; ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yych == 0x0A) goto yy109; - goto yy131; -yy134: + goto yy133; +yy136: ++YYCURSOR; { cur = cursor; yylval.regexp = strToCaseInsensitiveRE(token()); return STRING; } -yy136: +yy138: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy137: +yy139: if(yybm[0+yych] & 64) { - goto yy136; + goto yy138; } if(yych <= '!') goto yy109; - if(yych <= '"') goto yy139; + if(yych <= '"') goto yy141; ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yych == 0x0A) goto yy109; - goto yy136; -yy139: + goto yy138; +yy141: ++YYCURSOR; { cur = cursor; yylval.regexp = strToRE(token()); return STRING; } -yy141: +yy143: ++YYCURSOR; { tok = cursor; RETURN(0); } -yy143: +yy145: ++YYCURSOR; { depth = 1; goto comment; } -yy145: +yy147: ++YYCURSOR; { cur = cursor; @@ -878,52 +893,52 @@ yy145: depth = 0; goto code; } -yy147: +yy149: yych = *++YYCURSOR; - if(yych == ',') goto yy161; - goto yy149; -yy148: + if(yych == ',') goto yy163; + goto yy151; +yy150: ++YYCURSOR; if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; -yy149: +yy151: if(yybm[0+yych] & 128) { - goto yy148; + goto yy150; } - if(yych == ',') goto yy154; - if(yych == '}') goto yy152; + if(yych == ',') goto yy156; + if(yych == '}') goto yy154; goto yy109; -yy150: +yy152: ++YYCURSOR; -yy151: +yy153: { fatal("illegal closure form, use '{n}', '{n,}', '{n,m}' where n and m are numbers"); } -yy152: +yy154: ++YYCURSOR; { yylval.extop.minsize = atoi((char *)tok+1); yylval.extop.maxsize = atoi((char *)tok+1); RETURN(CLOSESIZE); } -yy154: +yy156: yyaccept = 7; yych = *(YYMARKER = ++YYCURSOR); - if(yych <= '/') goto yy151; - if(yych <= '9') goto yy157; - if(yych != '}') goto yy151; + if(yych <= '/') goto yy153; + if(yych <= '9') goto yy159; + if(yych != '}') goto yy153; ++YYCURSOR; { yylval.extop.minsize = atoi((char *)tok+1); yylval.extop.maxsize = -1; RETURN(CLOSESIZE); } -yy157: +yy159: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yych <= '/') goto yy109; - if(yych <= '9') goto yy157; + if(yych <= '9') goto yy159; if(yych != '}') goto yy109; ++YYCURSOR; { @@ -931,12 +946,12 @@ yy157: yylval.extop.maxsize = MAX(yylval.extop.minsize,atoi(strchr((char *)tok, ',')+1)); RETURN(CLOSESIZE); } -yy161: +yy163: yyaccept = 7; yych = *(YYMARKER = ++YYCURSOR); - if(yych <= '/') goto yy151; - if(yych <= '9') goto yy157; - if(yych != '}') goto yy151; + if(yych <= '/') goto yy153; + if(yych <= '9') goto yy159; + if(yych != '}') goto yy153; ++YYCURSOR; { yylval.op = '*'; @@ -987,20 +1002,20 @@ code: yych = *YYCURSOR; if(yych <= '&') { if(yych <= 0x0A) { - if(yych <= 0x00) goto yy172; - if(yych <= 0x09) goto yy174; - goto yy170; + if(yych <= 0x00) goto yy174; + if(yych <= 0x09) goto yy176; + goto yy172; } else { - if(yych == '"') goto yy176; - goto yy174; + if(yych == '"') goto yy178; + goto yy176; } } else { if(yych <= '{') { - if(yych <= '\'') goto yy177; - if(yych <= 'z') goto yy174; - goto yy168; + if(yych <= '\'') goto yy179; + if(yych <= 'z') goto yy176; + goto yy170; } else { - if(yych != '}') goto yy174; + if(yych != '}') goto yy176; } } ++YYCURSOR; @@ -1017,7 +1032,7 @@ code: } goto code; } -yy168: +yy170: ++YYCURSOR; { if (depth == 0) @@ -1030,17 +1045,17 @@ yy168: } goto code; } -yy170: +yy172: YYCTXMARKER = YYCURSOR + 1; ++YYCURSOR; if((yych = *YYCURSOR) <= 0x0C) { - if(yych <= 0x08) goto yy171; - if(yych <= 0x0A) goto yy185; + if(yych <= 0x08) goto yy173; + if(yych <= 0x0A) goto yy187; } else { - if(yych <= 0x0D) goto yy185; - if(yych == ' ') goto yy185; + if(yych <= 0x0D) goto yy187; + if(yych == ' ') goto yy187; } -yy171: +yy173: { if (depth == 0) { @@ -1061,7 +1076,7 @@ yy171: cline++; goto code; } -yy172: +yy174: ++YYCURSOR; { if (cursor == eof) @@ -1074,56 +1089,56 @@ yy172: } goto code; } -yy174: +yy176: ++YYCURSOR; -yy175: +yy177: { goto code; } -yy176: +yy178: yych = *(YYMARKER = ++YYCURSOR); - if(yych == 0x0A) goto yy175; - goto yy183; -yy177: + if(yych == 0x0A) goto yy177; + goto yy185; +yy179: yych = *(YYMARKER = ++YYCURSOR); - if(yych == 0x0A) goto yy175; - goto yy179; -yy178: + if(yych == 0x0A) goto yy177; + goto yy181; +yy180: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy179: +yy181: if(yybm[0+yych] & 64) { - goto yy178; + goto yy180; } - if(yych <= '&') goto yy180; - if(yych <= '\'') goto yy174; - goto yy181; -yy180: + if(yych <= '&') goto yy182; + if(yych <= '\'') goto yy176; + goto yy183; +yy182: YYCURSOR = YYMARKER; - goto yy175; -yy181: + goto yy177; +yy183: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych == 0x0A) goto yy180; - goto yy178; -yy182: + if(yych == 0x0A) goto yy182; + goto yy180; +yy184: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy183: +yy185: if(yybm[0+yych] & 128) { - goto yy182; + goto yy184; } - if(yych <= '!') goto yy180; - if(yych <= '"') goto yy174; + if(yych <= '!') goto yy182; + if(yych <= '"') goto yy176; ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych == 0x0A) goto yy180; - goto yy182; -yy185: + if(yych == 0x0A) goto yy182; + goto yy184; +yy187: ++YYCURSOR; YYCURSOR = YYCTXMARKER; { @@ -1149,17 +1164,17 @@ comment: if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; if(yych <= ')') { - if(yych == 0x0A) goto yy192; - goto yy194; + if(yych == 0x0A) goto yy194; + goto yy196; } else { - if(yych <= '*') goto yy189; - if(yych == '/') goto yy191; - goto yy194; + if(yych <= '*') goto yy191; + if(yych == '/') goto yy193; + goto yy196; } -yy189: +yy191: ++YYCURSOR; - if((yych = *YYCURSOR) == '/') goto yy197; -yy190: + if((yych = *YYCURSOR) == '/') goto yy199; +yy192: { if(cursor == eof) { @@ -1167,11 +1182,11 @@ yy190: } goto comment; } -yy191: +yy193: yych = *++YYCURSOR; - if(yych == '*') goto yy195; - goto yy190; -yy192: + if(yych == '*') goto yy197; + goto yy192; +yy194: ++YYCURSOR; { if(cursor == eof) @@ -1182,17 +1197,17 @@ yy192: cline++; goto comment; } -yy194: +yy196: yych = *++YYCURSOR; - goto yy190; -yy195: + goto yy192; +yy197: ++YYCURSOR; { ++depth; fatal("ambiguous /* found"); goto comment; } -yy197: +yy199: ++YYCURSOR; { if(--depth == 0) @@ -1248,52 +1263,52 @@ config: if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; if(yych <= 0x1F) { - if(yych != 0x09) goto yy205; + if(yych != 0x09) goto yy207; } else { - if(yych <= ' ') goto yy201; - if(yych == '=') goto yy203; - goto yy205; + if(yych <= ' ') goto yy203; + if(yych == '=') goto yy205; + goto yy207; } -yy201: +yy203: ++YYCURSOR; yych = *YYCURSOR; - goto yy210; -yy202: + goto yy212; +yy204: { goto config; } -yy203: +yy205: ++YYCURSOR; yych = *YYCURSOR; - goto yy208; -yy204: + goto yy210; +yy206: { iscfg = 2; cur = cursor; RETURN('='); } -yy205: +yy207: ++YYCURSOR; { fatal("missing '='"); } -yy207: +yy209: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy208: +yy210: if(yybm[0+yych] & 128) { - goto yy207; + goto yy209; } - goto yy204; -yy209: + goto yy206; +yy211: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy210: - if(yych == 0x09) goto yy209; - if(yych == ' ') goto yy209; - goto yy202; +yy212: + if(yych == 0x09) goto yy211; + if(yych == ' ') goto yy211; + goto yy204; } @@ -1339,191 +1354,191 @@ value: yych = *YYCURSOR; if(yych <= '&') { if(yych <= 0x0D) { - if(yych <= 0x08) goto yy219; - if(yych <= 0x0A) goto yy213; - if(yych <= 0x0C) goto yy219; + if(yych <= 0x08) goto yy221; + if(yych <= 0x0A) goto yy215; + if(yych <= 0x0C) goto yy221; } else { if(yych <= ' ') { - if(yych <= 0x1F) goto yy219; + if(yych <= 0x1F) goto yy221; } else { - if(yych == '"') goto yy221; - goto yy219; + if(yych == '"') goto yy223; + goto yy221; } } } else { if(yych <= '/') { - if(yych <= '\'') goto yy223; - if(yych == '-') goto yy216; - goto yy219; + if(yych <= '\'') goto yy225; + if(yych == '-') goto yy218; + goto yy221; } else { if(yych <= '9') { - if(yych <= '0') goto yy214; - goto yy217; + if(yych <= '0') goto yy216; + goto yy219; } else { - if(yych != ';') goto yy219; + if(yych != ';') goto yy221; } } } -yy213: +yy215: { cur = cursor; yylval.str = new Str(token()); iscfg = 0; return VALUE; } -yy214: +yy216: ++YYCURSOR; if(yybm[0+(yych = *YYCURSOR)] & 8) { - goto yy219; + goto yy221; } -yy215: +yy217: { cur = cursor; yylval.number = atoi(token().to_string().c_str()); iscfg = 0; return NUMBER; } -yy216: +yy218: yych = *++YYCURSOR; - if(yych <= '0') goto yy220; - if(yych >= ':') goto yy220; -yy217: + if(yych <= '0') goto yy222; + if(yych >= ':') goto yy222; +yy219: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yybm[0+yych] & 4) { - goto yy217; + goto yy219; } if(yych <= 0x0D) { - if(yych <= 0x08) goto yy219; - if(yych <= 0x0A) goto yy215; - if(yych >= 0x0D) goto yy215; + if(yych <= 0x08) goto yy221; + if(yych <= 0x0A) goto yy217; + if(yych >= 0x0D) goto yy217; } else { if(yych <= ' ') { - if(yych >= ' ') goto yy215; + if(yych >= ' ') goto yy217; } else { - if(yych == ';') goto yy215; + if(yych == ';') goto yy217; } } -yy219: +yy221: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy220: +yy222: if(yybm[0+yych] & 8) { - goto yy219; + goto yy221; } - goto yy213; -yy221: + goto yy215; +yy223: YYMARKER = ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yybm[0+yych] & 16) { - goto yy221; + goto yy223; } if(yych <= '!') { - if(yych == 0x0A) goto yy213; - goto yy231; - } else { - if(yych <= '"') goto yy219; - if(yych <= '[') goto yy231; + if(yych == 0x0A) goto yy215; goto yy233; + } else { + if(yych <= '"') goto yy221; + if(yych <= '[') goto yy233; + goto yy235; } -yy223: +yy225: YYMARKER = ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yybm[0+yych] & 32) { - goto yy223; + goto yy225; } if(yych <= '&') { - if(yych == 0x0A) goto yy213; + if(yych == 0x0A) goto yy215; } else { - if(yych <= '\'') goto yy219; - if(yych >= '\\') goto yy228; + if(yych <= '\'') goto yy221; + if(yych >= '\\') goto yy230; } -yy225: +yy227: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yybm[0+yych] & 64) { - goto yy225; + goto yy227; } - if(yych <= '&') goto yy227; - if(yych <= '\'') goto yy229; - goto yy230; -yy227: + if(yych <= '&') goto yy229; + if(yych <= '\'') goto yy231; + goto yy232; +yy229: YYCURSOR = YYMARKER; - goto yy213; -yy228: + goto yy215; +yy230: YYMARKER = ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yych <= 0x0D) { if(yych <= 0x09) { - if(yych <= 0x08) goto yy223; - goto yy225; + if(yych <= 0x08) goto yy225; + goto yy227; } else { - if(yych <= 0x0A) goto yy213; - if(yych <= 0x0C) goto yy223; - goto yy225; + if(yych <= 0x0A) goto yy215; + if(yych <= 0x0C) goto yy225; + goto yy227; } } else { if(yych <= ' ') { - if(yych <= 0x1F) goto yy223; - goto yy225; + if(yych <= 0x1F) goto yy225; + goto yy227; } else { - if(yych == ';') goto yy225; - goto yy223; + if(yych == ';') goto yy227; + goto yy225; } } -yy229: +yy231: yych = *++YYCURSOR; - goto yy213; -yy230: + goto yy215; +yy232: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych == 0x0A) goto yy227; - goto yy225; -yy231: + if(yych == 0x0A) goto yy229; + goto yy227; +yy233: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yybm[0+yych] & 128) { - goto yy231; + goto yy233; } - if(yych <= '!') goto yy227; - if(yych <= '"') goto yy229; - goto yy234; -yy233: + if(yych <= '!') goto yy229; + if(yych <= '"') goto yy231; + goto yy236; +yy235: YYMARKER = ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yych <= 0x0D) { if(yych <= 0x09) { - if(yych <= 0x08) goto yy221; - goto yy231; + if(yych <= 0x08) goto yy223; + goto yy233; } else { - if(yych <= 0x0A) goto yy213; - if(yych <= 0x0C) goto yy221; - goto yy231; + if(yych <= 0x0A) goto yy215; + if(yych <= 0x0C) goto yy223; + goto yy233; } } else { if(yych <= ' ') { - if(yych <= 0x1F) goto yy221; - goto yy231; + if(yych <= 0x1F) goto yy223; + goto yy233; } else { - if(yych == ';') goto yy231; - goto yy221; + if(yych == ';') goto yy233; + goto yy223; } } -yy234: +yy236: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych == 0x0A) goto yy227; - goto yy231; + if(yych == 0x0A) goto yy229; + goto yy233; } } diff --git a/re2c/parser.y b/re2c/parser.y index d48526b3..20fd467d 100644 --- a/re2c/parser.y +++ b/re2c/parser.y @@ -162,7 +162,7 @@ rule: delete $2; delete $7; } - | '<' cond '>' look CODE + | '<' cond '>' look newcond CODE { delete $2; if (!cFlag) @@ -180,7 +180,7 @@ rule: $7->newcond = $6; specStar.push_back(new RuleOp($4, $5, $7, accept++)); } - | '<' STAR '>' look CODE + | '<' STAR '>' look newcond CODE { if (!cFlag) { @@ -188,7 +188,7 @@ rule: } in->fatal("no expression specified"); } - | NOCOND CODE + | NOCOND newcond CODE { if (!cFlag) { @@ -198,7 +198,8 @@ rule: { in->fatal("code to handle illegal condition already defined"); } - $$ = specNone = new RuleOp(new NullOp(), new NullOp(), $2, accept++); + $3->newcond = $2; + $$ = specNone = new RuleOp(new NullOp(), new NullOp(), $3, accept++); } ; diff --git a/re2c/scanner.re b/re2c/scanner.re index fbdc005f..0e7e86e8 100644 --- a/re2c/scanner.re +++ b/re2c/scanner.re @@ -300,7 +300,7 @@ scan: fatal("unterminated range (missing ])"); } - "<>" / (ws* "{") { + "<>" / (ws* ("{" | "=>" | ":=")) { RETURN(NOCOND); } [<>,()|=;/\\] { diff --git a/re2c/test/condition_11.cg.c b/re2c/test/condition_11.cg.c new file mode 100755 index 00000000..75d18efe --- /dev/null +++ b/re2c/test/condition_11.cg.c @@ -0,0 +1,86 @@ +/* Generated by re2c */ +#line 1 "condition_11.cg.re" + +#line 5 "" +{ + YYCTYPE yych; + static void *yyctable[3] = { + &&yyc_0, + &&yyc_r1, + &&yyc_r2, + }; + goto *yyctable[YYGETCONDITION()]; +/* *********************************** */ +yyc_0: + + YYSETCONDITION(yycr1); +#line 3 "condition_11.cg.re" + { return NULL; } +#line 20 "" +/* *********************************** */ +yyc_r1: + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if(yych <= '2') { + if(yych <= '0') goto yy5; + if(yych <= '1') goto yy8; + goto yy6; + } else { + if(yych <= '`') goto yy5; + if(yych <= 'a') goto yy10; + if(yych <= 'b') goto yy12; + } +yy5: +yy6: + ++YYCURSOR; +#line 5 "condition_11.cg.re" + { return "2"; } +#line 39 "" +yy8: + ++YYCURSOR; +#line 4 "condition_11.cg.re" + { return "1"; } +#line 44 "" +yy10: + ++YYCURSOR; + YYSETCONDITION(yycr2); +#line 6 "condition_11.cg.re" + { return "a"; } +#line 50 "" +yy12: + ++YYCURSOR; + YYSETCONDITION(yycr2); +#line 7 "condition_11.cg.re" + { return "b"; } +#line 56 "" +/* *********************************** */ +yyc_r2: + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if(yych <= '2') { + if(yych <= '0') goto yy16; + if(yych <= '1') goto yy19; + goto yy17; + } else { + if(yych == 'b') goto yy21; + } +yy16: +yy17: + ++YYCURSOR; +#line 5 "condition_11.cg.re" + { return "2"; } +#line 73 "" +yy19: + ++YYCURSOR; +#line 4 "condition_11.cg.re" + { return "1"; } +#line 78 "" +yy21: + ++YYCURSOR; + YYSETCONDITION(yyc); +#line 7 "condition_11.cg.re" + { return "b"; } +#line 84 "" +} +#line 9 "condition_11.cg.re" + diff --git a/re2c/test/condition_11.cg.re b/re2c/test/condition_11.cg.re new file mode 100755 index 00000000..fbf112a0 --- /dev/null +++ b/re2c/test/condition_11.cg.re @@ -0,0 +1,9 @@ +/*!re2c + +<> => r1 { return NULL; } +<*> "1" => r1 { return "1"; } +<*> "2" => r1 { return "2"; } + "a" => r2 { return "a"; } + "b" => r2 { return "b"; } + +*/