]> granicus.if.org Git - re2c/commitdiff
- Respect re2c:flags:w and re2c:flags:u inplace configuration changes.
authorhelly <helly@642ea486-5414-0410-9d7f-a0204ed87703>
Mon, 24 Mar 2008 16:41:12 +0000 (16:41 +0000)
committerhelly <helly@642ea486-5414-0410-9d7f-a0204ed87703>
Mon, 24 Mar 2008 16:41:12 +0000 (16:41 +0000)
- Added the ability to add rules in 'use:re2c' blocks.
- Changed -r flag to accept only 'rules:re2c' and 'use:re2c' blocks.

17 files changed:
re2c/CHANGELOG
re2c/bootstrap/parser.cc
re2c/bootstrap/scanner.cc
re2c/bootstrap/y.tab.h
re2c/htdocs/index.html
re2c/htdocs/manual.html
re2c/parser.h
re2c/parser.y
re2c/re2c.1.in
re2c/scanner.h
re2c/scanner.re
re2c/test/repeat-03.cgir.c
re2c/test/repeat-03.cgir.re
re2c/test/repeat-06.gir.c [new file with mode: 0755]
re2c/test/repeat-06.gir.re [new file with mode: 0755]
re2c/test/repeat-07.gir.c [new file with mode: 0755]
re2c/test/repeat-07.gir.re [new file with mode: 0755]

index 2c9e573abef1b2377a1e9e2e968135923588034d..6fb2ea7cd3fdd08c3c451071341886fd5c52f87c 100644 (file)
@@ -3,6 +3,7 @@ Version 0.13.4 (2008-??-??)
 - Added re2c:yyfill:check inplace configuration.
 - Added re2c:define:YYSETSTATE:naked inplace configuration.
 - Added re2c:flags:w and re2c:flags:u inplace configurations.
+- Added the ability to add rules in 'use:re2c' blocks.
 - Changed -r flag to accept only 'rules:re2c' and 'use:re2c' blocks.
 
 Version 0.13.3 (2008-03-14)
index 62dae88ea11f5d299a6de9db5c6e4a5240a18d27..d94b1dbe7c2c89ed8b0f4d2277c22bdcbf669833 100644 (file)
@@ -133,11 +133,12 @@ void yyerror(const char*);
 
 static re2c::uint       accept;
 static re2c::RegExpMap  specMap;
-static RegExp           *spec, *specNone = NULL;
+static RegExp           *spec = NULL, *specNone = NULL;
 static RuleOpList       specStar;
 static Scanner          *in = NULL;
 static Scanner::ParseMode  parseMode;
 static SetupMap            ruleSetupMap;
+static bool                foundRules;
 
 /* Bison version 1.875 emits a definition that is not working
  * with several g++ version. Hence we disable it here.
@@ -248,7 +249,7 @@ void setup_rule(CondList *clist, Token *code)
 
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 typedef union YYSTYPE
-#line 130 "parser.y"
+#line 131 "parser.y"
 {
        re2c::Symbol    *symbol;
        re2c::RegExp    *regexp;
@@ -260,7 +261,7 @@ typedef union YYSTYPE
        re2c::CondList  *clist;
 }
 /* Line 187 of yacc.c.  */
-#line 264 "parser.cc"
+#line 265 "parser.cc"
        YYSTYPE;
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
@@ -273,7 +274,7 @@ typedef union YYSTYPE
 
 
 /* Line 216 of yacc.c.  */
-#line 277 "parser.cc"
+#line 278 "parser.cc"
 
 #ifdef short
 # undef short
@@ -495,7 +496,7 @@ union yyalloc
 /* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  14
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  49
+#define YYNRULES  48
 /* YYNRULES -- Number of states.  */
 #define YYNSTATES  91
 
@@ -544,11 +545,11 @@ static const yytype_uint8 yytranslate[] =
    YYRHS.  */
 static const yytype_uint8 yyprhs[] =
 {
-       0,     0,     3,     4,     7,    10,    15,    18,    23,    28,
-      32,    37,    42,    46,    54,    62,    69,    76,    84,    92,
-      99,   106,   110,   114,   119,   124,   125,   127,   129,   133,
-     134,   138,   139,   142,   144,   148,   150,   154,   156,   159,
-     161,   164,   167,   169,   171,   174,   177,   179,   181,   183
+       0,     0,     3,     4,     7,    10,    15,    18,    23,    27,
+      32,    37,    41,    49,    57,    64,    71,    79,    87,    94,
+     101,   105,   109,   114,   119,   120,   122,   124,   128,   129,
+     133,   134,   137,   139,   143,   145,   149,   151,   154,   156,
+     159,   162,   164,   166,   169,   172,   174,   176,   178
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
@@ -556,33 +557,33 @@ static const yytype_int8 yyrhs[] =
 {
       28,     0,    -1,    -1,    28,    30,    -1,    28,    29,    -1,
        7,    16,    35,    17,    -1,    15,    35,    -1,     7,    16,
-      35,    18,    -1,     7,    16,    35,    18,    -1,    15,    35,
-      18,    -1,    11,    16,    12,    17,    -1,    11,    16,    13,
-      17,    -1,    35,    34,     8,    -1,    19,    31,    20,    35,
-      34,    33,     8,    -1,    19,    31,    20,    35,    34,    21,
-      33,    -1,    19,    31,    20,    34,    33,     8,    -1,    19,
-      31,    20,    34,    21,    33,    -1,    19,     5,    20,    35,
-      34,    33,     8,    -1,    19,     5,    20,    35,    34,    21,
-      33,    -1,    19,     5,    20,    34,    33,     8,    -1,    19,
-       5,    20,    34,    21,    33,    -1,     6,    33,     8,    -1,
-       6,    21,    33,    -1,    14,     5,    20,     8,    -1,    14,
-      31,    20,     8,    -1,    -1,    32,    -1,     7,    -1,    32,
-      22,     7,    -1,    -1,    16,    20,     7,    -1,    -1,    18,
-      35,    -1,    36,    -1,    35,    23,    36,    -1,    37,    -1,
-      36,    24,    37,    -1,    38,    -1,    37,    38,    -1,    40,
-      -1,    40,    39,    -1,    40,     3,    -1,     4,    -1,     5,
-      -1,    39,     4,    -1,    39,     5,    -1,     7,    -1,     9,
-      -1,    10,    -1,    25,    35,    26,    -1
+      35,    18,    -1,    15,    35,    18,    -1,    11,    16,    12,
+      17,    -1,    11,    16,    13,    17,    -1,    35,    34,     8,
+      -1,    19,    31,    20,    35,    34,    33,     8,    -1,    19,
+      31,    20,    35,    34,    21,    33,    -1,    19,    31,    20,
+      34,    33,     8,    -1,    19,    31,    20,    34,    21,    33,
+      -1,    19,     5,    20,    35,    34,    33,     8,    -1,    19,
+       5,    20,    35,    34,    21,    33,    -1,    19,     5,    20,
+      34,    33,     8,    -1,    19,     5,    20,    34,    21,    33,
+      -1,     6,    33,     8,    -1,     6,    21,    33,    -1,    14,
+       5,    20,     8,    -1,    14,    31,    20,     8,    -1,    -1,
+      32,    -1,     7,    -1,    32,    22,     7,    -1,    -1,    16,
+      20,     7,    -1,    -1,    18,    35,    -1,    36,    -1,    35,
+      23,    36,    -1,    37,    -1,    36,    24,    37,    -1,    38,
+      -1,    37,    38,    -1,    40,    -1,    40,    39,    -1,    40,
+       3,    -1,     4,    -1,     5,    -1,    39,     4,    -1,    39,
+       5,    -1,     7,    -1,     9,    -1,    10,    -1,    25,    35,
+      26,    -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,   159,   159,   163,   170,   174,   182,   190,   194,   198,
-     202,   208,   216,   225,   229,   234,   239,   245,   253,   261,
-     266,   272,   284,   296,   302,   310,   313,   320,   325,   334,
-     337,   345,   348,   355,   359,   366,   370,   381,   385,   392,
-     396,   411,   418,   422,   426,   430,   437,   445,   449,   453
+       0,   160,   160,   162,   166,   170,   178,   186,   190,   194,
+     200,   208,   217,   221,   226,   231,   237,   245,   253,   258,
+     264,   276,   288,   294,   302,   305,   312,   317,   326,   329,
+     337,   340,   347,   351,   358,   362,   373,   377,   384,   388,
+     403,   410,   414,   418,   422,   429,   437,   441,   445
 };
 #endif
 
@@ -614,20 +615,20 @@ static const yytype_uint16 yytoknum[] =
 static const yytype_uint8 yyr1[] =
 {
        0,    27,    28,    28,    28,    29,    29,    29,    29,    29,
-      29,    29,    30,    30,    30,    30,    30,    30,    30,    30,
-      30,    30,    30,    30,    30,    31,    31,    32,    32,    33,
-      33,    34,    34,    35,    35,    36,    36,    37,    37,    38,
-      38,    38,    39,    39,    39,    39,    40,    40,    40,    40
+      29,    30,    30,    30,    30,    30,    30,    30,    30,    30,
+      30,    30,    30,    30,    31,    31,    32,    32,    33,    33,
+      34,    34,    35,    35,    36,    36,    37,    37,    38,    38,
+      38,    39,    39,    39,    39,    40,    40,    40,    40
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
 static const yytype_uint8 yyr2[] =
 {
-       0,     2,     0,     2,     2,     4,     2,     4,     4,     3,
-       4,     4,     3,     7,     7,     6,     6,     7,     7,     6,
-       6,     3,     3,     4,     4,     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
+       0,     2,     0,     2,     2,     4,     2,     4,     3,     4,
+       4,     3,     7,     7,     6,     6,     7,     7,     6,     6,
+       3,     3,     4,     4,     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
 };
 
 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
@@ -635,16 +636,16 @@ static const yytype_uint8 yyr2[] =
    means the default is an error.  */
 static const yytype_uint8 yydefact[] =
 {
-       2,     0,     1,    29,    46,    47,    48,     0,    25,     0,
-      25,     0,     4,     3,    31,    33,    35,    37,    39,     0,
-      29,     0,     0,     0,     0,    27,     0,    26,    46,     6,
-       0,     0,     0,     0,     0,     0,     0,    38,    41,    42,
-      43,    40,     0,    22,    21,     0,     0,     0,     0,     0,
-       0,     9,    31,    31,    49,    32,    34,    12,    36,    44,
-      45,    30,     5,     7,    10,    11,    23,    24,    28,    29,
-      31,    29,    31,    29,     0,    29,    29,     0,    29,    20,
-      19,    29,     0,    16,    15,    29,     0,    18,    17,    14,
-      13
+       2,     0,     1,    28,    45,    46,    47,     0,    24,     0,
+      24,     0,     4,     3,    30,    32,    34,    36,    38,     0,
+      28,     0,     0,     0,     0,    26,     0,    25,    45,     6,
+       0,     0,     0,     0,     0,     0,     0,    37,    40,    41,
+      42,    39,     0,    21,    20,     0,     0,     0,     0,     0,
+       0,     8,    30,    30,    48,    31,    33,    11,    35,    43,
+      44,    29,     5,     7,     9,    10,    22,    23,    27,    28,
+      30,    28,    30,    28,     0,    28,    28,     0,    28,    19,
+      18,    28,     0,    15,    14,    28,     0,    17,    16,    13,
+      12
 };
 
 /* YYDEFGOTO[NTERM-NUM].  */
@@ -1539,25 +1540,20 @@ yyreduce:
   switch (yyn)
     {
         case 2:
-#line 159 "parser.y"
+#line 160 "parser.y"
     {
-                       accept = 0;
-                       spec = NULL;
                }
     break;
 
   case 3:
-#line 164 "parser.y"
+#line 163 "parser.y"
     {
-                       if (parseMode == Scanner::Reuse)
-                       {
-                               in->fatal("rules not allowed in 'use:re2c' block");
-                       }
+                       foundRules = true;
                }
     break;
 
   case 5:
-#line 175 "parser.y"
+#line 171 "parser.y"
     {
                        if ((yyvsp[(1) - (4)].symbol)->re)
                        {
@@ -1568,7 +1564,7 @@ yyreduce:
     break;
 
   case 6:
-#line 183 "parser.y"
+#line 179 "parser.y"
     {
                        if ((yyvsp[(1) - (2)].symbol)->re)
                        {
@@ -1579,28 +1575,21 @@ yyreduce:
     break;
 
   case 7:
-#line 191 "parser.y"
+#line 187 "parser.y"
     {
                        in->fatal("trailing contexts are not allowed in named definitions");
                }
     break;
 
   case 8:
-#line 195 "parser.y"
+#line 191 "parser.y"
     {
                        in->fatal("trailing contexts are not allowed in named definitions");
                }
     break;
 
   case 9:
-#line 199 "parser.y"
-    {
-                       in->fatal("trailing contexts are not allowed in named definitions");
-               }
-    break;
-
-  case 10:
-#line 203 "parser.y"
+#line 195 "parser.y"
     {
                        in->config(*(yyvsp[(1) - (4)].str), *(yyvsp[(3) - (4)].str));
                        delete (yyvsp[(1) - (4)].str);
@@ -1608,16 +1597,16 @@ yyreduce:
                }
     break;
 
-  case 11:
-#line 209 "parser.y"
+  case 10:
+#line 201 "parser.y"
     {
                        in->config(*(yyvsp[(1) - (4)].str), (yyvsp[(3) - (4)].number));
                        delete (yyvsp[(1) - (4)].str);
                }
     break;
 
-  case 12:
-#line 217 "parser.y"
+  case 11:
+#line 209 "parser.y"
     {
                        if (cFlag)
                        {
@@ -1628,31 +1617,31 @@ yyreduce:
                }
     break;
 
-  case 13:
-#line 226 "parser.y"
+  case 12:
+#line 218 "parser.y"
     {
                        context_rule((yyvsp[(2) - (7)].clist), (yyvsp[(4) - (7)].regexp), (yyvsp[(5) - (7)].regexp), (yyvsp[(6) - (7)].str), (yyvsp[(7) - (7)].token));
                }
     break;
 
-  case 14:
-#line 230 "parser.y"
+  case 13:
+#line 222 "parser.y"
     {
                        assert((yyvsp[(7) - (7)].str));
                        context_rule((yyvsp[(2) - (7)].clist), (yyvsp[(4) - (7)].regexp), (yyvsp[(5) - (7)].regexp), (yyvsp[(7) - (7)].str), NULL);
                }
     break;
 
-  case 15:
-#line 235 "parser.y"
+  case 14:
+#line 227 "parser.y"
     {
                        context_none((yyvsp[(2) - (6)].clist));
                        delete (yyvsp[(5) - (6)].str);
                }
     break;
 
-  case 16:
-#line 240 "parser.y"
+  case 15:
+#line 232 "parser.y"
     {
                        assert((yyvsp[(6) - (6)].str));
                        context_none((yyvsp[(2) - (6)].clist));
@@ -1660,8 +1649,8 @@ yyreduce:
                }
     break;
 
-  case 17:
-#line 246 "parser.y"
+  case 16:
+#line 238 "parser.y"
     {
                        context_check(NULL);
                        Token *token = new Token((yyvsp[(7) - (7)].token), (yyvsp[(7) - (7)].token)->line, (yyvsp[(6) - (7)].str));
@@ -1671,8 +1660,8 @@ yyreduce:
                }
     break;
 
-  case 18:
-#line 254 "parser.y"
+  case 17:
+#line 246 "parser.y"
     {
                        assert((yyvsp[(7) - (7)].str));
                        context_check(NULL);
@@ -1682,16 +1671,16 @@ yyreduce:
                }
     break;
 
-  case 19:
-#line 262 "parser.y"
+  case 18:
+#line 254 "parser.y"
     {
                        context_none(NULL);
                        delete (yyvsp[(5) - (6)].str);
                }
     break;
 
-  case 20:
-#line 267 "parser.y"
+  case 19:
+#line 259 "parser.y"
     {
                        assert((yyvsp[(6) - (6)].str));
                        context_none(NULL);
@@ -1699,8 +1688,8 @@ yyreduce:
                }
     break;
 
-  case 21:
-#line 273 "parser.y"
+  case 20:
+#line 265 "parser.y"
     {
                        context_check(NULL);
                        if (specNone)
@@ -1714,8 +1703,8 @@ yyreduce:
                }
     break;
 
-  case 22:
-#line 285 "parser.y"
+  case 21:
+#line 277 "parser.y"
     {
                        assert((yyvsp[(3) - (3)].str));
                        context_check(NULL);
@@ -1729,8 +1718,8 @@ yyreduce:
                }
     break;
 
-  case 23:
-#line 297 "parser.y"
+  case 22:
+#line 289 "parser.y"
     {
                        CondList *clist = new CondList();
                        clist->insert("*");
@@ -1738,94 +1727,94 @@ yyreduce:
                }
     break;
 
-  case 24:
-#line 303 "parser.y"
+  case 23:
+#line 295 "parser.y"
     {
                        setup_rule((yyvsp[(2) - (4)].clist), (yyvsp[(4) - (4)].token));
                }
     break;
 
-  case 25:
-#line 310 "parser.y"
+  case 24:
+#line 302 "parser.y"
     {
                        in->fatal("unnamed condition not supported");
                }
     break;
 
-  case 26:
-#line 314 "parser.y"
+  case 25:
+#line 306 "parser.y"
     {
                        (yyval.clist) = (yyvsp[(1) - (1)].clist);
                }
     break;
 
-  case 27:
-#line 321 "parser.y"
+  case 26:
+#line 313 "parser.y"
     {
                        (yyval.clist) = new CondList();
                        (yyval.clist)->insert((yyvsp[(1) - (1)].symbol)->GetName().to_string());
                }
     break;
 
-  case 28:
-#line 326 "parser.y"
+  case 27:
+#line 318 "parser.y"
     {
                        (yyvsp[(1) - (3)].clist)->insert((yyvsp[(3) - (3)].symbol)->GetName().to_string());
                        (yyval.clist) = (yyvsp[(1) - (3)].clist);
                }
     break;
 
-  case 29:
-#line 334 "parser.y"
+  case 28:
+#line 326 "parser.y"
     {
                        (yyval.str) = NULL;
                }
     break;
 
-  case 30:
-#line 338 "parser.y"
+  case 29:
+#line 330 "parser.y"
     {
                        (yyval.str) = new Str((yyvsp[(3) - (3)].symbol)->GetName().to_string().c_str());
                }
     break;
 
-  case 31:
-#line 345 "parser.y"
+  case 30:
+#line 337 "parser.y"
     {
                        (yyval.regexp) = new NullOp;
                }
     break;
 
-  case 32:
-#line 349 "parser.y"
+  case 31:
+#line 341 "parser.y"
     {
                        (yyval.regexp) = (yyvsp[(2) - (2)].regexp);
                }
     break;
 
-  case 33:
-#line 356 "parser.y"
+  case 32:
+#line 348 "parser.y"
     {
                        (yyval.regexp) = (yyvsp[(1) - (1)].regexp);
                }
     break;
 
-  case 34:
-#line 360 "parser.y"
+  case 33:
+#line 352 "parser.y"
     {
                        (yyval.regexp) = mkAlt((yyvsp[(1) - (3)].regexp), (yyvsp[(3) - (3)].regexp));
                }
     break;
 
-  case 35:
-#line 367 "parser.y"
+  case 34:
+#line 359 "parser.y"
     {
                        (yyval.regexp) = (yyvsp[(1) - (1)].regexp);
                }
     break;
 
-  case 36:
-#line 371 "parser.y"
+  case 35:
+#line 363 "parser.y"
     {
                        (yyval.regexp) = mkDiff((yyvsp[(1) - (3)].regexp), (yyvsp[(3) - (3)].regexp));
                        if(!(yyval.regexp))
@@ -1835,29 +1824,29 @@ yyreduce:
                }
     break;
 
-  case 37:
-#line 382 "parser.y"
+  case 36:
+#line 374 "parser.y"
     {
                        (yyval.regexp) = (yyvsp[(1) - (1)].regexp);
                }
     break;
 
-  case 38:
-#line 386 "parser.y"
+  case 37:
+#line 378 "parser.y"
     {
                        (yyval.regexp) = new CatOp((yyvsp[(1) - (2)].regexp), (yyvsp[(2) - (2)].regexp));
                }
     break;
 
-  case 39:
-#line 393 "parser.y"
+  case 38:
+#line 385 "parser.y"
     {
                        (yyval.regexp) = (yyvsp[(1) - (1)].regexp);
                }
     break;
 
-  case 40:
-#line 397 "parser.y"
+  case 39:
+#line 389 "parser.y"
     {
                        switch((yyvsp[(2) - (2)].op))
                        {
@@ -1874,43 +1863,43 @@ yyreduce:
                }
     break;
 
-  case 41:
-#line 412 "parser.y"
+  case 40:
+#line 404 "parser.y"
     {
                        (yyval.regexp) = new CloseVOp((yyvsp[(1) - (2)].regexp), (yyvsp[(2) - (2)].extop).minsize, (yyvsp[(2) - (2)].extop).maxsize);
                }
     break;
 
-  case 42:
-#line 419 "parser.y"
+  case 41:
+#line 411 "parser.y"
     {
                        (yyval.op) = (yyvsp[(1) - (1)].op);
                }
     break;
 
-  case 43:
-#line 423 "parser.y"
+  case 42:
+#line 415 "parser.y"
     {
                        (yyval.op) = (yyvsp[(1) - (1)].op);
                }
     break;
 
-  case 44:
-#line 427 "parser.y"
+  case 43:
+#line 419 "parser.y"
     {
                        (yyval.op) = ((yyvsp[(1) - (2)].op) == (yyvsp[(2) - (2)].op)) ? (yyvsp[(1) - (2)].op) : '*';
                }
     break;
 
-  case 45:
-#line 431 "parser.y"
+  case 44:
+#line 423 "parser.y"
     {
                        (yyval.op) = ((yyvsp[(1) - (2)].op) == (yyvsp[(2) - (2)].op)) ? (yyvsp[(1) - (2)].op) : '*';
                }
     break;
 
-  case 46:
-#line 438 "parser.y"
+  case 45:
+#line 430 "parser.y"
     {
                        if(!(yyvsp[(1) - (1)].symbol)->re)
                        {
@@ -1920,22 +1909,22 @@ yyreduce:
                }
     break;
 
-  case 47:
-#line 446 "parser.y"
+  case 46:
+#line 438 "parser.y"
     {
                        (yyval.regexp) = (yyvsp[(1) - (1)].regexp);
                }
     break;
 
-  case 48:
-#line 450 "parser.y"
+  case 47:
+#line 442 "parser.y"
     {
                        (yyval.regexp) = (yyvsp[(1) - (1)].regexp);
                }
     break;
 
-  case 49:
-#line 454 "parser.y"
+  case 48:
+#line 446 "parser.y"
     {
                        (yyval.regexp) = (yyvsp[(2) - (3)].regexp);
                }
@@ -1943,7 +1932,7 @@ yyreduce:
 
 
 /* Line 1267 of yacc.c.  */
-#line 1947 "parser.cc"
+#line 1936 "parser.cc"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -2157,7 +2146,7 @@ yyreturn:
 }
 
 
-#line 459 "parser.y"
+#line 451 "parser.y"
 
 
 extern "C" {
@@ -2177,6 +2166,7 @@ namespace re2c
 void parse(Scanner& i, std::ostream& o, std::ostream* h)
 {
        std::map<std::string, DFA*>  dfa_map;
+       ScannerState rules_state;
 
        in = &i;
 
@@ -2197,6 +2187,11 @@ void parse(Scanner& i, std::ostream& o, std::ostream* h)
        while ((parseMode = i.echo()) != Scanner::Stop)
        {
                bool bPrologBrace = false;
+               ScannerState curr_state;
+
+               i.save_state(curr_state);
+               foundRules = false;
+
                if (rFlag && parseMode == Scanner::Rules && dfa_map.size())
                {
                        in->fatal("cannot have a second 'rules:re2c' block");
@@ -2208,32 +2203,58 @@ void parse(Scanner& i, std::ostream& o, std::ostream* h)
                                in->fatal("got 'use:re2c' without 'rules:re2c'");
                        }
                }
+               else if (parseMode == Scanner::Rules)
+               {
+                       i.save_state(rules_state);
+               }
                else
                {
                        dfa_map.clear();
                }
+               accept = 0;
+               spec = NULL;
                in->set_in_parse(true);
                yyparse();
                in->set_in_parse(false);
-               if (rFlag)
+               if (rFlag && parseMode == Scanner::Reuse)
                {
                        uint nRealCharsLast = nRealChars;
                        if (uFlag)
                        {
-                               nRealChars = 0x110000; /* 17 times w-Flag */
+                               nRealChars = 0x110000; // 17 times w-Flag
                        }
                        else if (wFlag)
                        {
-                               nRealChars = (1<<16); /* 0x10000 */
+                               nRealChars = (1<<16); // 0x10000
                        }
                        else
                        {
-                               nRealChars = (1<<8); /* 0x100 */
+                               nRealChars = (1<<8); // 0x100
                        }
-                       if (nRealCharsLast != nRealChars)
+                       if (foundRules || nRealCharsLast != nRealChars)
                        {
-                               /* Char width changed, so we need to regenerate the dfa. */
+                               // Re-parse rules
+                               parseMode = Scanner::Parse;
+                               i.restore_state(rules_state);
+                               i.reuse();
+                               dfa_map.clear();
+                               parse_cleanup();
+                               spec = NULL;
+                               accept = 0;
+                               in->set_in_parse(true);
+                               yyparse();
+                               in->set_in_parse(false);
+
+                               // Now append potential new rules
+                               i.restore_state(curr_state);
+                               parseMode = Scanner::Parse;
+                               in->set_in_parse(true);
+                               yyparse();
+                               in->set_in_parse(false);
                        }
+                       uFlagOld = uFlag;
+                       wFlagOld = wFlag;
+                       nRealCharsOld = nRealChars;
                }
                if (cFlag)
                {
@@ -2278,11 +2299,7 @@ void parse(Scanner& i, std::ostream& o, std::ostream* h)
                        {
                                assert(it->second.second);
 
-                               if (parseMode == Scanner::Reuse)
-                               {
-                                       dfa_map[it->first]->emit(o, topIndent, &specMap, it->first, !--nCount, bPrologBrace);
-                               }
-                               else
+                               if (parseMode != Scanner::Reuse)
                                {
                                        itRuleSetup = ruleSetupMap.find(it->first);                             
                                        if (itRuleSetup != ruleSetupMap.end())
@@ -2303,10 +2320,10 @@ void parse(Scanner& i, std::ostream& o, std::ostream* h)
                                        }
                                        dfa_map[it->first] = genCode(it->second.second);
                                        dfa_map[it->first]->prepare();
-                                       if (!rFlag)
-                                       {
-                                               dfa_map[it->first]->emit(o, topIndent, &specMap, it->first, !--nCount, bPrologBrace);
-                                       }
+                               }
+                               if (parseMode != Scanner::Rules && dfa_map.find(it->first) != dfa_map.end())
+                               {
+                                       dfa_map[it->first]->emit(o, topIndent, &specMap, it->first, !--nCount, bPrologBrace);
                                }
                        }
                        if (!h && !bTypesDone)
@@ -2316,19 +2333,14 @@ void parse(Scanner& i, std::ostream& o, std::ostream* h)
                }
                else if (spec || !dfa_map.empty())
                {
-                       if (parseMode == Scanner::Reuse)
-                       {
-                               dfa_map[""]->emit(o, topIndent, NULL, "", 0, bPrologBrace);
-                       }
-                       else
+                       if (parseMode != Scanner::Reuse)
                        {
                                dfa_map[""] = genCode(spec);
                                dfa_map[""]->prepare();
-                               if (!rFlag)
-                               {
-                                       dfa_map[""]->emit(o, topIndent, NULL, "", 0, bPrologBrace);
-                                       dfa_map.clear();
-                               }
+                       }
+                       if (parseMode != Scanner::Rules && dfa_map.find("") != dfa_map.end())
+                       {
+                               dfa_map[""]->emit(o, topIndent, NULL, "", 0, bPrologBrace);
                        }
                }
                o << sourceFileInfo;
@@ -2364,14 +2376,19 @@ void parse(Scanner& i, std::ostream& o, std::ostream* h)
        {
                genHeader(*h, 0, specMap);
        }
+       
+       parse_cleanup();
+       in = NULL;
+}
 
+void parse_cleanup()
+{
        RegExp::vFreeList.clear();
        Range::vFreeList.clear();
        Symbol::ClearTable();
        specMap.clear();
        specStar.clear();
        specNone = NULL;
-       in = NULL;
 }
 
 } // end namespace re2c
index a04857ebd04f1ceb04f86caa5b2f54083c91bf76..8366b8652ea5c927f99b7741b82c7d96c1d4914d 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.13.4.dev on Mon Mar 24 15:31:27 2008 */
+/* Generated by re2c 0.13.4.dev on Mon Mar 24 16:50:42 2008 */
 /* $Id$ */
 #include <stdlib.h>
 #include <string.h>
@@ -333,11 +333,7 @@ yy38:
                                        {
                                                fatal("found 'use:re2c' block without -r flag");
                                        }
-                                       next_label = 0;
-                                       next_fill_index = 0;
-                                       bWroteGetState = false;
-                                       bWroteCondCheck = false;
-                                       mapCodeName.clear();
+                                       reuse();
                                        if (bUsedYYMaxFill && bSinglePass)
                                        {
                                                fatal("found scanner block after YYMAXFILL declaration");
@@ -1875,4 +1871,13 @@ SubStr Scanner::raw_token(std::string enclosure) const
        return SubStr(std::string(enclosure + token().to_string() + enclosure).c_str());
 }
 
+void Scanner::reuse()
+{
+       next_label = 0;
+       next_fill_index = 0;
+       bWroteGetState = false;
+       bWroteCondCheck = false;
+       mapCodeName.clear();
+}
+
 } // end namespace re2c
index 66d32fa7b1b704990060b89126429accbde3d9e5..bc38838cf572ca0f3639e1582859672e260eddd5 100644 (file)
@@ -74,7 +74,7 @@
 
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 typedef union YYSTYPE
-#line 130 "parser.y"
+#line 131 "parser.y"
 {
        re2c::Symbol    *symbol;
        re2c::RegExp    *regexp;
index bdaa4ae209448f87387a0e80ccba6b5f674bc7f1..de2b98697c8f3e4e04ca0dff1427f84d16340f55 100755 (executable)
@@ -84,6 +84,7 @@ fixes which were incorporated. <a href=
 <li>Added re2c:yyfill:check inplace configuration.</li>
 <li>Added re2c:define:YYSETSTATE:naked inplace configuration.</li>
 <li>Added re2c:flags:w and re2c:flags:u inplace configurations.</li>
+<li>Added the ability to add rules in 'use:re2c' blocks.</li>
 <li>Changed -r flag to accept only 'rules:re2c' and 'use:re2c' blocks.</li>
 <ul>
 </ul>
index 69268d5c738bdfa213239eb1fa9de9f7339b260d..abb9295a727178996e2fa6712418340d8f37b441 100755 (executable)
@@ -127,13 +127,15 @@ tool with the re2c output which you might want if you do not require your users
 to have re2c themselves when building from your source. <b>-o output</b>
 Specify the output file.<br /><br /></dd>
 <dt><b>-r</b></dt>
-<dd>Allows reuse of scanner definitions with '<b>/*!repeat:re2c</b>' after
+<dd>Allows reuse of scanner definitions with '<b>/*!use:re2c</b>' after
 '<b>/*!rules:re2c</b>'. In this mode no '<b>/*!re2c</b>' block and exactly one
 '<b>/*!use:re2c</b>' must be present. The rules are being saved and used by
 every '<b>/*!repeat:re2c</b>' block that follows. These blocks can contain
-inplace configurations. That way it is possible to create the same scanner
-multiple times for different character types, different input mechanisms or
-different output mechanisms.
+inplace configurations, especially '<b>re2c:flags:w</b>' and '<b>re2c:flags:u</b>'.
+That way it is possible to create the same scanner multiple times for different
+character types, different input mechanisms or different output mechanisms.
+The '<b>/*!use:re2c</b>' blocks can also contain additional rules that will be
+appended to the set of rules in '<b>/*!rules:re2c</b>'.
 <br /><br /></dd>
 <dt><b>-s</b></dt>
 <dd>Generate nested ifs for some switches. Many compilers need this assist to
index ed916656f5792a3a8e466dfe2c5d826b6018179e..c6d3ffc1835578b305a898bb6259e54a30169bf4 100644 (file)
@@ -54,6 +54,7 @@ private:
 };
 
 extern void parse(Scanner&, std::ostream&, std::ostream*);
+extern void parse_cleanup();
 
 } // end namespace re2c
 
index 6c0ef42a8621cf956c87be5b283200aec65082af..ed51b18984877944be5115fca0b4f79c84401cec 100644 (file)
@@ -30,11 +30,12 @@ void yyerror(const char*);
 
 static re2c::uint       accept;
 static re2c::RegExpMap  specMap;
-static RegExp           *spec, *specNone = NULL;
+static RegExp           *spec = NULL, *specNone = NULL;
 static RuleOpList       specStar;
 static Scanner          *in = NULL;
 static Scanner::ParseMode  parseMode;
 static SetupMap            ruleSetupMap;
+static bool                foundRules;
 
 /* Bison version 1.875 emits a definition that is not working
  * with several g++ version. Hence we disable it here.
@@ -157,15 +158,10 @@ void setup_rule(CondList *clist, Token *code)
 spec:
                /* empty */
                {
-                       accept = 0;
-                       spec = NULL;
                }
        |       spec rule
                {
-                       if (parseMode == Scanner::Reuse)
-                       {
-                               in->fatal("rules not allowed in 'use:re2c' block");
-                       }
+                       foundRules = true;
                }
        |       spec decl
 ;
@@ -191,10 +187,6 @@ decl:
                {
                        in->fatal("trailing contexts are not allowed in named definitions");
                }
-       |       ID '=' expr '/'
-               {
-                       in->fatal("trailing contexts are not allowed in named definitions");
-               }
        |       FID expr '/'
                {
                        in->fatal("trailing contexts are not allowed in named definitions");
@@ -475,6 +467,7 @@ namespace re2c
 void parse(Scanner& i, std::ostream& o, std::ostream* h)
 {
        std::map<std::string, DFA*>  dfa_map;
+       ScannerState rules_state;
 
        in = &i;
 
@@ -495,6 +488,11 @@ void parse(Scanner& i, std::ostream& o, std::ostream* h)
        while ((parseMode = i.echo()) != Scanner::Stop)
        {
                bool bPrologBrace = false;
+               ScannerState curr_state;
+
+               i.save_state(curr_state);
+               foundRules = false;
+
                if (rFlag && parseMode == Scanner::Rules && dfa_map.size())
                {
                        in->fatal("cannot have a second 'rules:re2c' block");
@@ -506,32 +504,58 @@ void parse(Scanner& i, std::ostream& o, std::ostream* h)
                                in->fatal("got 'use:re2c' without 'rules:re2c'");
                        }
                }
+               else if (parseMode == Scanner::Rules)
+               {
+                       i.save_state(rules_state);
+               }
                else
                {
                        dfa_map.clear();
                }
+               accept = 0;
+               spec = NULL;
                in->set_in_parse(true);
                yyparse();
                in->set_in_parse(false);
-               if (rFlag)
+               if (rFlag && parseMode == Scanner::Reuse)
                {
                        uint nRealCharsLast = nRealChars;
                        if (uFlag)
                        {
-                               nRealChars = 0x110000; /* 17 times w-Flag */
+                               nRealChars = 0x110000; // 17 times w-Flag
                        }
                        else if (wFlag)
                        {
-                               nRealChars = (1<<16); /* 0x10000 */
+                               nRealChars = (1<<16); // 0x10000
                        }
                        else
                        {
-                               nRealChars = (1<<8); /* 0x100 */
+                               nRealChars = (1<<8); // 0x100
                        }
-                       if (nRealCharsLast != nRealChars)
+                       if (foundRules || nRealCharsLast != nRealChars)
                        {
-                               /* Char width changed, so we need to regenerate the dfa. */
+                               // Re-parse rules
+                               parseMode = Scanner::Parse;
+                               i.restore_state(rules_state);
+                               i.reuse();
+                               dfa_map.clear();
+                               parse_cleanup();
+                               spec = NULL;
+                               accept = 0;
+                               in->set_in_parse(true);
+                               yyparse();
+                               in->set_in_parse(false);
+
+                               // Now append potential new rules
+                               i.restore_state(curr_state);
+                               parseMode = Scanner::Parse;
+                               in->set_in_parse(true);
+                               yyparse();
+                               in->set_in_parse(false);
                        }
+                       uFlagOld = uFlag;
+                       wFlagOld = wFlag;
+                       nRealCharsOld = nRealChars;
                }
                if (cFlag)
                {
@@ -576,11 +600,7 @@ void parse(Scanner& i, std::ostream& o, std::ostream* h)
                        {
                                assert(it->second.second);
 
-                               if (parseMode == Scanner::Reuse)
-                               {
-                                       dfa_map[it->first]->emit(o, topIndent, &specMap, it->first, !--nCount, bPrologBrace);
-                               }
-                               else
+                               if (parseMode != Scanner::Reuse)
                                {
                                        itRuleSetup = ruleSetupMap.find(it->first);                             
                                        if (itRuleSetup != ruleSetupMap.end())
@@ -601,10 +621,10 @@ void parse(Scanner& i, std::ostream& o, std::ostream* h)
                                        }
                                        dfa_map[it->first] = genCode(it->second.second);
                                        dfa_map[it->first]->prepare();
-                                       if (!rFlag)
-                                       {
-                                               dfa_map[it->first]->emit(o, topIndent, &specMap, it->first, !--nCount, bPrologBrace);
-                                       }
+                               }
+                               if (parseMode != Scanner::Rules && dfa_map.find(it->first) != dfa_map.end())
+                               {
+                                       dfa_map[it->first]->emit(o, topIndent, &specMap, it->first, !--nCount, bPrologBrace);
                                }
                        }
                        if (!h && !bTypesDone)
@@ -614,19 +634,14 @@ void parse(Scanner& i, std::ostream& o, std::ostream* h)
                }
                else if (spec || !dfa_map.empty())
                {
-                       if (parseMode == Scanner::Reuse)
-                       {
-                               dfa_map[""]->emit(o, topIndent, NULL, "", 0, bPrologBrace);
-                       }
-                       else
+                       if (parseMode != Scanner::Reuse)
                        {
                                dfa_map[""] = genCode(spec);
                                dfa_map[""]->prepare();
-                               if (!rFlag)
-                               {
-                                       dfa_map[""]->emit(o, topIndent, NULL, "", 0, bPrologBrace);
-                                       dfa_map.clear();
-                               }
+                       }
+                       if (parseMode != Scanner::Rules && dfa_map.find("") != dfa_map.end())
+                       {
+                               dfa_map[""]->emit(o, topIndent, NULL, "", 0, bPrologBrace);
                        }
                }
                o << sourceFileInfo;
@@ -662,14 +677,19 @@ void parse(Scanner& i, std::ostream& o, std::ostream* h)
        {
                genHeader(*h, 0, specMap);
        }
+       
+       parse_cleanup();
+       in = NULL;
+}
 
+void parse_cleanup()
+{
        RegExp::vFreeList.clear();
        Range::vFreeList.clear();
        Symbol::ClearTable();
        specMap.clear();
        specStar.clear();
        specNone = NULL;
-       in = NULL;
 }
 
 } // end namespace re2c
index 4442138ddd6e1a0a1882534add173044f0f7515a..0ab86212f0728f3597c3ce81b830634dd0c0ba3d 100644 (file)
@@ -143,13 +143,15 @@ have \*(re themselves when building from your source.
 Specify the output file.
 .TP
 \fB-r\fP
-Allows reuse of scanner definitions with '\fB/*!repeat:re2c\fP' after
+Allows reuse of scanner definitions with '\fB/*!use:re2c\fP' after
 '\fB/*!rules:re2c\fP'. In this mode no '\fB/*!re2c\fP' block and exactly one
 '\fB/*!rules:re2c\fP' must be present. The rules are being saved and used by
 every '\fB/*!use:re2c\fP' block that follows. These blocks can contain
-inplace configurations. That way it is possible to create the same scanner
-multiple times for different character types, different input mechanisms or
-different output mechanisms.
+inplace configurations, especially '\fBre2c:flags:w\fP' and '\fBre2c:flags:u\fP'.
+That way it is possible to create the same scanner multiple times for different
+character types, different input mechanisms or different output mechanisms.
+The '\fB/*!use:re2c\fP' blocks can also contain additional rules that will be
+appended to the set of rules in '\fB/*!rules:re2c\fP'.
 .TP
 \fB-s\fP
 Generate nested \fCif\fPs for some \fCswitch\fPes.  Many compilers need this
index f2689d948a566b6c53cd8e86458dd1f039f71a74..bc9fd37cd64769e10f4ee4ba70f1a71d2a478549 100644 (file)
@@ -45,6 +45,7 @@ public:
 
        ParseMode echo();
        int scan();
+       void reuse();
        
        size_t get_pos() const;
        void save_state(ScannerState&) const;
index b7e0afc404e0063288f03eb5ec62df657f28dada..55655af194552d749a79a6be6b2ade028d84ed12 100644 (file)
@@ -164,11 +164,7 @@ echo:
                                        {
                                                fatal("found 'use:re2c' block without -r flag");
                                        }
-                                       next_label = 0;
-                                       next_fill_index = 0;
-                                       bWroteGetState = false;
-                                       bWroteCondCheck = false;
-                                       mapCodeName.clear();
+                                       reuse();
                                        if (bUsedYYMaxFill && bSinglePass)
                                        {
                                                fatal("found scanner block after YYMAXFILL declaration");
@@ -713,4 +709,13 @@ SubStr Scanner::raw_token(std::string enclosure) const
        return SubStr(std::string(enclosure + token().to_string() + enclosure).c_str());
 }
 
+void Scanner::reuse()
+{
+       next_label = 0;
+       next_fill_index = 0;
+       bWroteGetState = false;
+       bWroteCondCheck = false;
+       mapCodeName.clear();
+}
+
 } // end namespace re2c
index d0d663679a9da2dcc66daccf2b7b13033e520e8f..4023045314d4192271606926d842573f403f4d8c 100755 (executable)
@@ -1 +1,194 @@
-re2c: error: line 21, column 10: rules not allowed in 'use:re2c' block
+/* Generated by re2c */
+// multiple scanners
+
+
+enum YYCONDTYPE {
+       yycr1,
+       yycr2,
+};
+
+
+void scan(unsigned char* in)
+{
+
+{
+       YYCTYPE yych;
+       static void *yyctable[2] = {
+               &&yyc_r1,
+               &&yyc_r2,
+       };
+       goto *yyctable[YYGETCONDITION()];
+/* *********************************** */
+yyc_r1:
+
+       if (YYLIMIT <= YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       {
+               static void *yytarget[256] = {
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy2,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy5,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy7,  &&yy9,  &&yy11, &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3
+               };
+               goto *yytarget[yych];
+       }
+yy2:
+yy3:
+       ++YYCURSOR;
+       { return "."; }
+yy5:
+       ++YYCURSOR;
+       { return "1"; }
+yy7:
+       ++YYCURSOR;
+       { return "a"; }
+yy9:
+       ++YYCURSOR;
+       { return "b"; }
+yy11:
+       ++YYCURSOR;
+       { return "c"; }
+/* *********************************** */
+yyc_r2:
+       if (YYLIMIT <= YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       if (yych <= '`') {
+               if (yych != '\n') goto yy16;
+       } else {
+               if (yych <= 'a') goto yy18;
+               if (yych == 'c') goto yy20;
+               goto yy16;
+       }
+yy16:
+       ++YYCURSOR;
+       { return "."; }
+yy18:
+       ++YYCURSOR;
+       { return "a"; }
+yy20:
+       ++YYCURSOR;
+       { return "c"; }
+}
+
+
+}
+
+void scan(unsigned short* in)
+{
+
+{
+       YYCTYPE yych;
+       static void *yyctable[2] = {
+               &&yyc_r1,
+               &&yyc_r2,
+       };
+       goto *yyctable[YYGETCONDITION()];
+/* *********************************** */
+yyc_r1:
+
+       if (YYLIMIT <= YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       {
+               static void *yytarget[256] = {
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy2,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy5,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy7,  &&yy9,  &&yy11, &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,
+                       &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3,  &&yy3
+               };
+               goto *yytarget[yych];
+       }
+yy2:
+yy3:
+       ++YYCURSOR;
+       { return "."; }
+yy5:
+       ++YYCURSOR;
+       { return "2"; }
+yy7:
+       ++YYCURSOR;
+       { return "a"; }
+yy9:
+       ++YYCURSOR;
+       { return "b"; }
+yy11:
+       ++YYCURSOR;
+       { return "c"; }
+/* *********************************** */
+yyc_r2:
+       if (YYLIMIT <= YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       if (yych <= '`') {
+               if (yych != '\n') goto yy16;
+       } else {
+               if (yych <= 'a') goto yy18;
+               if (yych == 'c') goto yy20;
+               goto yy16;
+       }
+yy16:
+       ++YYCURSOR;
+       { return "."; }
+yy18:
+       ++YYCURSOR;
+       { return "a"; }
+yy20:
+       ++YYCURSOR;
+       { return "c"; }
+}
+
+}
index d0595cd9f755c60018d73c8db3a39fda6ba4e4b8..3b033e56ff26a52e89eee92e6fdbdd6040288e29 100755 (executable)
@@ -1,4 +1,4 @@
-// multiple scanners, error
+// multiple scanners
 
 /*!types:re2c */
 
@@ -6,19 +6,24 @@ void scan(unsigned char* in)
 {
 /*!rules:re2c
 
-<*>            "1"     { return "1"; }
-<*>            "2"     { return "2"; }
-<r1>   "a" { return "a"; }
-<r1,r2>        "b" { return "b"; }
+<*>            "a"     { return "a"; }
+<*>            .       { return "."; }
+<r1>   "b" { return "b"; }
+<r1,r2>        "c" { return "c"; }
+
+*//*!use:re2c
+
+<r1>   "1" { return "1"; }
 
 */
+
 }
 
 void scan(unsigned short* in)
 {
 /*!use:re2c
 
-<r1>   "c" { return "c"; }
+<r1>   "2" { return "2"; }
 
 */
 }
diff --git a/re2c/test/repeat-06.gir.c b/re2c/test/repeat-06.gir.c
new file mode 100755 (executable)
index 0000000..eb88736
--- /dev/null
@@ -0,0 +1,206 @@
+/* Generated by re2c */
+// multiple scanners, additional rules, no char width change
+
+void scan(unsigned char* in)
+{
+
+       {
+               unsigned char yych;
+
+               if (limit1 <= cursor1) fill1(1);
+               yych = *cursor1;
+               {
+                       static void *yytarget[256] = {
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy2,  &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy11, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy3,  &&yy5,  &&yy7,  &&yy9,  &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13
+                       };
+                       goto *yytarget[yych];
+               }
+yy2:
+yy3:
+               ++cursor1;
+               return "a";
+yy5:
+               ++cursor1;
+               return "b";
+yy7:
+               ++cursor1;
+               return "c";
+yy9:
+               ++cursor1;
+               return "d";
+yy11:
+               ++cursor1;
+               return "1";
+yy13:
+               ++cursor1;
+               return ".";
+       }
+
+}
+
+void scan(unsigned short* in)
+{
+
+       {
+               unsigned short yych;
+
+               if (limit2 <= cursor2) fill2(1);
+               yych = *cursor2;
+               {
+                       static void *yytarget[256] = {
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy2,  &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy11, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy3,  &&yy5,  &&yy7,  &&yy9,  &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13
+                       };
+                       goto *yytarget[yych];
+               }
+yy2:
+yy3:
+               ++cursor2;
+               return "a";
+yy5:
+               ++cursor2;
+               return "b";
+yy7:
+               ++cursor2;
+               return "c";
+yy9:
+               ++cursor2;
+               return "d";
+yy11:
+               ++cursor2;
+               return "2";
+yy13:
+               ++cursor2;
+               return ".";
+       }
+
+}
+
+void scan(unsigned int* in)
+{
+
+       {
+               unsigned int yych;
+
+               if (limit3 <= cursor3) fill3(1);
+               yych = *cursor3;
+               {
+                       static void *yytarget[256] = {
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy2,  &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy11, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy3,  &&yy5,  &&yy7,  &&yy9,  &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13
+                       };
+                       goto *yytarget[yych];
+               }
+yy2:
+yy3:
+               ++cursor3;
+               return "a";
+yy5:
+               ++cursor3;
+               return "b";
+yy7:
+               ++cursor3;
+               return "c";
+yy9:
+               ++cursor3;
+               return "d";
+yy11:
+               ++cursor3;
+               return "3";
+yy13:
+               ++cursor3;
+               return ".";
+       }
+
+}
diff --git a/re2c/test/repeat-06.gir.re b/re2c/test/repeat-06.gir.re
new file mode 100755 (executable)
index 0000000..3c75d1e
--- /dev/null
@@ -0,0 +1,55 @@
+// multiple scanners, additional rules, no char width change
+
+void scan(unsigned char* in)
+{
+/*!rules:re2c
+
+"a" := return "a";
+"b" := return "b";
+"c" := return "c";
+"d" := return "d";
+
+re2c:indent:top = 1;
+
+*//*!use:re2c
+
+re2c:define:YYCTYPE  = 'unsigned char';
+re2c:define:YYFILL   = 'fill1';
+re2c:define:YYCURSOR = 'cursor1';
+re2c:define:YYLIMIT  = 'limit1';
+
+"1"    := return "1";
+.   := return ".";
+
+*/
+}
+
+void scan(unsigned short* in)
+{
+/*!use:re2c
+
+re2c:define:YYCTYPE  = 'unsigned short';
+re2c:define:YYFILL   = 'fill2';
+re2c:define:YYCURSOR = 'cursor2';
+re2c:define:YYLIMIT  = 'limit2';
+
+"2"    := return "2";
+.   := return ".";
+
+*/
+}
+
+void scan(unsigned int* in)
+{
+/*!use:re2c
+
+re2c:define:YYCTYPE  = 'unsigned int';
+re2c:define:YYFILL   = 'fill3';
+re2c:define:YYCURSOR = 'cursor3';
+re2c:define:YYLIMIT  = 'limit3';
+
+"3"    := return "3";
+.   := return ".";
+
+*/
+}
diff --git a/re2c/test/repeat-07.gir.c b/re2c/test/repeat-07.gir.c
new file mode 100755 (executable)
index 0000000..e7f616c
--- /dev/null
@@ -0,0 +1,210 @@
+/* Generated by re2c */
+// multiple scanners, additional rules, char width change
+
+void scan(unsigned char* in)
+{
+
+       {
+               unsigned char yych;
+
+               if (limit1 <= cursor1) fill1(1);
+               yych = *cursor1;
+               {
+                       static void *yytarget[256] = {
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy2,  &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy11, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy3,  &&yy5,  &&yy7,  &&yy9,  &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13
+                       };
+                       goto *yytarget[yych];
+               }
+yy2:
+yy3:
+               ++cursor1;
+               return "a";
+yy5:
+               ++cursor1;
+               return "b";
+yy7:
+               ++cursor1;
+               return "c";
+yy9:
+               ++cursor1;
+               return "d";
+yy11:
+               ++cursor1;
+               return "1";
+yy13:
+               ++cursor1;
+               return ".";
+       }
+
+}
+
+void scan(unsigned short* in)
+{
+
+       {
+               unsigned short yych;
+
+               if (limit2 <= cursor2) fill2(1);
+               yych = *cursor2;
+               if (yych & ~0xFF) {
+                       goto yy13;
+               } else {
+                       static void *yytarget[256] = {
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy2,  &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy11, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy3,  &&yy5,  &&yy7,  &&yy9,  &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13
+                       };
+                       goto *yytarget[yych];
+               }
+yy2:
+yy3:
+               ++cursor2;
+               return "a";
+yy5:
+               ++cursor2;
+               return "b";
+yy7:
+               ++cursor2;
+               return "c";
+yy9:
+               ++cursor2;
+               return "d";
+yy11:
+               ++cursor2;
+               return "2";
+yy13:
+               ++cursor2;
+               return ".";
+       }
+
+}
+
+void scan(unsigned int* in)
+{
+
+       {
+               unsigned int yych;
+
+               if (limit3 <= cursor3) fill3(1);
+               yych = *cursor3;
+               if (yych & ~0xFF) {
+                       goto yy13;
+               } else {
+                       static void *yytarget[256] = {
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy2,  &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy11, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy3,  &&yy5,  &&yy7,  &&yy9,  &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13,
+                               &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13, &&yy13
+                       };
+                       goto *yytarget[yych];
+               }
+yy2:
+yy3:
+               ++cursor3;
+               return "a";
+yy5:
+               ++cursor3;
+               return "b";
+yy7:
+               ++cursor3;
+               return "c";
+yy9:
+               ++cursor3;
+               return "d";
+yy11:
+               ++cursor3;
+               return "3";
+yy13:
+               ++cursor3;
+               return ".";
+       }
+
+}
diff --git a/re2c/test/repeat-07.gir.re b/re2c/test/repeat-07.gir.re
new file mode 100755 (executable)
index 0000000..10d3793
--- /dev/null
@@ -0,0 +1,64 @@
+// multiple scanners, additional rules, char width change
+
+void scan(unsigned char* in)
+{
+/*!rules:re2c
+
+"a" := return "a";
+"b" := return "b";
+"c" := return "c";
+"d" := return "d";
+
+re2c:indent:top = 1;
+
+*//*!use:re2c
+
+re2c:flags:u = 0;
+re2c:flags:w = 0;
+
+re2c:define:YYCTYPE  = 'unsigned char';
+re2c:define:YYFILL   = 'fill1';
+re2c:define:YYCURSOR = 'cursor1';
+re2c:define:YYLIMIT  = 'limit1';
+
+"1"    := return "1";
+.   := return ".";
+
+*/
+}
+
+void scan(unsigned short* in)
+{
+/*!use:re2c
+
+re2c:flags:u = 0;
+re2c:flags:w = 1;
+
+re2c:define:YYCTYPE  = 'unsigned short';
+re2c:define:YYFILL   = 'fill2';
+re2c:define:YYCURSOR = 'cursor2';
+re2c:define:YYLIMIT  = 'limit2';
+
+"2"    := return "2";
+.   := return ".";
+
+*/
+}
+
+void scan(unsigned int* in)
+{
+/*!use:re2c
+
+re2c:flags:u = 1;
+re2c:flags:w = 1;
+
+re2c:define:YYCTYPE  = 'unsigned int';
+re2c:define:YYFILL   = 'fill3';
+re2c:define:YYCURSOR = 'cursor3';
+re2c:define:YYLIMIT  = 'limit3';
+
+"3"    := return "3";
+.   := return ".";
+
+*/
+}