From: helly Date: Tue, 27 Dec 2005 23:58:09 +0000 (+0000) Subject: - Add error message for illegal closure forms X-Git-Tag: 0.13.6~577 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f0dde84dc3c7612f765cc424183a5ed4547f2760;p=re2c - Add error message for illegal closure forms --- diff --git a/bootstrap/scanner.cc b/bootstrap/scanner.cc index fc534a74..1ef13067 100644 --- a/bootstrap/scanner.cc +++ b/bootstrap/scanner.cc @@ -1,4 +1,4 @@ -/* Generated by re2c 0.9.12.dev on Tue Dec 27 23:51:46 2005 */ +/* Generated by re2c 0.9.12.dev on Wed Dec 28 00:53:17 2005 */ #line 1 "scanner.re" /* $Id$ */ #include @@ -285,23 +285,27 @@ yy29: } yy31: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if(yych <= '/') goto yy32; - if(yych <= '0') goto yy84; - if(yych <= '9') goto yy85; - goto yy32; + if(yych <= '/'){ + if(yych == ',') goto yy87; + goto yy32; + } else { + if(yych <= '0') goto yy84; + if(yych <= '9') goto yy85; + goto yy32; + } yy32: #line 139 "scanner.re" { depth = 1; goto code; } -#line 298 "scanner.cc" +#line 302 "scanner.cc" yy33: ++YYCURSOR; if((yych = *YYCURSOR) == '*') goto yy82; goto yy34; yy34: #line 169 "scanner.re" { RETURN(*tok); } -#line 305 "scanner.cc" +#line 309 "scanner.cc" yy35: ++YYCURSOR; if((yych = *YYCURSOR) == '/') goto yy80; goto yy36; @@ -309,7 +313,7 @@ yy36: #line 171 "scanner.re" { yylval.op = *tok; RETURN(CLOSE); } -#line 313 "scanner.cc" +#line 317 "scanner.cc" yy37: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if(yych != 0x0A) goto yy76; @@ -317,7 +321,7 @@ yy37: yyaccept = 1; yy38: #line 156 "scanner.re" { fatal("unterminated string constant (missing \")"); } -#line 321 "scanner.cc" +#line 325 "scanner.cc" yy39: yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if(yych != 0x0A) goto yy71; @@ -325,7 +329,7 @@ yy39: yyaccept = 2; yy40: #line 157 "scanner.re" { fatal("unterminated string constant (missing ')"); } -#line 329 "scanner.cc" +#line 333 "scanner.cc" yy41: yyaccept = 3; yych = *(YYMARKER = ++YYCURSOR); if(yych == 0x0A) goto yy42; @@ -334,7 +338,7 @@ yy41: yyaccept = 3; yy42: #line 167 "scanner.re" { fatal("unterminated range (missing ])"); } -#line 338 "scanner.cc" +#line 342 "scanner.cc" yy43: yych = *++YYCURSOR; goto yy34; yy44: yych = *++YYCURSOR; @@ -343,44 +347,44 @@ yy45: ++YYCURSOR; yych = *YYCURSOR; goto yy58; yy46: -#line 189 "scanner.re" +#line 191 "scanner.re" { cur = cursor; yylval.symbol = Symbol::find(token()); return ID; } -#line 351 "scanner.cc" +#line 355 "scanner.cc" yy47: ++YYCURSOR; goto yy48; yy48: -#line 193 "scanner.re" +#line 195 "scanner.re" { cur = cursor; yylval.regexp = mkDot(); return RANGE; } -#line 360 "scanner.cc" +#line 364 "scanner.cc" yy49: ++YYCURSOR; yych = *YYCURSOR; goto yy56; yy50: -#line 198 "scanner.re" +#line 200 "scanner.re" { goto scan; } -#line 367 "scanner.cc" +#line 371 "scanner.cc" yy51: ++YYCURSOR; goto yy52; yy52: -#line 200 "scanner.re" +#line 202 "scanner.re" { if(cursor == eof) RETURN(0); pos = cursor; cline++; goto scan; } -#line 376 "scanner.cc" +#line 380 "scanner.cc" yy53: ++YYCURSOR; goto yy54; yy54: -#line 205 "scanner.re" +#line 207 "scanner.re" { std::cerr << "unexpected character: " << *tok << std::endl; goto scan; } -#line 384 "scanner.cc" +#line 388 "scanner.cc" yy55: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; @@ -420,6 +424,7 @@ yy61: YYCURSOR = YYMARKER; case 1: goto yy38; case 2: goto yy40; case 3: goto yy42; + case 4: goto yy88; } yy62: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); @@ -445,7 +450,7 @@ yy66: { cur = cursor; yylval.regexp = ranToRE(token()); return RANGE; } -#line 449 "scanner.cc" +#line 454 "scanner.cc" yy67: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; @@ -458,7 +463,7 @@ yy69: { cur = cursor; yylval.regexp = invToRE(token()); return RANGE; } -#line 462 "scanner.cc" +#line 467 "scanner.cc" yy70: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; @@ -483,7 +488,7 @@ yy74: { cur = cursor; yylval.regexp = strToCaseInsensitiveRE(token()); return STRING; } -#line 487 "scanner.cc" +#line 492 "scanner.cc" yy75: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; @@ -508,254 +513,266 @@ yy79: { cur = cursor; yylval.regexp = strToRE(token()); return STRING; } -#line 512 "scanner.cc" +#line 517 "scanner.cc" yy80: ++YYCURSOR; goto yy81; yy81: #line 145 "scanner.re" { tok = cursor; RETURN(0); } -#line 519 "scanner.cc" +#line 524 "scanner.cc" yy82: ++YYCURSOR; goto yy83; yy83: #line 142 "scanner.re" { depth = 1; goto comment; } -#line 526 "scanner.cc" +#line 531 "scanner.cc" yy84: yych = *++YYCURSOR; - if(yych == ',') goto yy96; + if(yych == ',') goto yy98; goto yy86; yy85: ++YYCURSOR; if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; goto yy86; yy86: if(yych <= '/'){ - if(yych == ',') goto yy89; + if(yych == ',') goto yy91; goto yy61; } else { if(yych <= '9') goto yy85; - if(yych != '}') goto yy61; - goto yy87; + if(yych == '}') goto yy89; + goto yy61; } yy87: ++YYCURSOR; goto yy88; yy88: +#line 189 "scanner.re" +{ fatal("illegal closure form, use '{n}', '{n,}', '{n,m}' where n and m are numbers"); } +#line 552 "scanner.cc" +yy89: ++YYCURSOR; + goto yy90; +yy90: #line 177 "scanner.re" { yylval.extop.minsize = atoi((char *)tok+1); yylval.extop.maxsize = atoi((char *)tok+1); RETURN(CLOSESIZE); } -#line 549 "scanner.cc" -yy89: yych = *++YYCURSOR; - if(yych != '}') goto yy93; - goto yy90; -yy90: ++YYCURSOR; - goto yy91; -yy91: +#line 560 "scanner.cc" +yy91: yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if(yych <= '/') goto yy88; + if(yych <= '9') goto yy94; + if(yych != '}') goto yy88; + goto yy92; +yy92: ++YYCURSOR; + goto yy93; +yy93: #line 185 "scanner.re" { yylval.extop.minsize = atoi((char *)tok+1); yylval.extop.maxsize = -1; RETURN(CLOSESIZE); } -#line 560 "scanner.cc" -yy92: ++YYCURSOR; +#line 574 "scanner.cc" +yy94: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - goto yy93; -yy93: if(yych <= '/') goto yy61; - if(yych <= '9') goto yy92; - if(yych != '}') goto yy61; - goto yy94; -yy94: ++YYCURSOR; goto yy95; -yy95: +yy95: if(yych <= '/') goto yy61; + if(yych <= '9') goto yy94; + if(yych != '}') goto yy61; + goto yy96; +yy96: ++YYCURSOR; + goto yy97; +yy97: #line 181 "scanner.re" { yylval.extop.minsize = atoi((char *)tok+1); yylval.extop.maxsize = MAX(yylval.extop.minsize,atoi(strchr((char *)tok, ',')+1)); RETURN(CLOSESIZE); } -#line 576 "scanner.cc" -yy96: yych = *++YYCURSOR; - if(yych != '}') goto yy93; - goto yy97; -yy97: ++YYCURSOR; - goto yy98; -yy98: +#line 590 "scanner.cc" +yy98: yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if(yych <= '/') goto yy88; + if(yych <= '9') goto yy94; + if(yych != '}') goto yy88; + goto yy99; +yy99: ++YYCURSOR; + goto yy100; +yy100: #line 174 "scanner.re" { yylval.op = '*'; RETURN(CLOSE); } -#line 586 "scanner.cc" +#line 603 "scanner.cc" } -#line 208 "scanner.re" +#line 210 "scanner.re" code: -#line 593 "scanner.cc" +#line 610 "scanner.cc" { YYCTYPE yych; unsigned int yyaccept = 0; - goto yy99; + goto yy101; ++YYCURSOR; -yy99: +yy101: if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; if(yych <= '&'){ if(yych <= 0x0A){ - if(yych <= 0x09) goto yy107; - goto yy105; - } else { - if(yych == '"') goto yy109; + if(yych <= 0x09) goto yy109; goto yy107; + } else { + if(yych == '"') goto yy111; + goto yy109; } } else { if(yych <= '{'){ - if(yych <= '\'') goto yy110; - if(yych <= 'z') goto yy107; - goto yy103; + if(yych <= '\'') goto yy112; + if(yych <= 'z') goto yy109; + goto yy105; } else { - if(yych != '}') goto yy107; - goto yy101; + if(yych != '}') goto yy109; + goto yy103; } } -yy101: ++YYCURSOR; - goto yy102; -yy102: -#line 212 "scanner.re" +yy103: ++YYCURSOR; + goto yy104; +yy104: +#line 214 "scanner.re" { if(--depth == 0){ cur = cursor; yylval.token = new Token(token(), tline); return CODE; } goto code; } -#line 630 "scanner.cc" -yy103: ++YYCURSOR; - goto yy104; -yy104: -#line 218 "scanner.re" -{ ++depth; - goto code; } -#line 637 "scanner.cc" +#line 647 "scanner.cc" yy105: ++YYCURSOR; goto yy106; yy106: #line 220 "scanner.re" +{ ++depth; + goto code; } +#line 654 "scanner.cc" +yy107: ++YYCURSOR; + goto yy108; +yy108: +#line 222 "scanner.re" { if(cursor == eof) fatal("missing '}'"); pos = cursor; cline++; goto code; } -#line 646 "scanner.cc" -yy107: ++YYCURSOR; - goto yy108; -yy108: -#line 224 "scanner.re" +#line 663 "scanner.cc" +yy109: ++YYCURSOR; + goto yy110; +yy110: +#line 226 "scanner.re" { goto code; } -#line 652 "scanner.cc" -yy109: yyaccept = 0; +#line 669 "scanner.cc" +yy111: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if(yych == 0x0A) goto yy108; - goto yy116; -yy110: yyaccept = 0; + if(yych == 0x0A) goto yy110; + goto yy118; +yy112: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if(yych == 0x0A) goto yy108; - goto yy112; -yy111: ++YYCURSOR; + if(yych == 0x0A) goto yy110; + goto yy114; +yy113: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - goto yy112; -yy112: if(yych <= '&'){ - if(yych != 0x0A) goto yy111; - goto yy113; + goto yy114; +yy114: if(yych <= '&'){ + if(yych != 0x0A) goto yy113; + goto yy115; } else { - if(yych <= '\'') goto yy107; - if(yych == '\\') goto yy114; - goto yy111; + if(yych <= '\'') goto yy109; + if(yych == '\\') goto yy116; + goto yy113; } -yy113: YYCURSOR = YYMARKER; +yy115: YYCURSOR = YYMARKER; switch(yyaccept){ - case 0: goto yy108; + case 0: goto yy110; } -yy114: ++YYCURSOR; +yy116: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych == 0x0A) goto yy113; - goto yy111; -yy115: ++YYCURSOR; + if(yych == 0x0A) goto yy115; + goto yy113; +yy117: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - goto yy116; -yy116: if(yych <= '!'){ - if(yych == 0x0A) goto yy113; - goto yy115; - } else { - if(yych <= '"') goto yy107; - if(yych != '\\') goto yy115; + goto yy118; +yy118: if(yych <= '!'){ + if(yych == 0x0A) goto yy115; goto yy117; + } else { + if(yych <= '"') goto yy109; + if(yych != '\\') goto yy117; + goto yy119; } -yy117: ++YYCURSOR; +yy119: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych == 0x0A) goto yy113; - goto yy115; + if(yych == 0x0A) goto yy115; + goto yy117; } -#line 225 "scanner.re" +#line 227 "scanner.re" comment: -#line 705 "scanner.cc" +#line 722 "scanner.cc" { YYCTYPE yych; - goto yy118; + goto yy120; ++YYCURSOR; -yy118: +yy120: if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; if(yych <= ')'){ - if(yych == 0x0A) goto yy123; - goto yy125; + if(yych == 0x0A) goto yy125; + goto yy127; } else { - if(yych <= '*') goto yy120; - if(yych == '/') goto yy122; - goto yy125; + if(yych <= '*') goto yy122; + if(yych == '/') goto yy124; + goto yy127; } -yy120: ++YYCURSOR; - if((yych = *YYCURSOR) == '/') goto yy128; - goto yy121; -yy121: -#line 239 "scanner.re" +yy122: ++YYCURSOR; + if((yych = *YYCURSOR) == '/') goto yy130; + goto yy123; +yy123: +#line 241 "scanner.re" { goto comment; } -#line 727 "scanner.cc" -yy122: yych = *++YYCURSOR; - if(yych == '*') goto yy126; - goto yy121; -yy123: ++YYCURSOR; - goto yy124; -yy124: -#line 235 "scanner.re" +#line 744 "scanner.cc" +yy124: yych = *++YYCURSOR; + if(yych == '*') goto yy128; + goto yy123; +yy125: ++YYCURSOR; + goto yy126; +yy126: +#line 237 "scanner.re" { if(cursor == eof) RETURN(0); tok = pos = cursor; cline++; goto comment; } -#line 739 "scanner.cc" -yy125: yych = *++YYCURSOR; - goto yy121; -yy126: ++YYCURSOR; - goto yy127; -yy127: -#line 233 "scanner.re" -{ ++depth; - goto comment; } -#line 748 "scanner.cc" +#line 756 "scanner.cc" +yy127: yych = *++YYCURSOR; + goto yy123; yy128: ++YYCURSOR; goto yy129; yy129: -#line 229 "scanner.re" +#line 235 "scanner.re" +{ ++depth; + goto comment; } +#line 765 "scanner.cc" +yy130: ++YYCURSOR; + goto yy131; +yy131: +#line 231 "scanner.re" { if(--depth == 0) goto scan; else goto comment; } -#line 757 "scanner.cc" +#line 774 "scanner.cc" } -#line 240 "scanner.re" +#line 242 "scanner.re" } diff --git a/scanner.re b/scanner.re index fb819917..242e1fb7 100644 --- a/scanner.re +++ b/scanner.re @@ -186,6 +186,8 @@ scan: yylval.extop.maxsize = -1; RETURN(CLOSESIZE); } + "{" [0-9]* "," { fatal("illegal closure form, use '{n}', '{n,}', '{n,m}' where n and m are numbers"); } + letter (letter|digit)* { cur = cursor; yylval.symbol = Symbol::find(token()); return ID; } diff --git a/test/error1.c b/test/error1.c new file mode 100755 index 00000000..145d8fd3 --- /dev/null +++ b/test/error1.c @@ -0,0 +1,17 @@ +line 18, column 5: illegal closure form, use '{n}', '{n,}', '{n,m}' where n and m are numbers +/* Generated by re2c */ +#line 1 "error1.re" +#include +#include +#include + +#define RET(n) return n + +int scan(const char *s, int l) { +const char *p = s; +const char *q; +#define YYCTYPE char +#define YYCURSOR p +#define YYLIMIT (s+l) +#define YYMARKER q +#define YYFILL(n) diff --git a/test/error1.re b/test/error1.re new file mode 100755 index 00000000..8bf90854 --- /dev/null +++ b/test/error1.re @@ -0,0 +1,21 @@ +#include +#include +#include + +#define RET(n) return n + +int scan(const char *s, int l) { +const char *p = s; +const char *q; +#define YYCTYPE char +#define YYCURSOR p +#define YYLIMIT (s+l) +#define YYMARKER q +#define YYFILL(n) +/*!re2c + any = [\000-\377]; + + 'a'{,}"\n" {RET(1);} + any {RET(0);} +*/ +} diff --git a/test/error2.c b/test/error2.c new file mode 100755 index 00000000..8ea7e6a2 --- /dev/null +++ b/test/error2.c @@ -0,0 +1,17 @@ +line 18, column 5: illegal closure form, use '{n}', '{n,}', '{n,m}' where n and m are numbers +/* Generated by re2c */ +#line 1 "error2.re" +#include +#include +#include + +#define RET(n) return n + +int scan(const char *s, int l) { +const char *p = s; +const char *q; +#define YYCTYPE char +#define YYCURSOR p +#define YYLIMIT (s+l) +#define YYMARKER q +#define YYFILL(n) diff --git a/test/error2.re b/test/error2.re new file mode 100755 index 00000000..7beb3533 --- /dev/null +++ b/test/error2.re @@ -0,0 +1,21 @@ +#include +#include +#include + +#define RET(n) return n + +int scan(const char *s, int l) { +const char *p = s; +const char *q; +#define YYCTYPE char +#define YYCURSOR p +#define YYLIMIT (s+l) +#define YYMARKER q +#define YYFILL(n) +/*!re2c + any = [\000-\377]; + + 'a'{0,b}"\n" {RET(1);} + any {RET(0);} +*/ +} diff --git a/test/error3.c b/test/error3.c new file mode 100755 index 00000000..9183a144 --- /dev/null +++ b/test/error3.c @@ -0,0 +1,46 @@ +unexpected character: ] +/* Generated by re2c */ +#line 1 "error3.re" +#include +#include +#include + +#define RET(n) return n + +int scan(const char *s, int l) { +const char *p = s; +const char *q; +#define YYCTYPE char +#define YYCURSOR p +#define YYLIMIT (s+l) +#define YYMARKER q +#define YYFILL(n) + +#line 19 "" +{ + YYCTYPE yych; + goto yy0; + ++YYCURSOR; +yy0: + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch(yych){ + case 'a': goto yy2; + default: goto yy4; + } +yy2: ++YYCURSOR; + goto yy3; +yy3: +#line 18 "error3.re" +{RET(1);} +#line 36 "" +yy4: ++YYCURSOR; + goto yy5; +yy5: +#line 19 "error3.re" +{RET(0);} +#line 42 "" +} +#line 20 "error3.re" + +} diff --git a/test/error3.re b/test/error3.re new file mode 100755 index 00000000..959d250a --- /dev/null +++ b/test/error3.re @@ -0,0 +1,21 @@ +#include +#include +#include + +#define RET(n) return n + +int scan(const char *s, int l) { +const char *p = s; +const char *q; +#define YYCTYPE char +#define YYCURSOR p +#define YYLIMIT (s+l) +#define YYMARKER q +#define YYFILL(n) +/*!re2c + any = [\000-\377]; + + [a]] {RET(1);} + any {RET(0);} +*/ +}