Allow value and stack references in action text of (?{...}...) element groups
authorNick Downing <nick@ndcode.org>
Sun, 20 Jan 2019 05:44:15 +0000 (16:44 +1100)
committerNick Downing <nick@ndcode.org>
Sun, 20 Jan 2019 05:48:06 +0000 (16:48 +1100)
src/parse-gram.c
src/parse-gram.h
src/parse-gram.y
src/reader.c
src/scan-gram.c
src/scan-gram.l

index 4d9cd0d..319bcbc 100644 (file)
@@ -120,7 +120,7 @@ extern int gram_debug;
 
   #include "symlist.h"
   #include "symtab.h"
-#line 248 "src/parse-gram.y" /* yacc.c:355  */
+#line 249 "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 906 "src/parse-gram.y" /* yacc.c:355  */
+#line 923 "src/parse-gram.y" /* yacc.c:355  */
 #include "muscle-tab.h"
 
 #line 136 "src/parse-gram.c" /* yacc.c:355  */
@@ -208,23 +208,23 @@ union GRAM_STYPE
 unsigned char character;
 #line 213 "src/parse-gram.y" /* yacc.c:355  */
 char *code;
-#line 218 "src/parse-gram.y" /* yacc.c:355  */
+#line 219 "src/parse-gram.y" /* yacc.c:355  */
 uniqstr uniqstr;
-#line 226 "src/parse-gram.y" /* yacc.c:355  */
+#line 227 "src/parse-gram.y" /* yacc.c:355  */
 int integer;
-#line 230 "src/parse-gram.y" /* yacc.c:355  */
+#line 231 "src/parse-gram.y" /* yacc.c:355  */
 symbol *symbol;
-#line 235 "src/parse-gram.y" /* yacc.c:355  */
+#line 236 "src/parse-gram.y" /* yacc.c:355  */
 assoc assoc;
-#line 238 "src/parse-gram.y" /* yacc.c:355  */
+#line 239 "src/parse-gram.y" /* yacc.c:355  */
 symbol_list *list;
-#line 241 "src/parse-gram.y" /* yacc.c:355  */
+#line 242 "src/parse-gram.y" /* yacc.c:355  */
 named_ref *named_ref;
-#line 268 "src/parse-gram.y" /* yacc.c:355  */
+#line 269 "src/parse-gram.y" /* yacc.c:355  */
 param_type param;
-#line 565 "src/parse-gram.y" /* yacc.c:355  */
+#line 566 "src/parse-gram.y" /* yacc.c:355  */
 code_props_type code_type;
-#line 908 "src/parse-gram.y" /* yacc.c:355  */
+#line 925 "src/parse-gram.y" /* yacc.c:355  */
 
   struct
   {
@@ -332,7 +332,7 @@ int gram_parse (void);
   extern char *code_piece[];
   extern int code_piece0;
   void code_piece_append(const char *str);
-  void code_piece_pack();
+  void code_piece_pack(void);
   
   extern char gram_piece_temp[], *gram_piece[];
   extern int gram_piece0, gram_piece1;
@@ -354,7 +354,7 @@ int gram_parse (void);
 
   /* Nick extra rules for element groups */
   int nested_rhs = 0;
-#line 258 "src/parse-gram.y" /* yacc.c:359  */
+#line 259 "src/parse-gram.y" /* yacc.c:359  */
 
   /** Add a lex-param and/or a parse-param.
    *
@@ -586,7 +586,7 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  3
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   211
+#define YYLAST   208
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  61
@@ -613,7 +613,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,
-      59,    60,     2,     2,     2,     2,     2,     2,     2,     2,
+      54,    60,     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,
@@ -639,26 +639,26 @@ static const yytype_uint8 yytranslate[] =
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
       35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
-      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
-      55,    56,    57,    58
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    55,
+      56,    57,    58,    59
 };
 
 #if GRAM_DEBUG
   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       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,   820,   837,   843,
-     852,   854,   859,   866,   872,   878,   878,   883,   890,   891,
-     901,   902,   927,   928,   929,   930,   942,   944,   953,   958,
-     959,   964,   972,   973
+       0,   292,   292,   307,   318,   322,   323,   335,   353,   360,
+     364,   371,   379,   384,   389,   393,   400,   413,   417,   421,
+     425,   429,   433,   433,   437,   441,   467,   471,   475,   479,
+     483,   484,   493,   494,   495,   503,   524,   530,   536,   551,
+     569,   570,   580,   581,   587,   606,   606,   613,   613,   620,
+     633,   651,   652,   653,   654,   658,   659,   664,   666,   671,
+     678,   691,   696,   704,   705,   709,   713,   717,   718,   719,
+     724,   729,   736,   745,   753,   767,   768,   777,   778,   784,
+     785,   786,   793,   793,   806,   810,   814,   821,   838,   844,
+     853,   855,   860,   867,   873,   879,   879,   900,   907,   908,
+     918,   919,   944,   945,   946,   947,   959,   961,   970,   975,
+     976,   981,   989,   990
 };
 #endif
 
@@ -679,9 +679,9 @@ static const char *const yytname[] =
   "\"%skeleton\"", "\"%start\"", "\"%token-table\"", "\"%verbose\"",
   "\"%yacc\"", "\"{...}\"", "\"%?{...}\"", "\"[identifier]\"", "\"char\"",
   "\"epilogue\"", "\"=\"", "\"identifier\"", "\"identifier:\"", "\"%%\"",
-  "\"|\"", "\"%{...%}\"", "\";\"", "\"<tag>\"", "\"<*>\"", "\"<>\"",
+  "\"|\"", "\"%{...%}\"", "\";\"", "\"<tag>\"", "\"<*>\"", "\"<>\"", "'('",
   "\"integer\"", "\"%param\"", "\"%union\"", "\"%empty\"", "\"%space\"",
-  "'('", "')'", "$accept", "input", "prologue_declarations",
+  "')'", "$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",
@@ -703,15 +703,15 @@ 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,   313,    40,
+     305,   306,   307,   308,    40,   309,   310,   311,   312,   313,
       41
 };
 # endif
 
-#define YYPACT_NINF -127
+#define YYPACT_NINF -128
 
 #define yypact_value_is_default(Yystate) \
-  (!!((Yystate) == (-127)))
+  (!!((Yystate) == (-128)))
 
 #define YYTABLE_NINF -113
 
@@ -722,21 +722,21 @@ static const yytype_uint16 yytoknum[] =
      STATE-NUM.  */
 static const yytype_int16 yypact[] =
 {
-    -127,    20,   155,  -127,  -127,  -127,     4,  -127,  -127,  -127,
-    -127,  -127,  -127,    -6,  -127,     3,    47,  -127,     8,     9,
-    -127,    51,  -127,    30,    68,    76,  -127,  -127,  -127,    77,
-      80,    84,     0,  -127,  -127,  -127,   112,  -127,  -127,  -127,
-      43,  -127,  -127,    50,  -127,  -127,    39,    31,    31,     0,
-    -127,    52,  -127,  -127,    -1,  -127,  -127,  -127,  -127,  -127,
-    -127,  -127,  -127,  -127,  -127,  -127,  -127,  -127,  -127,  -127,
-    -127,    44,  -127,    46,    18,  -127,  -127,    56,    61,  -127,
-      62,    33,  -127,     0,  -127,  -127,    31,    -2,    31,     0,
-    -127,  -127,  -127,  -127,  -127,  -127,  -127,  -127,    59,  -127,
-    -127,  -127,  -127,  -127,    64,  -127,  -127,  -127,  -127,    33,
-    -127,  -127,  -127,     0,  -127,    54,  -127,   101,  -127,  -127,
-    -127,  -127,  -127,  -127,  -127,  -127,  -127,   -39,    53,  -127,
-    -127,     0,    55,    63,    56,  -127,  -127,  -127,  -127,    56,
-      53,  -127,  -127,  -127,  -127,  -127,  -127,     1,  -127
+    -128,    12,   151,  -128,  -128,  -128,   -22,  -128,  -128,  -128,
+    -128,  -128,  -128,   -31,  -128,     7,    27,  -128,   -19,     4,
+    -128,    55,  -128,    29,    63,    68,  -128,  -128,  -128,    71,
+      73,    75,     1,  -128,  -128,  -128,    85,  -128,  -128,  -128,
+      35,  -128,  -128,    43,  -128,  -128,    36,    18,    18,     1,
+    -128,    49,  -128,  -128,     2,  -128,  -128,  -128,  -128,  -128,
+    -128,  -128,  -128,  -128,  -128,  -128,  -128,  -128,  -128,  -128,
+    -128,    50,  -128,    53,    15,  -128,  -128,    64,    65,  -128,
+      67,     3,  -128,     1,  -128,  -128,    18,    -2,    18,     1,
+    -128,  -128,  -128,  -128,  -128,  -128,  -128,  -128,    69,  -128,
+    -128,  -128,  -128,  -128,    72,  -128,  -128,  -128,  -128,     3,
+    -128,  -128,  -128,     1,  -128,    52,  -128,   110,  -128,  -128,
+    -128,  -128,  -128,  -128,  -128,  -128,  -128,   -41,    95,  -128,
+    -128,     1,    60,    66,    64,  -128,  -128,  -128,  -128,    64,
+      95,  -128,  -128,  -128,  -128,  -128,  -128,    25,  -128
 };
 
   /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -757,17 +757,17 @@ static const yytype_uint8 yydefact[] =
        2,    99,    82,    31,    23,    44,    67,    68,    69,    35,
       63,    66,    65,    50,    57,    59,    76,    72,    73,    62,
      113,    87,    30,    64,    58,    60,    74,    83,    84,    87,
-      86,     0,     0,     0,    98,    90,    91,    97,    95,    98,
+      86,     0,     0,     0,    98,    90,    95,    91,    97,    98,
       85,    92,    93,    94,    89,    87,    88,     0,    96
 };
 
   /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int8 yypgoto[] =
 {
-    -127,  -127,  -127,  -127,  -127,  -127,   103,  -127,  -127,  -127,
-    -127,  -127,  -127,  -127,  -127,  -127,    -7,  -127,  -127,     6,
-    -127,   -76,    78,  -127,    57,  -127,  -127,  -127,  -124,  -127,
-    -126,  -127,  -127,   -16,  -127,   -32,   -80,  -127
+    -128,  -128,  -128,  -128,  -128,  -128,   114,  -128,  -128,  -128,
+    -128,  -128,  -128,  -128,  -128,  -128,     5,  -128,  -128,    10,
+    -128,   -75,    74,  -128,    47,  -128,  -128,  -128,  -127,  -128,
+     -97,  -128,  -128,   -13,  -128,   -32,   -84,  -128
 };
 
   /* YYDEFGOTO[NTERM-NUM].  */
@@ -784,54 +784,52 @@ static const yytype_int16 yydefgoto[] =
      number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_int16 yytable[] =
 {
-      69,    65,    92,    65,    65,   140,    52,   118,   144,   129,
-     116,   130,   116,   146,   131,   132,   133,    90,  -112,    71,
-       3,   147,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    87,    87,    50,    13,    14,    65,   126,    93,    51,
-     134,   135,    66,    66,    94,    67,    67,    26,    53,   112,
-      55,   115,   117,    32,    58,    49,    65,   119,   136,   137,
-     138,   148,    56,    57,    72,    98,   131,   132,   133,    59,
-      87,    60,    87,    66,    40,    66,    67,   112,    67,    61,
-      62,   115,    84,    63,   106,   107,   108,    64,    79,    81,
-      82,    91,   134,   135,    96,    66,    97,   101,    67,   141,
-     103,   105,   120,   122,    65,    42,   124,     0,   125,   142,
-     136,   137,   138,    71,   143,   123,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,     0,    88,     0,    13,    14,
-       0,    99,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    26,     0,     0,     0,     0,     0,    32,     0,     0,
-       0,     0,     0,     0,     0,     0,     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
+      69,    65,   140,   118,    65,    92,    65,   129,    50,   130,
+      52,   116,     3,   116,    51,  -112,    71,    90,   147,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    65,    49,
+      55,    13,    14,   126,    87,    87,    56,   144,   131,   132,
+     133,    93,   146,    66,    26,    66,    67,    94,    67,   112,
+      32,   115,    53,   117,   106,   107,   108,   119,    58,    57,
+      66,    72,    98,    67,   134,   135,    60,    66,    59,    84,
+      67,    61,    40,    87,    62,    87,    63,   112,    64,   136,
+      79,   115,    81,   137,   138,   148,    71,    82,    91,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    65,   141,
+      96,    13,    14,    97,   103,   101,   105,   125,   131,   132,
+     133,   122,   120,    65,    26,   142,    42,   143,   124,   123,
+      32,    99,    88,     0,     0,     0,     0,     0,     0,     0,
+       0,    72,     0,     0,   134,   135,     0,    66,     0,     0,
+      67,     0,    40,     0,     0,     0,     0,     0,     0,   136,
+       0,     0,     0,   137,   138,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,     0,     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,     0,    39,    40
 };
 
 static const yytype_int16 yycheck[] =
 {
-      32,     3,     3,     3,     3,   129,     3,    87,   134,    48,
-      86,    50,    88,   139,    13,    14,    15,    49,     0,     1,
-       0,   145,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    47,    48,    39,    16,    17,     3,   117,    39,    45,
-      39,    40,    42,    42,    45,    45,    45,    29,    45,    81,
-       3,    83,    54,    35,     3,    51,     3,    89,    57,    58,
-      59,    60,    54,    54,    46,    47,    13,    14,    15,    39,
-      86,     3,    88,    42,    56,    42,    45,   109,    45,     3,
-       3,   113,    51,     3,    51,    52,    53,     3,    45,    39,
-      51,    39,    39,    40,    50,    42,    50,    41,    45,   131,
-      39,    39,    43,    39,     3,     2,   113,    -1,    54,    54,
-      57,    58,    59,     1,    51,   109,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,    -1,    48,    -1,    16,    17,
-      -1,    74,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    29,    -1,    -1,    -1,    -1,    -1,    35,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -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
+      32,     3,   129,    87,     3,     3,     3,    48,    39,    50,
+       3,    86,     0,    88,    45,     0,     1,    49,   145,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,     3,    51,
+       3,    16,    17,   117,    47,    48,    55,   134,    13,    14,
+      15,    39,   139,    42,    29,    42,    45,    45,    45,    81,
+      35,    83,    45,    55,    51,    52,    53,    89,     3,    55,
+      42,    46,    47,    45,    39,    40,     3,    42,    39,    51,
+      45,     3,    57,    86,     3,    88,     3,   109,     3,    54,
+      45,   113,    39,    58,    59,    60,     1,    51,    39,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,     3,   131,
+      50,    16,    17,    50,    39,    41,    39,    55,    13,    14,
+      15,    39,    43,     3,    29,    55,     2,    51,   113,   109,
+      35,    74,    48,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    46,    -1,    -1,    39,    40,    -1,    42,    -1,    -1,
+      45,    -1,    57,    -1,    -1,    -1,    -1,    -1,    -1,    54,
+      -1,    -1,    -1,    58,    59,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    -1,    -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,    -1,    56,    57
 };
 
   /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@ -841,18 +839,18 @@ static const yytype_uint8 yystos[] =
        0,    62,    63,     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,    64,    67,    68,    70,    73,    74,    72,    71,    51,
-      39,    45,     3,    45,    92,     3,    54,    54,     3,    39,
+      33,    34,    35,    36,    37,    38,    47,    49,    50,    56,
+      57,    64,    67,    68,    70,    73,    74,    72,    71,    51,
+      39,    45,     3,    45,    92,     3,    55,    55,     3,    39,
        3,     3,     3,     3,     3,     3,    42,    45,    94,    96,
       97,     1,    46,    67,    84,    85,    86,    95,    65,    45,
       69,    39,    51,    75,    51,    82,    83,    94,    83,    78,
       96,    39,     3,    39,    45,    93,    50,    50,    47,    85,
       98,    41,    91,    39,    66,    39,    51,    52,    53,    79,
-      80,    81,    96,    76,    77,    96,    82,    54,    97,    96,
-      43,    87,    39,    80,    77,    54,    97,    88,    89,    48,
-      50,    13,    14,    15,    39,    40,    57,    58,    59,    96,
-      89,    96,    54,    51,    91,    90,    91,    89,    60
+      80,    81,    96,    76,    77,    96,    82,    55,    97,    96,
+      43,    87,    39,    80,    77,    55,    97,    88,    89,    48,
+      50,    13,    14,    15,    39,    40,    54,    58,    59,    96,
+      89,    96,    55,    51,    91,    90,    91,    89,    60
 };
 
   /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
@@ -1042,79 +1040,85 @@ yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvalue
   switch (yytype)
     {
           case 3: /* "string"  */
-#line 215 "src/parse-gram.y" /* yacc.c:684  */
+#line 216 "src/parse-gram.y" /* yacc.c:684  */
       { fputs (quotearg_style (c_quoting_style, ((*yyvaluep).code)), yyo); }
-#line 1048 "src/parse-gram.c" /* yacc.c:684  */
+#line 1046 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 23: /* "%<flag>"  */
-#line 223 "src/parse-gram.y" /* yacc.c:684  */
+#line 224 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%%%s", ((*yyvaluep).uniqstr)); }
-#line 1054 "src/parse-gram.c" /* yacc.c:684  */
+#line 1052 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 39: /* "{...}"  */
-#line 216 "src/parse-gram.y" /* yacc.c:684  */
+#line 217 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "{\n%s\n}", ((*yyvaluep).code)); }
-#line 1060 "src/parse-gram.c" /* yacc.c:684  */
+#line 1058 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 40: /* "%?{...}"  */
-#line 216 "src/parse-gram.y" /* yacc.c:684  */
+#line 217 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "{\n%s\n}", ((*yyvaluep).code)); }
-#line 1066 "src/parse-gram.c" /* yacc.c:684  */
+#line 1064 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 41: /* "[identifier]"  */
-#line 221 "src/parse-gram.y" /* yacc.c:684  */
+#line 222 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "[%s]", ((*yyvaluep).uniqstr)); }
-#line 1072 "src/parse-gram.c" /* yacc.c:684  */
+#line 1070 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 42: /* "char"  */
 #line 211 "src/parse-gram.y" /* yacc.c:684  */
       { fputs (char_name (((*yyvaluep).character)), yyo); }
-#line 1078 "src/parse-gram.c" /* yacc.c:684  */
+#line 1076 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 43: /* "epilogue"  */
-#line 216 "src/parse-gram.y" /* yacc.c:684  */
+#line 217 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "{\n%s\n}", ((*yyvaluep).code)); }
-#line 1084 "src/parse-gram.c" /* yacc.c:684  */
+#line 1082 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 45: /* "identifier"  */
-#line 220 "src/parse-gram.y" /* yacc.c:684  */
+#line 221 "src/parse-gram.y" /* yacc.c:684  */
       { fputs (((*yyvaluep).uniqstr), yyo); }
-#line 1090 "src/parse-gram.c" /* yacc.c:684  */
+#line 1088 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 46: /* "identifier:"  */
-#line 222 "src/parse-gram.y" /* yacc.c:684  */
+#line 223 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%s:", ((*yyvaluep).uniqstr)); }
-#line 1096 "src/parse-gram.c" /* yacc.c:684  */
+#line 1094 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 49: /* "%{...%}"  */
-#line 216 "src/parse-gram.y" /* yacc.c:684  */
+#line 217 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "{\n%s\n}", ((*yyvaluep).code)); }
-#line 1102 "src/parse-gram.c" /* yacc.c:684  */
+#line 1100 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 51: /* "<tag>"  */
-#line 224 "src/parse-gram.y" /* yacc.c:684  */
+#line 225 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "<%s>", ((*yyvaluep).uniqstr)); }
-#line 1108 "src/parse-gram.c" /* yacc.c:684  */
+#line 1106 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
-    case 54: /* "integer"  */
-#line 228 "src/parse-gram.y" /* yacc.c:684  */
+    case 54: /* '('  */
+#line 217 "src/parse-gram.y" /* yacc.c:684  */
+      { fprintf (yyo, "{\n%s\n}", ((*yyvaluep).code)); }
+#line 1112 "src/parse-gram.c" /* yacc.c:684  */
+        break;
+
+    case 55: /* "integer"  */
+#line 229 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%d", ((*yyvaluep).integer)); }
-#line 1114 "src/parse-gram.c" /* yacc.c:684  */
+#line 1118 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
-    case 55: /* "%param"  */
-#line 271 "src/parse-gram.y" /* yacc.c:684  */
+    case 56: /* "%param"  */
+#line 272 "src/parse-gram.y" /* yacc.c:684  */
       {
   switch (((*yyvaluep).param))
     {
@@ -1127,35 +1131,35 @@ yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvalue
       case param_none: aver (false); break;
     }
 }
-#line 1131 "src/parse-gram.c" /* yacc.c:684  */
+#line 1135 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 68: /* code_props_type  */
-#line 566 "src/parse-gram.y" /* yacc.c:684  */
+#line 567 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%s", code_props_type_string (((*yyvaluep).code_type))); }
-#line 1137 "src/parse-gram.c" /* yacc.c:684  */
+#line 1141 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 77: /* symbol.prec  */
-#line 232 "src/parse-gram.y" /* yacc.c:684  */
+#line 233 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%s", ((*yyvaluep).symbol)->tag); }
-#line 1143 "src/parse-gram.c" /* yacc.c:684  */
+#line 1147 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 81: /* tag  */
-#line 224 "src/parse-gram.y" /* yacc.c:684  */
+#line 225 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "<%s>", ((*yyvaluep).uniqstr)); }
-#line 1149 "src/parse-gram.c" /* yacc.c:684  */
+#line 1153 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 92: /* variable  */
-#line 220 "src/parse-gram.y" /* yacc.c:684  */
+#line 221 "src/parse-gram.y" /* yacc.c:684  */
       { fputs (((*yyvaluep).uniqstr), yyo); }
-#line 1155 "src/parse-gram.c" /* yacc.c:684  */
+#line 1159 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 93: /* value  */
-#line 917 "src/parse-gram.y" /* yacc.c:684  */
+#line 934 "src/parse-gram.y" /* yacc.c:684  */
       {
   switch (((*yyvaluep).value).kind)
     {
@@ -1164,31 +1168,31 @@ yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvalue
     case muscle_string:  fprintf (yyo, "\"%s\"", ((*yyvaluep).value).chars); break;
     }
 }
-#line 1168 "src/parse-gram.c" /* yacc.c:684  */
+#line 1172 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 94: /* id  */
-#line 232 "src/parse-gram.y" /* yacc.c:684  */
+#line 233 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%s", ((*yyvaluep).symbol)->tag); }
-#line 1174 "src/parse-gram.c" /* yacc.c:684  */
+#line 1178 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 95: /* id_colon  */
-#line 233 "src/parse-gram.y" /* yacc.c:684  */
+#line 234 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%s:", ((*yyvaluep).symbol)->tag); }
-#line 1180 "src/parse-gram.c" /* yacc.c:684  */
+#line 1184 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 96: /* symbol  */
-#line 232 "src/parse-gram.y" /* yacc.c:684  */
+#line 233 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%s", ((*yyvaluep).symbol)->tag); }
-#line 1186 "src/parse-gram.c" /* yacc.c:684  */
+#line 1190 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 97: /* string_as_id  */
-#line 232 "src/parse-gram.y" /* yacc.c:684  */
+#line 233 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%s", ((*yyvaluep).symbol)->tag); }
-#line 1192 "src/parse-gram.c" /* yacc.c:684  */
+#line 1196 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
 
@@ -1891,7 +1895,7 @@ YYLTYPE yylloc = yyloc_default;
   boundary_set (&yylloc.end, current_file, 1, 1);
 }
 
-#line 1895 "src/parse-gram.c" /* yacc.c:1430  */
+#line 1899 "src/parse-gram.c" /* yacc.c:1430  */
   yylsp[0] = yylloc;
   goto yysetstate;
 
@@ -2097,18 +2101,18 @@ yyreduce:
     switch (yyn)
       {
           case 2:
-#line 292 "src/parse-gram.y" /* yacc.c:1648  */
+#line 293 "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 2097 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2101 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 3:
-#line 307 "src/parse-gram.y" /* yacc.c:1648  */
+#line 308 "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 */
@@ -2119,11 +2123,11 @@ yyreduce:
  gram_piece[gram_piece2] = gram_piece[gram_piece2 - 1]; /* empty */
  gram_piece[gram_piece2 - 1] = temp;
  }
-#line 2112 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2116 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 6:
-#line 323 "src/parse-gram.y" /* yacc.c:1648  */
+#line 324 "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>");
@@ -2135,11 +2139,11 @@ yyreduce:
  free(gram_piece[gram_piece2]);
  gram_piece[gram_piece2] = strdup(code_piece[code_piece0 - 1]);
     }
-#line 2128 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2132 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 7:
-#line 335 "src/parse-gram.y" /* yacc.c:1648  */
+#line 336 "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) {
@@ -2157,42 +2161,42 @@ yyreduce:
  else
   abort();
     }
-#line 2150 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2154 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 8:
-#line 353 "src/parse-gram.y" /* yacc.c:1648  */
+#line 354 "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 2161 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2165 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 9:
-#line 359 "src/parse-gram.y" /* yacc.c:1648  */
+#line 360 "src/parse-gram.y" /* yacc.c:1648  */
     { defines_flag = true; /*}*/
  insert_after(0, "</AST_Section1_Defines>");
  insert_before(0, "<AST_Section1_Defines>");
  }
-#line 2170 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2174 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 10:
-#line 364 "src/parse-gram.y" /* yacc.c:1648  */
+#line 365 "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 2181 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2185 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 11:
-#line 371 "src/parse-gram.y" /* yacc.c:1648  */
+#line 372 "src/parse-gram.y" /* yacc.c:1648  */
     {
       muscle_percent_define_insert ("parse.error", (yylsp[0]), muscle_keyword,
                                     "verbose",
@@ -2200,51 +2204,51 @@ yyreduce:
  insert_after(0, "</AST_Section1_ErrorVerbose>");
  insert_before(0, "<AST_Section1_ErrorVerbose>");
     }
-#line 2193 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2197 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 12:
-#line 378 "src/parse-gram.y" /* yacc.c:1648  */
+#line 379 "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 2203 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2207 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 13:
-#line 383 "src/parse-gram.y" /* yacc.c:1648  */
+#line 384 "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 2213 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2217 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 14:
-#line 388 "src/parse-gram.y" /* yacc.c:1648  */
+#line 389 "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 2222 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2226 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 15:
-#line 393 "src/parse-gram.y" /* yacc.c:1648  */
+#line 394 "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 2233 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2237 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 16:
-#line 400 "src/parse-gram.y" /* yacc.c:1648  */
+#line 401 "src/parse-gram.y" /* yacc.c:1648  */
     {
  /* should be BracedCode, but too hard to put AST_Text inside braces */
  code_piece_append("<AST_Text>");
@@ -2257,80 +2261,80 @@ yyreduce:
  insert_after(1, "</AST_Section1_InitialAction>");
  insert_before(0, "<AST_Section1_InitialAction>");
     }
-#line 2250 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2254 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 17:
-#line 412 "src/parse-gram.y" /* yacc.c:1648  */
+#line 413 "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 2259 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2263 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 18:
-#line 416 "src/parse-gram.y" /* yacc.c:1648  */
+#line 417 "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 2268 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2272 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 19:
-#line 420 "src/parse-gram.y" /* yacc.c:1648  */
+#line 421 "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 2277 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2281 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 20:
-#line 424 "src/parse-gram.y" /* yacc.c:1648  */
+#line 425 "src/parse-gram.y" /* yacc.c:1648  */
     { nondeterministic_parser = true; /*}*/
  insert_after(0, "</AST_Section1_NonDeterministicParser>");
  insert_before(0, "<AST_Section1_NonDeterministicParser>");
  }
-#line 2286 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2290 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 21:
-#line 428 "src/parse-gram.y" /* yacc.c:1648  */
+#line 429 "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 2295 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2299 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 22:
-#line 432 "src/parse-gram.y" /* yacc.c:1648  */
+#line 433 "src/parse-gram.y" /* yacc.c:1648  */
     { current_param = (yyvsp[0].param); }
-#line 2301 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2305 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 23:
-#line 432 "src/parse-gram.y" /* yacc.c:1648  */
+#line 433 "src/parse-gram.y" /* yacc.c:1648  */
     { current_param = param_none; /*}*/
  insert_after(2, "</AST_Section1_Param>");
  insert_before(0, "<AST_Section1_Param>");
  }
-#line 2310 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2314 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 24:
-#line 436 "src/parse-gram.y" /* yacc.c:1648  */
+#line 437 "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 2319 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2323 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 25:
-#line 441 "src/parse-gram.y" /* yacc.c:1648  */
+#line 442 "src/parse-gram.y" /* yacc.c:1648  */
     {
       char const *skeleton_user = (yyvsp[0].code);
       if (strchr (skeleton_user, '/'))
@@ -2356,50 +2360,50 @@ yyreduce:
  insert_after(1, "</AST_Section1_Skeleton>");
  insert_before(0, "<AST_Section1_Skeleton>");
     }
-#line 2349 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2353 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 26:
-#line 466 "src/parse-gram.y" /* yacc.c:1648  */
+#line 467 "src/parse-gram.y" /* yacc.c:1648  */
     { token_table_flag = true; /*}*/
  insert_after(0, "</AST_Section1_TokenTable>");
  insert_before(0, "<AST_Section1_TokenTable>");
  }
-#line 2358 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2362 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 27:
-#line 470 "src/parse-gram.y" /* yacc.c:1648  */
+#line 471 "src/parse-gram.y" /* yacc.c:1648  */
     { report_flag |= report_states; /*}*/
  insert_after(0, "</AST_Section1_Verbose>");
  insert_before(0, "<AST_Section1_Verbose>");
  }
-#line 2367 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2371 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 28:
-#line 474 "src/parse-gram.y" /* yacc.c:1648  */
+#line 475 "src/parse-gram.y" /* yacc.c:1648  */
     { yacc_flag = true; /*}*/
  insert_after(0, "</AST_Section1_YACC>");
  insert_before(0, "<AST_Section1_YACC>");
  }
-#line 2376 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2380 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 30:
-#line 482 "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 2382 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2386 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 31:
-#line 483 "src/parse-gram.y" /* yacc.c:1648  */
+#line 484 "src/parse-gram.y" /* yacc.c:1648  */
     { add_param (current_param, (yyvsp[0].code), (yylsp[0])); }
-#line 2388 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2392 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 34:
-#line 495 "src/parse-gram.y" /* yacc.c:1648  */
+#line 496 "src/parse-gram.y" /* yacc.c:1648  */
     {
       grammar_start_symbol_set ((yyvsp[0].symbol), (yylsp[0]));
  insert_after(1, "</AST_Section1Or2_Start>");
@@ -2407,11 +2411,11 @@ yyreduce:
  insert_before(1, "<AST_SymbolRef>");
  insert_before(0, "<AST_Section1Or2_Start>");
     }
-#line 2400 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2404 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 35:
-#line 503 "src/parse-gram.y" /* yacc.c:1648  */
+#line 504 "src/parse-gram.y" /* yacc.c:1648  */
     {
       code_props code;
       code_props_symbol_action_init (&code, (yyvsp[-1].code), (yylsp[-1]));
@@ -2432,31 +2436,31 @@ yyreduce:
  sprintf(gram_piece_temp, "<AST_Section1Or2_CodeProps _type=\"%d\">", (yyvsp[-2].code_type));
  insert_before(0, gram_piece_temp);
     }
-#line 2425 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2429 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 36:
-#line 524 "src/parse-gram.y" /* yacc.c:1648  */
+#line 525 "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 2435 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2439 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 37:
-#line 530 "src/parse-gram.y" /* yacc.c:1648  */
+#line 531 "src/parse-gram.y" /* yacc.c:1648  */
     {
       default_prec = false;
  insert_after(0, "</AST_Section1Or2_DefaultPrec>");
  insert_before(0, "<AST_Section1Or2_DefaultPrec>");
     }
-#line 2445 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2449 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 38:
-#line 536 "src/parse-gram.y" /* yacc.c:1648  */
+#line 537 "src/parse-gram.y" /* yacc.c:1648  */
     {
       /* Do not invoke muscle_percent_code_grow here since it invokes
          muscle_user_name_list_grow.  */
@@ -2471,11 +2475,11 @@ yyreduce:
  insert_after(1, "</AST_Section1Or2_Code>");
  insert_before(0, "<AST_Section1Or2_Code><AST_ID />");
     }
-#line 2464 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2468 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 39:
-#line 551 "src/parse-gram.y" /* yacc.c:1648  */
+#line 552 "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]));
@@ -2487,37 +2491,37 @@ yyreduce:
  insert_after(2, "</AST_Section1Or2_Code>");
  insert_before(0, "<AST_Section1Or2_Code>");
     }
-#line 2480 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2484 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 40:
-#line 568 "src/parse-gram.y" /* yacc.c:1648  */
+#line 569 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.code_type) = destructor; }
-#line 2486 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2490 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 41:
-#line 569 "src/parse-gram.y" /* yacc.c:1648  */
+#line 570 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.code_type) = printer; }
-#line 2492 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2496 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 42:
-#line 579 "src/parse-gram.y" /* yacc.c:1648  */
+#line 580 "src/parse-gram.y" /* yacc.c:1648  */
     { insert_before(0, "<AST_ID />"); }
-#line 2498 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2502 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 43:
-#line 580 "src/parse-gram.y" /* yacc.c:1648  */
+#line 581 "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 2506 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2510 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 44:
-#line 587 "src/parse-gram.y" /* yacc.c:1648  */
+#line 588 "src/parse-gram.y" /* yacc.c:1648  */
     {
       union_seen = true;
  code_piece_append("<AST_BracedCode>{<AST_Text>");
@@ -2530,45 +2534,45 @@ yyreduce:
  insert_after(2, "</AST_Section1Or2_Union>");
  insert_before(0, "<AST_Section1Or2_Union>");
     }
-#line 2523 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2527 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 45:
-#line 605 "src/parse-gram.y" /* yacc.c:1648  */
+#line 606 "src/parse-gram.y" /* yacc.c:1648  */
     { current_class = nterm_sym; }
-#line 2529 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2533 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 46:
-#line 606 "src/parse-gram.y" /* yacc.c:1648  */
+#line 607 "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 2540 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2544 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 47:
-#line 612 "src/parse-gram.y" /* yacc.c:1648  */
+#line 613 "src/parse-gram.y" /* yacc.c:1648  */
     { current_class = token_sym; }
-#line 2546 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2550 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 48:
-#line 613 "src/parse-gram.y" /* yacc.c:1648  */
+#line 614 "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 2557 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2561 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 49:
-#line 620 "src/parse-gram.y" /* yacc.c:1648  */
+#line 621 "src/parse-gram.y" /* yacc.c:1648  */
     {
       symbol_list *list;
       tag_seen = true;
@@ -2578,11 +2582,11 @@ yyreduce:
  insert_after(2, "</AST_Section1Or2_Type>");
  insert_before(0, "<AST_Section1Or2_Type>");
     }
-#line 2571 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2575 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 50:
-#line 633 "src/parse-gram.y" /* yacc.c:1648  */
+#line 634 "src/parse-gram.y" /* yacc.c:1648  */
     {
       symbol_list *list;
       ++current_prec;
@@ -2597,70 +2601,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 2590 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2594 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 51:
-#line 650 "src/parse-gram.y" /* yacc.c:1648  */
+#line 651 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.assoc) = left_assoc; }
-#line 2596 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2600 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 52:
-#line 651 "src/parse-gram.y" /* yacc.c:1648  */
+#line 652 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.assoc) = right_assoc;  }
-#line 2602 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2606 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 53:
-#line 652 "src/parse-gram.y" /* yacc.c:1648  */
+#line 653 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.assoc) = non_assoc; }
-#line 2608 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2612 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 54:
-#line 653 "src/parse-gram.y" /* yacc.c:1648  */
+#line 654 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.assoc) = precedence_assoc; }
-#line 2614 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2618 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 55:
-#line 657 "src/parse-gram.y" /* yacc.c:1648  */
+#line 658 "src/parse-gram.y" /* yacc.c:1648  */
     { current_type = NULL; }
-#line 2620 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2624 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 56:
-#line 658 "src/parse-gram.y" /* yacc.c:1648  */
+#line 659 "src/parse-gram.y" /* yacc.c:1648  */
     { current_type = (yyvsp[0].uniqstr); tag_seen = true; }
-#line 2626 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2630 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 57:
-#line 664 "src/parse-gram.y" /* yacc.c:1648  */
+#line 665 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.list) = symbol_list_sym_new ((yyvsp[0].symbol), (yylsp[0])); }
-#line 2632 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2636 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 58:
-#line 666 "src/parse-gram.y" /* yacc.c:1648  */
+#line 667 "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 2638 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2642 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 59:
-#line 671 "src/parse-gram.y" /* yacc.c:1648  */
+#line 672 "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 2649 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2653 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 60:
-#line 678 "src/parse-gram.y" /* yacc.c:1648  */
+#line 679 "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]));
@@ -2669,88 +2673,88 @@ yyreduce:
  sprintf(gram_piece_temp, "<AST_SymbolRef user_token=\"%d\">", (yyvsp[0].integer));
  insert_before(0, gram_piece_temp);
     }
-#line 2662 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2666 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 61:
-#line 691 "src/parse-gram.y" /* yacc.c:1648  */
+#line 692 "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 2671 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2675 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 62:
-#line 696 "src/parse-gram.y" /* yacc.c:1648  */
+#line 697 "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 2680 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2684 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 63:
-#line 703 "src/parse-gram.y" /* yacc.c:1648  */
+#line 704 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.list) = (yyvsp[0].list); }
-#line 2686 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2690 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 64:
-#line 704 "src/parse-gram.y" /* yacc.c:1648  */
+#line 705 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.list) = symbol_list_append ((yyvsp[-1].list), (yyvsp[0].list)); }
-#line 2692 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2696 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 65:
-#line 708 "src/parse-gram.y" /* yacc.c:1648  */
+#line 709 "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 2701 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2705 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 66:
-#line 712 "src/parse-gram.y" /* yacc.c:1648  */
+#line 713 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.list) = symbol_list_type_new ((yyvsp[0].uniqstr), (yylsp[0])); }
-#line 2707 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2711 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 68:
-#line 717 "src/parse-gram.y" /* yacc.c:1648  */
+#line 718 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.uniqstr) = uniqstr_new ("*"); }
-#line 2713 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2717 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 69:
-#line 718 "src/parse-gram.y" /* yacc.c:1648  */
+#line 719 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.uniqstr) = uniqstr_new (""); }
-#line 2719 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2723 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 70:
-#line 724 "src/parse-gram.y" /* yacc.c:1648  */
+#line 725 "src/parse-gram.y" /* yacc.c:1648  */
     {
       current_type = (yyvsp[0].uniqstr);
       tag_seen = true;
     }
-#line 2728 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2732 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 71:
-#line 729 "src/parse-gram.y" /* yacc.c:1648  */
+#line 730 "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 2739 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2743 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 72:
-#line 736 "src/parse-gram.y" /* yacc.c:1648  */
+#line 737 "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]));
@@ -2759,11 +2763,11 @@ yyreduce:
  sprintf(gram_piece_temp, "<AST_SymbolRef user_token=\"%d\">", (yyvsp[0].integer));
  insert_before(0, gram_piece_temp);
     }
-#line 2752 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2756 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 73:
-#line 745 "src/parse-gram.y" /* yacc.c:1648  */
+#line 746 "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]));
@@ -2771,11 +2775,11 @@ yyreduce:
  insert_after(1, "</AST_SymbolRef>");
  insert_before(0, "<AST_SymbolRef>");
     }
-#line 2764 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2768 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 74:
-#line 753 "src/parse-gram.y" /* yacc.c:1648  */
+#line 754 "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]));
@@ -2785,25 +2789,25 @@ yyreduce:
  sprintf(gram_piece_temp, "<AST_SymbolRef user_token=\"%d\">", (yyvsp[-1].integer));
  insert_before(0, gram_piece_temp);
     }
-#line 2778 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2782 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 81:
-#line 786 "src/parse-gram.y" /* yacc.c:1648  */
+#line 787 "src/parse-gram.y" /* yacc.c:1648  */
     {
       yyerrok;
     }
-#line 2786 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2790 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 82:
-#line 792 "src/parse-gram.y" /* yacc.c:1648  */
+#line 793 "src/parse-gram.y" /* yacc.c:1648  */
     { current_lhs ((yyvsp[-1].symbol), (yylsp[-1]), (yyvsp[0].named_ref)); }
-#line 2792 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2796 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 83:
-#line 793 "src/parse-gram.y" /* yacc.c:1648  */
+#line 794 "src/parse-gram.y" /* yacc.c:1648  */
     {
     /* Free the current lhs. */
     current_lhs (0, (yylsp[-3]), 0);
@@ -2813,29 +2817,29 @@ yyreduce:
  insert_before(0, "<AST_SymbolRef>");
  insert_before(0, "<AST_Section2_Rules>");
   }
-#line 2806 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2810 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 84:
-#line 805 "src/parse-gram.y" /* yacc.c:1648  */
+#line 806 "src/parse-gram.y" /* yacc.c:1648  */
     { grammar_current_rule_end ((yylsp[0])); /*}*/
  insert_after(0, "</AST_Production>");
  insert_before(0, "<AST_Production>");
  }
-#line 2815 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2819 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 85:
-#line 809 "src/parse-gram.y" /* yacc.c:1648  */
+#line 810 "src/parse-gram.y" /* yacc.c:1648  */
     { grammar_current_rule_end ((yylsp[0])); /*}*/
  insert_after(2, "</AST_Production>");
  insert_before(2, "<AST_Production>");
  }
-#line 2824 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2828 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 87:
-#line 821 "src/parse-gram.y" /* yacc.c:1648  */
+#line 822 "src/parse-gram.y" /* yacc.c:1648  */
     {
  /* Nick extra rules for element groups */
  if (nested_rhs)
@@ -2852,21 +2856,21 @@ yyreduce:
  gram_piece[gram_piece2] = gram_piece[gram_piece2 - 1]; /* empty */
  gram_piece[gram_piece2 - 1] = temp;
  }
-#line 2845 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2849 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 88:
-#line 838 "src/parse-gram.y" /* yacc.c:1648  */
+#line 839 "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 2855 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2859 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 89:
-#line 844 "src/parse-gram.y" /* yacc.c:1648  */
+#line 845 "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();
@@ -2875,153 +2879,169 @@ yyreduce:
  insert_after(2, "</AST_Production_Action>");
  insert_before(1, "<AST_Production_Action>");
  }
-#line 2868 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2872 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 90:
-#line 853 "src/parse-gram.y" /* yacc.c:1648  */
+#line 854 "src/parse-gram.y" /* yacc.c:1648  */
     { grammar_current_rule_action_append ((yyvsp[0].code), (yylsp[0]), NULL, true); }
-#line 2874 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2878 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 91:
-#line 855 "src/parse-gram.y" /* yacc.c:1648  */
+#line 856 "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 2883 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2887 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 92:
-#line 860 "src/parse-gram.y" /* yacc.c:1648  */
+#line 861 "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 2894 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2898 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 93:
-#line 867 "src/parse-gram.y" /* yacc.c:1648  */
+#line 868 "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 2904 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2908 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 94:
-#line 873 "src/parse-gram.y" /* yacc.c:1648  */
+#line 874 "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 2913 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2917 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 95:
-#line 878 "src/parse-gram.y" /* yacc.c:1648  */
+#line 879 "src/parse-gram.y" /* yacc.c:1648  */
     { ++nested_rhs; }
-#line 2919 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2923 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 96:
-#line 878 "src/parse-gram.y" /* yacc.c:1648  */
-    {
+#line 879 "src/parse-gram.y" /* yacc.c:1648  */
+    {
+ code_piece_append("(?E{<AST_Text>");
+ code_props plain_code;
+ extern int no_handle_action;
+ no_handle_action = 1;
+ extern symbol_list *current_rule;
+ char *p = (yyvsp[-3].code) + 4; // skip leading "(?E{"
+ p[strlen(p) - 1] = 0; // remove trailing "}"
+ code_props_rule_action_init(&plain_code, p, (yylsp[-3]), current_rule, NULL, 0);
+ code_props_translate_code(&plain_code);
+ no_handle_action = 0;
+ gram_scanner_last_string_free ();
+ code_scanner_last_string_free ();
+ code_piece_append("</AST_Text>}");
+ code_piece_pack();
+ free(gram_piece[gram_piece2 + 2]);
+ gram_piece[gram_piece2 + 2] = strdup(code_piece[code_piece0 - 1]);
  insert_after(3, "</AST_Production_GroupElement>");
  insert_before(1, "<AST_Production_GroupElement>");
  }
-#line 2928 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2948 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 97:
-#line 883 "src/parse-gram.y" /* yacc.c:1648  */
+#line 900 "src/parse-gram.y" /* yacc.c:1648  */
     {
  insert_after(1, "</AST_Production_Space>");
  insert_before(1, "<AST_Production_Space>");
  }
-#line 2937 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2957 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 98:
-#line 890 "src/parse-gram.y" /* yacc.c:1648  */
+#line 907 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.named_ref) = 0; }
-#line 2943 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2963 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 99:
-#line 891 "src/parse-gram.y" /* yacc.c:1648  */
+#line 908 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.named_ref) = named_ref_new ((yyvsp[0].uniqstr), (yylsp[0])); }
-#line 2949 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2969 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 101:
-#line 902 "src/parse-gram.y" /* yacc.c:1648  */
+#line 919 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.uniqstr) = uniqstr_new ((yyvsp[0].code)); }
-#line 2955 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2975 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 102:
-#line 927 "src/parse-gram.y" /* yacc.c:1648  */
+#line 944 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.value).kind = muscle_keyword; (yyval.value).chars = ""; }
-#line 2961 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2981 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 103:
-#line 928 "src/parse-gram.y" /* yacc.c:1648  */
+#line 945 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.value).kind = muscle_keyword; (yyval.value).chars = (yyvsp[0].uniqstr); }
-#line 2967 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2987 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 104:
-#line 929 "src/parse-gram.y" /* yacc.c:1648  */
+#line 946 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.value).kind = muscle_string;  (yyval.value).chars = (yyvsp[0].code); }
-#line 2973 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2993 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 105:
-#line 930 "src/parse-gram.y" /* yacc.c:1648  */
+#line 947 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.value).kind = muscle_code;    (yyval.value).chars = strip_braces ((yyvsp[0].code)); }
-#line 2979 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2999 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 106:
-#line 943 "src/parse-gram.y" /* yacc.c:1648  */
+#line 960 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.symbol) = symbol_from_uniqstr ((yyvsp[0].uniqstr), (yylsp[0])); }
-#line 2985 "src/parse-gram.c" /* yacc.c:1648  */
+#line 3005 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 107:
-#line 945 "src/parse-gram.y" /* yacc.c:1648  */
+#line 962 "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 2995 "src/parse-gram.c" /* yacc.c:1648  */
+#line 3015 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 108:
-#line 953 "src/parse-gram.y" /* yacc.c:1648  */
+#line 970 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.symbol) = symbol_from_uniqstr ((yyvsp[0].uniqstr), (yylsp[0])); }
-#line 3001 "src/parse-gram.c" /* yacc.c:1648  */
+#line 3021 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 111:
-#line 965 "src/parse-gram.y" /* yacc.c:1648  */
+#line 982 "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 3010 "src/parse-gram.c" /* yacc.c:1648  */
+#line 3030 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 113:
-#line 974 "src/parse-gram.y" /* yacc.c:1648  */
+#line 991 "src/parse-gram.y" /* yacc.c:1648  */
     {
 #if 0
  int gram_piece0_save = gram_piece0, gram_piece1_save = gram_piece1;
@@ -3042,11 +3062,11 @@ yyreduce:
  insert_after(1, "</AST_Section3>");
  insert_after(0, "<AST_Section3>");
     }
-#line 3035 "src/parse-gram.c" /* yacc.c:1648  */
+#line 3055 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
 
-#line 3039 "src/parse-gram.c" /* yacc.c:1648  */
+#line 3059 "src/parse-gram.c" /* yacc.c:1648  */
         default: break;
       }
     if (yychar_backup != yychar)
@@ -3309,7 +3329,7 @@ yyreturn:
 #endif
   return yyresult;
 }
-#line 996 "src/parse-gram.y" /* yacc.c:1907  */
+#line 1013 "src/parse-gram.y" /* yacc.c:1907  */
 
 
 /* Return the location of the left-hand side of a rule whose
index 0fec12b..e5d8243 100644 (file)
@@ -52,7 +52,7 @@ extern int gram_debug;
 
   #include "symlist.h"
   #include "symtab.h"
-#line 248 "src/parse-gram.y" /* yacc.c:1910  */
+#line 249 "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 906 "src/parse-gram.y" /* yacc.c:1910  */
+#line 923 "src/parse-gram.y" /* yacc.c:1910  */
 #include "muscle-tab.h"
 
 #line 68 "src/parse-gram.h" /* yacc.c:1910  */
@@ -140,23 +140,23 @@ union GRAM_STYPE
 unsigned char character;
 #line 213 "src/parse-gram.y" /* yacc.c:1910  */
 char *code;
-#line 218 "src/parse-gram.y" /* yacc.c:1910  */
+#line 219 "src/parse-gram.y" /* yacc.c:1910  */
 uniqstr uniqstr;
-#line 226 "src/parse-gram.y" /* yacc.c:1910  */
+#line 227 "src/parse-gram.y" /* yacc.c:1910  */
 int integer;
-#line 230 "src/parse-gram.y" /* yacc.c:1910  */
+#line 231 "src/parse-gram.y" /* yacc.c:1910  */
 symbol *symbol;
-#line 235 "src/parse-gram.y" /* yacc.c:1910  */
+#line 236 "src/parse-gram.y" /* yacc.c:1910  */
 assoc assoc;
-#line 238 "src/parse-gram.y" /* yacc.c:1910  */
+#line 239 "src/parse-gram.y" /* yacc.c:1910  */
 symbol_list *list;
-#line 241 "src/parse-gram.y" /* yacc.c:1910  */
+#line 242 "src/parse-gram.y" /* yacc.c:1910  */
 named_ref *named_ref;
-#line 268 "src/parse-gram.y" /* yacc.c:1910  */
+#line 269 "src/parse-gram.y" /* yacc.c:1910  */
 param_type param;
-#line 565 "src/parse-gram.y" /* yacc.c:1910  */
+#line 566 "src/parse-gram.y" /* yacc.c:1910  */
 code_props_type code_type;
-#line 908 "src/parse-gram.y" /* yacc.c:1910  */
+#line 925 "src/parse-gram.y" /* yacc.c:1910  */
 
   struct
   {
index 162143d..63d113c 100644 (file)
@@ -97,7 +97,7 @@
   extern char *code_piece[];
   extern int code_piece0;
   void code_piece_append(const char *str);
-  void code_piece_pack();
+  void code_piece_pack(void);
   
   extern char gram_piece_temp[], *gram_piece[];
   extern int gram_piece0, gram_piece1;
 %printer { fputs (char_name ($$), yyo); } CHAR
 
 %union {char *code;};
-%type <code> "{...}" "%?{...}" "%{...%}" EPILOGUE STRING
+/* Nick added: '(' */
+%type <code> "{...}" "%?{...}" "%{...%}" EPILOGUE STRING '('
 %printer { fputs (quotearg_style (c_quoting_style, $$), yyo); } STRING
 %printer { fprintf (yyo, "{\n%s\n}", $$); } <code>
 
@@ -876,6 +877,22 @@ rhs:
  }
 /* Nick extra rules for element groups */
 | rhs '(' { ++nested_rhs; } rhs ')' {
+ code_piece_append("(?E{<AST_Text>");
+ code_props plain_code;
+ extern int no_handle_action;
+ no_handle_action = 1;
+ extern symbol_list *current_rule;
+ char *p = $2 + 4; // skip leading "(?E{"
+ p[strlen(p) - 1] = 0; // remove trailing "}"
+ code_props_rule_action_init(&plain_code, p, @2, current_rule, NULL, 0);
+ code_props_translate_code(&plain_code);
+ no_handle_action = 0;
+ gram_scanner_last_string_free ();
+ code_scanner_last_string_free ();
+ code_piece_append("</AST_Text>}");
+ code_piece_pack();
+ free(gram_piece[gram_piece2 + 2]);
+ gram_piece[gram_piece2 + 2] = strdup(code_piece[code_piece0 - 1]);
  insert_after(3, "</AST_Production_GroupElement>");
  insert_before(1, "<AST_Production_GroupElement>");
  }
index a7992bc..c462e87 100644 (file)
@@ -215,7 +215,7 @@ assign_named_ref (symbol_list *p, named_ref *name)
 /* The rule currently being defined, and the previous rule.
    CURRENT_RULE points to the first LHS of the current rule, while
    PREVIOUS_RULE_END points to the *end* of the previous rule (NULL).  */
-static symbol_list *current_rule = NULL;
+/*static*/ symbol_list *current_rule = NULL;
 static symbol_list *previous_rule_end = NULL;
 
 
index 31232fa..bf2910e 100644 (file)
@@ -3028,7 +3028,7 @@ YY_RULE_SETUP
       {
         STRING_FINISH;
         loc->start = code_start;
-        STRING_FREE; //val->code = last_string;
+        val->code = last_string;
         BEGIN INITIAL;
 #if 1
  gram_piece_append("</AST_Text>");
index f92e958..7c15c56 100644 (file)
@@ -908,7 +908,7 @@ eqopt    ([[:space:]]*=)?
       {
         STRING_FINISH;
         loc->start = code_start;
-        STRING_FREE; //val->code = last_string;
+        val->code = last_string;
         BEGIN INITIAL;
 #if 1
  gram_piece_append("</AST_Text>");