Add element groups (extension syntax)
authorNick Downing <downing.nick@gmail.com>
Wed, 26 Sep 2018 12:11:09 +0000 (22:11 +1000)
committerNick Downing <downing.nick@gmail.com>
Wed, 26 Sep 2018 12:11:25 +0000 (22:11 +1000)
src/parse-gram.c
src/parse-gram.h
src/parse-gram.y
src/scan-gram.c
src/scan-gram.l

index 8239655..cabc21b 100644 (file)
@@ -120,7 +120,7 @@ extern int gram_debug;
 
   #include "symlist.h"
   #include "symtab.h"
-#line 246 "src/parse-gram.y" /* yacc.c:355  */
+#line 248 "src/parse-gram.y" /* yacc.c:355  */
 
   typedef enum
   {
@@ -129,7 +129,7 @@ extern int gram_debug;
     param_parse  = 1 << 1,
     param_both   = param_lex | param_parse
   } param_type;
-#line 887 "src/parse-gram.y" /* yacc.c:355  */
+#line 899 "src/parse-gram.y" /* yacc.c:355  */
 #include "muscle-tab.h"
 
 #line 136 "src/parse-gram.c" /* yacc.c:355  */
@@ -203,27 +203,27 @@ extern int gram_debug;
 
 union GRAM_STYPE
 {
-#line 207 "src/parse-gram.y" /* yacc.c:355  */
+#line 209 "src/parse-gram.y" /* yacc.c:355  */
 unsigned char character;
-#line 211 "src/parse-gram.y" /* yacc.c:355  */
+#line 213 "src/parse-gram.y" /* yacc.c:355  */
 char *code;
-#line 216 "src/parse-gram.y" /* yacc.c:355  */
+#line 218 "src/parse-gram.y" /* yacc.c:355  */
 uniqstr uniqstr;
-#line 224 "src/parse-gram.y" /* yacc.c:355  */
+#line 226 "src/parse-gram.y" /* yacc.c:355  */
 int integer;
-#line 228 "src/parse-gram.y" /* yacc.c:355  */
+#line 230 "src/parse-gram.y" /* yacc.c:355  */
 symbol *symbol;
-#line 233 "src/parse-gram.y" /* yacc.c:355  */
+#line 235 "src/parse-gram.y" /* yacc.c:355  */
 assoc assoc;
-#line 236 "src/parse-gram.y" /* yacc.c:355  */
+#line 238 "src/parse-gram.y" /* yacc.c:355  */
 symbol_list *list;
-#line 239 "src/parse-gram.y" /* yacc.c:355  */
+#line 241 "src/parse-gram.y" /* yacc.c:355  */
 named_ref *named_ref;
-#line 266 "src/parse-gram.y" /* yacc.c:355  */
+#line 268 "src/parse-gram.y" /* yacc.c:355  */
 param_type param;
-#line 563 "src/parse-gram.y" /* yacc.c:355  */
+#line 565 "src/parse-gram.y" /* yacc.c:355  */
 code_props_type code_type;
-#line 889 "src/parse-gram.y" /* yacc.c:355  */
+#line 901 "src/parse-gram.y" /* yacc.c:355  */
 
   struct
   {
@@ -351,7 +351,9 @@ int gram_parse (void);
     ++gram_piece3; \
    } while (0)
 
-#line 256 "src/parse-gram.y" /* yacc.c:359  */
+  /* Nick extra rules for element groups */
+  int nested_rhs = 0;
+#line 258 "src/parse-gram.y" /* yacc.c:359  */
 
   /** Add a lex-param and/or a parse-param.
    *
@@ -362,7 +364,7 @@ int gram_parse (void);
   static void add_param (param_type type, char *decl, location loc);
   static param_type current_param = param_none;
 
-#line 366 "src/parse-gram.c" /* yacc.c:359  */
+#line 368 "src/parse-gram.c" /* yacc.c:359  */
 
 #ifdef short
 # undef short
@@ -583,16 +585,16 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  3
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   164
+#define YYLAST   183
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  58
+#define YYNTOKENS  60
 /* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  37
+#define YYNNTS  38
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  110
+#define YYNRULES  112
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  144
+#define YYNSTATES  148
 
 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
    by yylex, with out-of-bounds checking.  */
@@ -610,7 +612,7 @@ static const yytype_uint8 yytranslate[] =
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+      58,    59,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -644,18 +646,18 @@ static const yytype_uint8 yytranslate[] =
   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,   289,   289,   304,   315,   319,   320,   332,   350,   357,
-     361,   368,   376,   381,   386,   390,   397,   410,   414,   418,
-     422,   426,   430,   430,   434,   438,   464,   468,   472,   476,
-     480,   481,   490,   491,   492,   500,   521,   527,   533,   548,
-     566,   567,   577,   578,   584,   603,   603,   610,   610,   617,
-     630,   648,   649,   650,   651,   655,   656,   661,   663,   668,
-     675,   688,   693,   701,   702,   706,   710,   714,   715,   716,
-     721,   726,   733,   742,   750,   764,   765,   774,   775,   781,
-     782,   783,   790,   790,   803,   807,   811,   816,   828,   834,
-     843,   845,   850,   857,   863,   871,   872,   882,   883,   908,
-     909,   910,   911,   923,   925,   934,   939,   940,   945,   953,
-     954
+       0,   291,   291,   306,   317,   321,   322,   334,   352,   359,
+     363,   370,   378,   383,   388,   392,   399,   412,   416,   420,
+     424,   428,   432,   432,   436,   440,   466,   470,   474,   478,
+     482,   483,   492,   493,   494,   502,   523,   529,   535,   550,
+     568,   569,   579,   580,   586,   605,   605,   612,   612,   619,
+     632,   650,   651,   652,   653,   657,   658,   663,   665,   670,
+     677,   690,   695,   703,   704,   708,   712,   716,   717,   718,
+     723,   728,   735,   744,   752,   766,   767,   776,   777,   783,
+     784,   785,   792,   792,   805,   809,   813,   818,   835,   841,
+     850,   852,   857,   864,   870,   876,   876,   883,   884,   894,
+     895,   920,   921,   922,   923,   935,   937,   946,   951,   952,
+     957,   965,   966
 };
 #endif
 
@@ -677,15 +679,15 @@ static const char *const yytname[] =
   "\"%yacc\"", "\"{...}\"", "\"%?{...}\"", "\"[identifier]\"", "\"char\"",
   "\"epilogue\"", "\"=\"", "\"identifier\"", "\"identifier:\"", "\"%%\"",
   "\"|\"", "\"%{...%}\"", "\";\"", "\"<tag>\"", "\"<*>\"", "\"<>\"",
-  "\"integer\"", "\"%param\"", "\"%union\"", "\"%empty\"", "$accept",
-  "input", "prologue_declarations", "prologue_declaration", "$@1",
-  "params", "grammar_declaration", "code_props_type", "union_name",
+  "\"integer\"", "\"%param\"", "\"%union\"", "\"%empty\"", "'('", "')'",
+  "$accept", "input", "prologue_declarations", "prologue_declaration",
+  "$@1", "params", "grammar_declaration", "code_props_type", "union_name",
   "symbol_declaration", "$@2", "$@3", "precedence_declaration",
   "precedence_declarator", "tag.opt", "symbols.prec", "symbol.prec",
   "symbols.1", "generic_symlist", "generic_symlist_item", "tag",
   "symbol_def", "symbol_defs.1", "grammar", "rules_or_grammar_declaration",
-  "rules", "$@4", "rhses.1", "rhs", "named_ref.opt", "variable", "value",
-  "id", "id_colon", "symbol", "string_as_id", "epilogue.opt", YY_NULLPTR
+  "rules", "$@4", "rhses.1", "rhs", "$@5", "named_ref.opt", "variable",
+  "value", "id", "id_colon", "symbol", "string_as_id", "epilogue.opt", YY_NULLPTR
 };
 #endif
 
@@ -699,16 +701,16 @@ static const yytype_uint16 yytoknum[] =
      275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
      285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
      295,   296,   297,   298,   299,   300,   301,   302,   303,   304,
-     305,   306,   307,   308,   309,   310,   311,   312
+     305,   306,   307,   308,   309,   310,   311,   312,    40,    41
 };
 # endif
 
-#define YYPACT_NINF -113
+#define YYPACT_NINF -127
 
 #define yypact_value_is_default(Yystate) \
-  (!!((Yystate) == (-113)))
+  (!!((Yystate) == (-127)))
 
-#define YYTABLE_NINF -110
+#define YYTABLE_NINF -112
 
 #define yytable_value_is_error(Yytable_value) \
   0
@@ -717,21 +719,21 @@ static const yytype_uint16 yytoknum[] =
      STATE-NUM.  */
 static const yytype_int8 yypact[] =
 {
-    -113,    16,   108,  -113,  -113,  -113,   -27,  -113,  -113,  -113,
-    -113,  -113,  -113,   -24,  -113,    23,    24,  -113,   -21,   -15,
-    -113,    29,  -113,     3,    38,    42,  -113,  -113,  -113,    44,
-      47,    71,    31,  -113,  -113,  -113,    55,  -113,  -113,  -113,
-      30,  -113,  -113,    39,  -113,  -113,    26,   -22,   -22,    31,
-    -113,    48,  -113,  -113,     1,  -113,  -113,  -113,  -113,  -113,
-    -113,  -113,  -113,  -113,  -113,  -113,  -113,  -113,  -113,  -113,
-    -113,    45,  -113,    50,     2,  -113,  -113,    57,    49,  -113,
-      52,    41,  -113,    31,  -113,  -113,   -22,    -2,   -22,    31,
-    -113,  -113,  -113,  -113,  -113,  -113,  -113,  -113,    46,  -113,
-    -113,  -113,  -113,  -113,    63,  -113,  -113,  -113,  -113,    41,
-    -113,  -113,  -113,    31,  -113,    51,  -113,   100,  -113,  -113,
-    -113,  -113,  -113,  -113,  -113,  -113,  -113,   -20,    40,  -113,
-    -113,    31,    53,    58,    57,  -113,  -113,    57,    40,  -113,
-    -113,  -113,  -113,  -113
+    -127,    14,   127,  -127,  -127,  -127,   -22,  -127,  -127,  -127,
+    -127,  -127,  -127,   -37,  -127,     8,    27,  -127,   -19,   -18,
+    -127,    39,  -127,    19,    56,    63,  -127,  -127,  -127,    73,
+      83,    94,     1,  -127,  -127,  -127,    84,  -127,  -127,  -127,
+      42,  -127,  -127,    59,  -127,  -127,    51,    18,    18,     1,
+    -127,    64,  -127,  -127,     2,  -127,  -127,  -127,  -127,  -127,
+    -127,  -127,  -127,  -127,  -127,  -127,  -127,  -127,  -127,  -127,
+    -127,    58,  -127,    61,    15,  -127,  -127,    68,    67,  -127,
+      75,     3,  -127,     1,  -127,  -127,    18,    -2,    18,     1,
+    -127,  -127,  -127,  -127,  -127,  -127,  -127,  -127,    69,  -127,
+    -127,  -127,  -127,  -127,    76,  -127,  -127,  -127,  -127,     3,
+    -127,  -127,  -127,     1,  -127,    62,  -127,   114,  -127,  -127,
+    -127,  -127,  -127,  -127,  -127,  -127,  -127,   -38,    65,  -127,
+    -127,     1,    66,    70,    68,  -127,  -127,  -127,    68,    65,
+    -127,  -127,  -127,  -127,  -127,  -127,    25,  -127
 };
 
   /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -744,25 +746,25 @@ static const yytype_uint8 yydefact[] =
        7,     0,    15,     0,     0,     0,    37,    19,    20,     0,
        0,     0,     0,    26,    27,    28,     0,     6,    29,    22,
       42,     4,     5,     0,    33,    32,    55,     0,     0,     0,
-      38,     0,    98,    97,    99,    10,    12,    13,    14,    16,
-      17,    18,    21,    24,    25,   108,   104,   103,   106,    34,
-     107,     0,   105,     0,     0,    77,    79,    95,     0,    43,
+      38,     0,   100,    99,   101,    10,    12,    13,    14,    16,
+      17,    18,    21,    24,    25,   110,   106,   105,   108,    34,
+     109,     0,   107,     0,     0,    77,    79,    97,     0,    43,
        0,     0,    56,     0,    70,    75,    48,    71,    46,    49,
-      61,    39,   101,   102,   100,     8,    81,    80,     0,    78,
-       2,    96,    82,    31,    23,    44,    67,    68,    69,    35,
+      61,    39,   103,   104,   102,     8,    81,    80,     0,    78,
+       2,    98,    82,    31,    23,    44,    67,    68,    69,    35,
       63,    66,    65,    50,    57,    59,    76,    72,    73,    62,
-     110,    87,    30,    64,    58,    60,    74,    83,    84,    87,
-      86,     0,     0,     0,    95,    90,    91,    95,    85,    92,
-      93,    94,    89,    88
+     112,    87,    30,    64,    58,    60,    74,    83,    84,    87,
+      86,     0,     0,     0,    97,    90,    91,    95,    97,    85,
+      92,    93,    94,    89,    87,    88,     0,    96
 };
 
   /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int8 yypgoto[] =
 {
-    -113,  -113,  -113,  -113,  -113,  -113,   102,  -113,  -113,  -113,
-    -113,  -113,  -113,  -113,  -113,  -113,     8,  -113,  -113,    13,
-    -113,   -50,    75,  -113,    73,  -113,  -113,  -113,    19,  -112,
-    -113,  -113,    22,  -113,   -32,   -82,  -113
+    -127,  -127,  -127,  -127,  -127,  -127,   116,  -127,  -127,  -127,
+    -127,  -127,  -127,  -127,  -127,  -127,    11,  -127,  -127,    16,
+    -127,   -13,    78,  -127,    53,  -127,  -127,  -127,  -126,  -127,
+    -125,  -127,  -127,   -14,  -127,   -32,   -80,  -127
 };
 
   /* YYDEFGOTO[NTERM-NUM].  */
@@ -770,8 +772,8 @@ static const yytype_int16 yydefgoto[] =
 {
       -1,     1,     2,    41,    78,   104,    73,    43,    80,    44,
       48,    47,    45,    46,    83,   113,   114,    89,   109,   110,
-     111,    85,    86,    74,    75,    76,   121,   127,   128,   102,
-      54,    95,    68,    77,   112,    70,   100
+     111,    85,    86,    74,    75,    76,   121,   127,   128,   144,
+     102,    54,    95,    68,    77,   138,    70,   100
 };
 
   /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
@@ -779,82 +781,86 @@ static const yytype_int16 yydefgoto[] =
      number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_int16 yytable[] =
 {
-      69,    65,  -109,    71,    92,   118,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,    50,     3,    90,    13,    14,
-      66,    51,   142,    67,    49,   143,    52,    55,   129,    84,
-     130,    26,    58,    56,    65,   126,   116,    32,   116,    57,
-      93,    60,    59,    65,    65,    61,    94,    62,    72,    98,
-      63,   115,   117,   131,   132,   133,    71,   119,    40,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    53,    87,
-      87,    13,    14,    66,    64,    79,    67,    82,    81,   134,
-     135,   115,    66,    66,    26,    67,    67,    91,   103,   120,
-      32,   105,   106,   107,   108,    96,   137,   136,   101,   139,
-      97,    72,   122,    65,    42,   125,   137,   140,    87,   141,
-      87,    40,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,   124,   123,    88,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
-      29,    30,    31,    32,    33,    34,    35,    99,   138,     0,
-       0,     0,     0,     0,     0,    36,     0,    37,    38,     0,
-       0,     0,     0,    39,    40
+      69,    65,    50,   139,    65,    92,    65,   118,    51,   143,
+     129,    52,   130,   145,     3,  -111,    71,    90,   146,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    65,    49,
+      55,    13,    14,    87,    87,    56,    57,   126,   131,   132,
+     133,    93,    58,    66,    26,    66,    67,    94,    67,   112,
+      32,   115,   117,    53,   106,   107,   108,   119,    59,    60,
+      66,    72,    98,    67,   134,   135,    61,    66,    65,    84,
+      67,    40,    87,   116,    87,   116,    62,   112,   131,   132,
+     133,   115,   136,   137,   147,    71,    63,    79,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    64,    81,   140,
+      13,    14,    82,    91,   134,   135,   103,    66,    96,   101,
+      67,    97,   120,    26,   105,   122,   125,    65,    42,    32,
+     141,   142,   136,   137,   124,   123,    88,    99,     0,     0,
+      72,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      40,     0,     0,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
+      30,    31,    32,    33,    34,    35,     0,     0,     0,     0,
+       0,     0,     0,     0,    36,     0,    37,    38,     0,     0,
+       0,     0,    39,    40
 };
 
 static const yytype_int16 yycheck[] =
 {
-      32,     3,     0,     1,     3,    87,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,    39,     0,    49,    16,    17,
-      42,    45,   134,    45,    51,   137,     3,     3,    48,    51,
-      50,    29,     3,    54,     3,   117,    86,    35,    88,    54,
-      39,     3,    39,     3,     3,     3,    45,     3,    46,    47,
-       3,    83,    54,    13,    14,    15,     1,    89,    56,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    45,    47,
-      48,    16,    17,    42,     3,    45,    45,    51,    39,    39,
-      40,   113,    42,    42,    29,    45,    45,    39,    39,    43,
-      35,    39,    51,    52,    53,    50,   128,    57,    41,   131,
-      50,    46,    39,     3,     2,    54,   138,    54,    86,    51,
-      88,    56,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,   113,   109,    48,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    36,    37,    38,    74,   129,    -1,
-      -1,    -1,    -1,    -1,    -1,    47,    -1,    49,    50,    -1,
-      -1,    -1,    -1,    55,    56
+      32,     3,    39,   129,     3,     3,     3,    87,    45,   134,
+      48,     3,    50,   138,     0,     0,     1,    49,   144,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,     3,    51,
+       3,    16,    17,    47,    48,    54,    54,   117,    13,    14,
+      15,    39,     3,    42,    29,    42,    45,    45,    45,    81,
+      35,    83,    54,    45,    51,    52,    53,    89,    39,     3,
+      42,    46,    47,    45,    39,    40,     3,    42,     3,    51,
+      45,    56,    86,    86,    88,    88,     3,   109,    13,    14,
+      15,   113,    57,    58,    59,     1,     3,    45,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,     3,    39,   131,
+      16,    17,    51,    39,    39,    40,    39,    42,    50,    41,
+      45,    50,    43,    29,    39,    39,    54,     3,     2,    35,
+      54,    51,    57,    58,   113,   109,    48,    74,    -1,    -1,
+      46,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      56,    -1,    -1,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    38,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    47,    -1,    49,    50,    -1,    -1,
+      -1,    -1,    55,    56
 };
 
   /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
      symbol of state STATE-NUM.  */
 static const yytype_uint8 yystos[] =
 {
-       0,    59,    60,     0,     4,     5,     6,     7,     8,     9,
+       0,    61,    62,     0,     4,     5,     6,     7,     8,     9,
       10,    11,    12,    16,    17,    18,    19,    20,    21,    22,
       23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
       33,    34,    35,    36,    37,    38,    47,    49,    50,    55,
-      56,    61,    64,    65,    67,    70,    71,    69,    68,    51,
-      39,    45,     3,    45,    88,     3,    54,    54,     3,    39,
-       3,     3,     3,     3,     3,     3,    42,    45,    90,    92,
-      93,     1,    46,    64,    81,    82,    83,    91,    62,    45,
-      66,    39,    51,    72,    51,    79,    80,    90,    80,    75,
-      92,    39,     3,    39,    45,    89,    50,    50,    47,    82,
-      94,    41,    87,    39,    63,    39,    51,    52,    53,    76,
-      77,    78,    92,    73,    74,    92,    79,    54,    93,    92,
-      43,    84,    39,    77,    74,    54,    93,    85,    86,    48,
-      50,    13,    14,    15,    39,    40,    57,    92,    86,    92,
-      54,    51,    87,    87
+      56,    63,    66,    67,    69,    72,    73,    71,    70,    51,
+      39,    45,     3,    45,    91,     3,    54,    54,     3,    39,
+       3,     3,     3,     3,     3,     3,    42,    45,    93,    95,
+      96,     1,    46,    66,    83,    84,    85,    94,    64,    45,
+      68,    39,    51,    74,    51,    81,    82,    93,    82,    77,
+      95,    39,     3,    39,    45,    92,    50,    50,    47,    84,
+      97,    41,    90,    39,    65,    39,    51,    52,    53,    78,
+      79,    80,    95,    75,    76,    95,    81,    54,    96,    95,
+      43,    86,    39,    79,    76,    54,    96,    87,    88,    48,
+      50,    13,    14,    15,    39,    40,    57,    58,    95,    88,
+      95,    54,    51,    90,    89,    90,    88,    59
 };
 
   /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const yytype_uint8 yyr1[] =
 {
-       0,    58,    59,    60,    60,    61,    61,    61,    61,    61,
-      61,    61,    61,    61,    61,    61,    61,    61,    61,    61,
-      61,    61,    62,    61,    61,    61,    61,    61,    61,    61,
-      63,    63,    64,    64,    64,    64,    64,    64,    64,    64,
-      65,    65,    66,    66,    64,    68,    67,    69,    67,    67,
-      70,    71,    71,    71,    71,    72,    72,    73,    73,    74,
-      74,    75,    75,    76,    76,    77,    77,    78,    78,    78,
-      79,    79,    79,    79,    79,    80,    80,    81,    81,    82,
-      82,    82,    84,    83,    85,    85,    85,    86,    86,    86,
-      86,    86,    86,    86,    86,    87,    87,    88,    88,    89,
-      89,    89,    89,    90,    90,    91,    92,    92,    93,    94,
-      94
+       0,    60,    61,    62,    62,    63,    63,    63,    63,    63,
+      63,    63,    63,    63,    63,    63,    63,    63,    63,    63,
+      63,    63,    64,    63,    63,    63,    63,    63,    63,    63,
+      65,    65,    66,    66,    66,    66,    66,    66,    66,    66,
+      67,    67,    68,    68,    66,    70,    69,    71,    69,    69,
+      72,    73,    73,    73,    73,    74,    74,    75,    75,    76,
+      76,    77,    77,    78,    78,    79,    79,    80,    80,    80,
+      81,    81,    81,    81,    81,    82,    82,    83,    83,    84,
+      84,    84,    86,    85,    87,    87,    87,    88,    88,    88,
+      88,    88,    88,    88,    88,    89,    88,    90,    90,    91,
+      91,    92,    92,    92,    92,    93,    93,    94,    95,    95,
+      96,    97,    97
 };
 
   /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
@@ -869,9 +875,9 @@ static const yytype_uint8 yyr2[] =
        2,     1,     2,     1,     2,     1,     1,     1,     1,     1,
        1,     1,     2,     2,     3,     1,     2,     1,     2,     1,
        2,     2,     0,     4,     1,     3,     2,     0,     3,     3,
-       2,     2,     3,     3,     3,     0,     1,     1,     1,     0,
-       1,     1,     1,     1,     1,     1,     1,     1,     1,     0,
-       2
+       2,     2,     3,     3,     3,     0,     5,     0,     1,     1,
+       1,     0,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     0,     2
 };
 
 
@@ -1027,79 +1033,79 @@ yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvalue
   switch (yytype)
     {
           case 3: /* "string"  */
-#line 213 "src/parse-gram.y" /* yacc.c:684  */
+#line 215 "src/parse-gram.y" /* yacc.c:684  */
       { fputs (quotearg_style (c_quoting_style, ((*yyvaluep).code)), yyo); }
-#line 1033 "src/parse-gram.c" /* yacc.c:684  */
+#line 1039 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 23: /* "%<flag>"  */
-#line 221 "src/parse-gram.y" /* yacc.c:684  */
+#line 223 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%%%s", ((*yyvaluep).uniqstr)); }
-#line 1039 "src/parse-gram.c" /* yacc.c:684  */
+#line 1045 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 39: /* "{...}"  */
-#line 214 "src/parse-gram.y" /* yacc.c:684  */
+#line 216 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "{\n%s\n}", ((*yyvaluep).code)); }
-#line 1045 "src/parse-gram.c" /* yacc.c:684  */
+#line 1051 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 40: /* "%?{...}"  */
-#line 214 "src/parse-gram.y" /* yacc.c:684  */
+#line 216 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "{\n%s\n}", ((*yyvaluep).code)); }
-#line 1051 "src/parse-gram.c" /* yacc.c:684  */
+#line 1057 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 41: /* "[identifier]"  */
-#line 219 "src/parse-gram.y" /* yacc.c:684  */
+#line 221 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "[%s]", ((*yyvaluep).uniqstr)); }
-#line 1057 "src/parse-gram.c" /* yacc.c:684  */
+#line 1063 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 42: /* "char"  */
-#line 209 "src/parse-gram.y" /* yacc.c:684  */
+#line 211 "src/parse-gram.y" /* yacc.c:684  */
       { fputs (char_name (((*yyvaluep).character)), yyo); }
-#line 1063 "src/parse-gram.c" /* yacc.c:684  */
+#line 1069 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 43: /* "epilogue"  */
-#line 214 "src/parse-gram.y" /* yacc.c:684  */
+#line 216 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "{\n%s\n}", ((*yyvaluep).code)); }
-#line 1069 "src/parse-gram.c" /* yacc.c:684  */
+#line 1075 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 45: /* "identifier"  */
-#line 218 "src/parse-gram.y" /* yacc.c:684  */
+#line 220 "src/parse-gram.y" /* yacc.c:684  */
       { fputs (((*yyvaluep).uniqstr), yyo); }
-#line 1075 "src/parse-gram.c" /* yacc.c:684  */
+#line 1081 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 46: /* "identifier:"  */
-#line 220 "src/parse-gram.y" /* yacc.c:684  */
+#line 222 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%s:", ((*yyvaluep).uniqstr)); }
-#line 1081 "src/parse-gram.c" /* yacc.c:684  */
+#line 1087 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 49: /* "%{...%}"  */
-#line 214 "src/parse-gram.y" /* yacc.c:684  */
+#line 216 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "{\n%s\n}", ((*yyvaluep).code)); }
-#line 1087 "src/parse-gram.c" /* yacc.c:684  */
+#line 1093 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 51: /* "<tag>"  */
-#line 222 "src/parse-gram.y" /* yacc.c:684  */
+#line 224 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "<%s>", ((*yyvaluep).uniqstr)); }
-#line 1093 "src/parse-gram.c" /* yacc.c:684  */
+#line 1099 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 54: /* "integer"  */
-#line 226 "src/parse-gram.y" /* yacc.c:684  */
+#line 228 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%d", ((*yyvaluep).integer)); }
-#line 1099 "src/parse-gram.c" /* yacc.c:684  */
+#line 1105 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 55: /* "%param"  */
-#line 269 "src/parse-gram.y" /* yacc.c:684  */
+#line 271 "src/parse-gram.y" /* yacc.c:684  */
       {
   switch (((*yyvaluep).param))
     {
@@ -1112,35 +1118,35 @@ yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvalue
       case param_none: aver (false); break;
     }
 }
-#line 1116 "src/parse-gram.c" /* yacc.c:684  */
+#line 1122 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
-    case 65: /* code_props_type  */
-#line 564 "src/parse-gram.y" /* yacc.c:684  */
+    case 67: /* code_props_type  */
+#line 566 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%s", code_props_type_string (((*yyvaluep).code_type))); }
-#line 1122 "src/parse-gram.c" /* yacc.c:684  */
+#line 1128 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
-    case 74: /* symbol.prec  */
-#line 230 "src/parse-gram.y" /* yacc.c:684  */
+    case 76: /* symbol.prec  */
+#line 232 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%s", ((*yyvaluep).symbol)->tag); }
-#line 1128 "src/parse-gram.c" /* yacc.c:684  */
+#line 1134 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
-    case 78: /* tag  */
-#line 222 "src/parse-gram.y" /* yacc.c:684  */
+    case 80: /* tag  */
+#line 224 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "<%s>", ((*yyvaluep).uniqstr)); }
-#line 1134 "src/parse-gram.c" /* yacc.c:684  */
+#line 1140 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
-    case 88: /* variable  */
-#line 218 "src/parse-gram.y" /* yacc.c:684  */
+    case 91: /* variable  */
+#line 220 "src/parse-gram.y" /* yacc.c:684  */
       { fputs (((*yyvaluep).uniqstr), yyo); }
-#line 1140 "src/parse-gram.c" /* yacc.c:684  */
+#line 1146 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
-    case 89: /* value  */
-#line 898 "src/parse-gram.y" /* yacc.c:684  */
+    case 92: /* value  */
+#line 910 "src/parse-gram.y" /* yacc.c:684  */
       {
   switch (((*yyvaluep).value).kind)
     {
@@ -1149,31 +1155,31 @@ yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvalue
     case muscle_string:  fprintf (yyo, "\"%s\"", ((*yyvaluep).value).chars); break;
     }
 }
-#line 1153 "src/parse-gram.c" /* yacc.c:684  */
+#line 1159 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
-    case 90: /* id  */
-#line 230 "src/parse-gram.y" /* yacc.c:684  */
+    case 93: /* id  */
+#line 232 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%s", ((*yyvaluep).symbol)->tag); }
-#line 1159 "src/parse-gram.c" /* yacc.c:684  */
+#line 1165 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
-    case 91: /* id_colon  */
-#line 231 "src/parse-gram.y" /* yacc.c:684  */
+    case 94: /* id_colon  */
+#line 233 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%s:", ((*yyvaluep).symbol)->tag); }
-#line 1165 "src/parse-gram.c" /* yacc.c:684  */
+#line 1171 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
-    case 92: /* symbol  */
-#line 230 "src/parse-gram.y" /* yacc.c:684  */
+    case 95: /* symbol  */
+#line 232 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%s", ((*yyvaluep).symbol)->tag); }
-#line 1171 "src/parse-gram.c" /* yacc.c:684  */
+#line 1177 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
-    case 93: /* string_as_id  */
-#line 230 "src/parse-gram.y" /* yacc.c:684  */
+    case 96: /* string_as_id  */
+#line 232 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%s", ((*yyvaluep).symbol)->tag); }
-#line 1177 "src/parse-gram.c" /* yacc.c:684  */
+#line 1183 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
 
@@ -1868,7 +1874,7 @@ YYLTYPE yylloc = yyloc_default;
   yychar = YYEMPTY; /* Cause a token to be read.  */
 
 /* User initialization code.  */
-#line 133 "src/parse-gram.y" /* yacc.c:1430  */
+#line 135 "src/parse-gram.y" /* yacc.c:1430  */
 {
   /* Bison's grammar can initial empty locations, hence a default
      location is needed. */
@@ -1876,7 +1882,7 @@ YYLTYPE yylloc = yyloc_default;
   boundary_set (&yylloc.end, current_file, 1, 1);
 }
 
-#line 1880 "src/parse-gram.c" /* yacc.c:1430  */
+#line 1886 "src/parse-gram.c" /* yacc.c:1430  */
   yylsp[0] = yylloc;
   goto yysetstate;
 
@@ -2082,18 +2088,18 @@ yyreduce:
     switch (yyn)
       {
           case 2:
-#line 290 "src/parse-gram.y" /* yacc.c:1648  */
+#line 292 "src/parse-gram.y" /* yacc.c:1648  */
     {
  insert_after(2, "</AST_Section2>");
  insert_before(2, "<AST_Section2>");
  insert_after(0, "</AST_Section1>");
  insert_before(0, "<AST_Section1>");
  }
-#line 2082 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2088 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 3:
-#line 305 "src/parse-gram.y" /* yacc.c:1648  */
+#line 307 "src/parse-gram.y" /* yacc.c:1648  */
     {
  /* in this case, want empty rule associated with stuff on the right of us */
  /* therefore, move inter-token text from the right of us over to the left */
@@ -2104,11 +2110,11 @@ yyreduce:
  gram_piece[gram_piece2] = gram_piece[gram_piece2 - 1]; /* empty */
  gram_piece[gram_piece2 - 1] = temp;
  }
-#line 2097 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2103 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 6:
-#line 321 "src/parse-gram.y" /* yacc.c:1648  */
+#line 323 "src/parse-gram.y" /* yacc.c:1648  */
     {
  /* inserting %{...%} below is a hack as we may lose some whitespace near it */
  code_piece_append("<AST_Section1_Prologue>%{<AST_Text>");
@@ -2120,11 +2126,11 @@ yyreduce:
  free(gram_piece[gram_piece2]);
  gram_piece[gram_piece2] = strdup(code_piece[code_piece0 - 1]);
     }
-#line 2113 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2119 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 7:
-#line 333 "src/parse-gram.y" /* yacc.c:1648  */
+#line 335 "src/parse-gram.y" /* yacc.c:1648  */
     {
       muscle_percent_define_ensure ((yyvsp[0].uniqstr), (yylsp[0]), true);
  if (strcmp((yyvsp[0].uniqstr), "api.pure") == 0) {
@@ -2142,42 +2148,42 @@ yyreduce:
  else
   abort();
     }
-#line 2135 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2141 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 8:
-#line 351 "src/parse-gram.y" /* yacc.c:1648  */
+#line 353 "src/parse-gram.y" /* yacc.c:1648  */
     {
       muscle_percent_define_insert ((yyvsp[-1].uniqstr), (yylsp[-1]), (yyvsp[0].value).kind, (yyvsp[0].value).chars,
                                     MUSCLE_PERCENT_DEFINE_GRAMMAR_FILE);
  insert_after(2, "</AST_Section1_Define>");
  insert_before(0, "<AST_Section1_Define>");
     }
-#line 2146 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2152 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 9:
-#line 357 "src/parse-gram.y" /* yacc.c:1648  */
+#line 359 "src/parse-gram.y" /* yacc.c:1648  */
     { defines_flag = true; /*}*/
  insert_after(0, "</AST_Section1_Defines>");
  insert_before(0, "<AST_Section1_Defines>");
  }
-#line 2155 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2161 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 10:
-#line 362 "src/parse-gram.y" /* yacc.c:1648  */
+#line 364 "src/parse-gram.y" /* yacc.c:1648  */
     {
       defines_flag = true;
       spec_defines_file = xstrdup ((yyvsp[0].code));
  insert_after(1, "</AST_Section1_Defines>");
  insert_before(0, "<AST_Section1_Defines>");
     }
-#line 2166 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2172 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 11:
-#line 369 "src/parse-gram.y" /* yacc.c:1648  */
+#line 371 "src/parse-gram.y" /* yacc.c:1648  */
     {
       muscle_percent_define_insert ("parse.error", (yylsp[0]), muscle_keyword,
                                     "verbose",
@@ -2185,51 +2191,51 @@ yyreduce:
  insert_after(0, "</AST_Section1_ErrorVerbose>");
  insert_before(0, "<AST_Section1_ErrorVerbose>");
     }
-#line 2178 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2184 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 12:
-#line 376 "src/parse-gram.y" /* yacc.c:1648  */
+#line 378 "src/parse-gram.y" /* yacc.c:1648  */
     { expected_sr_conflicts = (yyvsp[0].integer); /*}*/
  insert_after(1, "</AST_Section1_Expect>");
  sprintf(gram_piece_temp, "<AST_Section1_Expect value=\"%d\">", (yyvsp[0].integer));
  insert_before(0, gram_piece_temp);
  }
-#line 2188 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2194 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 13:
-#line 381 "src/parse-gram.y" /* yacc.c:1648  */
+#line 383 "src/parse-gram.y" /* yacc.c:1648  */
     { expected_rr_conflicts = (yyvsp[0].integer); /*}*/
  insert_after(1, "</AST_Section1_ExpectRR>");
  sprintf(gram_piece_temp, "<AST_Section1_ExpectRR value=\"%d\">", (yyvsp[0].integer));
  insert_before(0, gram_piece_temp);
  }
-#line 2198 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2204 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 14:
-#line 386 "src/parse-gram.y" /* yacc.c:1648  */
+#line 388 "src/parse-gram.y" /* yacc.c:1648  */
     { spec_file_prefix = (yyvsp[0].code); /*}*/
  insert_after(1, "</AST_Section1_FilePrefix>");
  insert_before(0, "<AST_Section1_FilePrefix>");
  }
-#line 2207 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2213 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 15:
-#line 391 "src/parse-gram.y" /* yacc.c:1648  */
+#line 393 "src/parse-gram.y" /* yacc.c:1648  */
     {
       nondeterministic_parser = true;
       glr_parser = true;
  insert_after(0, "</AST_Section1_GLRParser>");
  insert_before(0, "<AST_Section1_GLRParser>");
     }
-#line 2218 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2224 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 16:
-#line 398 "src/parse-gram.y" /* yacc.c:1648  */
+#line 400 "src/parse-gram.y" /* yacc.c:1648  */
     {
  /* should be BracedCode, but too hard to put AST_Text inside braces */
  code_piece_append("<AST_Text>");
@@ -2242,80 +2248,80 @@ yyreduce:
  insert_after(1, "</AST_Section1_InitialAction>");
  insert_before(0, "<AST_Section1_InitialAction>");
     }
-#line 2235 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2241 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 17:
-#line 410 "src/parse-gram.y" /* yacc.c:1648  */
+#line 412 "src/parse-gram.y" /* yacc.c:1648  */
     { language_argmatch ((yyvsp[0].code), grammar_prio, (yylsp[-1])); /*}*/
  insert_after(1, "</AST_Section1_Language>");
  insert_before(0, "<AST_Section1_Language>");
  }
-#line 2244 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2250 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 18:
-#line 414 "src/parse-gram.y" /* yacc.c:1648  */
+#line 416 "src/parse-gram.y" /* yacc.c:1648  */
     { spec_name_prefix = (yyvsp[0].code); /*}*/
  insert_after(1, "</AST_Section1_NamePrefix>");
  insert_before(0, "<AST_Section1_NamePrefix>");
  }
-#line 2253 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2259 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 19:
-#line 418 "src/parse-gram.y" /* yacc.c:1648  */
+#line 420 "src/parse-gram.y" /* yacc.c:1648  */
     { no_lines_flag = true; /*}*/
  insert_after(0, "</AST_Section1_Lines>");
  insert_before(0, "<AST_Section1_Lines value=\"false\">");
  }
-#line 2262 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2268 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 20:
-#line 422 "src/parse-gram.y" /* yacc.c:1648  */
+#line 424 "src/parse-gram.y" /* yacc.c:1648  */
     { nondeterministic_parser = true; /*}*/
  insert_after(0, "</AST_Section1_NonDeterministicParser>");
  insert_before(0, "<AST_Section1_NonDeterministicParser>");
  }
-#line 2271 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2277 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 21:
-#line 426 "src/parse-gram.y" /* yacc.c:1648  */
+#line 428 "src/parse-gram.y" /* yacc.c:1648  */
     { spec_outfile = (yyvsp[0].code); /*}*/
  insert_after(1, "</AST_Section1_Output>");
  insert_before(0, "<AST_Section1_Output>");
  }
-#line 2280 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2286 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 22:
-#line 430 "src/parse-gram.y" /* yacc.c:1648  */
+#line 432 "src/parse-gram.y" /* yacc.c:1648  */
     { current_param = (yyvsp[0].param); }
-#line 2286 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2292 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 23:
-#line 430 "src/parse-gram.y" /* yacc.c:1648  */
+#line 432 "src/parse-gram.y" /* yacc.c:1648  */
     { current_param = param_none; /*}*/
  insert_after(2, "</AST_Section1_Param>");
  insert_before(0, "<AST_Section1_Param>");
  }
-#line 2295 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2301 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 24:
-#line 434 "src/parse-gram.y" /* yacc.c:1648  */
+#line 436 "src/parse-gram.y" /* yacc.c:1648  */
     { version_check (&(yylsp[0]), (yyvsp[0].code)); /*}*/
  insert_after(1, "</AST_Section1_Require>");
  insert_before(0, "<AST_Section1_Require>");
  }
-#line 2304 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2310 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 25:
-#line 439 "src/parse-gram.y" /* yacc.c:1648  */
+#line 441 "src/parse-gram.y" /* yacc.c:1648  */
     {
       char const *skeleton_user = (yyvsp[0].code);
       if (strchr (skeleton_user, '/'))
@@ -2341,50 +2347,50 @@ yyreduce:
  insert_after(1, "</AST_Section1_Skeleton>");
  insert_before(0, "<AST_Section1_Skeleton>");
     }
-#line 2334 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2340 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 26:
-#line 464 "src/parse-gram.y" /* yacc.c:1648  */
+#line 466 "src/parse-gram.y" /* yacc.c:1648  */
     { token_table_flag = true; /*}*/
  insert_after(0, "</AST_Section1_TokenTable>");
  insert_before(0, "<AST_Section1_TokenTable>");
  }
-#line 2343 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2349 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 27:
-#line 468 "src/parse-gram.y" /* yacc.c:1648  */
+#line 470 "src/parse-gram.y" /* yacc.c:1648  */
     { report_flag |= report_states; /*}*/
  insert_after(0, "</AST_Section1_Verbose>");
  insert_before(0, "<AST_Section1_Verbose>");
  }
-#line 2352 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2358 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 28:
-#line 472 "src/parse-gram.y" /* yacc.c:1648  */
+#line 474 "src/parse-gram.y" /* yacc.c:1648  */
     { yacc_flag = true; /*}*/
  insert_after(0, "</AST_Section1_YACC>");
  insert_before(0, "<AST_Section1_YACC>");
  }
-#line 2361 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2367 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 30:
-#line 480 "src/parse-gram.y" /* yacc.c:1648  */
+#line 482 "src/parse-gram.y" /* yacc.c:1648  */
     { add_param (current_param, (yyvsp[0].code), (yylsp[0])); }
-#line 2367 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2373 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 31:
-#line 481 "src/parse-gram.y" /* yacc.c:1648  */
+#line 483 "src/parse-gram.y" /* yacc.c:1648  */
     { add_param (current_param, (yyvsp[0].code), (yylsp[0])); }
-#line 2373 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2379 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 34:
-#line 493 "src/parse-gram.y" /* yacc.c:1648  */
+#line 495 "src/parse-gram.y" /* yacc.c:1648  */
     {
       grammar_start_symbol_set ((yyvsp[0].symbol), (yylsp[0]));
  insert_after(1, "</AST_Section1Or2_Start>");
@@ -2392,11 +2398,11 @@ yyreduce:
  insert_before(1, "<AST_SymbolRef>");
  insert_before(0, "<AST_Section1Or2_Start>");
     }
-#line 2385 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2391 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 35:
-#line 501 "src/parse-gram.y" /* yacc.c:1648  */
+#line 503 "src/parse-gram.y" /* yacc.c:1648  */
     {
       code_props code;
       code_props_symbol_action_init (&code, (yyvsp[-1].code), (yylsp[-1]));
@@ -2417,31 +2423,31 @@ yyreduce:
  sprintf(gram_piece_temp, "<AST_Section1Or2_CodeProps _type=\"%d\">", (yyvsp[-2].code_type));
  insert_before(0, gram_piece_temp);
     }
-#line 2410 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2416 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 36:
-#line 522 "src/parse-gram.y" /* yacc.c:1648  */
+#line 524 "src/parse-gram.y" /* yacc.c:1648  */
     {
       default_prec = true;
  insert_after(0, "</AST_Section1Or2_DefaultPrec>");
  insert_before(0, "<AST_Section1Or2_DefaultPrec value=\"true\">");
    }
-#line 2420 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2426 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 37:
-#line 528 "src/parse-gram.y" /* yacc.c:1648  */
+#line 530 "src/parse-gram.y" /* yacc.c:1648  */
     {
       default_prec = false;
  insert_after(0, "</AST_Section1Or2_DefaultPrec>");
  insert_before(0, "<AST_Section1Or2_DefaultPrec>");
     }
-#line 2430 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2436 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 38:
-#line 534 "src/parse-gram.y" /* yacc.c:1648  */
+#line 536 "src/parse-gram.y" /* yacc.c:1648  */
     {
       /* Do not invoke muscle_percent_code_grow here since it invokes
          muscle_user_name_list_grow.  */
@@ -2456,11 +2462,11 @@ yyreduce:
  insert_after(1, "</AST_Section1Or2_Code>");
  insert_before(0, "<AST_Section1Or2_Code><AST_ID />");
     }
-#line 2449 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2455 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 39:
-#line 549 "src/parse-gram.y" /* yacc.c:1648  */
+#line 551 "src/parse-gram.y" /* yacc.c:1648  */
     {
  code_piece_append("<AST_BracedCode>{<AST_Text>");
       muscle_percent_code_grow ((yyvsp[-1].uniqstr), (yylsp[-1]), translate_code_braceless ((yyvsp[0].code), (yylsp[0])), (yylsp[0]));
@@ -2472,37 +2478,37 @@ yyreduce:
  insert_after(2, "</AST_Section1Or2_Code>");
  insert_before(0, "<AST_Section1Or2_Code>");
     }
-#line 2465 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2471 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 40:
-#line 566 "src/parse-gram.y" /* yacc.c:1648  */
+#line 568 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.code_type) = destructor; }
-#line 2471 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2477 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 41:
-#line 567 "src/parse-gram.y" /* yacc.c:1648  */
+#line 569 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.code_type) = printer; }
-#line 2477 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2483 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 42:
-#line 577 "src/parse-gram.y" /* yacc.c:1648  */
+#line 579 "src/parse-gram.y" /* yacc.c:1648  */
     { insert_before(0, "<AST_ID />"); }
-#line 2483 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2489 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 43:
-#line 578 "src/parse-gram.y" /* yacc.c:1648  */
+#line 580 "src/parse-gram.y" /* yacc.c:1648  */
     { muscle_percent_define_insert ("api.value.union.name",
                                          (yylsp[0]), muscle_keyword, (yyvsp[0].uniqstr),
                                          MUSCLE_PERCENT_DEFINE_GRAMMAR_FILE); }
-#line 2491 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2497 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 44:
-#line 585 "src/parse-gram.y" /* yacc.c:1648  */
+#line 587 "src/parse-gram.y" /* yacc.c:1648  */
     {
       union_seen = true;
  code_piece_append("<AST_BracedCode>{<AST_Text>");
@@ -2515,45 +2521,45 @@ yyreduce:
  insert_after(2, "</AST_Section1Or2_Union>");
  insert_before(0, "<AST_Section1Or2_Union>");
     }
-#line 2508 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2514 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 45:
-#line 603 "src/parse-gram.y" /* yacc.c:1648  */
+#line 605 "src/parse-gram.y" /* yacc.c:1648  */
     { current_class = nterm_sym; }
-#line 2514 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2520 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 46:
-#line 604 "src/parse-gram.y" /* yacc.c:1648  */
+#line 606 "src/parse-gram.y" /* yacc.c:1648  */
     {
       current_class = unknown_sym;
       current_type = NULL;
  insert_after(2, "</AST_Section1Or2_NTerm>");
  insert_before(0, "<AST_Section1Or2_NTerm>");
     }
-#line 2525 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2531 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 47:
-#line 610 "src/parse-gram.y" /* yacc.c:1648  */
+#line 612 "src/parse-gram.y" /* yacc.c:1648  */
     { current_class = token_sym; }
-#line 2531 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2537 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 48:
-#line 611 "src/parse-gram.y" /* yacc.c:1648  */
+#line 613 "src/parse-gram.y" /* yacc.c:1648  */
     {
       current_class = unknown_sym;
       current_type = NULL;
  insert_after(2, "</AST_Section1Or2_Token>");
  insert_before(0, "<AST_Section1Or2_Token>");
     }
-#line 2542 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2548 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 49:
-#line 618 "src/parse-gram.y" /* yacc.c:1648  */
+#line 620 "src/parse-gram.y" /* yacc.c:1648  */
     {
       symbol_list *list;
       tag_seen = true;
@@ -2563,11 +2569,11 @@ yyreduce:
  insert_after(2, "</AST_Section1Or2_Type>");
  insert_before(0, "<AST_Section1Or2_Type>");
     }
-#line 2556 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2562 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 50:
-#line 631 "src/parse-gram.y" /* yacc.c:1648  */
+#line 633 "src/parse-gram.y" /* yacc.c:1648  */
     {
       symbol_list *list;
       ++current_prec;
@@ -2582,70 +2588,70 @@ yyreduce:
  sprintf(gram_piece_temp, "<AST_Section1Or2_Precedence _type=\"%d\">", ((yyvsp[-2].assoc) & 3) - 1); /* -1 precedence, 0 right, 1 left, 2 nonassoc */
  insert_before(0, gram_piece_temp);
     }
-#line 2575 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2581 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 51:
-#line 648 "src/parse-gram.y" /* yacc.c:1648  */
+#line 650 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.assoc) = left_assoc; }
-#line 2581 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2587 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 52:
-#line 649 "src/parse-gram.y" /* yacc.c:1648  */
+#line 651 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.assoc) = right_assoc;  }
-#line 2587 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2593 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 53:
-#line 650 "src/parse-gram.y" /* yacc.c:1648  */
+#line 652 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.assoc) = non_assoc; }
-#line 2593 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2599 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 54:
-#line 651 "src/parse-gram.y" /* yacc.c:1648  */
+#line 653 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.assoc) = precedence_assoc; }
-#line 2599 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2605 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 55:
-#line 655 "src/parse-gram.y" /* yacc.c:1648  */
+#line 657 "src/parse-gram.y" /* yacc.c:1648  */
     { current_type = NULL; }
-#line 2605 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2611 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 56:
-#line 656 "src/parse-gram.y" /* yacc.c:1648  */
+#line 658 "src/parse-gram.y" /* yacc.c:1648  */
     { current_type = (yyvsp[0].uniqstr); tag_seen = true; }
-#line 2611 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2617 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 57:
-#line 662 "src/parse-gram.y" /* yacc.c:1648  */
+#line 664 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.list) = symbol_list_sym_new ((yyvsp[0].symbol), (yylsp[0])); }
-#line 2617 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2623 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 58:
-#line 664 "src/parse-gram.y" /* yacc.c:1648  */
+#line 666 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.list) = symbol_list_append ((yyvsp[-1].list), symbol_list_sym_new ((yyvsp[0].symbol), (yylsp[0]))); }
-#line 2623 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2629 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 59:
-#line 669 "src/parse-gram.y" /* yacc.c:1648  */
+#line 671 "src/parse-gram.y" /* yacc.c:1648  */
     {
       (yyval.symbol) = (yyvsp[0].symbol);
       symbol_class_set ((yyvsp[0].symbol), token_sym, (yylsp[0]), false);
  insert_after(0, "</AST_SymbolRef>");
  insert_before(0, "<AST_SymbolRef>");
     }
-#line 2634 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2640 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 60:
-#line 676 "src/parse-gram.y" /* yacc.c:1648  */
+#line 678 "src/parse-gram.y" /* yacc.c:1648  */
     {
       (yyval.symbol) = (yyvsp[-1].symbol);
       symbol_user_token_number_set ((yyvsp[-1].symbol), (yyvsp[0].integer), (yylsp[0]));
@@ -2654,88 +2660,88 @@ yyreduce:
  sprintf(gram_piece_temp, "<AST_SymbolRef user_token=\"%d\">", (yyvsp[0].integer));
  insert_before(0, gram_piece_temp);
     }
-#line 2647 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2653 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 61:
-#line 689 "src/parse-gram.y" /* yacc.c:1648  */
+#line 691 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.list) = symbol_list_sym_new ((yyvsp[0].symbol), (yylsp[0])); /*}*/
  insert_after(0, "</AST_SymbolRef>");
  insert_before(0, "<AST_SymbolRef>");
  }
-#line 2656 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2662 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 62:
-#line 694 "src/parse-gram.y" /* yacc.c:1648  */
+#line 696 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.list) = symbol_list_append ((yyvsp[-1].list), symbol_list_sym_new ((yyvsp[0].symbol), (yylsp[0]))); /*}*/
  insert_after(1, "</AST_SymbolRef>");
  insert_before(1, "<AST_SymbolRef>");
  }
-#line 2665 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2671 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 63:
-#line 701 "src/parse-gram.y" /* yacc.c:1648  */
+#line 703 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.list) = (yyvsp[0].list); }
-#line 2671 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2677 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 64:
-#line 702 "src/parse-gram.y" /* yacc.c:1648  */
+#line 704 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.list) = symbol_list_append ((yyvsp[-1].list), (yyvsp[0].list)); }
-#line 2677 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2683 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 65:
-#line 706 "src/parse-gram.y" /* yacc.c:1648  */
+#line 708 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.list) = symbol_list_sym_new ((yyvsp[0].symbol), (yylsp[0])); /*}*/
  insert_after(0, "</AST_SymbolRef>");
  insert_before(0, "<AST_SymbolRef>");
  }
-#line 2686 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2692 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 66:
-#line 710 "src/parse-gram.y" /* yacc.c:1648  */
+#line 712 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.list) = symbol_list_type_new ((yyvsp[0].uniqstr), (yylsp[0])); }
-#line 2692 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2698 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 68:
-#line 715 "src/parse-gram.y" /* yacc.c:1648  */
+#line 717 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.uniqstr) = uniqstr_new ("*"); }
-#line 2698 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2704 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 69:
-#line 716 "src/parse-gram.y" /* yacc.c:1648  */
+#line 718 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.uniqstr) = uniqstr_new (""); }
-#line 2704 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2710 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 70:
-#line 722 "src/parse-gram.y" /* yacc.c:1648  */
+#line 724 "src/parse-gram.y" /* yacc.c:1648  */
     {
       current_type = (yyvsp[0].uniqstr);
       tag_seen = true;
     }
-#line 2713 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2719 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 71:
-#line 727 "src/parse-gram.y" /* yacc.c:1648  */
+#line 729 "src/parse-gram.y" /* yacc.c:1648  */
     {
       symbol_class_set ((yyvsp[0].symbol), current_class, (yylsp[0]), true);
       symbol_type_set ((yyvsp[0].symbol), current_type, (yylsp[0]));
  insert_after(0, "</AST_SymbolRef>");
  insert_before(0, "<AST_SymbolRef>");
     }
-#line 2724 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2730 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 72:
-#line 734 "src/parse-gram.y" /* yacc.c:1648  */
+#line 736 "src/parse-gram.y" /* yacc.c:1648  */
     {
       symbol_class_set ((yyvsp[-1].symbol), current_class, (yylsp[-1]), true);
       symbol_type_set ((yyvsp[-1].symbol), current_type, (yylsp[-1]));
@@ -2744,11 +2750,11 @@ yyreduce:
  sprintf(gram_piece_temp, "<AST_SymbolRef user_token=\"%d\">", (yyvsp[0].integer));
  insert_before(0, gram_piece_temp);
     }
-#line 2737 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2743 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 73:
-#line 743 "src/parse-gram.y" /* yacc.c:1648  */
+#line 745 "src/parse-gram.y" /* yacc.c:1648  */
     {
       symbol_class_set ((yyvsp[-1].symbol), current_class, (yylsp[-1]), true);
       symbol_type_set ((yyvsp[-1].symbol), current_type, (yylsp[-1]));
@@ -2756,11 +2762,11 @@ yyreduce:
  insert_after(1, "</AST_SymbolRef>");
  insert_before(0, "<AST_SymbolRef>");
     }
-#line 2749 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2755 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 74:
-#line 751 "src/parse-gram.y" /* yacc.c:1648  */
+#line 753 "src/parse-gram.y" /* yacc.c:1648  */
     {
       symbol_class_set ((yyvsp[-2].symbol), current_class, (yylsp[-2]), true);
       symbol_type_set ((yyvsp[-2].symbol), current_type, (yylsp[-2]));
@@ -2770,25 +2776,25 @@ yyreduce:
  sprintf(gram_piece_temp, "<AST_SymbolRef user_token=\"%d\">", (yyvsp[-1].integer));
  insert_before(0, gram_piece_temp);
     }
-#line 2763 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2769 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 81:
-#line 784 "src/parse-gram.y" /* yacc.c:1648  */
+#line 786 "src/parse-gram.y" /* yacc.c:1648  */
     {
       yyerrok;
     }
-#line 2771 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2777 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 82:
-#line 790 "src/parse-gram.y" /* yacc.c:1648  */
+#line 792 "src/parse-gram.y" /* yacc.c:1648  */
     { current_lhs ((yyvsp[-1].symbol), (yylsp[-1]), (yyvsp[0].named_ref)); }
-#line 2777 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2783 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 83:
-#line 791 "src/parse-gram.y" /* yacc.c:1648  */
+#line 793 "src/parse-gram.y" /* yacc.c:1648  */
     {
     /* Free the current lhs. */
     current_lhs (0, (yylsp[-3]), 0);
@@ -2798,30 +2804,35 @@ yyreduce:
  insert_before(0, "<AST_SymbolRef>");
  insert_before(0, "<AST_Section2_Rules>");
   }
-#line 2791 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2797 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 84:
-#line 803 "src/parse-gram.y" /* yacc.c:1648  */
+#line 805 "src/parse-gram.y" /* yacc.c:1648  */
     { grammar_current_rule_end ((yylsp[0])); /*}*/
  insert_after(0, "</AST_Production>");
  insert_before(0, "<AST_Production>");
  }
-#line 2800 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2806 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 85:
-#line 807 "src/parse-gram.y" /* yacc.c:1648  */
+#line 809 "src/parse-gram.y" /* yacc.c:1648  */
     { grammar_current_rule_end ((yylsp[0])); /*}*/
  insert_after(2, "</AST_Production>");
  insert_before(2, "<AST_Production>");
  }
-#line 2809 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2815 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 87:
-#line 817 "src/parse-gram.y" /* yacc.c:1648  */
-    { grammar_current_rule_begin (current_lhs_symbol, current_lhs_location,
+#line 819 "src/parse-gram.y" /* yacc.c:1648  */
+    {
+ /* Nick extra rules for element groups */
+ if (nested_rhs)
+  --nested_rhs;
+ else
+      grammar_current_rule_begin (current_lhs_symbol, current_lhs_location,
                                   current_lhs_named_ref); /*}*/
  /* in this case, want empty rule associated with stuff on the right of us */
  /* therefore, move inter-token text from the right of us over to the left */
@@ -2832,21 +2843,21 @@ yyreduce:
  gram_piece[gram_piece2] = gram_piece[gram_piece2 - 1]; /* empty */
  gram_piece[gram_piece2 - 1] = temp;
  }
-#line 2825 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2836 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 88:
-#line 829 "src/parse-gram.y" /* yacc.c:1648  */
+#line 836 "src/parse-gram.y" /* yacc.c:1648  */
     { grammar_current_rule_symbol_append ((yyvsp[-1].symbol), (yylsp[-1]), (yyvsp[0].named_ref)); /*}*/
  insert_after(2, "</AST_Production_SymbolRef>");
  insert_after(1, "</AST_SymbolRef>");
  insert_before(1, "<AST_Production_SymbolRef><AST_SymbolRef>");
  }
-#line 2835 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2846 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 89:
-#line 835 "src/parse-gram.y" /* yacc.c:1648  */
+#line 842 "src/parse-gram.y" /* yacc.c:1648  */
     { /* should be BracedCode, but too hard to put AST_Text inside braces */ code_piece_append("<AST_Text>"); grammar_current_rule_action_append ((yyvsp[-1].code), (yylsp[-1]), (yyvsp[0].named_ref), false); /*}*/
  code_piece_append("</AST_Text>");
  code_piece_pack();
@@ -2855,129 +2866,144 @@ yyreduce:
  insert_after(2, "</AST_Production_Action>");
  insert_before(1, "<AST_Production_Action>");
  }
-#line 2848 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2859 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 90:
-#line 844 "src/parse-gram.y" /* yacc.c:1648  */
+#line 851 "src/parse-gram.y" /* yacc.c:1648  */
     { grammar_current_rule_action_append ((yyvsp[0].code), (yylsp[0]), NULL, true); }
-#line 2854 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2865 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 91:
-#line 846 "src/parse-gram.y" /* yacc.c:1648  */
+#line 853 "src/parse-gram.y" /* yacc.c:1648  */
     { grammar_current_rule_empty_set ((yylsp[0])); /*}*/
  insert_after(1, "</AST_Production_Empty>");
  insert_before(1, "<AST_Production_Empty>");
  }
-#line 2863 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2874 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 92:
-#line 851 "src/parse-gram.y" /* yacc.c:1648  */
+#line 858 "src/parse-gram.y" /* yacc.c:1648  */
     { grammar_current_rule_prec_set ((yyvsp[0].symbol), (yylsp[0])); /*}*/
  insert_after(2, "</AST_Production_Prec>");
  insert_after(2, "</AST_SymbolRef>");
  insert_before(2, "<AST_SymbolRef>");
  insert_before(1, "<AST_Production_Prec>");
  }
-#line 2874 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2885 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 93:
-#line 858 "src/parse-gram.y" /* yacc.c:1648  */
+#line 865 "src/parse-gram.y" /* yacc.c:1648  */
     { grammar_current_rule_dprec_set ((yyvsp[0].integer), (yylsp[0])); /*}*/
  insert_after(2, "</AST_Production_DPrec>");
  sprintf(gram_piece_temp, "<AST_Production_DPrec value=\"%d\">", (yyvsp[0].integer));
  insert_before(1, gram_piece_temp);
  }
-#line 2884 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2895 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 94:
-#line 864 "src/parse-gram.y" /* yacc.c:1648  */
+#line 871 "src/parse-gram.y" /* yacc.c:1648  */
     { grammar_current_rule_merge_set ((yyvsp[0].uniqstr), (yylsp[0])); /*}*/
  insert_after(2, "</AST_Production_Merge>");
  insert_before(1, "<AST_Production_Merge>");
  }
-#line 2893 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2904 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 95:
-#line 871 "src/parse-gram.y" /* yacc.c:1648  */
-    { (yyval.named_ref) = 0; }
-#line 2899 "src/parse-gram.c" /* yacc.c:1648  */
+#line 876 "src/parse-gram.y" /* yacc.c:1648  */
+    { ++nested_rhs; }
+#line 2910 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 96:
-#line 872 "src/parse-gram.y" /* yacc.c:1648  */
-    { (yyval.named_ref) = named_ref_new ((yyvsp[0].uniqstr), (yylsp[0])); }
-#line 2905 "src/parse-gram.c" /* yacc.c:1648  */
+#line 876 "src/parse-gram.y" /* yacc.c:1648  */
+    {
+ insert_after(3, "</AST_Production_GroupElement>");
+ insert_before(1, "<AST_Production_GroupElement>");
+ }
+#line 2919 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
-  case 98:
+  case 97:
 #line 883 "src/parse-gram.y" /* yacc.c:1648  */
+    { (yyval.named_ref) = 0; }
+#line 2925 "src/parse-gram.c" /* yacc.c:1648  */
+    break;
+
+  case 98:
+#line 884 "src/parse-gram.y" /* yacc.c:1648  */
+    { (yyval.named_ref) = named_ref_new ((yyvsp[0].uniqstr), (yylsp[0])); }
+#line 2931 "src/parse-gram.c" /* yacc.c:1648  */
+    break;
+
+  case 100:
+#line 895 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.uniqstr) = uniqstr_new ((yyvsp[0].code)); }
-#line 2911 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2937 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
-  case 99:
-#line 908 "src/parse-gram.y" /* yacc.c:1648  */
+  case 101:
+#line 920 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.value).kind = muscle_keyword; (yyval.value).chars = ""; }
-#line 2917 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2943 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
-  case 100:
-#line 909 "src/parse-gram.y" /* yacc.c:1648  */
+  case 102:
+#line 921 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.value).kind = muscle_keyword; (yyval.value).chars = (yyvsp[0].uniqstr); }
-#line 2923 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2949 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
-  case 101:
-#line 910 "src/parse-gram.y" /* yacc.c:1648  */
+  case 103:
+#line 922 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.value).kind = muscle_string;  (yyval.value).chars = (yyvsp[0].code); }
-#line 2929 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2955 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
-  case 102:
-#line 911 "src/parse-gram.y" /* yacc.c:1648  */
+  case 104:
+#line 923 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.value).kind = muscle_code;    (yyval.value).chars = strip_braces ((yyvsp[0].code)); }
-#line 2935 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2961 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
-  case 103:
-#line 924 "src/parse-gram.y" /* yacc.c:1648  */
+  case 105:
+#line 936 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.symbol) = symbol_from_uniqstr ((yyvsp[0].uniqstr), (yylsp[0])); }
-#line 2941 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2967 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
-  case 104:
-#line 926 "src/parse-gram.y" /* yacc.c:1648  */
+  case 106:
+#line 938 "src/parse-gram.y" /* yacc.c:1648  */
     {
       (yyval.symbol) = symbol_get (char_name ((yyvsp[0].character)), (yylsp[0]));
       symbol_class_set ((yyval.symbol), token_sym, (yylsp[0]), false);
       symbol_user_token_number_set ((yyval.symbol), (yyvsp[0].character), (yylsp[0]));
     }
-#line 2951 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2977 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
-  case 105:
-#line 934 "src/parse-gram.y" /* yacc.c:1648  */
+  case 107:
+#line 946 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.symbol) = symbol_from_uniqstr ((yyvsp[0].uniqstr), (yylsp[0])); }
-#line 2957 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2983 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
-  case 108:
-#line 946 "src/parse-gram.y" /* yacc.c:1648  */
+  case 110:
+#line 958 "src/parse-gram.y" /* yacc.c:1648  */
     {
       (yyval.symbol) = symbol_get (quotearg_style (c_quoting_style, (yyvsp[0].code)), (yylsp[0]));
       symbol_class_set ((yyval.symbol), token_sym, (yylsp[0]), false);
     }
-#line 2966 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2992 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
-  case 110:
-#line 955 "src/parse-gram.y" /* yacc.c:1648  */
+  case 112:
+#line 967 "src/parse-gram.y" /* yacc.c:1648  */
     {
 #if 0
  int gram_piece0_save = gram_piece0, gram_piece1_save = gram_piece1;
@@ -2998,11 +3024,11 @@ yyreduce:
  insert_after(1, "</AST_Section3>");
  insert_after(0, "<AST_Section3>");
     }
-#line 2991 "src/parse-gram.c" /* yacc.c:1648  */
+#line 3017 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
 
-#line 2995 "src/parse-gram.c" /* yacc.c:1648  */
+#line 3021 "src/parse-gram.c" /* yacc.c:1648  */
         default: break;
       }
     if (yychar_backup != yychar)
@@ -3265,7 +3291,7 @@ yyreturn:
 #endif
   return yyresult;
 }
-#line 977 "src/parse-gram.y" /* yacc.c:1907  */
+#line 989 "src/parse-gram.y" /* yacc.c:1907  */
 
 
 /* Return the location of the left-hand side of a rule whose
index 537cbe7..3677998 100644 (file)
@@ -52,7 +52,7 @@ extern int gram_debug;
 
   #include "symlist.h"
   #include "symtab.h"
-#line 246 "src/parse-gram.y" /* yacc.c:1910  */
+#line 248 "src/parse-gram.y" /* yacc.c:1910  */
 
   typedef enum
   {
@@ -61,7 +61,7 @@ extern int gram_debug;
     param_parse  = 1 << 1,
     param_both   = param_lex | param_parse
   } param_type;
-#line 887 "src/parse-gram.y" /* yacc.c:1910  */
+#line 899 "src/parse-gram.y" /* yacc.c:1910  */
 #include "muscle-tab.h"
 
 #line 68 "src/parse-gram.h" /* yacc.c:1910  */
@@ -135,27 +135,27 @@ extern int gram_debug;
 
 union GRAM_STYPE
 {
-#line 207 "src/parse-gram.y" /* yacc.c:1910  */
+#line 209 "src/parse-gram.y" /* yacc.c:1910  */
 unsigned char character;
-#line 211 "src/parse-gram.y" /* yacc.c:1910  */
+#line 213 "src/parse-gram.y" /* yacc.c:1910  */
 char *code;
-#line 216 "src/parse-gram.y" /* yacc.c:1910  */
+#line 218 "src/parse-gram.y" /* yacc.c:1910  */
 uniqstr uniqstr;
-#line 224 "src/parse-gram.y" /* yacc.c:1910  */
+#line 226 "src/parse-gram.y" /* yacc.c:1910  */
 int integer;
-#line 228 "src/parse-gram.y" /* yacc.c:1910  */
+#line 230 "src/parse-gram.y" /* yacc.c:1910  */
 symbol *symbol;
-#line 233 "src/parse-gram.y" /* yacc.c:1910  */
+#line 235 "src/parse-gram.y" /* yacc.c:1910  */
 assoc assoc;
-#line 236 "src/parse-gram.y" /* yacc.c:1910  */
+#line 238 "src/parse-gram.y" /* yacc.c:1910  */
 symbol_list *list;
-#line 239 "src/parse-gram.y" /* yacc.c:1910  */
+#line 241 "src/parse-gram.y" /* yacc.c:1910  */
 named_ref *named_ref;
-#line 266 "src/parse-gram.y" /* yacc.c:1910  */
+#line 268 "src/parse-gram.y" /* yacc.c:1910  */
 param_type param;
-#line 563 "src/parse-gram.y" /* yacc.c:1910  */
+#line 565 "src/parse-gram.y" /* yacc.c:1910  */
 code_props_type code_type;
-#line 889 "src/parse-gram.y" /* yacc.c:1910  */
+#line 901 "src/parse-gram.y" /* yacc.c:1910  */
 
   struct
   {
index 5933b5f..c9cb7c1 100644 (file)
     ++gram_piece3; \
    } while (0)
 
+  /* Nick extra rules for element groups */
+  int nested_rhs = 0;
 }
 
 %define api.prefix {gram_}
@@ -814,7 +816,12 @@ rhses.1:
 %token PERCENT_EMPTY "%empty";
 rhs:
   %empty
-    { grammar_current_rule_begin (current_lhs_symbol, current_lhs_location,
+    {
+ /* Nick extra rules for element groups */
+ if (nested_rhs)
+  --nested_rhs;
+ else
+      grammar_current_rule_begin (current_lhs_symbol, current_lhs_location,
                                   current_lhs_named_ref); /*}*/
  /* in this case, want empty rule associated with stuff on the right of us */
  /* therefore, move inter-token text from the right of us over to the left */
@@ -865,6 +872,11 @@ rhs:
  insert_after(2, "</AST_Production_Merge>");
  insert_before(1, "<AST_Production_Merge>");
  }
+/* Nick extra rules for element groups */
+| rhs '(' { ++nested_rhs; } rhs ')' {
+ insert_after(3, "</AST_Production_GroupElement>");
+ insert_before(1, "<AST_Production_GroupElement>");
+ }
 ;
 
 named_ref.opt:
index b15cb1d..c66f7e5 100644 (file)
@@ -482,8 +482,8 @@ static void yy_fatal_error (yyconst char msg[]  );
        (yy_c_buf_p) = yy_cp;
 
 /* %% [4.0] data tables for the DFA and the user's section 1 definitions go here */
-#define YY_NUM_RULES 130
-#define YY_END_OF_BUFFER 131
+#define YY_NUM_RULES 133
+#define YY_END_OF_BUFFER 134
 /* This struct is not used in this scanner,
    but its presence is necessary. */
 struct yy_trans_info
@@ -491,71 +491,72 @@ struct yy_trans_info
        flex_int32_t yy_verify;
        flex_int32_t yy_nxt;
        };
-static yyconst flex_int16_t yy_accept[579] =
+static yyconst flex_int16_t yy_accept[587] =
     {   0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,   93,   93,  113,  113,  113,  113,    0,    0,
-        0,    0,  131,   80,    2,    2,   71,   80,   70,   80,
-        1,   66,   80,   67,   67,   65,   77,   63,   66,   79,
-       73,   64,   80,   90,   90,  128,   95,   94,  128,   81,
-       97,   96,   84,    2,    1,   84,   83,   82,   84,   99,
-       99,  100,   98,   81,  129,  119,  128,  118,  128,  128,
-      128,  122,  125,  126,  128,   92,  128,  117,  116,  128,
-      115,  114,   87,    2,    1,   85,   87,   87,   86,   87,
-
-       88,    2,    1,   88,   88,   80,   78,   62,    0,   62,
-       62,   62,   62,   62,   62,   62,   62,   62,   62,   62,
-       62,   62,   62,   62,   62,   62,   62,   72,   66,   66,
-        4,    3,   69,   67,   69,    0,   76,    0,   89,  112,
-      110,  101,  112,  103,  104,  105,  106,  107,  108,  112,
-      109,  112,   99,   99,  100,  127,  120,  121,    0,  123,
-        0,  122,  124,    0,   91,    0,    0,   93,  113,  113,
-      113,  113,   87,   85,   62,    0,   74,   62,   62,   62,
+        0,    0,   95,   95,  115,  115,  115,  115,    0,    0,
+        0,    0,    0,    0,  134,   82,    2,    2,   71,   82,
+       70,   82,   76,   82,    1,   66,   82,   67,   67,   65,
+       79,   63,   66,   81,   73,   64,   82,   92,   92,  131,
+       97,   96,  131,   83,   99,   98,   86,    2,    1,   86,
+       85,   84,   86,  101,  101,  102,  100,   83,  132,  121,
+      131,  120,  131,  131,  131,  124,  127,  128,  131,   94,
+      131,  119,  118,  131,  117,  116,   89,    2,    1,   87,
+
+       89,   89,   88,   89,   90,    2,    1,   90,   90,  129,
+       82,   80,   62,    0,   62,   62,   62,   62,   62,   62,
        62,   62,   62,   62,   62,   62,   62,   62,   62,   62,
+       62,   62,   72,   82,   66,   66,    4,    3,   69,   67,
+       69,    0,   78,    0,   91,  114,  112,  103,  114,  105,
+      106,  107,  108,  109,  110,  114,  111,  114,  101,  101,
+      102,  130,  122,  123,    0,  125,    0,  124,  126,    0,
+       93,    0,    0,   95,  115,  115,  115,  115,   89,   87,
+       62,    0,   74,   62,   62,   62,   62,   62,   62,   62,
        62,   62,   62,   62,   62,   62,   62,   62,   62,   62,
 
-       62,   62,   62,   62,   62,   62,   62,   62,    3,   69,
-       68,   75,    0,  101,    0,    0,  102,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        62,   62,   62,   62,   62,   62,   62,   62,   62,   62,
+       62,   62,   62,   62,    0,    3,   69,   68,   77,    0,
+      103,    0,    0,  104,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,   62,   62,   62,
        62,   62,   62,   62,   62,   62,   62,   62,   62,   62,
        62,   62,   62,   62,   62,   62,   62,   62,   62,   62,
-       62,   62,   62,   62,   62,   62,   62,   62,    0,  101,
-        0,    0,   62,    7,   62,   62,   62,   62,   62,   62,
-       62,   62,   62,   62,   62,   62,   62,   23,   62,   62,
        62,   62,   62,   62,   62,   62,   62,   62,   62,   62,
+       62,   62,   62,   62,   62,   75,    0,  103,    0,    0,
+       62,    7,   62,   62,   62,   62,   62,   62,   62,   62,
+       62,   62,   62,   62,   62,   23,   62,   62,   62,   62,
 
-       62,   62,   36,   62,   62,   62,   62,   62,   62,   44,
-       62,   47,   62,   62,   50,    0,    0,    0,   62,    8,
-       62,   62,   62,   13,   14,   62,   62,   62,   62,   62,
-       62,   62,   62,   62,   26,   62,   62,   62,   62,   62,
-       62,   62,   62,   32,   62,   34,   62,   62,   62,   62,
-       62,   62,   41,   62,   43,   45,   48,   62,    0,    0,
-      111,    6,   62,   10,   62,   62,   62,   16,   62,   62,
        62,   62,   62,   62,   62,   62,   62,   62,   62,   62,
-       62,   62,   62,   62,   33,   62,   62,   62,   62,   62,
-       62,   62,   62,   62,   62,    0,   62,   11,   62,   62,
+       36,   62,   62,   62,   62,   62,   62,   44,   62,   47,
+       62,   62,   50,    0,    0,    0,   62,    8,   62,   62,
+       62,   13,   14,   62,   62,   62,   62,   62,   62,   62,
+       62,   62,   26,   62,   62,   62,   62,   62,   62,   62,
+       62,   32,   62,   34,   62,   62,   62,   62,   62,   62,
+       41,   62,   43,   45,   48,   62,    0,    0,  113,    6,
+       62,   10,   62,   62,   62,   16,   62,   62,   62,   62,
+       62,   62,   62,   62,   62,   62,   62,   62,   62,   62,
+       62,   62,   33,   62,   62,   62,   62,   62,   62,   62,
 
+       62,   62,   62,    0,   62,   11,   62,   62,   62,   62,
        62,   62,   62,   62,   62,   62,   62,   62,   62,   62,
-       62,   62,   62,   62,   62,   62,   62,   62,   62,    0,
-       59,   62,   62,   38,   62,   62,   40,   62,   62,   62,
-       49,    5,    0,   62,   62,   62,   62,   62,   62,   62,
-       62,   62,   62,   62,   62,   22,   62,   62,   62,   62,
-       62,   29,   62,   58,   30,   62,   62,   62,   62,   62,
-       42,   62,   62,    0,   62,   62,   62,   62,   62,   17,
-       53,   62,   62,   62,   62,   62,   24,   25,   62,   62,
-       62,   62,   62,   62,   62,   62,   62,   62,   62,    0,
-        0,   62,   62,   12,   62,   62,   62,   62,   62,   21,
-
-       62,   62,   62,   62,   62,   62,   62,   37,   62,   62,
-       62,   62,   62,   62,   62,   62,   18,   62,   62,   62,
-       27,   56,   62,   62,   62,   35,   39,   60,   46,   61,
-        9,   51,   62,   62,    0,   54,   62,   62,   62,    0,
-       56,   62,   62,   62,   15,   52,   62,   62,   62,   62,
-       62,   62,   62,   62,   20,   62,   62,   62,   62,   62,
-       28,   57,   62,   62,   62,   62,   62,   62,   62,   19,
-       55,   62,   62,   62,   62,   62,   31,    0
+       62,   62,   62,   62,   62,   62,   62,    0,   59,   62,
+       62,   38,   62,   62,   40,   62,   62,   62,   49,    5,
+        0,   62,   62,   62,   62,   62,   62,   62,   62,   62,
+       62,   62,   62,   22,   62,   62,   62,   62,   62,   29,
+       62,   58,   30,   62,   62,   62,   62,   62,   42,   62,
+       62,    0,   62,   62,   62,   62,   62,   17,   53,   62,
+       62,   62,   62,   62,   24,   25,   62,   62,   62,   62,
+       62,   62,   62,   62,   62,   62,   62,    0,    0,   62,
+
+       62,   12,   62,   62,   62,   62,   62,   21,   62,   62,
+       62,   62,   62,   62,   62,   37,   62,   62,   62,   62,
+       62,   62,   62,   62,   18,   62,   62,   62,   27,   56,
+       62,   62,   62,   35,   39,   60,   46,   61,    9,   51,
+       62,   62,    0,   54,   62,   62,   62,    0,   56,   62,
+       62,   62,   15,   52,   62,   62,   62,   62,   62,   62,
+       62,   62,   20,   62,   62,   62,   62,   62,   28,   57,
+       62,   62,   62,   62,   62,   62,   62,   19,   55,   62,
+       62,   62,   62,   62,   31,    0
     } ;
 
 static yyconst flex_int32_t yy_ec[256] =
@@ -563,17 +564,17 @@ static yyconst flex_int32_t yy_ec[256] =
         1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
         2,    2,    4,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    5,    1,    6,    7,    1,    8,    1,    9,    1,
-        1,   10,    1,   11,   12,   13,   14,   15,   16,   16,
-       16,   16,   16,   16,   16,   17,   17,   18,   19,   20,
-       21,   22,   23,    1,   24,   24,   24,   24,   24,   24,
-       25,   25,   25,   25,   25,   25,   25,   25,   25,   25,
-       25,   25,   25,   25,   26,   25,   25,   27,   25,   25,
-       28,   29,   30,    1,   31,    1,   32,   33,   34,   35,
-
-       36,   37,   38,   39,   40,   25,   41,   42,   43,   44,
-       45,   46,   47,   48,   49,   50,   51,   52,   25,   53,
-       54,   25,   55,   56,   57,    1,    1,    1,    1,    1,
+        1,    5,    1,    6,    7,    1,    8,    1,    9,   10,
+       11,   12,    1,   13,   14,   15,   16,   17,   18,   18,
+       18,   18,   18,   18,   18,   19,   19,   20,   21,   22,
+       23,   24,   25,    1,   26,   26,   26,   26,   27,   26,
+       28,   28,   28,   28,   28,   28,   28,   28,   28,   28,
+       28,   28,   28,   28,   29,   28,   28,   30,   28,   28,
+       31,   32,   33,    1,   34,    1,   35,   36,   37,   38,
+
+       39,   40,   41,   42,   43,   28,   44,   45,   46,   47,
+       48,   49,   50,   51,   52,   53,   54,   55,   28,   56,
+       57,   28,   58,   59,   60,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -590,398 +591,411 @@ static yyconst flex_int32_t yy_ec[256] =
         1,    1,    1,    1,    1
     } ;
 
-static yyconst flex_int32_t yy_meta[59] =
+static yyconst flex_int32_t yy_meta[62] =
     {   0,
-        1,    2,    3,    1,    2,    4,    1,    4,    4,    4,
-        4,    5,    6,    2,    7,    7,    7,    1,    4,    8,
-        4,    8,    1,    7,    9,    9,    9,   10,    1,   11,
-        9,    7,    7,    7,    7,    7,    7,    9,    9,    9,
+        1,    2,    3,    1,    2,    4,    1,    4,    4,    1,
+        1,    4,    4,    5,    6,    2,    7,    7,    7,    1,
+        4,    8,    4,    8,    1,    7,    7,    9,    9,    9,
+       10,    1,   11,    9,    7,    7,    7,    7,    7,    7,
         9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
-        9,    9,    9,    9,    4,    4,    4,    1
+        9,    9,    9,    9,    9,    9,    9,    4,    4,    4,
+        1
     } ;
 
-static yyconst flex_int16_t yy_base[605] =
+static yyconst flex_int16_t yy_base[613] =
     {   0,
-        0, 1001,  997,  996,   56,   57,   58,   61,   63,   90,
-       76,   87,   70,   97,  117,  121,   66,  130,  140,  144,
-       79,  107,   99,  109,  153,  159,  148,  152,  201,  998,
-      182,  258, 1004,    0, 1009, 1009, 1009,  265, 1009, 1009,
-     1009,  320,  153,  313,  153, 1009,   61, 1009,  330, 1009,
-     1009, 1009,  961, 1009,  988, 1009, 1009, 1009,  383, 1009,
-     1009, 1009, 1009, 1009, 1009,  161, 1009, 1009,  959,  988,
-      110,  979, 1009,  986, 1009, 1009,  940, 1009,  169,  144,
-      254, 1009, 1009, 1009,  250, 1009,  187, 1009, 1009,  265,
-     1009, 1009,    0, 1009,    0,    0,  261, 1009, 1009,  954,
-
-     1009, 1009, 1009,  266,  953,    0, 1009,    0,  320,  954,
-      948,  241,  293,  952,  949,  946,  250,  953,  294,  937,
-      303,  245,  150,  311,  943,  950,  953, 1009,  436,    0,
-     1009,    0,    0,  346,  480,  962, 1009,  943, 1009, 1009,
-     1009,  342,    0, 1009, 1009, 1009, 1009, 1009, 1009,    0,
-     1009,    0,  970,  330,  961, 1009, 1009, 1009,  365, 1009,
-      369, 1009, 1009,  374, 1009,  378,  382,  951, 1009,  388,
-      950,  392,    0,    0,    0,  398, 1009,  934,  942,  374,
-      928,  929,  926,  927,  360,  924,  931,  926,  368,  935,
-      920,  924,  398,  930,  915,  916,  333,  915,  915,  923,
-
-      924,  927,  910,  916,  910,  915,  906,  919,    0,    0,
-        0, 1009,  908,  402,    0,    0,    0,  423,  431,  453,
-      410,  459,  443,  465,  390,  471,  475,  479,  483,  379,
-      919,  914,  898,   81,  898,  911,  896,  900,  908,  907,
-      906,  929,  890,  901,  888,  925,  904,  897,  898,  415,
-      448,  412,  885,  886,  420,  897,  886,  893,  877,  888,
-      884,  877,  881,  887,  886,  876,  887,  885,  882, 1009,
-        0,    0,  869,    0,  878,  864,  870,  865,  878,  857,
-      862,  875,  896,  872,  860,  865,  853,    0,  857,  852,
-      865,  333,  864,  859,  862,  857,  847,  859,  851,  842,
-
-      849,  855,  854,  839,  467,  848,  837,  850,  835,    0,
-      840,    0,  839,  837,    0,  876,    0,    0,  826,    0,
-      837,  842,  826,    0,    0,  475,  826,  829,  477,  842,
-      841,  840,  839,  830,    0,  823,  822,  830,  822,  828,
-      820,  814,  812,    0,  811,    0,  848,  824,  822,  811,
-      810,  807,    0,  804,    0,  479,    0,  804,  484,    0,
-     1009,    0,  802,  802,  816,  797,  796,  480,  799,  801,
-      800,  796,  801,  804,  793,  795,  791,  790,  805,  800,
-      803,  798,  788,  796,  516,  785,  794,  781,  796,  795,
-      790,  780,  774,  773,  786,  519,  495,    0,  771,  784,
-
-      783,  770,  769,  780,  764,  763,  764,  800,  775,  778,
-      765,  772,  771,  755,  756,  753,  754,  768,  753,  525,
-     1009,  768,  755,    0,  750,  749,    0,  752,  763,  762,
-        0, 1009,  787,  746,  745,  745,  741,  740,  739,  738,
-      748,  734,  733,  746,  749,    0,  737,  730,  741,  740,
-      734,    0,  733,    0,    0,  731,  725,  738,  722,  721,
-        0,  736,  735,  761,  718,  717,  716,  730,  729,    0,
-        0,  721,  714,  713,  710,  723,    0,    0,  716,  715,
-      704,  703,  712,  719,  714,  705,  701,  683,  679,  710,
-      499,  675,  673,    0,  663,  660,  651,  639,  619,    0,
-
-      616,  611,  607,  511,  513,  615,  615,    0,  607,  606,
-      617,  616,  615,  614,  598,  540,  536,  538,  537,  546,
-      545,  549,  539,  538,  543,    0,    0,    0,    0,    0,
-        0,    0,  546,  545,  556, 1009,  531,  533,  535,  569,
-     1009,  531,  530,  527,    0,    0,  538,  532,  524,  531,
-      529,  513,  516,  515,    0,  499,  498,  491,  467,  461,
-        0,    0,  459,  439,  435,  434,  389,  381,  378,    0,
-        0,  390,  366,  347,  350,  307,    0, 1009,  590,  601,
-      612,  623,  634,  645,  656,  662,  671,  682,  693,  702,
-      708,  713,  722,  729,  286,  277,  259,  187,  179,  173,
-
-      135,  133,   87,  738
+        0, 1034, 1028, 1027,   59,   60,   61,   64,   66,   82,
+       66,   85,  102,  120,  129,  141,  149,  150,  161,  170,
+       69,   71,   72,   74,  109,  111,  130,  139,  230, 1031,
+      191,  195,  289,  293, 1037,    0, 1042, 1042, 1042,  346,
+     1042, 1011,    0, 1042, 1042,  404,  118,  289,  163, 1042,
+      107, 1042,  465, 1042, 1042, 1042,  990, 1042, 1018, 1042,
+     1042, 1042,  521, 1042, 1042, 1042, 1042, 1042, 1042,  156,
+     1042, 1042,  988, 1018,  160, 1009, 1042, 1016, 1042, 1042,
+      969, 1042,  193,   92,  153, 1042, 1042, 1042,   62, 1042,
+       98, 1042, 1042,  311, 1042, 1042,    0, 1042,    0,    0,
+
+      179, 1042, 1042,  983, 1042, 1042, 1042,  194,  982, 1042,
+        0, 1042,    0,  319,  983,  977,  164,  166,  981,  978,
+      975,  179,  982,  275,  966,  282,  177,  171,  255,  972,
+      979,  982, 1042,  989,  577,    0, 1042,    0,    0,  308,
+      622,  991, 1042,  971, 1042, 1042, 1042,  312,    0, 1042,
+     1042, 1042, 1042, 1042, 1042,    0, 1042,    0,  999,  317,
+      990, 1042, 1042, 1042,  332, 1042,  337, 1042, 1042,  353,
+     1042,  357,  361,  979, 1042,  365,  978,  404,    0,    0,
+        0,  420, 1042,  962,  970,  376,  956,  957,  954,  955,
+      248,  952,  959,  954,  292,  963,  948,  952,  396,  958,
+
+      943,  944,  307,  943,  943,  951,  952,  955,  938,  944,
+      938,  943,  934,  947,  925,    0,    0,    0, 1042,  935,
+      361,    0,    0,    0,  429,  401,  436,  320,  442,  418,
+      446,  426,  450,  454,  458,  465,  432,  946,  941,  925,
+      322,  925,  938,  923,  927,  935,  934,  933,  957,  917,
+      928,  915,  953,  931,  924,  925,  382,  435,  188,  912,
+      913,  419,  924,  913,  920,  904,  915,  911,  904,  908,
+      914,  913,  903,  914,  912, 1042,  909, 1042,    0,    0,
+      896,    0,  905,  891,  897,  892,  905,  884,  889,  902,
+      924,  899,  887,  892,  880,    0,  884,  879,  892,  126,
+
+      891,  886,  889,  884,  874,  886,  878,  869,  876,  882,
+      881,  866,  286,  875,  864,  877,  862,    0,  867,    0,
+      866,  864,    0,  906,    0,    0,  853,    0,  864,  869,
+      853,    0,    0,  304,  853,  856,  448,  869,  868,  867,
+      866,  857,    0,  850,  849,  857,  849,  855,  847,  841,
+      839,    0,  838,    0,  876,  851,  849,  838,  837,  834,
+        0,  831,    0,  460,    0,  831,  469,    0, 1042,    0,
+      829,  829,  843,  824,  823,  465,  826,  828,  827,  823,
+      828,  831,  820,  822,  818,  817,  832,  827,  830,  825,
+      815,  823,  498,  812,  821,  808,  823,  822,  817,  807,
+
+      801,  800,  813,  488,  470,    0,  798,  811,  810,  797,
+      796,  807,  791,  790,  791,  828,  802,  805,  792,  799,
+      798,  782,  783,  780,  781,  795,  780,  506, 1042,  795,
+      782,    0,  777,  776,    0,  779,  790,  789,    0, 1042,
+      817,  773,  764,  761,  746,  742,  737,  732,  741,  727,
+      724,  737,  727,    0,  696,  686,  696,  692,  686,    0,
+      685,    0,    0,  681,  675,  688,  672,  669,    0,  684,
+      683,  650,  604,  603,  602,  616,  615,    0,    0,  607,
+      598,  597,  594,  607,    0,    0,  600,  599,  584,  583,
+      592,  599,  594,  593,  592,  585,  584,  622,  486,  588,
+
+      587,    0,  577,  576,  567,  568,  567,    0,  567,  562,
+      561,  481,  482,  569,  569,    0,  562,  561,  572,  569,
+      570,  569,  553,  552,  520,  550,  537,  546,  529,  560,
+      537,  536,  539,    0,    0,    0,    0,    0,    0,    0,
+      541,  540,  591, 1042,  503,  506,  525,  596, 1042,  520,
+      519,  517,    0,    0,  527,  526,  513,  520,  519,  502,
+      511,  508,    0,  512,  511,  504,  500,  499,    0,    0,
+      505,  502,  497,  521,  476,  467,  469,    0,    0,  479,
+      462,  460,  444,  430,    0, 1042,  662,  673,  684,  695,
+      706,  717,  728,  734,  743,  754,  765,  774,  780,  785,
+
+      794,  801,  470,  439,  414,  362,  222,  183,  181,  147,
+       69,  810
     } ;
 
-static yyconst flex_int16_t yy_def[605] =
+static yyconst flex_int16_t yy_def[613] =
     {   0,
-      578,    1,  579,  579,  580,  580,  580,  580,  581,  581,
-      582,  582,  580,  580,  580,  580,  580,  580,  580,  580,
-      580,  580,  580,  580,  580,  580,  580,  580,  578,   29,
-      583,  583,  578,  584,  578,  578,  578,  578,  578,  578,
-      578,  585,  578,  586,  586,  578,  578,  578,  585,  578,
-      578,  578,  584,  578,  578,  578,  578,  578,  587,  578,
-      578,  578,  578,  578,  578,  578,  578,  578,  578,  588,
-      588,  578,  578,  588,  578,  578,  578,  578,  578,  578,
-      578,  578,  578,  578,  578,  578,  578,  578,  578,  589,
-      578,  578,  590,  578,  590,  591,  578,  578,  578,  590,
-
-      578,  578,  578,  578,  578,  584,  578,  592,  578,  592,
-      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
-      592,  592,  592,  592,  592,  592,  592,  578,  585,   49,
-      578,  593,  594,  586,  594,  578,  578,  578,  578,  578,
-      578,  578,  595,  578,  578,  578,  578,  578,  578,  596,
-      578,  597,  588,  588,  578,  578,  578,  578,  578,  578,
-      578,  578,  578,  578,  578,  578,  578,  578,  578,  578,
-      578,  578,  590,  591,  592,  578,  578,  592,  592,  592,
-      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
-      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
-
-      592,  592,  592,  592,  592,  592,  592,  592,  593,  594,
-      135,  578,  578,  578,  598,  599,  597,  578,  578,  578,
-      578,  578,  578,  578,  578,  578,  578,  578,  578,  589,
-      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
-      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
-      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
-      592,  592,  592,  592,  592,  592,  592,  592,  578,  578,
-      600,  601,  592,  592,  592,  592,  592,  592,  592,  592,
-      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
-      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
-
-      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
-      592,  592,  592,  592,  592,  578,  602,  603,  592,  592,
-      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
-      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
-      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
-      592,  592,  592,  592,  592,  592,  592,  592,  578,  596,
-      578,  592,  592,  592,  592,  592,  592,  592,  592,  592,
-      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
-      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
-      592,  592,  592,  592,  592,  578,  592,  592,  592,  592,
-
-      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
-      592,  592,  592,  592,  592,  592,  592,  592,  592,  578,
-      578,  592,  592,  592,  592,  592,  592,  592,  592,  592,
-      592,  578,  578,  592,  592,  592,  592,  592,  592,  592,
-      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
-      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
-      592,  592,  592,  604,  592,  592,  592,  592,  592,  592,
-      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
-      592,  592,  592,  592,  592,  592,  592,  592,  592,  604,
-      604,  592,  592,  592,  592,  592,  592,  592,  592,  592,
-
-      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
-      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
-      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
-      592,  592,  592,  592,  578,  578,  592,  592,  592,  578,
-      578,  592,  592,  592,  592,  592,  592,  592,  592,  592,
-      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
-      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
-      592,  592,  592,  592,  592,  592,  592,    0,  578,  578,
-      578,  578,  578,  578,  578,  578,  578,  578,  578,  578,
-      578,  578,  578,  578,  578,  578,  578,  578,  578,  578,
-
-      578,  578,  578,  578
+      586,    1,  587,  587,  588,  588,  588,  588,  589,  589,
+      590,  590,  588,  588,  588,  588,  588,  588,  588,  588,
+      588,  588,  588,  588,  588,  588,  588,  588,  586,   29,
+      591,  591,  588,  588,  586,  592,  586,  586,  586,  586,
+      586,  592,  592,  586,  586,  593,  586,  594,  594,  586,
+      586,  586,  593,  586,  586,  586,  592,  586,  586,  586,
+      586,  586,  595,  586,  586,  586,  586,  586,  586,  586,
+      586,  586,  586,  596,  596,  586,  586,  596,  586,  586,
+      586,  586,  586,  586,  586,  586,  586,  586,  586,  586,
+      586,  586,  586,  597,  586,  586,  598,  586,  598,  599,
+
+      586,  586,  586,  598,  586,  586,  586,  586,  586,  586,
+      592,  586,  600,  586,  600,  600,  600,  600,  600,  600,
+      600,  600,  600,  600,  600,  600,  600,  600,  600,  600,
+      600,  600,  586,  592,  593,   53,  586,  601,  602,  594,
+      602,  586,  586,  586,  586,  586,  586,  586,  603,  586,
+      586,  586,  586,  586,  586,  604,  586,  605,  596,  596,
+      586,  586,  586,  586,  586,  586,  586,  586,  586,  586,
+      586,  586,  586,  586,  586,  586,  586,  586,  598,  599,
+      600,  586,  586,  600,  600,  600,  600,  600,  600,  600,
+      600,  600,  600,  600,  600,  600,  600,  600,  600,  600,
+
+      600,  600,  600,  600,  600,  600,  600,  600,  600,  600,
+      600,  600,  600,  600,  586,  601,  602,  141,  586,  586,
+      586,  606,  607,  605,  586,  586,  586,  586,  586,  586,
+      586,  586,  586,  586,  586,  586,  597,  600,  600,  600,
+      600,  600,  600,  600,  600,  600,  600,  600,  600,  600,
+      600,  600,  600,  600,  600,  600,  600,  600,  600,  600,
+      600,  600,  600,  600,  600,  600,  600,  600,  600,  600,
+      600,  600,  600,  600,  600,  586,  586,  586,  608,  609,
+      600,  600,  600,  600,  600,  600,  600,  600,  600,  600,
+      600,  600,  600,  600,  600,  600,  600,  600,  600,  600,
+
+      600,  600,  600,  600,  600,  600,  600,  600,  600,  600,
+      600,  600,  600,  600,  600,  600,  600,  600,  600,  600,
+      600,  600,  600,  586,  610,  611,  600,  600,  600,  600,
+      600,  600,  600,  600,  600,  600,  600,  600,  600,  600,
+      600,  600,  600,  600,  600,  600,  600,  600,  600,  600,
+      600,  600,  600,  600,  600,  600,  600,  600,  600,  600,
+      600,  600,  600,  600,  600,  600,  586,  604,  586,  600,
+      600,  600,  600,  600,  600,  600,  600,  600,  600,  600,
+      600,  600,  600,  600,  600,  600,  600,  600,  600,  600,
+      600,  600,  600,  600,  600,  600,  600,  600,  600,  600,
+
+      600,  600,  600,  586,  600,  600,  600,  600,  600,  600,
+      600,  600,  600,  600,  600,  600,  600,  600,  600,  600,
+      600,  600,  600,  600,  600,  600,  600,  586,  586,  600,
+      600,  600,  600,  600,  600,  600,  600,  600,  600,  586,
+      586,  600,  600,  600,  600,  600,  600,  600,  600,  600,
+      600,  600,  600,  600,  600,  600,  600,  600,  600,  600,
+      600,  600,  600,  600,  600,  600,  600,  600,  600,  600,
+      600,  612,  600,  600,  600,  600,  600,  600,  600,  600,
+      600,  600,  600,  600,  600,  600,  600,  600,  600,  600,
+      600,  600,  600,  600,  600,  600,  600,  612,  612,  600,
+
+      600,  600,  600,  600,  600,  600,  600,  600,  600,  600,
+      600,  600,  600,  600,  600,  600,  600,  600,  600,  600,
+      600,  600,  600,  600,  600,  600,  600,  600,  600,  600,
+      600,  600,  600,  600,  600,  600,  600,  600,  600,  600,
+      600,  600,  586,  586,  600,  600,  600,  586,  586,  600,
+      600,  600,  600,  600,  600,  600,  600,  600,  600,  600,
+      600,  600,  600,  600,  600,  600,  600,  600,  600,  600,
+      600,  600,  600,  600,  600,  600,  600,  600,  600,  600,
+      600,  600,  600,  600,  600,    0,  586,  586,  586,  586,
+      586,  586,  586,  586,  586,  586,  586,  586,  586,  586,
+
+      586,  586,  586,  586,  586,  586,  586,  586,  586,  586,
+      586,  586
     } ;
 
-static yyconst flex_int16_t yy_nxt[1068] =
+static yyconst flex_int16_t yy_nxt[1104] =
     {   0,
-       34,   35,   36,   34,   35,   37,   34,   38,   39,   40,
-       41,   34,   42,   43,   44,   45,   45,   34,   46,   47,
-       48,   40,   34,   49,   49,   49,   49,   50,   34,   34,
-       49,   49,   49,   49,   49,   49,   49,   49,   49,   49,
-       49,   49,   49,   49,   49,   49,   49,   49,   49,   49,
-       49,   49,   49,   49,   51,   52,   40,   34,   57,   57,
-       61,   58,   58,   61,   64,   36,   62,   64,   75,   62,
-      136,   76,   75,   65,   78,   76,   66,   77,   78,   79,
-       67,   75,  137,   79,   59,   59,   59,   71,   85,   59,
-       68,   64,   36,  361,   64,   72,   69,   73,   71,   75,
-
-       65,   86,   76,   66,   77,   78,   72,   67,   73,   75,
-       79,   86,  276,   60,   60,   60,   85,   68,   60,   75,
-      277,  154,   76,   75,   80,   78,   76,   87,   80,   78,
-       79,  153,   75,   74,   79,   76,   81,   87,   78,  360,
-       81,  318,   75,   79,   74,   76,   75,   80,   78,   76,
-       91,   80,   78,   79,   91,   88,   92,   79,   89,   81,
-       92,   88,  131,   81,   89,  160,  132,  134,  134,  134,
-      131,   82,  161,   83,  132,   82,   90,   83,  157,  317,
-       90,   90,  158,  102,   36,  272,  102,   90,  167,  168,
-      201,  167,  103,  271,   82,  104,   84,  159,   82,  202,
-
-       84,   93,   94,   36,   93,   94,   93,   93,   93,   93,
-       93,   95,   93,   96,   97,   98,   98,   98,   93,   93,
-       93,   93,   93,   93,   96,   96,   96,   96,   93,   93,
-       99,   96,   96,   96,   96,   96,   96,   96,   96,   96,
-       96,   96,   96,   96,   96,   96,   96,   96,   96,   96,
-       96,   96,   96,   96,   96,   93,   93,   93,   93,  102,
-       36,  162,  102,  165,  105,  217,  170,  171,  103,  170,
-      131,  104,  107,  163,  132,  131,  180,  108,  166,  132,
-      199,  188,  164,  216,  200,  189,  181,  109,  108,  108,
-      108,  108,  215,  172,  190,  108,  108,  110,  111,  112,
-
-      113,  114,  115,  108,  116,  108,  117,  118,  119,  120,
-      121,  108,  122,  123,  124,  125,  126,  108,  127,  128,
-      106,  176,  176,  106,  176,  192,  106,  134,  134,  134,
-      578,  129,  129,  578,  196,  182,  578,  106,  193,  135,
-      183,  154,  106,  194,  336,  184,  203,  578,  106,  106,
-      197,  153,  578,  198,  577,  204,  214,  214,  578,  578,
-      134,  134,  134,  337,  205,  135,  218,  219,  256,  218,
-      220,  221,  257,  220,  177,  222,  223,  106,  222,  224,
-      225,  578,  224,  167,  168,  576,  167,  578,  141,  227,
-      171,  141,  227,  229,  230,  575,  229,  142,  142,  176,
-
-      176,  240,  176,  165,  245,  141,  233,  172,  143,  250,
-      234,  141,  241,  574,  144,  145,  270,  270,  166,  146,
-      246,  573,  235,  572,  218,  219,  147,  218,  251,  571,
-      148,  160,  149,  150,  151,  152,  106,  570,  161,  106,
-      157,  252,  106,  297,  158,  569,  298,  129,  129,  293,
-      162,  301,  177,  106,  220,  221,  294,  220,  106,  159,
-      222,  223,  163,  222,  106,  106,  224,  225,  302,  224,
-      568,  164,  167,  168,  567,  167,  227,  171,  350,  227,
-      227,  171,  295,  227,  229,  230,  366,  229,  370,  296,
-      393,  402,  566,  106,  211,  211,  211,  351,  396,  396,
-
-      396,  432,  565,  211,  491,  367,  434,  371,  564,  394,
-      403,  211,  211,  211,  211,  211,  211,  420,  420,  420,
-      420,  432,  523,  433,  524,  435,  420,  420,  420,  420,
-      563,  562,  561,  396,  396,  396,  421,  535,  535,  535,
-      535,  524,  547,  524,  548,  421,  540,  540,  540,  540,
-      540,  540,  540,  540,  560,  559,  536,  535,  535,  535,
-      535,  548,  558,  548,  557,  541,  556,  555,  554,  541,
-      540,  540,  540,  540,  553,  552,  536,  551,  550,  549,
-      546,  545,  544,  543,  542,  539,  538,  537,  534,  541,
-       54,   54,   54,   54,   54,   54,   54,   54,   54,   54,
-
-       54,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   63,   63,   63,   63,   63,   63,   63,   63,
-       63,   63,   63,   70,   70,   70,   70,   70,   70,   70,
-       70,   70,   70,   70,  101,  101,  101,  101,  101,  101,
-      101,  101,  101,  101,  101,  106,  533,  532,  531,  106,
-      106,  530,  529,  528,  527,  106,  130,  526,  525,  522,
-      130,  130,  130,  521,  130,  520,  130,  133,  133,  519,
-      133,  140,  140,  140,  140,  140,  140,  140,  140,  140,
-      140,  140,  153,  153,  153,  153,  153,  153,  153,  518,
-      153,  153,  153,  169,  169,  169,  169,  169,  169,  169,
-
-      169,  169,  173,  517,  516,  173,  173,  515,  514,  173,
-      513,  173,  174,  174,  174,  491,  174,  175,  175,  175,
-      512,  175,  209,  209,  511,  209,  209,  209,  209,  209,
-      209,  209,  209,  210,  210,  210,  510,  210,  490,  490,
-      509,  490,  490,  490,  490,  490,  490,  490,  490,  508,
-      507,  506,  505,  504,  503,  502,  501,  500,  499,  498,
-      497,  496,  495,  494,  493,  492,  491,  489,  488,  487,
-      486,  485,  484,  483,  482,  481,  480,  479,  478,  477,
-      476,  475,  474,  473,  472,  471,  470,  469,  468,  467,
-      466,  465,  464,  463,  462,  461,  460,  459,  458,  457,
-
-      456,  455,  454,  453,  452,  451,  450,  449,  448,  447,
-      446,  445,  444,  443,  442,  441,  440,  439,  438,  437,
-      436,  431,  430,  429,  428,  427,  426,  425,  424,  423,
-      422,  419,  418,  417,  416,  415,  414,  413,  412,  411,
-      410,  409,  408,  407,  406,  405,  404,  401,  400,  399,
-      398,  397,  395,  392,  391,  390,  389,  388,  387,  386,
-      385,  384,  383,  382,  381,  380,  379,  378,  377,  376,
-      375,  374,  373,  372,  369,  368,  365,  364,  363,  362,
-      359,  358,  357,  356,  355,  354,  353,  352,  349,  348,
-      347,  346,  345,  344,  343,  342,  341,  340,  339,  338,
-
-      335,  334,  333,  332,  331,  330,  329,  328,  327,  326,
-      325,  324,  323,  322,  321,  320,  319,  316,  315,  314,
-      313,  312,  311,  310,  309,  308,  307,  306,  305,  304,
-      303,  300,  299,  292,  291,  290,  289,  288,  287,  286,
-      285,  284,  283,  282,  281,  280,  279,  278,  275,  274,
-      273,  269,  268,  267,  266,  265,  264,  263,  262,  261,
-      260,  259,  258,  255,  254,  253,  249,  248,  247,  244,
-      243,  242,  239,  238,  237,  236,  232,  231,  228,  226,
-      155,  154,  213,  212,  208,  207,  206,  195,  191,  187,
-      186,  185,  179,  178,  138,  138,  156,  154,  155,  154,
-
-      138,  139,  138,  578,  100,   55,   55,   53,   33,  578,
-      578,  578,  578,  578,  578,  578,  578,  578,  578,  578,
-      578,  578,  578,  578,  578,  578,  578,  578,  578,  578,
-      578,  578,  578,  578,  578,  578,  578,  578,  578,  578,
-      578,  578,  578,  578,  578,  578,  578,  578,  578,  578,
-      578,  578,  578,  578,  578,  578,  578,  578,  578,  578,
-      578,  578,  578,  578,  578,  578,  578
+       36,   37,   38,   36,   37,   39,   36,   40,   41,   42,
+       43,   44,   45,   36,   46,   47,   48,   49,   49,   36,
+       50,   51,   52,   44,   36,   53,   53,   53,   53,   53,
+       54,   36,   36,   53,   53,   53,   53,   53,   53,   53,
+       53,   53,   53,   53,   53,   53,   53,   53,   53,   53,
+       53,   53,   53,   53,   53,   53,   53,   55,   56,   44,
+       36,   61,   61,   65,   62,   62,   65,   68,   38,   66,
+       68,   79,   66,   79,   90,  369,   90,  171,   69,   75,
+       89,   70,   89,   68,   38,   71,   68,   76,   73,   77,
+       63,   63,   63,  172,   69,   63,   72,   70,   75,  173,
+
+      174,   71,  173,   91,   79,   91,   76,   80,   77,   81,
+       82,   92,   72,   92,   93,  166,   93,   83,  142,   64,
+       64,   64,   79,  167,   64,   80,   78,   81,   82,  137,
+      143,   79,   95,  138,   80,   83,   84,   82,   96,  344,
+       94,   95,   94,   79,   83,   78,   80,   96,   84,   82,
+       85,   79,   79,  368,   80,   80,   83,   82,   82,  345,
+      168,   94,   85,   79,   83,   83,   80,  137,   84,   82,
+       94,  138,   79,  160,  169,   80,   83,   84,   82,  140,
+      140,  140,   85,  159,  170,   83,   86,  326,   87,  325,
+      137,   85,  106,   38,  138,  106,  106,   38,   86,  106,
+
+       87,  109,  186,  107,  163,  137,  108,  107,  164,  138,
+      108,  188,  187,  194,  207,  205,  189,  195,   86,  206,
+       88,  190,  305,  208,  165,  306,  196,   86,  280,   88,
+       97,   98,   38,   97,   98,   97,   97,   97,   97,   97,
+       97,   97,   99,   97,  100,  101,  102,  102,  102,   97,
+       97,   97,   97,   97,   97,  100,  100,  100,  100,  100,
+       97,   97,  103,  100,  100,  100,  100,  100,  100,  100,
+      100,  100,  100,  100,  100,  100,  100,  100,  100,  100,
+      100,  100,  100,  100,  100,  100,  100,   97,   97,   97,
+       97,   79,  247,  209,   80,   79,   84,   82,   80,  358,
+
+       84,   82,  210,  248,   83,  140,  140,  140,   83,  198,
+       85,  211,  176,  177,   85,  176,  202,  374,  141,  359,
+      182,  182,  199,  182,  140,  140,  140,  200,  221,  221,
+      160,  252,  203,  225,  226,  204,  225,  375,  227,  228,
+      159,  227,  178,  166,  141,  263,   86,  253,  110,  264,
+       86,  167,  110,  112,  229,  230,  284,  229,  231,  232,
+      113,  231,  173,  174,  285,  173,  234,  177,  279,  234,
+      114,  113,  113,  113,  113,  113,  183,  278,  278,  113,
+      113,  115,  116,  117,  118,  119,  120,  113,  121,  113,
+      122,  123,  124,  125,  126,  113,  127,  128,  129,  130,
+
+      131,  113,  132,  133,  111,  236,  237,  111,  236,  257,
+      111,  240,  163,  111,  111,  241,  164,  135,  135,  301,
+      224,  182,  182,  111,  182,  168,  302,  242,  111,  258,
+      225,  226,  165,  225,  586,  111,  111,  227,  228,  169,
+      227,  171,  259,  229,  230,  223,  229,  231,  232,  170,
+      231,  173,  174,  309,  173,  234,  177,  172,  234,  234,
+      177,  378,  234,  178,  111,  586,  236,  237,  586,  236,
+      310,  586,  303,  401,  586,  586,  222,  183,  410,  304,
+      585,  379,  584,  442,  586,  404,  404,  404,  440,  586,
+      440,  499,  441,  402,  531,  532,  586,  586,  411,  428,
+
+      428,  428,  428,  443,  404,  404,  404,  428,  428,  428,
+      428,  583,  582,  581,  532,  532,  555,  580,  579,  556,
+      429,  543,  543,  543,  543,  586,  147,  578,  429,  147,
+      548,  548,  548,  548,  577,  576,  556,  148,  148,  556,
+      575,  574,  544,  573,  572,  147,  571,  570,  569,  149,
+      568,  549,  147,  567,  566,  150,  151,  565,  564,  563,
+      152,  548,  548,  548,  548,  562,  561,  153,  560,  559,
+      558,  154,  557,  155,  156,  157,  158,  111,  554,  553,
+      111,  552,  549,  111,  551,  550,  111,  111,  547,  546,
+      135,  135,  543,  543,  543,  543,  111,  548,  548,  548,
+
+      548,  111,  545,  542,  541,  540,  539,  538,  111,  111,
+      537,  536,  535,  544,  534,  533,  530,  529,  549,  528,
+      527,  526,  525,  524,  523,  522,  521,  499,  520,  519,
+      518,  517,  516,  515,  514,  513,  512,  111,  218,  218,
+      218,  511,  510,  509,  508,  507,  506,  218,  218,  505,
+      504,  503,  502,  501,  500,  499,  218,  218,  218,  218,
+      218,  218,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   60,   60,   60,   60,   60,   60,   60,
+       60,   60,   60,   60,   67,   67,   67,   67,   67,   67,
+       67,   67,   67,   67,   67,   74,   74,   74,   74,   74,
+
+       74,   74,   74,   74,   74,   74,  105,  105,  105,  105,
+      105,  105,  105,  105,  105,  105,  105,  111,  497,  496,
+      495,  111,  111,  494,  493,  492,  491,  111,  136,  490,
+      489,  488,  136,  136,  136,  487,  136,  486,  136,  139,
+      139,  485,  139,  146,  146,  146,  146,  146,  146,  146,
+      146,  146,  146,  146,  159,  159,  159,  159,  159,  159,
+      159,  484,  159,  159,  159,  175,  175,  175,  175,  175,
+      175,  175,  175,  175,  179,  483,  482,  179,  179,  481,
+      480,  179,  479,  179,  180,  180,  180,  478,  180,  181,
+      181,  181,  477,  181,  216,  216,  476,  216,  216,  216,
+
+      216,  216,  216,  216,  216,  217,  217,  217,  475,  217,
+      498,  498,  474,  498,  498,  498,  498,  498,  498,  498,
+      498,  473,  472,  471,  470,  469,  468,  467,  466,  465,
+      464,  463,  462,  461,  460,  459,  458,  457,  456,  455,
+      454,  453,  452,  451,  450,  449,  448,  447,  446,  445,
+      444,  439,  438,  437,  436,  435,  434,  433,  432,  431,
+      430,  427,  426,  425,  424,  423,  422,  421,  420,  419,
+      418,  417,  416,  415,  414,  413,  412,  409,  408,  407,
+      406,  405,  403,  400,  399,  398,  397,  396,  395,  394,
+      393,  392,  391,  390,  389,  388,  387,  386,  385,  384,
+
+      383,  382,  381,  380,  377,  376,  373,  372,  371,  370,
+      367,  366,  365,  364,  363,  362,  361,  360,  357,  356,
+      355,  354,  353,  352,  351,  350,  349,  348,  347,  346,
+      343,  342,  341,  340,  339,  338,  337,  336,  335,  334,
+      333,  332,  331,  330,  329,  328,  327,  324,  323,  322,
+      321,  320,  319,  318,  317,  316,  315,  314,  313,  312,
+      311,  308,  307,  300,  299,  298,  297,  296,  295,  294,
+      293,  292,  291,  290,  289,  288,  287,  286,  283,  282,
+      281,  277,  276,  275,  274,  273,  272,  271,  270,  269,
+      268,  267,  266,  265,  262,  261,  260,  256,  255,  254,
+
+      251,  250,  249,  246,  245,  244,  243,  239,  238,  235,
+      233,  161,  160,  220,  219,  215,  214,  213,  212,  201,
+      197,  193,  192,  191,  185,  184,  144,  144,  162,  160,
+      161,  160,  144,  145,  144,  134,  586,  104,   59,   59,
+       57,   35,  586,  586,  586,  586,  586,  586,  586,  586,
+      586,  586,  586,  586,  586,  586,  586,  586,  586,  586,
+      586,  586,  586,  586,  586,  586,  586,  586,  586,  586,
+      586,  586,  586,  586,  586,  586,  586,  586,  586,  586,
+      586,  586,  586,  586,  586,  586,  586,  586,  586,  586,
+      586,  586,  586,  586,  586,  586,  586,  586,  586,  586,
+
+      586,  586,  586
     } ;
 
-static yyconst flex_int16_t yy_chk[1068] =
+static yyconst flex_int16_t yy_chk[1104] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    5,    6,
-        7,    5,    6,    8,    9,    9,    7,    9,   17,    8,
-       47,   17,   13,    9,   17,   13,    9,   13,   13,   17,
-        9,   21,   47,   13,    5,    6,    7,   11,   21,    8,
-        9,   10,   10,  603,   10,   11,   10,   11,   12,   14,
-
-       10,   23,   14,   10,   14,   14,   12,   10,   12,   22,
-       14,   24,  234,    5,    6,    7,   22,   10,    8,   15,
-      234,   71,   15,   16,   15,   15,   16,   23,   16,   16,
-       15,   71,   18,   11,   16,   18,   15,   24,   18,  602,
-       16,  601,   19,   18,   12,   19,   20,   19,   19,   20,
-       27,   20,   20,   19,   28,   25,   27,   20,   25,   19,
-       28,   26,   43,   20,   26,   80,   43,   45,   45,   45,
-       66,   15,   80,   15,   66,   16,   27,   16,   79,  600,
-       28,   25,   79,   31,   31,  599,   31,   26,   87,   87,
-      123,   87,   31,  598,   19,   31,   19,   79,   20,  123,
-
-       20,   29,   29,   29,   29,   29,   29,   29,   29,   29,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    5,    6,    7,    5,    6,    8,    9,    9,    7,
+        9,   21,    8,   22,   23,  611,   24,   89,    9,   11,
+       21,    9,   22,   10,   10,    9,   10,   11,   10,   11,
+        5,    6,    7,   89,   10,    8,    9,   10,   12,   91,
+
+       91,   10,   91,   23,   13,   24,   12,   13,   12,   13,
+       13,   25,   10,   26,   25,   84,   26,   13,   51,    5,
+        6,    7,   14,   84,    8,   14,   11,   14,   14,   47,
+       51,   15,   27,   47,   15,   14,   15,   15,   27,  300,
+       25,   28,   26,   16,   15,   12,   16,   28,   16,   16,
+       15,   17,   18,  610,   17,   18,   16,   17,   18,  300,
+       85,   27,   16,   19,   17,   18,   19,   70,   19,   19,
+       28,   70,   20,   75,   85,   20,   19,   20,   20,   49,
+       49,   49,   19,   75,   85,   20,   15,  609,   15,  608,
+      101,   20,   31,   31,  101,   31,   32,   32,   16,   32,
+
+       16,   32,  117,   31,   83,  108,   31,   32,   83,  108,
+       32,  118,  117,  122,  128,  127,  118,  122,   19,  127,
+       19,  118,  259,  128,   83,  259,  122,   20,  607,   20,
+       29,   29,   29,   29,   29,   29,   29,   29,   29,   29,
        29,   29,   29,   29,   29,   29,   29,   29,   29,   29,
        29,   29,   29,   29,   29,   29,   29,   29,   29,   29,
        29,   29,   29,   29,   29,   29,   29,   29,   29,   29,
        29,   29,   29,   29,   29,   29,   29,   29,   29,   29,
-       29,   29,   29,   29,   29,   29,   29,   29,   29,   32,
-       32,   81,   32,   85,   32,  597,   90,   90,   32,   90,
-       97,   32,   38,   81,   97,  104,  112,   38,   85,  104,
-      122,  117,   81,  596,  122,  117,  112,   38,   38,   38,
-       38,   38,  595,   90,  117,   38,   38,   38,   38,   38,
-
-       38,   38,   38,   38,   38,   38,   38,   38,   38,   38,
-       38,   38,   38,   38,   38,   38,   38,   38,   38,   38,
-       42,  109,  109,   42,  109,  119,   42,   44,   44,   44,
-       49,   42,   42,   49,  121,  113,   49,   42,  119,   44,
-      113,  154,   42,  119,  292,  113,  124,   49,   42,   42,
-      121,  154,   49,  121,  576,  124,  142,  142,   49,   49,
-      134,  134,  134,  292,  124,   44,  159,  159,  197,  159,
-      161,  161,  197,  161,  109,  164,  164,   42,  164,  166,
-      166,  230,  166,  167,  167,  575,  167,   49,   59,  170,
-      170,   59,  170,  172,  172,  574,  172,   59,   59,  176,
-
-      176,  185,  176,  225,  189,   59,  180,  230,   59,  193,
-      180,   59,  185,  573,   59,   59,  214,  214,  225,   59,
-      189,  572,  180,  569,  218,  218,   59,  218,  193,  568,
-       59,  221,   59,   59,   59,   59,  129,  567,  221,  129,
-      219,  193,  129,  252,  219,  566,  252,  129,  129,  250,
-      223,  255,  176,  129,  220,  220,  250,  220,  129,  219,
-      222,  222,  223,  222,  129,  129,  224,  224,  255,  224,
-      565,  223,  226,  226,  564,  226,  227,  227,  305,  227,
-      228,  228,  251,  228,  229,  229,  326,  229,  329,  251,
-      356,  368,  563,  129,  135,  135,  135,  305,  359,  359,
-
-      359,  491,  560,  135,  491,  326,  397,  329,  559,  356,
-      368,  135,  135,  135,  135,  135,  135,  385,  385,  385,
-      385,  396,  504,  396,  505,  397,  420,  420,  420,  420,
-      558,  557,  556,  396,  396,  396,  385,  517,  517,  517,
-      517,  504,  537,  505,  538,  420,  521,  521,  521,  521,
-      522,  522,  522,  522,  554,  553,  517,  535,  535,  535,
-      535,  537,  552,  538,  551,  521,  550,  549,  548,  522,
-      540,  540,  540,  540,  547,  544,  535,  543,  542,  539,
-      534,  533,  525,  524,  523,  520,  519,  518,  516,  540,
-      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
-
-      579,  580,  580,  580,  580,  580,  580,  580,  580,  580,
-      580,  580,  581,  581,  581,  581,  581,  581,  581,  581,
-      581,  581,  581,  582,  582,  582,  582,  582,  582,  582,
-      582,  582,  582,  582,  583,  583,  583,  583,  583,  583,
-      583,  583,  583,  583,  583,  584,  515,  514,  513,  584,
-      584,  512,  511,  510,  509,  584,  585,  507,  506,  503,
-      585,  585,  585,  502,  585,  501,  585,  586,  586,  499,
-      586,  587,  587,  587,  587,  587,  587,  587,  587,  587,
-      587,  587,  588,  588,  588,  588,  588,  588,  588,  498,
-      588,  588,  588,  589,  589,  589,  589,  589,  589,  589,
-
-      589,  589,  590,  497,  496,  590,  590,  495,  493,  590,
-      492,  590,  591,  591,  591,  490,  591,  592,  592,  592,
-      489,  592,  593,  593,  488,  593,  593,  593,  593,  593,
-      593,  593,  593,  594,  594,  594,  487,  594,  604,  604,
-      486,  604,  604,  604,  604,  604,  604,  604,  604,  485,
-      484,  483,  482,  481,  480,  479,  476,  475,  474,  473,
-      472,  469,  468,  467,  466,  465,  464,  463,  462,  460,
-      459,  458,  457,  456,  453,  451,  450,  449,  448,  447,
-      445,  444,  443,  442,  441,  440,  439,  438,  437,  436,
-      435,  434,  433,  430,  429,  428,  426,  425,  423,  422,
-
-      419,  418,  417,  416,  415,  414,  413,  412,  411,  410,
-      409,  408,  407,  406,  405,  404,  403,  402,  401,  400,
-      399,  395,  394,  393,  392,  391,  390,  389,  388,  387,
-      386,  384,  383,  382,  381,  380,  379,  378,  377,  376,
-      375,  374,  373,  372,  371,  370,  369,  367,  366,  365,
-      364,  363,  358,  354,  352,  351,  350,  349,  348,  347,
-      345,  343,  342,  341,  340,  339,  338,  337,  336,  334,
-      333,  332,  331,  330,  328,  327,  323,  322,  321,  319,
-      316,  314,  313,  311,  309,  308,  307,  306,  304,  303,
-      302,  301,  300,  299,  298,  297,  296,  295,  294,  293,
-
-      291,  290,  289,  287,  286,  285,  284,  283,  282,  281,
-      280,  279,  278,  277,  276,  275,  273,  269,  268,  267,
-      266,  265,  264,  263,  262,  261,  260,  259,  258,  257,
-      256,  254,  253,  249,  248,  247,  246,  245,  244,  243,
-      242,  241,  240,  239,  238,  237,  236,  235,  233,  232,
-      231,  213,  208,  207,  206,  205,  204,  203,  202,  201,
-      200,  199,  198,  196,  195,  194,  192,  191,  190,  188,
-      187,  186,  184,  183,  182,  181,  179,  178,  171,  168,
-      155,  153,  138,  136,  127,  126,  125,  120,  118,  116,
-      115,  114,  111,  110,  105,  100,   77,   74,   72,   70,
-
-       69,   55,   53,   33,   30,    4,    3,    2,  578,  578,
-      578,  578,  578,  578,  578,  578,  578,  578,  578,  578,
-      578,  578,  578,  578,  578,  578,  578,  578,  578,  578,
-      578,  578,  578,  578,  578,  578,  578,  578,  578,  578,
-      578,  578,  578,  578,  578,  578,  578,  578,  578,  578,
-      578,  578,  578,  578,  578,  578,  578,  578,  578,  578,
-      578,  578,  578,  578,  578,  578,  578
+       29,   29,   29,   29,   29,   29,   29,   29,   29,   29,
+       29,   33,  191,  129,   33,   34,   33,   33,   34,  313,
+
+       34,   34,  129,  191,   33,   48,   48,   48,   34,  124,
+       33,  129,   94,   94,   34,   94,  126,  334,   48,  313,
+      114,  114,  124,  114,  140,  140,  140,  124,  148,  148,
+      160,  195,  126,  165,  165,  126,  165,  334,  167,  167,
+      160,  167,   94,  228,   48,  203,   33,  195,   33,  203,
+       34,  228,   34,   40,  170,  170,  241,  170,  172,  172,
+       40,  172,  173,  173,  241,  173,  176,  176,  606,  176,
+       40,   40,   40,   40,   40,   40,  114,  221,  221,   40,
+       40,   40,   40,   40,   40,   40,   40,   40,   40,   40,
+       40,   40,   40,   40,   40,   40,   40,   40,   40,   40,
+
+       40,   40,   40,   40,   46,  178,  178,   46,  178,  199,
+       46,  186,  226,   46,   46,  186,  226,   46,   46,  257,
+      605,  182,  182,   46,  182,  230,  257,  186,   46,  199,
+      225,  225,  226,  225,  237,   46,   46,  227,  227,  230,
+      227,  232,  199,  229,  229,  604,  229,  231,  231,  230,
+      231,  233,  233,  262,  233,  234,  234,  232,  234,  235,
+      235,  337,  235,  237,   46,   53,  236,  236,   53,  236,
+      262,   53,  258,  364,   53,   53,  603,  182,  376,  258,
+      584,  337,  583,  405,   53,  367,  367,  367,  499,   53,
+      404,  499,  404,  364,  512,  513,   53,   53,  376,  393,
+
+      393,  393,  393,  405,  404,  404,  404,  428,  428,  428,
+      428,  582,  581,  580,  512,  513,  545,  577,  576,  546,
+      393,  525,  525,  525,  525,   53,   63,  575,  428,   63,
+      529,  529,  529,  529,  574,  573,  545,   63,   63,  546,
+      572,  571,  525,  568,  567,   63,  566,  565,  564,   63,
+      562,  529,   63,  561,  560,   63,   63,  559,  558,  557,
+       63,  530,  530,  530,  530,  556,  555,   63,  552,  551,
+      550,   63,  547,   63,   63,   63,   63,  135,  542,  541,
+      135,  533,  530,  135,  532,  531,  135,  135,  528,  527,
+      135,  135,  543,  543,  543,  543,  135,  548,  548,  548,
+
+      548,  135,  526,  524,  523,  522,  521,  520,  135,  135,
+      519,  518,  517,  543,  515,  514,  511,  510,  548,  509,
+      507,  506,  505,  504,  503,  501,  500,  498,  497,  496,
+      495,  494,  493,  492,  491,  490,  489,  135,  141,  141,
+      141,  488,  487,  484,  483,  482,  481,  141,  141,  480,
+      477,  476,  475,  474,  473,  472,  141,  141,  141,  141,
+      141,  141,  587,  587,  587,  587,  587,  587,  587,  587,
+      587,  587,  587,  588,  588,  588,  588,  588,  588,  588,
+      588,  588,  588,  588,  589,  589,  589,  589,  589,  589,
+      589,  589,  589,  589,  589,  590,  590,  590,  590,  590,
+
+      590,  590,  590,  590,  590,  590,  591,  591,  591,  591,
+      591,  591,  591,  591,  591,  591,  591,  592,  471,  470,
+      468,  592,  592,  467,  466,  465,  464,  592,  593,  461,
+      459,  458,  593,  593,  593,  457,  593,  456,  593,  594,
+      594,  455,  594,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  596,  596,  596,  596,  596,  596,
+      596,  453,  596,  596,  596,  597,  597,  597,  597,  597,
+      597,  597,  597,  597,  598,  452,  451,  598,  598,  450,
+      449,  598,  448,  598,  599,  599,  599,  447,  599,  600,
+      600,  600,  446,  600,  601,  601,  445,  601,  601,  601,
+
+      601,  601,  601,  601,  601,  602,  602,  602,  444,  602,
+      612,  612,  443,  612,  612,  612,  612,  612,  612,  612,
+      612,  442,  441,  438,  437,  436,  434,  433,  431,  430,
+      427,  426,  425,  424,  423,  422,  421,  420,  419,  418,
+      417,  416,  415,  414,  413,  412,  411,  410,  409,  408,
+      407,  403,  402,  401,  400,  399,  398,  397,  396,  395,
+      394,  392,  391,  390,  389,  388,  387,  386,  385,  384,
+      383,  382,  381,  380,  379,  378,  377,  375,  374,  373,
+      372,  371,  366,  362,  360,  359,  358,  357,  356,  355,
+      353,  351,  350,  349,  348,  347,  346,  345,  344,  342,
+
+      341,  340,  339,  338,  336,  335,  331,  330,  329,  327,
+      324,  322,  321,  319,  317,  316,  315,  314,  312,  311,
+      310,  309,  308,  307,  306,  305,  304,  303,  302,  301,
+      299,  298,  297,  295,  294,  293,  292,  291,  290,  289,
+      288,  287,  286,  285,  284,  283,  281,  277,  275,  274,
+      273,  272,  271,  270,  269,  268,  267,  266,  265,  264,
+      263,  261,  260,  256,  255,  254,  253,  252,  251,  250,
+      249,  248,  247,  246,  245,  244,  243,  242,  240,  239,
+      238,  220,  215,  214,  213,  212,  211,  210,  209,  208,
+      207,  206,  205,  204,  202,  201,  200,  198,  197,  196,
+
+      194,  193,  192,  190,  189,  188,  187,  185,  184,  177,
+      174,  161,  159,  144,  142,  134,  132,  131,  130,  125,
+      123,  121,  120,  119,  116,  115,  109,  104,   81,   78,
+       76,   74,   73,   59,   57,   42,   35,   30,    4,    3,
+        2,  586,  586,  586,  586,  586,  586,  586,  586,  586,
+      586,  586,  586,  586,  586,  586,  586,  586,  586,  586,
+      586,  586,  586,  586,  586,  586,  586,  586,  586,  586,
+      586,  586,  586,  586,  586,  586,  586,  586,  586,  586,
+      586,  586,  586,  586,  586,  586,  586,  586,  586,  586,
+      586,  586,  586,  586,  586,  586,  586,  586,  586,  586,
+
+      586,  586,  586
     } ;
 
 static yy_state_type yy_last_accepting_state;
@@ -990,22 +1004,23 @@ static char *yy_last_accepting_cpos;
 extern int gram__flex_debug;
 int gram__flex_debug = 1;
 
-static yyconst flex_int16_t yy_rule_linenum[130] =
+static yyconst flex_int16_t yy_rule_linenum[133] =
     {   0,
-      199,  202,  203,  204,  212,  230,  231,  232,  233,  234,
-      235,  236,  237,  238,  239,  240,  241,  242,  243,  244,
-      245,  246,  247,  248,  249,  250,  251,  252,  253,  254,
-      255,  256,  257,  258,  259,  260,  261,  262,  263,  264,
-      265,  266,  267,  268,  269,  270,  271,  272,  273,  274,
-      277,  278,  279,  280,  281,  282,  283,  284,  285,  286,
-      287,  289,  293,  294,  295,  297,  309,  323,  340,  345,
-      348,  351,  354,  366,  377,  378,  379,  389,  403,  410,
-      430,  440,  455,  465,  492,  505,  521,  536,  553,  554,
-      565,  576,  577,  589,  605,  615,  642,  654,  676,  677,
-
-      688,  703,  719,  720,  721,  722,  723,  724,  725,  728,
-      730,  744,  762,  767,  768,  774,  775,  786,  792,  798,
-      804,  820,  821,  825,  832,  857,  886,  932,  933
+      201,  204,  205,  206,  214,  232,  233,  234,  235,  236,
+      237,  238,  239,  240,  241,  242,  243,  244,  245,  246,
+      247,  248,  249,  250,  251,  252,  253,  254,  255,  256,
+      257,  258,  259,  260,  261,  262,  263,  264,  265,  266,
+      267,  268,  269,  270,  271,  272,  273,  274,  275,  276,
+      279,  280,  281,  282,  283,  284,  285,  286,  287,  288,
+      289,  291,  295,  296,  297,  299,  311,  325,  342,  347,
+      350,  353,  356,  368,  379,  388,  393,  394,  395,  405,
+      419,  426,  446,  456,  471,  481,  508,  521,  537,  552,
+      569,  570,  581,  592,  593,  605,  621,  631,  658,  670,
+
+      692,  693,  704,  719,  735,  736,  737,  738,  739,  740,
+      741,  744,  746,  760,  778,  783,  784,  790,  791,  803,
+      809,  815,  821,  838,  839,  843,  850,  875,  901,  929,
+      976,  978
     } ;
 
 /* The intent behind this definition is that it'll catch
@@ -1156,11 +1171,13 @@ generics/template types.  */
 
 /* Bracketed identifiers support. */
 
+/* Nick extra rules for element groups */
+
 /* Zero or more instances of backslash-newline.  Following GCC, allow
    white space between the backslash and the newline.  */
 /* An equal sign, with optional leading whitespaces. This is used in some
    deprecated constructs. */
-#line 1155 "src/scan-gram.c"
+#line 1172 "src/scan-gram.c"
 
 #define INITIAL 0
 #define SC_YACC_COMMENT 1
@@ -1178,6 +1195,7 @@ generics/template types.  */
 #define SC_CHARACTER 13
 #define SC_BRACKETED_ID 14
 #define SC_RETURN_BRACKETED_ID 15
+#define SC_ELEMENT_GROUP 16
 
 #ifndef YY_NO_UNISTD_H
 /* Special case for "unistd.h", since it is non-ANSI. We include it way
@@ -1425,7 +1443,7 @@ YY_DECL
        register int yy_act;
     
 /* %% [7.0] user's declarations go here */
-#line 160 "src/scan-gram.l"
+#line 162 "src/scan-gram.l"
 
 
   /* Nesting level.  Either for nested braces, or nested angle brackets
@@ -1462,7 +1480,7 @@ YY_DECL
   | Scanning white space.  |
   `-----------------------*/
 
-#line 1457 "src/scan-gram.c"
+#line 1475 "src/scan-gram.c"
 
        if ( !(yy_init) )
                {
@@ -1531,13 +1549,13 @@ yy_match:
                        while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                                {
                                yy_current_state = (int) yy_def[yy_current_state];
-                               if ( yy_current_state >= 579 )
+                               if ( yy_current_state >= 587 )
                                        yy_c = yy_meta[(unsigned int) yy_c];
                                }
                        yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
                        ++yy_cp;
                        }
-               while ( yy_current_state != 578 );
+               while ( yy_current_state != 586 );
                yy_cp = (yy_last_accepting_cpos);
                yy_current_state = (yy_last_accepting_state);
 
@@ -1556,13 +1574,13 @@ do_action:      /* This label is used only to access EOF actions. */
                        {
                        if ( yy_act == 0 )
                                fprintf( stderr, "--scanner backing up\n" );
-                       else if ( yy_act < 130 )
+                       else if ( yy_act < 133 )
                                fprintf( stderr, "--accepting rule at line %ld (\"%s\")\n",
                                         (long)yy_rule_linenum[yy_act], gram_text );
-                       else if ( yy_act == 130 )
+                       else if ( yy_act == 133 )
                                fprintf( stderr, "--accepting default rule (\"%s\")\n",
                                         gram_text );
-                       else if ( yy_act == 131 )
+                       else if ( yy_act == 134 )
                                fprintf( stderr, "--(end of buffer or a NUL)\n" );
                        else
                                fprintf( stderr, "--EOF (start condition %d)\n", YY_START );
@@ -1581,23 +1599,23 @@ do_action:      /* This label is used only to access EOF actions. */
 /* Comments and white space.  */
 case 1:
 YY_RULE_SETUP
-#line 199 "src/scan-gram.l"
+#line 201 "src/scan-gram.l"
 {
      complain (loc, Wother, _("stray ',' treated as white space"));
   }
        YY_BREAK
 case 2:
 /* rule 2 can match eol */
-#line 203 "src/scan-gram.l"
+#line 205 "src/scan-gram.l"
 case 3:
 /* rule 3 can match eol */
 YY_RULE_SETUP
-#line 203 "src/scan-gram.l"
+#line 205 "src/scan-gram.l"
 continue;
        YY_BREAK
 case 4:
 YY_RULE_SETUP
-#line 204 "src/scan-gram.l"
+#line 206 "src/scan-gram.l"
 {
     token_start = loc->start;
     context_state = YY_START;
@@ -1609,7 +1627,7 @@ YY_RULE_SETUP
 case 5:
 /* rule 5 can match eol */
 YY_RULE_SETUP
-#line 212 "src/scan-gram.l"
+#line 214 "src/scan-gram.l"
 {
     handle_syncline (gram_text + sizeof "#line " - 1, *loc);
   }
@@ -1627,313 +1645,313 @@ YY_RULE_SETUP
 
 case 6:
 YY_RULE_SETUP
-#line 230 "src/scan-gram.l"
+#line 232 "src/scan-gram.l"
 return PERCENT_NONASSOC;
        YY_BREAK
 case 7:
 YY_RULE_SETUP
-#line 231 "src/scan-gram.l"
+#line 233 "src/scan-gram.l"
 return PERCENT_CODE;
        YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 232 "src/scan-gram.l"
+#line 234 "src/scan-gram.l"
 RETURN_PERCENT_FLAG("parse.trace");
        YY_BREAK
 case 9:
 YY_RULE_SETUP
-#line 233 "src/scan-gram.l"
+#line 235 "src/scan-gram.l"
 return PERCENT_DEFAULT_PREC;
        YY_BREAK
 case 10:
 YY_RULE_SETUP
-#line 234 "src/scan-gram.l"
+#line 236 "src/scan-gram.l"
 return PERCENT_DEFINE;
        YY_BREAK
 case 11:
 YY_RULE_SETUP
-#line 235 "src/scan-gram.l"
+#line 237 "src/scan-gram.l"
 return PERCENT_DEFINES;
        YY_BREAK
 case 12:
 YY_RULE_SETUP
-#line 236 "src/scan-gram.l"
+#line 238 "src/scan-gram.l"
 return PERCENT_DESTRUCTOR;
        YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 237 "src/scan-gram.l"
+#line 239 "src/scan-gram.l"
 return PERCENT_DPREC;
        YY_BREAK
 case 14:
 YY_RULE_SETUP
-#line 238 "src/scan-gram.l"
+#line 240 "src/scan-gram.l"
 return PERCENT_EMPTY;
        YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 239 "src/scan-gram.l"
+#line 241 "src/scan-gram.l"
 return PERCENT_ERROR_VERBOSE;
        YY_BREAK
 case 16:
 YY_RULE_SETUP
-#line 240 "src/scan-gram.l"
+#line 242 "src/scan-gram.l"
 return PERCENT_EXPECT;
        YY_BREAK
 case 17:
 YY_RULE_SETUP
-#line 241 "src/scan-gram.l"
+#line 243 "src/scan-gram.l"
 return PERCENT_EXPECT_RR;
        YY_BREAK
 case 18:
 YY_RULE_SETUP
-#line 242 "src/scan-gram.l"
+#line 244 "src/scan-gram.l"
 return PERCENT_FILE_PREFIX;
        YY_BREAK
 case 19:
 YY_RULE_SETUP
-#line 243 "src/scan-gram.l"
+#line 245 "src/scan-gram.l"
 return PERCENT_YACC;
        YY_BREAK
 case 20:
 YY_RULE_SETUP
-#line 244 "src/scan-gram.l"
+#line 246 "src/scan-gram.l"
 return PERCENT_INITIAL_ACTION;
        YY_BREAK
 case 21:
 YY_RULE_SETUP
-#line 245 "src/scan-gram.l"
+#line 247 "src/scan-gram.l"
 return PERCENT_GLR_PARSER;
        YY_BREAK
 case 22:
 YY_RULE_SETUP
-#line 246 "src/scan-gram.l"
+#line 248 "src/scan-gram.l"
 return PERCENT_LANGUAGE;
        YY_BREAK
 case 23:
 YY_RULE_SETUP
-#line 247 "src/scan-gram.l"
+#line 249 "src/scan-gram.l"
 return PERCENT_LEFT;
        YY_BREAK
 case 24:
 YY_RULE_SETUP
-#line 248 "src/scan-gram.l"
+#line 250 "src/scan-gram.l"
 RETURN_PERCENT_PARAM(lex);
        YY_BREAK
 case 25:
 YY_RULE_SETUP
-#line 249 "src/scan-gram.l"
+#line 251 "src/scan-gram.l"
 RETURN_PERCENT_FLAG("locations");
        YY_BREAK
 case 26:
 YY_RULE_SETUP
-#line 250 "src/scan-gram.l"
+#line 252 "src/scan-gram.l"
 return PERCENT_MERGE;
        YY_BREAK
 case 27:
 YY_RULE_SETUP
-#line 251 "src/scan-gram.l"
+#line 253 "src/scan-gram.l"
 return PERCENT_NAME_PREFIX;
        YY_BREAK
 case 28:
 YY_RULE_SETUP
-#line 252 "src/scan-gram.l"
+#line 254 "src/scan-gram.l"
 return PERCENT_NO_DEFAULT_PREC;
        YY_BREAK
 case 29:
 YY_RULE_SETUP
-#line 253 "src/scan-gram.l"
+#line 255 "src/scan-gram.l"
 return PERCENT_NO_LINES;
        YY_BREAK
 case 30:
 YY_RULE_SETUP
-#line 254 "src/scan-gram.l"
+#line 256 "src/scan-gram.l"
 return PERCENT_NONASSOC;
        YY_BREAK
 case 31:
 YY_RULE_SETUP
-#line 255 "src/scan-gram.l"
+#line 257 "src/scan-gram.l"
 return PERCENT_NONDETERMINISTIC_PARSER;
        YY_BREAK
 case 32:
 YY_RULE_SETUP
-#line 256 "src/scan-gram.l"
+#line 258 "src/scan-gram.l"
 return PERCENT_NTERM;
        YY_BREAK
 case 33:
 YY_RULE_SETUP
-#line 257 "src/scan-gram.l"
+#line 259 "src/scan-gram.l"
 return PERCENT_OUTPUT;
        YY_BREAK
 case 34:
 YY_RULE_SETUP
-#line 258 "src/scan-gram.l"
+#line 260 "src/scan-gram.l"
 RETURN_PERCENT_PARAM(both);
        YY_BREAK
 case 35:
 YY_RULE_SETUP
-#line 259 "src/scan-gram.l"
+#line 261 "src/scan-gram.l"
 RETURN_PERCENT_PARAM(parse);
        YY_BREAK
 case 36:
 YY_RULE_SETUP
-#line 260 "src/scan-gram.l"
+#line 262 "src/scan-gram.l"
 return PERCENT_PREC;
        YY_BREAK
 case 37:
 YY_RULE_SETUP
-#line 261 "src/scan-gram.l"
+#line 263 "src/scan-gram.l"
 return PERCENT_PRECEDENCE;
        YY_BREAK
 case 38:
 YY_RULE_SETUP
-#line 262 "src/scan-gram.l"
+#line 264 "src/scan-gram.l"
 return PERCENT_PRINTER;
        YY_BREAK
 case 39:
 YY_RULE_SETUP
-#line 263 "src/scan-gram.l"
+#line 265 "src/scan-gram.l"
 RETURN_PERCENT_FLAG("api.pure");
        YY_BREAK
 case 40:
 YY_RULE_SETUP
-#line 264 "src/scan-gram.l"
+#line 266 "src/scan-gram.l"
 return PERCENT_REQUIRE;
        YY_BREAK
 case 41:
 YY_RULE_SETUP
-#line 265 "src/scan-gram.l"
+#line 267 "src/scan-gram.l"
 return PERCENT_RIGHT;
        YY_BREAK
 case 42:
 YY_RULE_SETUP
-#line 266 "src/scan-gram.l"
+#line 268 "src/scan-gram.l"
 return PERCENT_SKELETON;
        YY_BREAK
 case 43:
 YY_RULE_SETUP
-#line 267 "src/scan-gram.l"
+#line 269 "src/scan-gram.l"
 return PERCENT_START;
        YY_BREAK
 case 44:
 YY_RULE_SETUP
-#line 268 "src/scan-gram.l"
+#line 270 "src/scan-gram.l"
 return PERCENT_TOKEN;
        YY_BREAK
 case 45:
 YY_RULE_SETUP
-#line 269 "src/scan-gram.l"
+#line 271 "src/scan-gram.l"
 return PERCENT_TOKEN;
        YY_BREAK
 case 46:
 YY_RULE_SETUP
-#line 270 "src/scan-gram.l"
+#line 272 "src/scan-gram.l"
 return PERCENT_TOKEN_TABLE;
        YY_BREAK
 case 47:
 YY_RULE_SETUP
-#line 271 "src/scan-gram.l"
+#line 273 "src/scan-gram.l"
 return PERCENT_TYPE;
        YY_BREAK
 case 48:
 YY_RULE_SETUP
-#line 272 "src/scan-gram.l"
+#line 274 "src/scan-gram.l"
 return PERCENT_UNION;
        YY_BREAK
 case 49:
 YY_RULE_SETUP
-#line 273 "src/scan-gram.l"
+#line 275 "src/scan-gram.l"
 return PERCENT_VERBOSE;
        YY_BREAK
 case 50:
 YY_RULE_SETUP
-#line 274 "src/scan-gram.l"
+#line 276 "src/scan-gram.l"
 return PERCENT_YACC;
        YY_BREAK
 /* deprecated */
 case 51:
 YY_RULE_SETUP
-#line 277 "src/scan-gram.l"
+#line 279 "src/scan-gram.l"
 DEPRECATED("%default-prec");
        YY_BREAK
 case 52:
 YY_RULE_SETUP
-#line 278 "src/scan-gram.l"
+#line 280 "src/scan-gram.l"
 DEPRECATED("%define parse.error verbose");
        YY_BREAK
 case 53:
 YY_RULE_SETUP
-#line 279 "src/scan-gram.l"
+#line 281 "src/scan-gram.l"
 DEPRECATED("%expect-rr");
        YY_BREAK
 case 54:
 /* rule 54 can match eol */
 YY_RULE_SETUP
-#line 280 "src/scan-gram.l"
+#line 282 "src/scan-gram.l"
 DEPRECATED("%file-prefix");
        YY_BREAK
 case 55:
 YY_RULE_SETUP
-#line 281 "src/scan-gram.l"
+#line 283 "src/scan-gram.l"
 DEPRECATED("%fixed-output-files");
        YY_BREAK
 case 56:
 /* rule 56 can match eol */
 YY_RULE_SETUP
-#line 282 "src/scan-gram.l"
+#line 284 "src/scan-gram.l"
 DEPRECATED("%name-prefix");
        YY_BREAK
 case 57:
 YY_RULE_SETUP
-#line 283 "src/scan-gram.l"
+#line 285 "src/scan-gram.l"
 DEPRECATED("%no-default-prec");
        YY_BREAK
 case 58:
 YY_RULE_SETUP
-#line 284 "src/scan-gram.l"
+#line 286 "src/scan-gram.l"
 DEPRECATED("%no-lines");
        YY_BREAK
 case 59:
 /* rule 59 can match eol */
 YY_RULE_SETUP
-#line 285 "src/scan-gram.l"
+#line 287 "src/scan-gram.l"
 DEPRECATED("%output");
        YY_BREAK
 case 60:
 YY_RULE_SETUP
-#line 286 "src/scan-gram.l"
+#line 288 "src/scan-gram.l"
 DEPRECATED("%pure-parser");
        YY_BREAK
 case 61:
 YY_RULE_SETUP
-#line 287 "src/scan-gram.l"
+#line 289 "src/scan-gram.l"
 DEPRECATED("%token-table");
        YY_BREAK
 case 62:
 YY_RULE_SETUP
-#line 289 "src/scan-gram.l"
+#line 291 "src/scan-gram.l"
 {
     complain (loc, complaint, _("invalid directive: %s"), quote (gram_text));
   }
        YY_BREAK
 case 63:
 YY_RULE_SETUP
-#line 293 "src/scan-gram.l"
+#line 295 "src/scan-gram.l"
 return EQUAL;
        YY_BREAK
 case 64:
 YY_RULE_SETUP
-#line 294 "src/scan-gram.l"
+#line 296 "src/scan-gram.l"
 return PIPE;
        YY_BREAK
 case 65:
 YY_RULE_SETUP
-#line 295 "src/scan-gram.l"
+#line 297 "src/scan-gram.l"
 return SEMICOLON;
        YY_BREAK
 case 66:
 YY_RULE_SETUP
-#line 297 "src/scan-gram.l"
+#line 299 "src/scan-gram.l"
 {
     val->uniqstr = uniqstr_new (gram_text);
     id_loc = *loc;
@@ -1948,7 +1966,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 67:
 YY_RULE_SETUP
-#line 309 "src/scan-gram.l"
+#line 311 "src/scan-gram.l"
 {
     val->integer = scan_integer (gram_text, 10, *loc);
 #if 0
@@ -1966,7 +1984,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 68:
 YY_RULE_SETUP
-#line 323 "src/scan-gram.l"
+#line 325 "src/scan-gram.l"
 {
     val->integer = scan_integer (gram_text, 16, *loc);
 #if 0
@@ -1986,7 +2004,7 @@ YY_RULE_SETUP
      accept "1FOO" as "1 FOO".  */
 case 69:
 YY_RULE_SETUP
-#line 340 "src/scan-gram.l"
+#line 342 "src/scan-gram.l"
 {
     complain (loc, complaint, _("invalid identifier: %s"), quote (gram_text));
   }
@@ -1994,25 +2012,25 @@ YY_RULE_SETUP
 /* Characters.  */
 case 70:
 YY_RULE_SETUP
-#line 345 "src/scan-gram.l"
+#line 347 "src/scan-gram.l"
 token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER; gram_piece_pack(); gram_piece_append("<AST_Char>"); gram_piece_flush(strlen(gram_text)); gram_piece_append("<AST_Text>");
        YY_BREAK
 /* Strings. */
 case 71:
 YY_RULE_SETUP
-#line 348 "src/scan-gram.l"
+#line 350 "src/scan-gram.l"
 token_start = loc->start; BEGIN SC_ESCAPED_STRING; gram_piece_pack(); gram_piece_append("<AST_String>"); gram_piece_flush(strlen(gram_text)); gram_piece_append("<AST_Text>");
        YY_BREAK
 /* Prologue. */
 case 72:
 YY_RULE_SETUP
-#line 351 "src/scan-gram.l"
+#line 353 "src/scan-gram.l"
 code_start = loc->start; BEGIN SC_PROLOGUE; gram_piece_pack(); gram_piece_append("<AST_Section1_Prologue>"); gram_piece_flush(strlen(gram_text)); gram_piece_append("<AST_Text>");
        YY_BREAK
 /* Code in between braces.  */
 case 73:
 YY_RULE_SETUP
-#line 354 "src/scan-gram.l"
+#line 356 "src/scan-gram.l"
 {
     STRING_GROW;
     nesting = 0;
@@ -2028,7 +2046,7 @@ YY_RULE_SETUP
 case 74:
 /* rule 74 can match eol */
 YY_RULE_SETUP
-#line 366 "src/scan-gram.l"
+#line 368 "src/scan-gram.l"
 {
     nesting = 0;
     code_start = loc->start;
@@ -2039,20 +2057,41 @@ YY_RULE_SETUP
     BEGIN SC_PREDICATE;
   }
        YY_BREAK
-/* A type. */
+/* Nick extra rules for element groups */
 case 75:
 YY_RULE_SETUP
-#line 377 "src/scan-gram.l"
-gram_piece_pack(); gram_piece_append("<AST_TagRef>&lt;<AST_Text>*</AST_Text>&gt;</AST_TagRef>"); return ~TAG_ANY; /*return TAG_ANY;*/
+#line 379 "src/scan-gram.l"
+{
+    STRING_GROW;
+    nesting = 0;
+    code_start = loc->start;
+    BEGIN SC_ELEMENT_GROUP;
+ gram_piece_pack();
+ gram_piece_flush(strlen(gram_text));
+ gram_piece_append("<AST_Text>");
+  }
        YY_BREAK
 case 76:
 YY_RULE_SETUP
-#line 378 "src/scan-gram.l"
-gram_piece_pack(); gram_piece_append("<AST_TagRef>&lt;<AST_Text />&gt;</AST_TagRef>"); return ~TAG_NONE; /*return TAG_NONE;*/
+#line 388 "src/scan-gram.l"
+{
+    return ')';
+  }
        YY_BREAK
+/* A type. */
 case 77:
 YY_RULE_SETUP
-#line 379 "src/scan-gram.l"
+#line 393 "src/scan-gram.l"
+gram_piece_pack(); gram_piece_append("<AST_TagRef>&lt;<AST_Text>*</AST_Text>&gt;</AST_TagRef>"); return ~TAG_ANY; /*return TAG_ANY;*/
+       YY_BREAK
+case 78:
+YY_RULE_SETUP
+#line 394 "src/scan-gram.l"
+gram_piece_pack(); gram_piece_append("<AST_TagRef>&lt;<AST_Text />&gt;</AST_TagRef>"); return ~TAG_NONE; /*return TAG_NONE;*/
+       YY_BREAK
+case 79:
+YY_RULE_SETUP
+#line 395 "src/scan-gram.l"
 {
     nesting = 0;
     token_start = loc->start;
@@ -2063,9 +2102,9 @@ YY_RULE_SETUP
  gram_piece_append("<AST_Text>");
   }
        YY_BREAK
-case 78:
+case 80:
 YY_RULE_SETUP
-#line 389 "src/scan-gram.l"
+#line 405 "src/scan-gram.l"
 {
     static int percent_percent_count;
     if (++percent_percent_count == 2)
@@ -2080,9 +2119,9 @@ YY_RULE_SETUP
     return PERCENT_PERCENT;
   }
        YY_BREAK
-case 79:
+case 81:
 YY_RULE_SETUP
-#line 403 "src/scan-gram.l"
+#line 419 "src/scan-gram.l"
 {
     bracketed_id_str = NULL;
     bracketed_id_start = loc->start;
@@ -2090,9 +2129,9 @@ YY_RULE_SETUP
     BEGIN SC_BRACKETED_ID;
   }
        YY_BREAK
-case 80:
+case 82:
 YY_RULE_SETUP
-#line 410 "src/scan-gram.l"
+#line 426 "src/scan-gram.l"
 {
     complain (loc, complaint, "%s: %s",
               ngettext ("invalid character", "invalid characters", gram_leng),
@@ -2100,7 +2139,7 @@ YY_RULE_SETUP
   }
        YY_BREAK
 case YY_STATE_EOF(INITIAL):
-#line 416 "src/scan-gram.l"
+#line 432 "src/scan-gram.l"
 {
     loc->start = loc->end = scanner_cursor;
     yyterminate ();
@@ -2113,9 +2152,9 @@ case YY_STATE_EOF(INITIAL):
   `--------------------------------------------------------------*/
 
 
-case 81:
+case 83:
 YY_RULE_SETUP
-#line 430 "src/scan-gram.l"
+#line 446 "src/scan-gram.l"
 complain (loc, complaint, _("invalid null character"));
        YY_BREAK
 
@@ -2124,9 +2163,9 @@ complain (loc, complaint, _("invalid null character"));
   `-----------------------------------------------------------------*/
 
 
-case 82:
+case 84:
 YY_RULE_SETUP
-#line 440 "src/scan-gram.l"
+#line 456 "src/scan-gram.l"
 {
     if (bracketed_id_str)
       {
@@ -2143,9 +2182,9 @@ YY_RULE_SETUP
       }
   }
        YY_BREAK
-case 83:
+case 85:
 YY_RULE_SETUP
-#line 455 "src/scan-gram.l"
+#line 471 "src/scan-gram.l"
 {
     BEGIN (bracketed_id_str ? SC_RETURN_BRACKETED_ID : INITIAL);
     *loc = id_loc;
@@ -2157,9 +2196,9 @@ YY_RULE_SETUP
 #endif
   }
        YY_BREAK
-case 84:
+case 86:
 YY_RULE_SETUP
-#line 465 "src/scan-gram.l"
+#line 481 "src/scan-gram.l"
 {
     ROLLBACK_CURRENT_TOKEN;
     BEGIN (bracketed_id_str ? SC_RETURN_BRACKETED_ID : INITIAL);
@@ -2172,7 +2211,7 @@ YY_RULE_SETUP
   }
        YY_BREAK
 case YY_STATE_EOF(SC_AFTER_IDENTIFIER):
-#line 475 "src/scan-gram.l"
+#line 491 "src/scan-gram.l"
 {
     BEGIN (bracketed_id_str ? SC_RETURN_BRACKETED_ID : INITIAL);
     *loc = id_loc;
@@ -2189,9 +2228,9 @@ case YY_STATE_EOF(SC_AFTER_IDENTIFIER):
   `--------------------------------*/
 
 
-case 85:
+case 87:
 YY_RULE_SETUP
-#line 492 "src/scan-gram.l"
+#line 508 "src/scan-gram.l"
 {
     if (bracketed_id_str)
       {
@@ -2206,9 +2245,9 @@ YY_RULE_SETUP
       }
   }
        YY_BREAK
-case 86:
+case 88:
 YY_RULE_SETUP
-#line 505 "src/scan-gram.l"
+#line 521 "src/scan-gram.l"
 {
     BEGIN bracketed_id_context_state;
     if (bracketed_id_str)
@@ -2225,9 +2264,9 @@ YY_RULE_SETUP
       complain (loc, complaint, _("an identifier expected"));
   }
        YY_BREAK
-case 87:
+case 89:
 YY_RULE_SETUP
-#line 521 "src/scan-gram.l"
+#line 537 "src/scan-gram.l"
 {
     complain (loc, complaint, "%s: %s",
               ngettext ("invalid character in bracketed name",
@@ -2236,7 +2275,7 @@ YY_RULE_SETUP
   }
        YY_BREAK
 case YY_STATE_EOF(SC_BRACKETED_ID):
-#line 528 "src/scan-gram.l"
+#line 544 "src/scan-gram.l"
 {
     BEGIN bracketed_id_context_state;
     unexpected_eof (bracketed_id_start, "]");
@@ -2245,9 +2284,9 @@ case YY_STATE_EOF(SC_BRACKETED_ID):
 
 
 
-case 88:
+case 90:
 YY_RULE_SETUP
-#line 536 "src/scan-gram.l"
+#line 552 "src/scan-gram.l"
 {
     ROLLBACK_CURRENT_TOKEN;
     val->uniqstr = bracketed_id_str;
@@ -2263,19 +2302,19 @@ YY_RULE_SETUP
   `---------------------------------------------------------------*/
 
 
-case 89:
+case 91:
 YY_RULE_SETUP
-#line 553 "src/scan-gram.l"
+#line 569 "src/scan-gram.l"
 BEGIN context_state;
        YY_BREAK
-case 90:
-/* rule 90 can match eol */
+case 92:
+/* rule 92 can match eol */
 YY_RULE_SETUP
-#line 554 "src/scan-gram.l"
+#line 570 "src/scan-gram.l"
 continue;
        YY_BREAK
 case YY_STATE_EOF(SC_YACC_COMMENT):
-#line 555 "src/scan-gram.l"
+#line 571 "src/scan-gram.l"
 unexpected_eof (token_start, "*/"); BEGIN context_state;
        YY_BREAK
 
@@ -2284,14 +2323,14 @@ unexpected_eof (token_start, "*/"); BEGIN context_state;
   `------------------------------------------------------------*/
 
 
-case 91:
-/* rule 91 can match eol */
+case 93:
+/* rule 93 can match eol */
 YY_RULE_SETUP
-#line 565 "src/scan-gram.l"
+#line 581 "src/scan-gram.l"
 STRING_GROW; BEGIN context_state;
        YY_BREAK
 case YY_STATE_EOF(SC_COMMENT):
-#line 566 "src/scan-gram.l"
+#line 582 "src/scan-gram.l"
 unexpected_eof (token_start, "*/"); BEGIN context_state;
        YY_BREAK
 
@@ -2300,20 +2339,20 @@ unexpected_eof (token_start, "*/"); BEGIN context_state;
   `--------------------------------------------------------------*/
 
 
-case 92:
-/* rule 92 can match eol */
+case 94:
+/* rule 94 can match eol */
 YY_RULE_SETUP
-#line 576 "src/scan-gram.l"
+#line 592 "src/scan-gram.l"
 STRING_GROW; BEGIN context_state;
        YY_BREAK
-case 93:
-/* rule 93 can match eol */
+case 95:
+/* rule 95 can match eol */
 YY_RULE_SETUP
-#line 577 "src/scan-gram.l"
+#line 593 "src/scan-gram.l"
 STRING_GROW;
        YY_BREAK
 case YY_STATE_EOF(SC_LINE_COMMENT):
-#line 578 "src/scan-gram.l"
+#line 594 "src/scan-gram.l"
 BEGIN context_state;
        YY_BREAK
 
@@ -2323,9 +2362,9 @@ BEGIN context_state;
   `------------------------------------------------*/
 
 
-case 94:
+case 96:
 YY_RULE_SETUP
-#line 589 "src/scan-gram.l"
+#line 605 "src/scan-gram.l"
 {
     STRING_FINISH;
     loc->start = token_start;
@@ -2343,13 +2382,13 @@ YY_RULE_SETUP
   }
        YY_BREAK
 case YY_STATE_EOF(SC_ESCAPED_STRING):
-#line 604 "src/scan-gram.l"
+#line 620 "src/scan-gram.l"
 unexpected_eof (token_start, "\"");
        YY_BREAK
-case 95:
-/* rule 95 can match eol */
+case 97:
+/* rule 97 can match eol */
 YY_RULE_SETUP
-#line 605 "src/scan-gram.l"
+#line 621 "src/scan-gram.l"
 unexpected_newline (token_start, "\"");
        YY_BREAK
 
@@ -2359,9 +2398,9 @@ unexpected_newline (token_start, "\"");
   `----------------------------------------------------------*/
 
 
-case 96:
+case 98:
 YY_RULE_SETUP
-#line 615 "src/scan-gram.l"
+#line 631 "src/scan-gram.l"
 {
     STRING_FINISH;
     loc->start = token_start;
@@ -2390,14 +2429,14 @@ YY_RULE_SETUP
 #endif
   }
        YY_BREAK
-case 97:
-/* rule 97 can match eol */
+case 99:
+/* rule 99 can match eol */
 YY_RULE_SETUP
-#line 642 "src/scan-gram.l"
+#line 658 "src/scan-gram.l"
 unexpected_newline (token_start, "'");
        YY_BREAK
 case YY_STATE_EOF(SC_ESCAPED_CHARACTER):
-#line 643 "src/scan-gram.l"
+#line 659 "src/scan-gram.l"
 unexpected_eof (token_start, "'");
        YY_BREAK
 
@@ -2406,9 +2445,9 @@ unexpected_eof (token_start, "'");
   `--------------------------------------------------------------*/
 
 
-case 98:
+case 100:
 YY_RULE_SETUP
-#line 654 "src/scan-gram.l"
+#line 670 "src/scan-gram.l"
 {
     --nesting;
     if (nesting < 0)
@@ -2431,19 +2470,19 @@ YY_RULE_SETUP
     STRING_GROW;
   }
        YY_BREAK
-case 99:
-/* rule 99 can match eol */
+case 101:
+/* rule 101 can match eol */
 YY_RULE_SETUP
-#line 676 "src/scan-gram.l"
+#line 692 "src/scan-gram.l"
 STRING_GROW;
        YY_BREAK
-case 100:
+case 102:
 YY_RULE_SETUP
-#line 677 "src/scan-gram.l"
+#line 693 "src/scan-gram.l"
 STRING_GROW; nesting += gram_leng;
        YY_BREAK
 case YY_STATE_EOF(SC_TAG):
-#line 679 "src/scan-gram.l"
+#line 695 "src/scan-gram.l"
 unexpected_eof (token_start, ">");
        YY_BREAK
 
@@ -2452,9 +2491,9 @@ unexpected_eof (token_start, ">");
   `----------------------------*/
 
 
-case 101:
+case 103:
 YY_RULE_SETUP
-#line 688 "src/scan-gram.l"
+#line 704 "src/scan-gram.l"
 {
     unsigned long int c = strtoul (gram_text + 1, NULL, 8);
     if (!c || UCHAR_MAX < c)
@@ -2470,9 +2509,9 @@ YY_RULE_SETUP
  }
   }
        YY_BREAK
-case 102:
+case 104:
 YY_RULE_SETUP
-#line 703 "src/scan-gram.l"
+#line 719 "src/scan-gram.l"
 {
     verify (UCHAR_MAX < ULONG_MAX);
     unsigned long int c = strtoul (gram_text + 2, NULL, 16);
@@ -2489,50 +2528,50 @@ YY_RULE_SETUP
  }
   }
        YY_BREAK
-case 103:
+case 105:
 YY_RULE_SETUP
-#line 719 "src/scan-gram.l"
+#line 735 "src/scan-gram.l"
 obstack_1grow (&obstack_for_string, '\a'); gram_piece_append("<AST_Text_Escape character=\"7\">"); gram_piece_flush(strlen(gram_text)); gram_piece_append("</AST_Text_Escape>");
        YY_BREAK
-case 104:
+case 106:
 YY_RULE_SETUP
-#line 720 "src/scan-gram.l"
+#line 736 "src/scan-gram.l"
 obstack_1grow (&obstack_for_string, '\b'); gram_piece_append("<AST_Text_Escape character=\"8\">"); gram_piece_flush(strlen(gram_text)); gram_piece_append("</AST_Text_Escape>");
        YY_BREAK
-case 105:
+case 107:
 YY_RULE_SETUP
-#line 721 "src/scan-gram.l"
+#line 737 "src/scan-gram.l"
 obstack_1grow (&obstack_for_string, '\f'); gram_piece_append("<AST_Text_Escape character=\"12\">"); gram_piece_flush(strlen(gram_text)); gram_piece_append("</AST_Text_Escape>");
        YY_BREAK
-case 106:
+case 108:
 YY_RULE_SETUP
-#line 722 "src/scan-gram.l"
+#line 738 "src/scan-gram.l"
 obstack_1grow (&obstack_for_string, '\n'); gram_piece_append("<AST_Text_Escape character=\"10\">"); gram_piece_flush(strlen(gram_text)); gram_piece_append("</AST_Text_Escape>");
        YY_BREAK
-case 107:
+case 109:
 YY_RULE_SETUP
-#line 723 "src/scan-gram.l"
+#line 739 "src/scan-gram.l"
 obstack_1grow (&obstack_for_string, '\r'); gram_piece_append("<AST_Text_Escape character=\"13\">"); gram_piece_flush(strlen(gram_text)); gram_piece_append("</AST_Text_Escape>");
        YY_BREAK
-case 108:
+case 110:
 YY_RULE_SETUP
-#line 724 "src/scan-gram.l"
+#line 740 "src/scan-gram.l"
 obstack_1grow (&obstack_for_string, '\t'); gram_piece_append("<AST_Text_Escape character=\"9\">"); gram_piece_flush(strlen(gram_text)); gram_piece_append("</AST_Text_Escape>");
        YY_BREAK
-case 109:
+case 111:
 YY_RULE_SETUP
-#line 725 "src/scan-gram.l"
+#line 741 "src/scan-gram.l"
 obstack_1grow (&obstack_for_string, '\v'); gram_piece_append("<AST_Text_Escape character=\"11\">"); gram_piece_flush(strlen(gram_text)); gram_piece_append("</AST_Text_Escape>");
        YY_BREAK
 /* \\[\"\'?\\] would be shorter, but it confuses xgettext.  */
-case 110:
+case 112:
 YY_RULE_SETUP
-#line 728 "src/scan-gram.l"
+#line 744 "src/scan-gram.l"
 obstack_1grow (&obstack_for_string, gram_text[1]); sprintf(gram_piece_temp, "<AST_Text_Escape character=\"%d\">", gram_text[1]); gram_piece_append(gram_piece_temp); gram_piece_flush(strlen(gram_text)); gram_piece_append("</AST_Text_Escape>"); 
        YY_BREAK
-case 111:
+case 113:
 YY_RULE_SETUP
-#line 730 "src/scan-gram.l"
+#line 746 "src/scan-gram.l"
 {
     int c = convert_ucn_to_byte (gram_text);
     if (c <= 0)
@@ -2548,10 +2587,10 @@ YY_RULE_SETUP
  }
   }
        YY_BREAK
-case 112:
-/* rule 112 can match eol */
+case 114:
+/* rule 114 can match eol */
 YY_RULE_SETUP
-#line 744 "src/scan-gram.l"
+#line 760 "src/scan-gram.l"
 {
     char const *p = gram_text + 1;
     /* Quote only if escaping won't make the character visible.  */
@@ -2569,57 +2608,58 @@ YY_RULE_SETUP
   `--------------------------------------------*/
 
 
-case 113:
-/* rule 113 can match eol */
+case 115:
+/* rule 115 can match eol */
 YY_RULE_SETUP
-#line 762 "src/scan-gram.l"
+#line 778 "src/scan-gram.l"
 STRING_GROW;
        YY_BREAK
 
 
 
-case 114:
+case 116:
 YY_RULE_SETUP
-#line 767 "src/scan-gram.l"
+#line 783 "src/scan-gram.l"
 STRING_GROW; BEGIN context_state;
        YY_BREAK
-case 115:
-/* rule 115 can match eol */
+case 117:
+/* rule 117 can match eol */
 YY_RULE_SETUP
-#line 768 "src/scan-gram.l"
+#line 784 "src/scan-gram.l"
 unexpected_newline (token_start, "'");
        YY_BREAK
 case YY_STATE_EOF(SC_CHARACTER):
-#line 769 "src/scan-gram.l"
+#line 785 "src/scan-gram.l"
 unexpected_eof (token_start, "'");
        YY_BREAK
 
 
 
-case 116:
+case 118:
 YY_RULE_SETUP
-#line 774 "src/scan-gram.l"
+#line 790 "src/scan-gram.l"
 STRING_GROW; BEGIN context_state;
        YY_BREAK
-case 117:
-/* rule 117 can match eol */
+case 119:
+/* rule 119 can match eol */
 YY_RULE_SETUP
-#line 775 "src/scan-gram.l"
+#line 791 "src/scan-gram.l"
 unexpected_newline (token_start, "\"");
        YY_BREAK
 case YY_STATE_EOF(SC_STRING):
-#line 776 "src/scan-gram.l"
+#line 792 "src/scan-gram.l"
 unexpected_eof (token_start, "\"");
        YY_BREAK
 
 /*---------------------------------------------------.
   | Strings, comments etc. can be found in user code.  |
   `---------------------------------------------------*/
+/* Nick added: SC_ELEMENT_GROUP */
 
 
-case 118:
+case 120:
 YY_RULE_SETUP
-#line 786 "src/scan-gram.l"
+#line 803 "src/scan-gram.l"
 {
     STRING_GROW;
     context_state = YY_START;
@@ -2627,9 +2667,9 @@ YY_RULE_SETUP
     BEGIN SC_CHARACTER;
   }
        YY_BREAK
-case 119:
+case 121:
 YY_RULE_SETUP
-#line 792 "src/scan-gram.l"
+#line 809 "src/scan-gram.l"
 {
     STRING_GROW;
     context_state = YY_START;
@@ -2637,10 +2677,10 @@ YY_RULE_SETUP
     BEGIN SC_STRING;
   }
        YY_BREAK
-case 120:
-/* rule 120 can match eol */
+case 122:
+/* rule 122 can match eol */
 YY_RULE_SETUP
-#line 798 "src/scan-gram.l"
+#line 815 "src/scan-gram.l"
 {
     STRING_GROW;
     context_state = YY_START;
@@ -2648,10 +2688,10 @@ YY_RULE_SETUP
     BEGIN SC_COMMENT;
   }
        YY_BREAK
-case 121:
-/* rule 121 can match eol */
+case 123:
+/* rule 123 can match eol */
 YY_RULE_SETUP
-#line 804 "src/scan-gram.l"
+#line 821 "src/scan-gram.l"
 {
     STRING_GROW;
     context_state = YY_START;
@@ -2663,39 +2703,41 @@ YY_RULE_SETUP
   | Scanning some code in braces (actions, predicates). The    |
   | initial "{" is already eaten.                              |
   `-----------------------------------------------------------*/
+/* Nick added: SC_ELEMENT_GROUP */
 
 
-case 122:
-/* rule 122 can match eol */
+case 124:
+/* rule 124 can match eol */
 YY_RULE_SETUP
-#line 820 "src/scan-gram.l"
+#line 838 "src/scan-gram.l"
 STRING_GROW; nesting++;
        YY_BREAK
-case 123:
-/* rule 123 can match eol */
+case 125:
+/* rule 125 can match eol */
 YY_RULE_SETUP
-#line 821 "src/scan-gram.l"
+#line 839 "src/scan-gram.l"
 STRING_GROW; nesting--;
        YY_BREAK
 /* Tokenize '<<%' correctly (as '<<' '%') rather than incorrrectly
      (as '<' '<%').  */
-case 124:
-/* rule 124 can match eol */
+case 126:
+/* rule 126 can match eol */
 YY_RULE_SETUP
-#line 825 "src/scan-gram.l"
+#line 843 "src/scan-gram.l"
 STRING_GROW;
        YY_BREAK
 case YY_STATE_EOF(SC_BRACED_CODE):
 case YY_STATE_EOF(SC_PREDICATE):
-#line 827 "src/scan-gram.l"
+case YY_STATE_EOF(SC_ELEMENT_GROUP):
+#line 845 "src/scan-gram.l"
 unexpected_eof (code_start, "}");
        YY_BREAK
 
 
 
-case 125:
+case 127:
 YY_RULE_SETUP
-#line 832 "src/scan-gram.l"
+#line 850 "src/scan-gram.l"
 {
     obstack_1grow (&obstack_for_string, '}');
 
@@ -2721,9 +2763,9 @@ YY_RULE_SETUP
 
 
 
-case 126:
+case 128:
 YY_RULE_SETUP
-#line 857 "src/scan-gram.l"
+#line 875 "src/scan-gram.l"
 {
     --nesting;
     if (nesting < 0)
@@ -2747,14 +2789,42 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
+/* Nick extra rules for element groups */
+
+
+case 129:
+YY_RULE_SETUP
+#line 901 "src/scan-gram.l"
+{
+    obstack_1grow (&obstack_for_string, '}');
+
+    --nesting;
+    if (nesting < 0)
+      {
+        STRING_FINISH;
+        loc->start = code_start;
+        STRING_FREE; //val->code = last_string;
+        BEGIN INITIAL;
+#if 1
+ gram_piece_append("</AST_Text>");
+ gram_piece_escape(gram_text, strlen(gram_text));
+ gram_piece_pack();
+ return ~'(';
+#else
+        return '(';
+#endif
+      }
+  }
+       YY_BREAK
+
 /*--------------------------------------------------------------.
   | Scanning some prologue: from "%{" (already scanned) to "%}".  |
   `--------------------------------------------------------------*/
 
 
-case 127:
+case 130:
 YY_RULE_SETUP
-#line 886 "src/scan-gram.l"
+#line 929 "src/scan-gram.l"
 {
     STRING_FINISH;
     loc->start = code_start;
@@ -2772,7 +2842,7 @@ YY_RULE_SETUP
   }
        YY_BREAK
 case YY_STATE_EOF(SC_PROLOGUE):
-#line 902 "src/scan-gram.l"
+#line 945 "src/scan-gram.l"
 unexpected_eof (code_start, "%}");
        YY_BREAK
 
@@ -2783,7 +2853,7 @@ unexpected_eof (code_start, "%}");
 
 
 case YY_STATE_EOF(SC_EPILOGUE):
-#line 913 "src/scan-gram.l"
+#line 956 "src/scan-gram.l"
 {
     STRING_FINISH;
     loc->start = code_start;
@@ -2801,20 +2871,22 @@ case YY_STATE_EOF(SC_EPILOGUE):
 /*-----------------------------------------------------.
   | By default, grow the string obstack with the input.  |
   `-----------------------------------------------------*/
-case 128:
-#line 933 "src/scan-gram.l"
-case 129:
-/* rule 129 can match eol */
-YY_RULE_SETUP
-#line 933 "src/scan-gram.l"
+/* Nick added: SC_ELEMENT_GROUP */
+case 131:
+#line 977 "src/scan-gram.l"
+/* Nick added: SC_ELEMENT_GROUP */
+case 132:
+/* rule 132 can match eol */
+YY_RULE_SETUP
+#line 978 "src/scan-gram.l"
 STRING_GROW;
        YY_BREAK
-case 130:
+case 133:
 YY_RULE_SETUP
-#line 936 "src/scan-gram.l"
+#line 981 "src/scan-gram.l"
 YY_FATAL_ERROR( "flex scanner jammed" );
        YY_BREAK
-#line 2804 "src/scan-gram.c"
+#line 2876 "src/scan-gram.c"
 case YY_STATE_EOF(SC_RETURN_BRACKETED_ID):
        yyterminate();
 
@@ -3120,7 +3192,7 @@ static int yy_get_next_buffer (void)
        for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
                {
 /* %% [16.0] code to find the next state goes here */
-               register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 58);
+               register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 61);
                if ( yy_accept[yy_current_state] )
                        {
                        (yy_last_accepting_state) = yy_current_state;
@@ -3129,7 +3201,7 @@ static int yy_get_next_buffer (void)
                while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                        {
                        yy_current_state = (int) yy_def[yy_current_state];
-                       if ( yy_current_state >= 579 )
+                       if ( yy_current_state >= 587 )
                                yy_c = yy_meta[(unsigned int) yy_c];
                        }
                yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -3153,7 +3225,7 @@ static int yy_get_next_buffer (void)
     /* %% [17.0] code to find the next state, and perhaps do backing up, goes here */
        register char *yy_cp = (yy_c_buf_p);
 
-       register YY_CHAR yy_c = 58;
+       register YY_CHAR yy_c = 61;
        if ( yy_accept[yy_current_state] )
                {
                (yy_last_accepting_state) = yy_current_state;
@@ -3162,11 +3234,11 @@ static int yy_get_next_buffer (void)
        while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                {
                yy_current_state = (int) yy_def[yy_current_state];
-               if ( yy_current_state >= 579 )
+               if ( yy_current_state >= 587 )
                        yy_c = yy_meta[(unsigned int) yy_c];
                }
        yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-       yy_is_jam = (yy_current_state == 578);
+       yy_is_jam = (yy_current_state == 586);
 
        return yy_is_jam ? 0 : yy_current_state;
 }
@@ -3948,7 +4020,7 @@ void gram_free (void * ptr )
 
 /* %ok-for-header */
 
-#line 936 "src/scan-gram.l"
+#line 981 "src/scan-gram.l"
 
 
 
index 3d26285..f215d9d 100644 (file)
@@ -143,6 +143,8 @@ void gram_piece_pack();
 %x SC_STRING SC_CHARACTER
  /* Bracketed identifiers support. */
 %x SC_BRACKETED_ID SC_RETURN_BRACKETED_ID
+ /* Nick extra rules for element groups */
+%x SC_ELEMENT_GROUP
 
 letter    [.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_]
 notletter [^.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_]{-}[%\{]
@@ -373,6 +375,20 @@ eqopt    ([[:space:]]*=)?
     BEGIN SC_PREDICATE;
   }
 
+  /* Nick extra rules for element groups */
+  "(?E{" {
+    STRING_GROW;
+    nesting = 0;
+    code_start = loc->start;
+    BEGIN SC_ELEMENT_GROUP;
+ gram_piece_pack();
+ gram_piece_flush(strlen(yytext));
+ gram_piece_append("<AST_Text>");
+  }
+  ")" {
+    return ')';
+  }
+
   /* A type. */
   "<*>"       gram_piece_pack(); gram_piece_append("<AST_TagRef>&lt;<AST_Text>*</AST_Text>&gt;</AST_TagRef>"); return ~TAG_ANY; /*return TAG_ANY;*/
   "<>"        gram_piece_pack(); gram_piece_append("<AST_TagRef>&lt;<AST_Text />&gt;</AST_TagRef>"); return ~TAG_NONE; /*return TAG_NONE;*/
@@ -781,7 +797,8 @@ eqopt    ([[:space:]]*=)?
   | Strings, comments etc. can be found in user code.  |
   `---------------------------------------------------*/
 
-<SC_BRACED_CODE,SC_PROLOGUE,SC_EPILOGUE,SC_PREDICATE>
+ /* Nick added: SC_ELEMENT_GROUP */
+<SC_BRACED_CODE,SC_PROLOGUE,SC_EPILOGUE,SC_PREDICATE,SC_ELEMENT_GROUP>
 {
   "'" {
     STRING_GROW;
@@ -815,7 +832,8 @@ eqopt    ([[:space:]]*=)?
   | initial "{" is already eaten.                              |
   `-----------------------------------------------------------*/
 
-<SC_BRACED_CODE,SC_PREDICATE>
+ /* Nick added: SC_ELEMENT_GROUP */
+<SC_BRACED_CODE,SC_PREDICATE,SC_ELEMENT_GROUP>
 {
   "{"|"<"{splice}"%"  STRING_GROW; nesting++;
   "%"{splice}">"      STRING_GROW; nesting--;
@@ -877,6 +895,31 @@ eqopt    ([[:space:]]*=)?
   }
 }
 
+ /* Nick extra rules for element groups */
+<SC_ELEMENT_GROUP>
+{
+  "}" {
+    obstack_1grow (&obstack_for_string, '}');
+
+    --nesting;
+    if (nesting < 0)
+      {
+        STRING_FINISH;
+        loc->start = code_start;
+        STRING_FREE; //val->code = last_string;
+        BEGIN INITIAL;
+#if 1
+ gram_piece_append("</AST_Text>");
+ gram_piece_escape(yytext, strlen(yytext));
+ gram_piece_pack();
+ return ~'(';
+#else
+        return '(';
+#endif
+      }
+  }
+}
+
   /*--------------------------------------------------------------.
   | Scanning some prologue: from "%{" (already scanned) to "%}".  |
   `--------------------------------------------------------------*/
@@ -929,8 +972,10 @@ eqopt    ([[:space:]]*=)?
   | By default, grow the string obstack with the input.  |
   `-----------------------------------------------------*/
 
-<SC_COMMENT,SC_LINE_COMMENT,SC_BRACED_CODE,SC_PREDICATE,SC_PROLOGUE,SC_EPILOGUE,SC_STRING,SC_CHARACTER,SC_ESCAPED_STRING,SC_ESCAPED_CHARACTER>. |
-  <SC_COMMENT,SC_LINE_COMMENT,SC_BRACED_CODE,SC_PREDICATE,SC_PROLOGUE,SC_EPILOGUE>\n    STRING_GROW;
+ /* Nick added: SC_ELEMENT_GROUP */
+<SC_COMMENT,SC_LINE_COMMENT,SC_BRACED_CODE,SC_PREDICATE,SC_PROLOGUE,SC_EPILOGUE,SC_STRING,SC_CHARACTER,SC_ESCAPED_STRING,SC_ESCAPED_CHARACTER,SC_ELEMENT_GROUP>. |
+  /* Nick added: SC_ELEMENT_GROUP */
+  <SC_COMMENT,SC_LINE_COMMENT,SC_BRACED_CODE,SC_PREDICATE,SC_PROLOGUE,SC_EPILOGUE,SC_ELEMENT_GROUP>\n    STRING_GROW;
 
 
 %%