Moving most of the (code|gram)_piece_* stuff out of *.c.patch and into *.[ly]
authorNick Downing <downing.nick@gmail.com>
Thu, 26 Jul 2018 11:03:22 +0000 (21:03 +1000)
committerNick Downing <downing.nick@gmail.com>
Thu, 26 Jul 2018 11:03:48 +0000 (21:03 +1000)
12 files changed:
.gitignore
src/parse-gram.c
src/parse-gram.c.patch
src/parse-gram.h
src/parse-gram.y
src/scan-code.c
src/scan-code.c.patch
src/scan-code.l
src/scan-gram.c
src/scan-gram.c.patch
src/scan-gram.l
src/scan-skel.c.patch [new file with mode: 0644]

index 2c60396..c9678a4 100644 (file)
@@ -66,6 +66,7 @@ src/parse-gram.c.orig
 src/parse-gram.output
 src/scan-code.c.orig
 src/scan-gram.c.orig
+src/scan-skel.c.orig
 src/yacc
 tests/atconfig
 tests/atlocal
index 1fa0db6..8a6a1f9 100644 (file)
@@ -120,7 +120,7 @@ extern int gram_debug;
 
   #include "symlist.h"
   #include "symtab.h"
-#line 227 "src/parse-gram.y" /* yacc.c:355  */
+#line 246 "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 892 "src/parse-gram.y" /* yacc.c:355  */
+#line 911 "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 188 "src/parse-gram.y" /* yacc.c:355  */
+#line 207 "src/parse-gram.y" /* yacc.c:355  */
 unsigned char character;
-#line 192 "src/parse-gram.y" /* yacc.c:355  */
+#line 211 "src/parse-gram.y" /* yacc.c:355  */
 char *code;
-#line 197 "src/parse-gram.y" /* yacc.c:355  */
+#line 216 "src/parse-gram.y" /* yacc.c:355  */
 uniqstr uniqstr;
-#line 205 "src/parse-gram.y" /* yacc.c:355  */
+#line 224 "src/parse-gram.y" /* yacc.c:355  */
 int integer;
-#line 209 "src/parse-gram.y" /* yacc.c:355  */
+#line 228 "src/parse-gram.y" /* yacc.c:355  */
 symbol *symbol;
-#line 214 "src/parse-gram.y" /* yacc.c:355  */
+#line 233 "src/parse-gram.y" /* yacc.c:355  */
 assoc assoc;
-#line 217 "src/parse-gram.y" /* yacc.c:355  */
+#line 236 "src/parse-gram.y" /* yacc.c:355  */
 symbol_list *list;
-#line 220 "src/parse-gram.y" /* yacc.c:355  */
+#line 239 "src/parse-gram.y" /* yacc.c:355  */
 named_ref *named_ref;
-#line 247 "src/parse-gram.y" /* yacc.c:355  */
+#line 266 "src/parse-gram.y" /* yacc.c:355  */
 param_type param;
-#line 534 "src/parse-gram.y" /* yacc.c:355  */
+#line 553 "src/parse-gram.y" /* yacc.c:355  */
 code_props_type code_type;
-#line 894 "src/parse-gram.y" /* yacc.c:355  */
+#line 913 "src/parse-gram.y" /* yacc.c:355  */
 
   struct
   {
@@ -332,7 +332,26 @@ int gram_parse (void);
   extern int code_piece0;
   void code_piece_append(const char *str);
   void code_piece_pack();
-#line 237 "src/parse-gram.y" /* yacc.c:359  */
+  
+  extern char gram_piece_temp[], *gram_piece[];
+  extern int gram_piece0, gram_piece1;
+  int gram_piece2, gram_piece3;
+  void gram_piece_insert(int n, const void *str);
+
+  #define insert_before(n, str) \
+   do { \
+    gram_piece_insert(gram_piece2 + (n) * 2, (str)); \
+    ++gram_piece0; \
+    ++gram_piece3; \
+   } while (0)
+  #define insert_after(n, str) \
+   do { \
+    gram_piece_insert(gram_piece2 + (n) * 2 + 1, (str)); \
+    ++gram_piece0; \
+    ++gram_piece3; \
+   } while (0)
+
+#line 256 "src/parse-gram.y" /* yacc.c:359  */
 
   /** Add a lex-param and/or a parse-param.
    *
@@ -343,7 +362,7 @@ int gram_parse (void);
   static void add_param (param_type type, char *decl, location loc);
   static param_type current_param = param_none;
 
-#line 347 "src/parse-gram.c" /* yacc.c:359  */
+#line 366 "src/parse-gram.c" /* yacc.c:359  */
 
 #ifdef short
 # undef short
@@ -625,18 +644,18 @@ static const yytype_uint8 yytranslate[] =
   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,   270,   270,   285,   296,   300,   301,   313,   319,   326,
-     330,   337,   345,   351,   357,   361,   368,   380,   384,   388,
-     392,   396,   400,   400,   404,   408,   434,   438,   442,   446,
-     450,   451,   460,   461,   462,   470,   492,   498,   504,   519,
-     537,   538,   548,   549,   555,   574,   574,   583,   583,   592,
-     607,   627,   628,   629,   630,   634,   635,   640,   642,   647,
-     654,   667,   672,   680,   681,   685,   689,   693,   694,   695,
-     700,   705,   718,   734,   748,   769,   770,   779,   780,   786,
-     787,   788,   795,   795,   808,   812,   816,   821,   833,   838,
-     847,   849,   854,   861,   868,   876,   877,   887,   888,   913,
-     914,   915,   916,   928,   930,   939,   944,   945,   950,   958,
-     959
+       0,   289,   289,   304,   315,   319,   320,   332,   338,   345,
+     349,   356,   364,   370,   376,   380,   387,   399,   403,   407,
+     411,   415,   419,   419,   423,   427,   453,   457,   461,   465,
+     469,   470,   479,   480,   481,   489,   511,   517,   523,   538,
+     556,   557,   567,   568,   574,   593,   593,   602,   602,   611,
+     626,   646,   647,   648,   649,   653,   654,   659,   661,   666,
+     673,   686,   691,   699,   700,   704,   708,   712,   713,   714,
+     719,   724,   737,   753,   767,   788,   789,   798,   799,   805,
+     806,   807,   814,   814,   827,   831,   835,   840,   852,   857,
+     866,   868,   873,   880,   887,   895,   896,   906,   907,   932,
+     933,   934,   935,   947,   949,   958,   963,   964,   969,   977,
+     978
 };
 #endif
 
@@ -1008,79 +1027,79 @@ yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvalue
   switch (yytype)
     {
           case 3: /* "string"  */
-#line 194 "src/parse-gram.y" /* yacc.c:684  */
+#line 213 "src/parse-gram.y" /* yacc.c:684  */
       { fputs (quotearg_style (c_quoting_style, ((*yyvaluep).code)), yyo); }
-#line 1014 "src/parse-gram.c" /* yacc.c:684  */
+#line 1033 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 23: /* "%<flag>"  */
-#line 202 "src/parse-gram.y" /* yacc.c:684  */
+#line 221 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%%%s", ((*yyvaluep).uniqstr)); }
-#line 1020 "src/parse-gram.c" /* yacc.c:684  */
+#line 1039 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 39: /* "{...}"  */
-#line 195 "src/parse-gram.y" /* yacc.c:684  */
+#line 214 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "{\n%s\n}", ((*yyvaluep).code)); }
-#line 1026 "src/parse-gram.c" /* yacc.c:684  */
+#line 1045 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 40: /* "%?{...}"  */
-#line 195 "src/parse-gram.y" /* yacc.c:684  */
+#line 214 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "{\n%s\n}", ((*yyvaluep).code)); }
-#line 1032 "src/parse-gram.c" /* yacc.c:684  */
+#line 1051 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 41: /* "[identifier]"  */
-#line 200 "src/parse-gram.y" /* yacc.c:684  */
+#line 219 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "[%s]", ((*yyvaluep).uniqstr)); }
-#line 1038 "src/parse-gram.c" /* yacc.c:684  */
+#line 1057 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 42: /* "char"  */
-#line 190 "src/parse-gram.y" /* yacc.c:684  */
+#line 209 "src/parse-gram.y" /* yacc.c:684  */
       { fputs (char_name (((*yyvaluep).character)), yyo); }
-#line 1044 "src/parse-gram.c" /* yacc.c:684  */
+#line 1063 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 43: /* "epilogue"  */
-#line 195 "src/parse-gram.y" /* yacc.c:684  */
+#line 214 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "{\n%s\n}", ((*yyvaluep).code)); }
-#line 1050 "src/parse-gram.c" /* yacc.c:684  */
+#line 1069 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 45: /* "identifier"  */
-#line 199 "src/parse-gram.y" /* yacc.c:684  */
+#line 218 "src/parse-gram.y" /* yacc.c:684  */
       { fputs (((*yyvaluep).uniqstr), yyo); }
-#line 1056 "src/parse-gram.c" /* yacc.c:684  */
+#line 1075 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 46: /* "identifier:"  */
-#line 201 "src/parse-gram.y" /* yacc.c:684  */
+#line 220 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%s:", ((*yyvaluep).uniqstr)); }
-#line 1062 "src/parse-gram.c" /* yacc.c:684  */
+#line 1081 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 49: /* "%{...%}"  */
-#line 195 "src/parse-gram.y" /* yacc.c:684  */
+#line 214 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "{\n%s\n}", ((*yyvaluep).code)); }
-#line 1068 "src/parse-gram.c" /* yacc.c:684  */
+#line 1087 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 51: /* "<tag>"  */
-#line 203 "src/parse-gram.y" /* yacc.c:684  */
+#line 222 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "<%s>", ((*yyvaluep).uniqstr)); }
-#line 1074 "src/parse-gram.c" /* yacc.c:684  */
+#line 1093 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 54: /* "integer"  */
-#line 207 "src/parse-gram.y" /* yacc.c:684  */
+#line 226 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%d", ((*yyvaluep).integer)); }
-#line 1080 "src/parse-gram.c" /* yacc.c:684  */
+#line 1099 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 55: /* "%param"  */
-#line 250 "src/parse-gram.y" /* yacc.c:684  */
+#line 269 "src/parse-gram.y" /* yacc.c:684  */
       {
   switch (((*yyvaluep).param))
     {
@@ -1093,35 +1112,35 @@ yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvalue
       case param_none: aver (false); break;
     }
 }
-#line 1097 "src/parse-gram.c" /* yacc.c:684  */
+#line 1116 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 65: /* code_props_type  */
-#line 535 "src/parse-gram.y" /* yacc.c:684  */
+#line 554 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%s", code_props_type_string (((*yyvaluep).code_type))); }
-#line 1103 "src/parse-gram.c" /* yacc.c:684  */
+#line 1122 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 74: /* symbol.prec  */
-#line 211 "src/parse-gram.y" /* yacc.c:684  */
+#line 230 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%s", ((*yyvaluep).symbol)->tag); }
-#line 1109 "src/parse-gram.c" /* yacc.c:684  */
+#line 1128 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 78: /* tag  */
-#line 203 "src/parse-gram.y" /* yacc.c:684  */
+#line 222 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "<%s>", ((*yyvaluep).uniqstr)); }
-#line 1115 "src/parse-gram.c" /* yacc.c:684  */
+#line 1134 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 88: /* variable  */
-#line 199 "src/parse-gram.y" /* yacc.c:684  */
+#line 218 "src/parse-gram.y" /* yacc.c:684  */
       { fputs (((*yyvaluep).uniqstr), yyo); }
-#line 1121 "src/parse-gram.c" /* yacc.c:684  */
+#line 1140 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 89: /* value  */
-#line 903 "src/parse-gram.y" /* yacc.c:684  */
+#line 922 "src/parse-gram.y" /* yacc.c:684  */
       {
   switch (((*yyvaluep).value).kind)
     {
@@ -1130,31 +1149,31 @@ yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvalue
     case muscle_string:  fprintf (yyo, "\"%s\"", ((*yyvaluep).value).chars); break;
     }
 }
-#line 1134 "src/parse-gram.c" /* yacc.c:684  */
+#line 1153 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 90: /* id  */
-#line 211 "src/parse-gram.y" /* yacc.c:684  */
+#line 230 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%s", ((*yyvaluep).symbol)->tag); }
-#line 1140 "src/parse-gram.c" /* yacc.c:684  */
+#line 1159 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 91: /* id_colon  */
-#line 212 "src/parse-gram.y" /* yacc.c:684  */
+#line 231 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%s:", ((*yyvaluep).symbol)->tag); }
-#line 1146 "src/parse-gram.c" /* yacc.c:684  */
+#line 1165 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 92: /* symbol  */
-#line 211 "src/parse-gram.y" /* yacc.c:684  */
+#line 230 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%s", ((*yyvaluep).symbol)->tag); }
-#line 1152 "src/parse-gram.c" /* yacc.c:684  */
+#line 1171 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 93: /* string_as_id  */
-#line 211 "src/parse-gram.y" /* yacc.c:684  */
+#line 230 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%s", ((*yyvaluep).symbol)->tag); }
-#line 1158 "src/parse-gram.c" /* yacc.c:684  */
+#line 1177 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
 
@@ -1748,28 +1767,6 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio
 | yyparse.  |
 `----------*/
 
-extern char gram_piece_temp[];
-extern char *gram_piece[];
-extern int gram_piece0, gram_piece1;
-void gram_piece_append(const char *str);
-void gram_piece_insert(int n, const char *str);
-void gram_piece_esc(const char *p, size_t n);
-void gram_piece_pack();
-int gram_piece2, gram_piece3;
-static void peek(int *yychar_p, YYSTYPE *yylval_p, YYLTYPE *yylloc_p) {
- if (*yychar_p == YYEMPTY)
-  *yychar_p = yylex(yylval_p, yylloc_p);
- memmove(gram_piece + gram_piece3 + 3, gram_piece + gram_piece3 + 1, (gram_piece1 - gram_piece3 - 1) * sizeof(char *));
- gram_piece[gram_piece3 + 1] = strdup("");
- gram_piece[gram_piece3 + 2] = strdup("");
- gram_piece3 += 2;
- gram_piece0 += 2;
- gram_piece1 += 2;
-}
-#define insert_before(n, str) \
- do { gram_piece_insert(gram_piece2 + (n) * 2, (str)); ++gram_piece0; ++gram_piece3; } while (0)
-#define insert_after(n, str) \
- do { gram_piece_insert(gram_piece2 + (n) * 2 + 1, (str)); ++gram_piece0; ++gram_piece3; } while (0)
 int
 yyparse (void)
 {
@@ -1871,7 +1868,7 @@ YYLTYPE yylloc = yyloc_default;
   yychar = YYEMPTY; /* Cause a token to be read.  */
 
 /* User initialization code.  */
-#line 114 "src/parse-gram.y" /* yacc.c:1430  */
+#line 133 "src/parse-gram.y" /* yacc.c:1430  */
 {
   /* Bison's grammar can initial empty locations, hence a default
      location is needed. */
@@ -1879,7 +1876,7 @@ YYLTYPE yylloc = yyloc_default;
   boundary_set (&yylloc.end, current_file, 1, 1);
 }
 
-#line 1861 "src/parse-gram.c" /* yacc.c:1430  */
+#line 1880 "src/parse-gram.c" /* yacc.c:1430  */
   yylsp[0] = yylloc;
   goto yysetstate;
 
@@ -2085,18 +2082,18 @@ yyreduce:
     switch (yyn)
       {
           case 2:
-#line 271 "src/parse-gram.y" /* yacc.c:1648  */
+#line 290 "src/parse-gram.y" /* yacc.c:1648  */
     {
  insert_after(2, "</PYACC_Section2>");
  insert_before(2, "<PYACC_Section2>");
  insert_after(0, "</PYACC_Section1>");
  insert_before(0, "<PYACC_Section1>");
  }
-#line 2063 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2082 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 3:
-#line 286 "src/parse-gram.y" /* yacc.c:1648  */
+#line 305 "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 */
@@ -2107,11 +2104,11 @@ yyreduce:
  gram_piece[gram_piece2] = gram_piece[gram_piece2 - 1]; /* empty */
  gram_piece[gram_piece2 - 1] = temp;
  }
-#line 2078 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2097 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 6:
-#line 302 "src/parse-gram.y" /* yacc.c:1648  */
+#line 321 "src/parse-gram.y" /* yacc.c:1648  */
     {
  /* inserting %{...%} below is a hack as we may lose some whitespace near it */
  code_piece_append("<PYACC_Section1_Prologue>%{<PYACC_Text>");
@@ -2123,52 +2120,52 @@ yyreduce:
  free(gram_piece[gram_piece2]);
  gram_piece[gram_piece2] = strdup(code_piece[code_piece0 - 1]);
     }
-#line 2094 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2113 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 7:
-#line 314 "src/parse-gram.y" /* yacc.c:1648  */
+#line 333 "src/parse-gram.y" /* yacc.c:1648  */
     {
       muscle_percent_define_ensure ((yyvsp[0].uniqstr), (yylsp[0]), true);
  insert_after(0, "</PYACC_Section1_Flag>");
  insert_before(0, "<PYACC_Section1_Flag>");
     }
-#line 2104 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2123 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 8:
-#line 320 "src/parse-gram.y" /* yacc.c:1648  */
+#line 339 "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, "</PYACC_Section1_Define>");
  insert_before(0, "<PYACC_Section1_Define>");
     }
-#line 2115 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2134 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 9:
-#line 326 "src/parse-gram.y" /* yacc.c:1648  */
+#line 345 "src/parse-gram.y" /* yacc.c:1648  */
     { defines_flag = true; /*}*/
  insert_after(0, "</PYACC_Section1_Define>");
  insert_before(0, "<PYACC_Section1_Define>");
  }
-#line 2124 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2143 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 10:
-#line 331 "src/parse-gram.y" /* yacc.c:1648  */
+#line 350 "src/parse-gram.y" /* yacc.c:1648  */
     {
       defines_flag = true;
       spec_defines_file = xstrdup ((yyvsp[0].code));
  insert_after(1, "</PYACC_Section1_Define>");
  insert_before(0, "<PYACC_Section1_Define>");
     }
-#line 2135 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2154 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 11:
-#line 338 "src/parse-gram.y" /* yacc.c:1648  */
+#line 357 "src/parse-gram.y" /* yacc.c:1648  */
     {
       muscle_percent_define_insert ("parse.error", (yylsp[0]), muscle_keyword,
                                     "verbose",
@@ -2176,53 +2173,53 @@ yyreduce:
  insert_after(0, "</PYACC_Section1_ErrorVerbose>");
  insert_before(0, "<PYACC_Section1_ErrorVerbose>");
     }
-#line 2147 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2166 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 12:
-#line 345 "src/parse-gram.y" /* yacc.c:1648  */
+#line 364 "src/parse-gram.y" /* yacc.c:1648  */
     { expected_sr_conflicts = (yyvsp[0].integer); /*}*/
  insert_after(1, "</PYACC_Section1_Expect>");
  insert_after(1, "</PYACC_Int>");
  insert_before(1, "<PYACC_Int>");
  insert_before(0, "<PYACC_Section1_Expect>");
  }
-#line 2158 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2177 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 13:
-#line 351 "src/parse-gram.y" /* yacc.c:1648  */
+#line 370 "src/parse-gram.y" /* yacc.c:1648  */
     { expected_rr_conflicts = (yyvsp[0].integer); /*}*/
  insert_after(1, "</PYACC_Section1_ExpectRR>");
  insert_after(1, "</PYACC_Int>");
  insert_before(1, "<PYACC_Int>");
  insert_before(0, "<PYACC_Section1_ExpectRR>");
  }
-#line 2169 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2188 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 14:
-#line 357 "src/parse-gram.y" /* yacc.c:1648  */
+#line 376 "src/parse-gram.y" /* yacc.c:1648  */
     { spec_file_prefix = (yyvsp[0].code); /*}*/
  insert_after(1, "</PYACC_Section1_FilePrefix>");
  insert_before(0, "<PYACC_Section1_FilePrefix>");
  }
-#line 2178 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2197 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 15:
-#line 362 "src/parse-gram.y" /* yacc.c:1648  */
+#line 381 "src/parse-gram.y" /* yacc.c:1648  */
     {
       nondeterministic_parser = true;
       glr_parser = true;
  insert_after(0, "</PYACC_Section1_GLRParser>");
  insert_before(0, "<PYACC_Section1_GLRParser>");
     }
-#line 2189 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2208 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 16:
-#line 369 "src/parse-gram.y" /* yacc.c:1648  */
+#line 388 "src/parse-gram.y" /* yacc.c:1648  */
     {
  code_piece_append("<PYACC_BracedCode>");
       muscle_code_grow ("initial_action", translate_code ((yyvsp[0].code), (yylsp[0]), false), (yylsp[0]));
@@ -2234,80 +2231,80 @@ yyreduce:
  insert_after(1, "</PYACC_Section1_InitialAction>");
  insert_before(0, "<PYACC_Section1_InitialAction>");
     }
-#line 2205 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2224 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 17:
-#line 380 "src/parse-gram.y" /* yacc.c:1648  */
+#line 399 "src/parse-gram.y" /* yacc.c:1648  */
     { language_argmatch ((yyvsp[0].code), grammar_prio, (yylsp[-1])); /*}*/
  insert_after(1, "</PYACC_Section1_Language>");
  insert_before(0, "<PYACC_Section1_Language>");
  }
-#line 2214 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2233 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 18:
-#line 384 "src/parse-gram.y" /* yacc.c:1648  */
+#line 403 "src/parse-gram.y" /* yacc.c:1648  */
     { spec_name_prefix = (yyvsp[0].code); /*}*/
  insert_after(1, "</PYACC_Section1_NamePrefix>");
  insert_before(0, "<PYACC_Section1_NamePrefix>");
  }
-#line 2223 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2242 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 19:
-#line 388 "src/parse-gram.y" /* yacc.c:1648  */
+#line 407 "src/parse-gram.y" /* yacc.c:1648  */
     { no_lines_flag = true; /*}*/
  insert_after(0, "</PYACC_Section1_Lines>");
  insert_before(0, "<PYACC_Section1_Lines value=\"false\">");
  }
-#line 2232 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2251 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 20:
-#line 392 "src/parse-gram.y" /* yacc.c:1648  */
+#line 411 "src/parse-gram.y" /* yacc.c:1648  */
     { nondeterministic_parser = true; /*}*/
  insert_after(0, "</PYACC_Section1_NonDeterministicParser>");
  insert_before(0, "<PYACC_Section1_NonDeterministicParser>");
  }
-#line 2241 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2260 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 21:
-#line 396 "src/parse-gram.y" /* yacc.c:1648  */
+#line 415 "src/parse-gram.y" /* yacc.c:1648  */
     { spec_outfile = (yyvsp[0].code); /*}*/
  insert_after(1, "</PYACC_Section1_Output>");
  insert_before(0, "<PYACC_Section1_Output>");
  }
-#line 2250 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2269 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 22:
-#line 400 "src/parse-gram.y" /* yacc.c:1648  */
+#line 419 "src/parse-gram.y" /* yacc.c:1648  */
     { current_param = (yyvsp[0].param); }
-#line 2256 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2275 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 23:
-#line 400 "src/parse-gram.y" /* yacc.c:1648  */
+#line 419 "src/parse-gram.y" /* yacc.c:1648  */
     { current_param = param_none; /*}*/
  insert_after(2, "</PYACC_Section1_Param>");
  insert_before(0, "<PYACC_Section1_Param>");
  }
-#line 2265 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2284 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 24:
-#line 404 "src/parse-gram.y" /* yacc.c:1648  */
+#line 423 "src/parse-gram.y" /* yacc.c:1648  */
     { version_check (&(yylsp[0]), (yyvsp[0].code)); /*}*/
  insert_after(1, "</PYACC_Section1_Require>");
  insert_before(0, "<PYACC_Section1_Require>");
  }
-#line 2274 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2293 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 25:
-#line 409 "src/parse-gram.y" /* yacc.c:1648  */
+#line 428 "src/parse-gram.y" /* yacc.c:1648  */
     {
       char const *skeleton_user = (yyvsp[0].code);
       if (strchr (skeleton_user, '/'))
@@ -2333,50 +2330,50 @@ yyreduce:
  insert_after(1, "</PYACC_Section1_Skeleton>");
  insert_before(0, "<PYACC_Section1_Skeleton>");
     }
-#line 2304 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2323 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 26:
-#line 434 "src/parse-gram.y" /* yacc.c:1648  */
+#line 453 "src/parse-gram.y" /* yacc.c:1648  */
     { token_table_flag = true; /*}*/
  insert_after(0, "</PYACC_Section1_TokenTable>");
  insert_before(0, "<PYACC_Section1_TokenTable>");
  }
-#line 2313 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2332 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 27:
-#line 438 "src/parse-gram.y" /* yacc.c:1648  */
+#line 457 "src/parse-gram.y" /* yacc.c:1648  */
     { report_flag |= report_states; /*}*/
  insert_after(0, "</PYACC_Section1_Verbose>");
  insert_before(0, "<PYACC_Section1_Verbose>");
  }
-#line 2322 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2341 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 28:
-#line 442 "src/parse-gram.y" /* yacc.c:1648  */
+#line 461 "src/parse-gram.y" /* yacc.c:1648  */
     { yacc_flag = true; /*}*/
  insert_after(0, "</PYACC_Section1_YACC>");
  insert_before(0, "<PYACC_Section1_YACC>");
  }
-#line 2331 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2350 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 30:
-#line 450 "src/parse-gram.y" /* yacc.c:1648  */
+#line 469 "src/parse-gram.y" /* yacc.c:1648  */
     { add_param (current_param, (yyvsp[0].code), (yylsp[0])); }
-#line 2337 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2356 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 31:
-#line 451 "src/parse-gram.y" /* yacc.c:1648  */
+#line 470 "src/parse-gram.y" /* yacc.c:1648  */
     { add_param (current_param, (yyvsp[0].code), (yylsp[0])); }
-#line 2343 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2362 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 34:
-#line 463 "src/parse-gram.y" /* yacc.c:1648  */
+#line 482 "src/parse-gram.y" /* yacc.c:1648  */
     {
       grammar_start_symbol_set ((yyvsp[0].symbol), (yylsp[0]));
  insert_after(1, "</PYACC_Section1Or2_Start>");
@@ -2384,11 +2381,11 @@ yyreduce:
  insert_before(1, "<PYACC_NonterminalRef>");
  insert_before(0, "<PYACC_Section1Or2_Start>");
     }
-#line 2355 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2374 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 35:
-#line 471 "src/parse-gram.y" /* yacc.c:1648  */
+#line 490 "src/parse-gram.y" /* yacc.c:1648  */
     {
       code_props code;
       code_props_symbol_action_init (&code, (yyvsp[-1].code), (yylsp[-1]));
@@ -2410,31 +2407,31 @@ yyreduce:
  sprintf(gram_piece_temp, "<PYACC_Section1Or2_CodeProps type=\"%d\">", (yyvsp[-2].code_type));
  insert_before(0, gram_piece_temp);
     }
-#line 2381 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2400 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 36:
-#line 493 "src/parse-gram.y" /* yacc.c:1648  */
+#line 512 "src/parse-gram.y" /* yacc.c:1648  */
     {
       default_prec = true;
  insert_after(0, "</PYACC_Section1Or2_DefaultPrec>");
  insert_before(0, "<PYACC_Section1Or2_DefaultPrec value=\"true\">");
    }
-#line 2391 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2410 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 37:
-#line 499 "src/parse-gram.y" /* yacc.c:1648  */
+#line 518 "src/parse-gram.y" /* yacc.c:1648  */
     {
       default_prec = false;
  insert_after(0, "</PYACC_Section1Or2_DefaultPrec>");
  insert_before(0, "<PYACC_Section1Or2_DefaultPrec>");
     }
-#line 2401 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2420 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 38:
-#line 505 "src/parse-gram.y" /* yacc.c:1648  */
+#line 524 "src/parse-gram.y" /* yacc.c:1648  */
     {
       /* Do not invoke muscle_percent_code_grow here since it invokes
          muscle_user_name_list_grow.  */
@@ -2449,11 +2446,11 @@ yyreduce:
  insert_after(1, "</PYACC_Section1Or2_Code>");
  insert_before(0, "<PYACC_Section1Or2_Code><PYACC_ID />");
     }
-#line 2420 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2439 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 39:
-#line 520 "src/parse-gram.y" /* yacc.c:1648  */
+#line 539 "src/parse-gram.y" /* yacc.c:1648  */
     {
  code_piece_append("<PYACC_BracedCode>{");
       muscle_percent_code_grow ((yyvsp[-1].uniqstr), (yylsp[-1]), translate_code_braceless ((yyvsp[0].code), (yylsp[0])), (yylsp[0]));
@@ -2465,37 +2462,37 @@ yyreduce:
  insert_after(2, "</PYACC_Section1Or2_Code>");
  insert_before(0, "<PYACC_Section1Or2_Code>");
     }
-#line 2436 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2455 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 40:
-#line 537 "src/parse-gram.y" /* yacc.c:1648  */
+#line 556 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.code_type) = destructor; }
-#line 2442 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2461 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 41:
-#line 538 "src/parse-gram.y" /* yacc.c:1648  */
+#line 557 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.code_type) = printer; }
-#line 2448 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2467 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 42:
-#line 548 "src/parse-gram.y" /* yacc.c:1648  */
+#line 567 "src/parse-gram.y" /* yacc.c:1648  */
     { insert_before(0, "<PYACC_ID />"); }
-#line 2454 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2473 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 43:
-#line 549 "src/parse-gram.y" /* yacc.c:1648  */
+#line 568 "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 2462 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2481 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 44:
-#line 556 "src/parse-gram.y" /* yacc.c:1648  */
+#line 575 "src/parse-gram.y" /* yacc.c:1648  */
     {
       union_seen = true;
  code_piece_append("<PYACC_BracedCode>{");
@@ -2508,17 +2505,17 @@ yyreduce:
  insert_after(2, "</PYACC_Section1Or2_Union>");
  insert_before(0, "<PYACC_Section1Or2_Union>");
     }
-#line 2479 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2498 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 45:
-#line 574 "src/parse-gram.y" /* yacc.c:1648  */
+#line 593 "src/parse-gram.y" /* yacc.c:1648  */
     { current_class = nterm_sym; }
-#line 2485 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2504 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 46:
-#line 575 "src/parse-gram.y" /* yacc.c:1648  */
+#line 594 "src/parse-gram.y" /* yacc.c:1648  */
     {
       current_class = unknown_sym;
       current_type = NULL;
@@ -2527,17 +2524,17 @@ yyreduce:
  insert_before(2, "<PYACC_Section1Or2_TaggedSymbols>");
  insert_before(0, "<PYACC_Section1Or2_NTerm>");
     }
-#line 2498 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2517 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 47:
-#line 583 "src/parse-gram.y" /* yacc.c:1648  */
+#line 602 "src/parse-gram.y" /* yacc.c:1648  */
     { current_class = token_sym; }
-#line 2504 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2523 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 48:
-#line 584 "src/parse-gram.y" /* yacc.c:1648  */
+#line 603 "src/parse-gram.y" /* yacc.c:1648  */
     {
       current_class = unknown_sym;
       current_type = NULL;
@@ -2546,11 +2543,11 @@ yyreduce:
  insert_before(2, "<PYACC_Section1Or2_TaggedSymbols>");
  insert_before(0, "<PYACC_Section1Or2_Token>");
     }
-#line 2517 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2536 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 49:
-#line 593 "src/parse-gram.y" /* yacc.c:1648  */
+#line 612 "src/parse-gram.y" /* yacc.c:1648  */
     {
       symbol_list *list;
       tag_seen = true;
@@ -2562,11 +2559,11 @@ yyreduce:
  insert_before(1, "<PYACC_Section1Or2_TaggedSymbols>");
  insert_before(0, "<PYACC_Section1Or2_Type>");
     }
-#line 2533 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2552 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 50:
-#line 608 "src/parse-gram.y" /* yacc.c:1648  */
+#line 627 "src/parse-gram.y" /* yacc.c:1648  */
     {
       symbol_list *list;
       ++current_prec;
@@ -2583,70 +2580,70 @@ yyreduce:
  sprintf(gram_piece_temp, "<PYACC_Section1Or2_Precedence type=\"%d\">", ((yyvsp[-2].assoc) & 3) - 1); /* -1 precedence, 0 right, 1 left, 2 nonassoc */
  insert_before(0, gram_piece_temp);
     }
-#line 2554 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2573 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 51:
-#line 627 "src/parse-gram.y" /* yacc.c:1648  */
+#line 646 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.assoc) = left_assoc; }
-#line 2560 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2579 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 52:
-#line 628 "src/parse-gram.y" /* yacc.c:1648  */
+#line 647 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.assoc) = right_assoc;  }
-#line 2566 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2585 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 53:
-#line 629 "src/parse-gram.y" /* yacc.c:1648  */
+#line 648 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.assoc) = non_assoc; }
-#line 2572 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2591 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 54:
-#line 630 "src/parse-gram.y" /* yacc.c:1648  */
+#line 649 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.assoc) = precedence_assoc; }
-#line 2578 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2597 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 55:
-#line 634 "src/parse-gram.y" /* yacc.c:1648  */
+#line 653 "src/parse-gram.y" /* yacc.c:1648  */
     { current_type = NULL; }
-#line 2584 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2603 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 56:
-#line 635 "src/parse-gram.y" /* yacc.c:1648  */
+#line 654 "src/parse-gram.y" /* yacc.c:1648  */
     { current_type = (yyvsp[0].uniqstr); tag_seen = true; }
-#line 2590 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2609 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 57:
-#line 641 "src/parse-gram.y" /* yacc.c:1648  */
+#line 660 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.list) = symbol_list_sym_new ((yyvsp[0].symbol), (yylsp[0])); }
-#line 2596 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2615 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 58:
-#line 643 "src/parse-gram.y" /* yacc.c:1648  */
+#line 662 "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 2602 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2621 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 59:
-#line 648 "src/parse-gram.y" /* yacc.c:1648  */
+#line 667 "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, "</PYACC_TerminalRef>");
  insert_before(0, "<PYACC_TerminalRef>");
     }
-#line 2613 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2632 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 60:
-#line 655 "src/parse-gram.y" /* yacc.c:1648  */
+#line 674 "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]));
@@ -2655,77 +2652,77 @@ yyreduce:
  sprintf(gram_piece_temp, "<PYACC_TerminalRef user_token=\"%d\">", (yyvsp[0].integer));
  insert_before(0, gram_piece_temp);
     }
-#line 2626 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2645 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 61:
-#line 668 "src/parse-gram.y" /* yacc.c:1648  */
+#line 687 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.list) = symbol_list_sym_new ((yyvsp[0].symbol), (yylsp[0])); /*}*/
  insert_after(0, "</PYACC_TerminalRef>");
  insert_before(0, "<PYACC_TerminalRef>");
  }
-#line 2635 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2654 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 62:
-#line 673 "src/parse-gram.y" /* yacc.c:1648  */
+#line 692 "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, "</PYACC_TerminalRef>");
  insert_before(1, "<PYACC_TerminalRef>");
  }
-#line 2644 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2663 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 63:
-#line 680 "src/parse-gram.y" /* yacc.c:1648  */
+#line 699 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.list) = (yyvsp[0].list); }
-#line 2650 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2669 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 64:
-#line 681 "src/parse-gram.y" /* yacc.c:1648  */
+#line 700 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.list) = symbol_list_append ((yyvsp[-1].list), (yyvsp[0].list)); }
-#line 2656 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2675 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 65:
-#line 685 "src/parse-gram.y" /* yacc.c:1648  */
+#line 704 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.list) = symbol_list_sym_new ((yyvsp[0].symbol), (yylsp[0])); /*}*/
  insert_after(0, "</PYACC_TerminalRef>");
  insert_before(0, "<PYACC_TerminalRef>");
  }
-#line 2665 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2684 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 66:
-#line 689 "src/parse-gram.y" /* yacc.c:1648  */
+#line 708 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.list) = symbol_list_type_new ((yyvsp[0].uniqstr), (yylsp[0])); }
-#line 2671 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2690 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 68:
-#line 694 "src/parse-gram.y" /* yacc.c:1648  */
+#line 713 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.uniqstr) = uniqstr_new ("*"); }
-#line 2677 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2696 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 69:
-#line 695 "src/parse-gram.y" /* yacc.c:1648  */
+#line 714 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.uniqstr) = uniqstr_new (""); }
-#line 2683 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2702 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 70:
-#line 701 "src/parse-gram.y" /* yacc.c:1648  */
+#line 720 "src/parse-gram.y" /* yacc.c:1648  */
     {
       current_type = (yyvsp[0].uniqstr);
       tag_seen = true;
     }
-#line 2692 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2711 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 71:
-#line 706 "src/parse-gram.y" /* yacc.c:1648  */
+#line 725 "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]));
@@ -2738,11 +2735,11 @@ yyreduce:
   insert_before(0, "<PYACC_TerminalRef>");
  }
     }
-#line 2709 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2728 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 72:
-#line 719 "src/parse-gram.y" /* yacc.c:1648  */
+#line 738 "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]));
@@ -2758,11 +2755,11 @@ yyreduce:
   insert_before(0, gram_piece_temp);
  }
     }
-#line 2729 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2748 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 73:
-#line 735 "src/parse-gram.y" /* yacc.c:1648  */
+#line 754 "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]));
@@ -2776,11 +2773,11 @@ yyreduce:
   insert_before(0, "<PYACC_TerminalRef>");
  }
     }
-#line 2747 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2766 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 74:
-#line 749 "src/parse-gram.y" /* yacc.c:1648  */
+#line 768 "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]));
@@ -2797,25 +2794,25 @@ yyreduce:
   insert_before(0, gram_piece_temp);
  }
     }
-#line 2768 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2787 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 81:
-#line 789 "src/parse-gram.y" /* yacc.c:1648  */
+#line 808 "src/parse-gram.y" /* yacc.c:1648  */
     {
       yyerrok;
     }
-#line 2776 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2795 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 82:
-#line 795 "src/parse-gram.y" /* yacc.c:1648  */
+#line 814 "src/parse-gram.y" /* yacc.c:1648  */
     { current_lhs ((yyvsp[-1].symbol), (yylsp[-1]), (yyvsp[0].named_ref)); }
-#line 2782 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2801 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 83:
-#line 796 "src/parse-gram.y" /* yacc.c:1648  */
+#line 815 "src/parse-gram.y" /* yacc.c:1648  */
     {
     /* Free the current lhs. */
     current_lhs (0, (yylsp[-3]), 0);
@@ -2825,29 +2822,29 @@ yyreduce:
  insert_before(0, "<PYACC_NonterminalRef>");
  insert_before(0, "<PYACC_Section2_Rules>");
   }
-#line 2796 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2815 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 84:
-#line 808 "src/parse-gram.y" /* yacc.c:1648  */
+#line 827 "src/parse-gram.y" /* yacc.c:1648  */
     { grammar_current_rule_end ((yylsp[0])); /*}*/
  insert_after(0, "</PYACC_Production>");
  insert_before(0, "<PYACC_Production>");
  }
-#line 2805 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2824 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 85:
-#line 812 "src/parse-gram.y" /* yacc.c:1648  */
+#line 831 "src/parse-gram.y" /* yacc.c:1648  */
     { grammar_current_rule_end ((yylsp[0])); /*}*/
  insert_after(2, "</PYACC_Production>");
  insert_before(2, "<PYACC_Production>");
  }
-#line 2814 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2833 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 87:
-#line 822 "src/parse-gram.y" /* yacc.c:1648  */
+#line 841 "src/parse-gram.y" /* yacc.c:1648  */
     { 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 */
@@ -2859,20 +2856,20 @@ yyreduce:
  gram_piece[gram_piece2] = gram_piece[gram_piece2 - 1]; /* empty */
  gram_piece[gram_piece2 - 1] = temp;
  }
-#line 2830 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2849 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 88:
-#line 834 "src/parse-gram.y" /* yacc.c:1648  */
+#line 853 "src/parse-gram.y" /* yacc.c:1648  */
     { grammar_current_rule_symbol_append ((yyvsp[-1].symbol), (yylsp[-1]), (yyvsp[0].named_ref)); /*}*/
  insert_after(2, "</PYACC_Production_SymbolRef>");
  insert_before(1, "<PYACC_Production_SymbolRef>");
  }
-#line 2839 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2858 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 89:
-#line 839 "src/parse-gram.y" /* yacc.c:1648  */
+#line 858 "src/parse-gram.y" /* yacc.c:1648  */
     { code_piece_append("<PYACC_BracedCode>"); grammar_current_rule_action_append ((yyvsp[-1].code), (yylsp[-1]), (yyvsp[0].named_ref), false); /*}*/
  code_piece_append("</PYACC_BracedCode>");
  code_piece_pack();
@@ -2881,130 +2878,130 @@ yyreduce:
  insert_after(2, "</PYACC_Production_Action>");
  insert_before(1, "<PYACC_Production_Action>");
  }
-#line 2852 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2871 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 90:
-#line 848 "src/parse-gram.y" /* yacc.c:1648  */
+#line 867 "src/parse-gram.y" /* yacc.c:1648  */
     { grammar_current_rule_action_append ((yyvsp[0].code), (yylsp[0]), NULL, true); }
-#line 2858 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2877 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 91:
-#line 850 "src/parse-gram.y" /* yacc.c:1648  */
+#line 869 "src/parse-gram.y" /* yacc.c:1648  */
     { grammar_current_rule_empty_set ((yylsp[0])); /*}*/
  insert_after(1, "</PYACC_Production_Empty>");
  insert_before(1, "<PYACC_Production_Empty>");
  }
-#line 2867 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2886 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 92:
-#line 855 "src/parse-gram.y" /* yacc.c:1648  */
+#line 874 "src/parse-gram.y" /* yacc.c:1648  */
     { grammar_current_rule_prec_set ((yyvsp[0].symbol), (yylsp[0])); /*}*/
  insert_after(2, "</PYACC_Production_Prec>");
  insert_after(2, "</PYACC_TerminalRef>");
  insert_before(2, "<PYACC_TerminalRef>");
  insert_before(1, "<PYACC_Production_Prec>");
  }
-#line 2878 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2897 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 93:
-#line 862 "src/parse-gram.y" /* yacc.c:1648  */
+#line 881 "src/parse-gram.y" /* yacc.c:1648  */
     { grammar_current_rule_dprec_set ((yyvsp[0].integer), (yylsp[0])); /*}*/
  insert_after(2, "</PYACC_Production_DPrec>");
  insert_after(2, "</PYACC_Int>");
  insert_before(2, "<PYACC_Int>");
  insert_before(1, "<PYACC_Production_DPrec>");
  }
-#line 2889 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2908 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 94:
-#line 869 "src/parse-gram.y" /* yacc.c:1648  */
+#line 888 "src/parse-gram.y" /* yacc.c:1648  */
     { grammar_current_rule_merge_set ((yyvsp[0].uniqstr), (yylsp[0])); /*}*/
  insert_after(2, "</PYACC_Production_Merge>");
  insert_before(1, "<PYACC_Production_Merge>");
  }
-#line 2898 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2917 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 95:
-#line 876 "src/parse-gram.y" /* yacc.c:1648  */
+#line 895 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.named_ref) = 0; }
-#line 2904 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2923 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 96:
-#line 877 "src/parse-gram.y" /* yacc.c:1648  */
+#line 896 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.named_ref) = named_ref_new ((yyvsp[0].uniqstr), (yylsp[0])); }
-#line 2910 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2929 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 98:
-#line 888 "src/parse-gram.y" /* yacc.c:1648  */
+#line 907 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.uniqstr) = uniqstr_new ((yyvsp[0].code)); }
-#line 2916 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2935 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 99:
-#line 913 "src/parse-gram.y" /* yacc.c:1648  */
+#line 932 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.value).kind = muscle_keyword; (yyval.value).chars = ""; }
-#line 2922 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2941 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 100:
-#line 914 "src/parse-gram.y" /* yacc.c:1648  */
+#line 933 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.value).kind = muscle_keyword; (yyval.value).chars = (yyvsp[0].uniqstr); }
-#line 2928 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2947 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 101:
-#line 915 "src/parse-gram.y" /* yacc.c:1648  */
+#line 934 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.value).kind = muscle_string;  (yyval.value).chars = (yyvsp[0].code); }
-#line 2934 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2953 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 102:
-#line 916 "src/parse-gram.y" /* yacc.c:1648  */
+#line 935 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.value).kind = muscle_code;    (yyval.value).chars = strip_braces ((yyvsp[0].code)); }
-#line 2940 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2959 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 103:
-#line 929 "src/parse-gram.y" /* yacc.c:1648  */
+#line 948 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.symbol) = symbol_from_uniqstr ((yyvsp[0].uniqstr), (yylsp[0])); }
-#line 2946 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2965 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 104:
-#line 931 "src/parse-gram.y" /* yacc.c:1648  */
+#line 950 "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 2956 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2975 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 105:
-#line 939 "src/parse-gram.y" /* yacc.c:1648  */
+#line 958 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.symbol) = symbol_from_uniqstr ((yyvsp[0].uniqstr), (yylsp[0])); }
-#line 2962 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2981 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 108:
-#line 951 "src/parse-gram.y" /* yacc.c:1648  */
+#line 970 "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 2971 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2990 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 110:
-#line 960 "src/parse-gram.y" /* yacc.c:1648  */
+#line 979 "src/parse-gram.y" /* yacc.c:1648  */
     {
 #if 0
  int gram_piece0_save = gram_piece0, gram_piece1_save = gram_piece1;
@@ -3025,11 +3022,11 @@ yyreduce:
  insert_after(1, "</PYACC_Section3>");
  insert_after(0, "<PYACC_Section3>");
     }
-#line 2996 "src/parse-gram.c" /* yacc.c:1648  */
+#line 3015 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
 
-#line 3000 "src/parse-gram.c" /* yacc.c:1648  */
+#line 3019 "src/parse-gram.c" /* yacc.c:1648  */
         default: break;
       }
     if (yychar_backup != yychar)
@@ -3292,7 +3289,7 @@ yyreturn:
 #endif
   return yyresult;
 }
-#line 982 "src/parse-gram.y" /* yacc.c:1907  */
+#line 1001 "src/parse-gram.y" /* yacc.c:1907  */
 
 
 /* Return the location of the left-hand side of a rule whose
index afd9d6a..e18764c 100644 (file)
@@ -1,34 +1,5 @@
 --- parse-gram.c.orig  2018-07-03 16:27:55.712903479 +1000
 +++ parse-gram.c       2018-07-06 09:54:49.562630748 +1000
-@@ -1742,6 +1742,28 @@
- | yyparse.  |
- `----------*/
-+extern char gram_piece_temp[];
-+extern char *gram_piece[];
-+extern int gram_piece0, gram_piece1;
-+void gram_piece_append(const char *str);
-+void gram_piece_insert(int n, const char *str);
-+void gram_piece_esc(const char *p, size_t n);
-+void gram_piece_pack();
-+int gram_piece2, gram_piece3;
-+static void peek(int *yychar_p, YYSTYPE *yylval_p, YYLTYPE *yylloc_p) {
-+ if (*yychar_p == YYEMPTY)
-+  *yychar_p = yylex(yylval_p, yylloc_p);
-+ memmove(gram_piece + gram_piece3 + 3, gram_piece + gram_piece3 + 1, (gram_piece1 - gram_piece3 - 1) * sizeof(char *));
-+ gram_piece[gram_piece3 + 1] = strdup("");
-+ gram_piece[gram_piece3 + 2] = strdup("");
-+ gram_piece3 += 2;
-+ gram_piece0 += 2;
-+ gram_piece1 += 2;
-+}
-+#define insert_before(n, str) \
-+ do { gram_piece_insert(gram_piece2 + (n) * 2, (str)); ++gram_piece0; ++gram_piece3; } while (0)
-+#define insert_after(n, str) \
-+ do { gram_piece_insert(gram_piece2 + (n) * 2 + 1, (str)); ++gram_piece0; ++gram_piece3; } while (0)
- int
- yyparse (void)
- {
 @@ -2026,6 +2048,17 @@
  yyreduce:
    /* yyn is the number of a rule to reduce with.  */
index fc40316..3b6bdbe 100644 (file)
@@ -52,7 +52,7 @@ extern int gram_debug;
 
   #include "symlist.h"
   #include "symtab.h"
-#line 227 "src/parse-gram.y" /* yacc.c:1910  */
+#line 246 "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 892 "src/parse-gram.y" /* yacc.c:1910  */
+#line 911 "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 188 "src/parse-gram.y" /* yacc.c:1910  */
+#line 207 "src/parse-gram.y" /* yacc.c:1910  */
 unsigned char character;
-#line 192 "src/parse-gram.y" /* yacc.c:1910  */
+#line 211 "src/parse-gram.y" /* yacc.c:1910  */
 char *code;
-#line 197 "src/parse-gram.y" /* yacc.c:1910  */
+#line 216 "src/parse-gram.y" /* yacc.c:1910  */
 uniqstr uniqstr;
-#line 205 "src/parse-gram.y" /* yacc.c:1910  */
+#line 224 "src/parse-gram.y" /* yacc.c:1910  */
 int integer;
-#line 209 "src/parse-gram.y" /* yacc.c:1910  */
+#line 228 "src/parse-gram.y" /* yacc.c:1910  */
 symbol *symbol;
-#line 214 "src/parse-gram.y" /* yacc.c:1910  */
+#line 233 "src/parse-gram.y" /* yacc.c:1910  */
 assoc assoc;
-#line 217 "src/parse-gram.y" /* yacc.c:1910  */
+#line 236 "src/parse-gram.y" /* yacc.c:1910  */
 symbol_list *list;
-#line 220 "src/parse-gram.y" /* yacc.c:1910  */
+#line 239 "src/parse-gram.y" /* yacc.c:1910  */
 named_ref *named_ref;
-#line 247 "src/parse-gram.y" /* yacc.c:1910  */
+#line 266 "src/parse-gram.y" /* yacc.c:1910  */
 param_type param;
-#line 534 "src/parse-gram.y" /* yacc.c:1910  */
+#line 553 "src/parse-gram.y" /* yacc.c:1910  */
 code_props_type code_type;
-#line 894 "src/parse-gram.y" /* yacc.c:1910  */
+#line 913 "src/parse-gram.y" /* yacc.c:1910  */
 
   struct
   {
index f53592e..5da35dc 100644 (file)
   extern int code_piece0;
   void code_piece_append(const char *str);
   void code_piece_pack();
+  
+  extern char gram_piece_temp[], *gram_piece[];
+  extern int gram_piece0, gram_piece1;
+  int gram_piece2, gram_piece3;
+  void gram_piece_insert(int n, const void *str);
+
+  #define insert_before(n, str) \
+   do { \
+    gram_piece_insert(gram_piece2 + (n) * 2, (str)); \
+    ++gram_piece0; \
+    ++gram_piece3; \
+   } while (0)
+  #define insert_after(n, str) \
+   do { \
+    gram_piece_insert(gram_piece2 + (n) * 2 + 1, (str)); \
+    ++gram_piece0; \
+    ++gram_piece3; \
+   } while (0)
+
 }
 
 %define api.prefix {gram_}
index 5d02560..a5117ca 100644 (file)
 /* %endif */
 /* end standard C headers. */
 
-char code_piece_temp[100];
-char *code_piece[10000];
-int code_piece0, code_piece1;
-void code_piece_append(const char *str) {
- code_piece[code_piece1++] = strdup(str);
-}
-void code_piece_insert(int n, const char *str) {
- memmove(code_piece + n + 1, code_piece + n, (code_piece1 - n) * sizeof(char *));
- code_piece[n] = strdup(str);
- ++code_piece1;
-}
-void code_piece_esc(const char *p, size_t n) {
- size_t i, j = 0;
- for (i = 0; i < n; ++i)
-  switch (p[i]) {
-  case '<':
-  case '>':
-   j += 4;
-   break;
-  case '&':
-   j += 5;
-   break;
-  default:
-   ++j;
-   break;
-  }
- char *q = malloc(j + 1);
- j = 0;
- for (i = 0; i < n; ++i)
-  switch (p[i]) {
-  case '<':
-   memcpy(q + j, "&lt;", 4);
-   j += 4;
-   break;
-  case '>':
-   memcpy(q + j, "&gt;", 4);
-   j += 4;
-   break;
-  case '&':
-   memcpy(q + j, "&amp;", 5);
-   j += 5;
-   break;
-  default:
-   q[j++] = p[i];
-   break;
-  }
- q[j] = 0;
- code_piece[code_piece1++] = q;
-}
-void code_piece_pack() {
- int i;
- size_t j = 0;
- for (i = code_piece0; i < code_piece1; ++i)
-  j += strlen(code_piece[i]);
- char *q = malloc(j + 1);
- j = 0;
- for (i = code_piece0; i < code_piece1; ++i) {
-  int k = strlen(code_piece[i]);
-  memcpy(q + j, code_piece[i], k);
-  free(code_piece[i]);
-  j += k;
- }
- q[j] = 0;
- code_piece[code_piece0++] = q;
- code_piece1 = code_piece0;
-}
-
 /* %if-c-or-c++ */
 /* flex integer type definitions */
 
@@ -321,14 +254,9 @@ extern FILE *code_in, *code_out;
        while ( 0 )
 
 #if 1
-#define flush() \
- do { \
-  code_piece_esc(yytext, yy_c_buf_p - yytext); \
-  yytext = yy_c_buf_p; \
- } while (0)
 #define unput(c) \
  do { \
-  code_piece_esc(yytext, yy_c_buf_p - yytext); \
+  code_piece_escape(yytext, yy_c_buf_p - yytext); \
   yyunput(c, (yytext_ptr)); \
   yytext = yy_c_buf_p; \
  } while (0)
@@ -704,8 +632,8 @@ int code__flex_debug = 1;
 
 static yyconst flex_int16_t yy_rule_linenum[18] =
     {   0,
-      117,  127,  128,  138,  143,  148,  154,  155,  156,  157,
-      159,  167,  174,  185,  202,  215,  218
+      125,  135,  136,  146,  151,  156,  162,  163,  164,  165,
+      167,  175,  181,  191,  209,  222,  225
     } ;
 
 /* The intent behind this definition is that it'll catch
@@ -783,6 +711,14 @@ static char *last_string;
 static bool untyped_var_seen;
 
 /* Nick */
+char code_piece_temp[100], *code_piece[10000];
+int code_piece0, code_piece1;
+
+void code_piece_append(const char *str);
+void code_piece_escape(const char *p, size_t n);
+void code_piece_flush(size_t n);
+void code_piece_pack();
+
 int no_handle_action;
 
 /* C and C++ comments in code. */
@@ -801,7 +737,7 @@ of $ and @.  */
 /* C style identifier. Must start with letter. Will be used for
    named symbol references. Shall be kept synchronized with
    scan-gram.l "letter" and "id". */
-#line 724 "src/scan-code.c"
+#line 732 "src/scan-code.c"
 
 #define INITIAL 0
 #define SC_COMMENT 1
@@ -1052,7 +988,7 @@ YY_DECL
        register int yy_act;
     
 /* %% [7.0] user's declarations go here */
-#line 99 "src/scan-code.l"
+#line 107 "src/scan-code.l"
 
 
 
@@ -1069,7 +1005,7 @@ YY_DECL
   | Scanning a C comment.  The initial '/ *' is already eaten.  |
   `------------------------------------------------------------*/
 
-#line 992 "src/scan-code.c"
+#line 1000 "src/scan-code.c"
 
        if ( !(yy_init) )
                {
@@ -1107,7 +1043,7 @@ YY_DECL
 
 #if 1
  /* we do this so that "continue;" in an action works correctly */
- for (; ; code_piece_esc(yytext, yy_c_buf_p - yytext))
+ for (; ; code_piece_escape(yytext, yy_c_buf_p - yytext))
 #else
        while ( 1 )             /* loops until end-of-file is reached */
 #endif
@@ -1187,7 +1123,7 @@ do_action:        /* This label is used only to access EOF actions. */
 case 1:
 /* rule 1 can match eol */
 YY_RULE_SETUP
-#line 117 "src/scan-code.l"
+#line 125 "src/scan-code.l"
 STRING_GROW; BEGIN sc_context;
        YY_BREAK
 
@@ -1199,13 +1135,13 @@ STRING_GROW; BEGIN sc_context;
 case 2:
 /* rule 2 can match eol */
 YY_RULE_SETUP
-#line 127 "src/scan-code.l"
+#line 135 "src/scan-code.l"
 STRING_GROW; BEGIN sc_context;
        YY_BREAK
 case 3:
 /* rule 3 can match eol */
 YY_RULE_SETUP
-#line 128 "src/scan-code.l"
+#line 136 "src/scan-code.l"
 STRING_GROW;
        YY_BREAK
 
@@ -1217,7 +1153,7 @@ STRING_GROW;
 case 4:
 /* rule 4 can match eol */
 YY_RULE_SETUP
-#line 138 "src/scan-code.l"
+#line 146 "src/scan-code.l"
 STRING_GROW;
        YY_BREAK
 
@@ -1225,7 +1161,7 @@ STRING_GROW;
 
 case 5:
 YY_RULE_SETUP
-#line 143 "src/scan-code.l"
+#line 151 "src/scan-code.l"
 STRING_GROW; BEGIN sc_context;
        YY_BREAK
 
@@ -1233,7 +1169,7 @@ STRING_GROW; BEGIN sc_context;
 
 case 6:
 YY_RULE_SETUP
-#line 148 "src/scan-code.l"
+#line 156 "src/scan-code.l"
 STRING_GROW; BEGIN sc_context;
        YY_BREAK
 
@@ -1241,29 +1177,29 @@ STRING_GROW; BEGIN sc_context;
 
 case 7:
 YY_RULE_SETUP
-#line 154 "src/scan-code.l"
+#line 162 "src/scan-code.l"
 STRING_GROW; BEGIN SC_CHARACTER;
        YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 155 "src/scan-code.l"
+#line 163 "src/scan-code.l"
 STRING_GROW; BEGIN SC_STRING;
        YY_BREAK
 case 9:
 /* rule 9 can match eol */
 YY_RULE_SETUP
-#line 156 "src/scan-code.l"
+#line 164 "src/scan-code.l"
 STRING_GROW; BEGIN SC_COMMENT;
        YY_BREAK
 case 10:
 /* rule 10 can match eol */
 YY_RULE_SETUP
-#line 157 "src/scan-code.l"
+#line 165 "src/scan-code.l"
 STRING_GROW; BEGIN SC_LINE_COMMENT;
        YY_BREAK
 case 11:
 YY_RULE_SETUP
-#line 159 "src/scan-code.l"
+#line 167 "src/scan-code.l"
 {
     complain (loc, Wother, _("stray '%s'"), code_text);
     obstack_escape (&obstack_for_string, code_text);
@@ -1274,22 +1210,20 @@ YY_RULE_SETUP
 
 case 12:
 YY_RULE_SETUP
-#line 167 "src/scan-code.l"
+#line 175 "src/scan-code.l"
 {
     ref_tail_fields = NULL;
     handle_action_dollar (self->rule, code_text, *loc);
- code_text = yy_c_buf_p;
     if (ref_tail_fields)
       obstack_sgrow (&obstack_for_string, ref_tail_fields);
   }
        YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 174 "src/scan-code.l"
+#line 181 "src/scan-code.l"
 {
     ref_tail_fields = NULL;
     handle_action_at (self->rule, code_text, *loc);
- code_text = yy_c_buf_p;
     if (ref_tail_fields)
       obstack_sgrow (&obstack_for_string, ref_tail_fields);
   }
@@ -1299,7 +1233,7 @@ YY_RULE_SETUP
 
 case 14:
 YY_RULE_SETUP
-#line 185 "src/scan-code.l"
+#line 191 "src/scan-code.l"
 {
  int i = sprintf(code_piece_temp, "<PYACC_Text_ValueReference tag_name=\"");
  int j = i + sprintf(code_piece_temp + i, "%s", code_text + 2);
@@ -1307,7 +1241,8 @@ YY_RULE_SETUP
   ;
  sprintf(code_piece_temp + j, "\">");
  code_piece_append(code_piece_temp);
- code_piece_esc(code_text, strlen(code_text));
+ i = strlen(code_text);
+ code_piece_escape(code_text, i);
  code_piece_append("</PYACC_Text_ValueReference>");
     const char *type_name = NULL;
     fetch_type_name (code_text + 1, &type_name, *loc)[-1] = 0;
@@ -1315,17 +1250,17 @@ YY_RULE_SETUP
     obstack_quote (&obstack_for_string, type_name);
     obstack_sgrow (&obstack_for_string, ")[");
     self->is_value_used = true;
- code_text = yy_c_buf_p;
+ code_text += i;
   }
        YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 202 "src/scan-code.l"
+#line 209 "src/scan-code.l"
 {
     obstack_sgrow (&obstack_for_string, "]b4_at_dollar[");
     muscle_percent_define_ensure("locations", the_location, true);
  code_piece_append("<PYACC_Text_ValueLocation>");
flush();
code_piece_flush(strlen(code_text));
  code_piece_append("</PYACC_Text_ValueLocation>");
   }
        YY_BREAK
@@ -1335,14 +1270,14 @@ YY_RULE_SETUP
 /* Escape M4 quoting characters in C code.  */
 case 16:
 YY_RULE_SETUP
-#line 215 "src/scan-code.l"
+#line 222 "src/scan-code.l"
 obstack_escape (&obstack_for_string, code_text);
        YY_BREAK
 /* By default, grow the string obstack with the input.  */
 case 17:
 /* rule 17 can match eol */
 YY_RULE_SETUP
-#line 218 "src/scan-code.l"
+#line 225 "src/scan-code.l"
 STRING_GROW;
        YY_BREAK
 /* End of processing. */
@@ -1353,16 +1288,16 @@ case YY_STATE_EOF(SC_STRING):
 case YY_STATE_EOF(SC_CHARACTER):
 case YY_STATE_EOF(SC_RULE_ACTION):
 case YY_STATE_EOF(SC_SYMBOL_ACTION):
-#line 221 "src/scan-code.l"
+#line 228 "src/scan-code.l"
 STRING_FINISH; /*code_piece_pack(); --code_piece0;*/ return last_string;
        YY_BREAK
 
 case 18:
 YY_RULE_SETUP
-#line 224 "src/scan-code.l"
+#line 231 "src/scan-code.l"
 YY_FATAL_ERROR( "flex scanner jammed" );
        YY_BREAK
-#line 1280 "src/scan-code.c"
+#line 1287 "src/scan-code.c"
 
        case YY_END_OF_BUFFER:
                {
@@ -2449,7 +2384,7 @@ void code_free (void * ptr )
 
 /* %ok-for-header */
 
-#line 224 "src/scan-code.l"
+#line 231 "src/scan-code.l"
 
 
 
@@ -2907,7 +2842,7 @@ handle_action_dollar (symbol_list *rule, char *text, location dollar_loc)
    ;
   sprintf(code_piece_temp + j, "\">");
   code_piece_append(code_piece_temp);
-  code_piece_esc(code_text, code_leng);
+  code_piece_flush(strlen(code_text));
   code_piece_append("</PYACC_Text_ValueReference>");
  }
  else {
@@ -2917,7 +2852,7 @@ handle_action_dollar (symbol_list *rule, char *text, location dollar_loc)
    ;
   sprintf(code_piece_temp + j, "\" index=\"%d\">", n);
   code_piece_append(code_piece_temp);
-  code_piece_esc(code_text, code_leng);
+  code_piece_flush(strlen(code_text));
   code_piece_append("</PYACC_Text_StackReference>");
  }
  if (no_handle_action)
@@ -3020,13 +2955,13 @@ handle_action_at (symbol_list *rule, char *text, location at_loc)
 #if 1
  if (n == LHS_REF) {
   code_piece_append("<PYACC_Text_ValueLocation>");
-  code_piece_esc(code_text, strlen(code_text));
+  code_piece_flush(strlen(code_text));
   code_piece_append("</PYACC_Text_ValueLocation>");
  }
  else {
   sprintf(code_piece_temp, "<PYACC_Text_StackLocation index=\"%d\">", n);
   code_piece_append(code_piece_temp);
-  code_piece_esc(code_text, strlen(code_text));
+  code_piece_flush(strlen(code_text));
   code_piece_append("</PYACC_Text_StackLocation>");
  }
  if (no_handle_action)
@@ -3157,3 +3092,70 @@ code_scanner_free (void)
   code_lex_destroy ();
 }
 
+/* Nick */
+void code_piece_append(const char *str) {
+ code_piece[code_piece1++] = strdup(str);
+}
+
+void code_piece_escape(const char *p, size_t n) {
+ size_t i, j = 0;
+ for (i = 0; i < n; ++i)
+  switch (p[i]) {
+  case '<':
+  case '>':
+   j += 4;
+   break;
+  case '&':
+   j += 5;
+   break;
+  default:
+   ++j;
+   break;
+  }
+ char *q = malloc(j + 1);
+ j = 0;
+ for (i = 0; i < n; ++i)
+  switch (p[i]) {
+  case '<':
+   memcpy(q + j, "&lt;", 4);
+   j += 4;
+   break;
+  case '>':
+   memcpy(q + j, "&gt;", 4);
+   j += 4;
+   break;
+  case '&':
+   memcpy(q + j, "&amp;", 5);
+   j += 5;
+   break;
+  default:
+   q[j++] = p[i];
+   break;
+  }
+ q[j] = 0;
+ code_piece[code_piece1++] = q;
+}
+
+void code_piece_flush(size_t n) {
+ code_piece_escape(code_text, n);
+ code_text += n;
+}
+
+void code_piece_pack() {
+ int i;
+ size_t j = 0;
+ for (i = code_piece0; i < code_piece1; ++i)
+  j += strlen(code_piece[i]);
+ char *q = malloc(j + 1);
+ j = 0;
+ for (i = code_piece0; i < code_piece1; ++i) {
+  int k = strlen(code_piece[i]);
+  memcpy(q + j, code_piece[i], k);
+  free(code_piece[i]);
+  j += k;
+ }
+ q[j] = 0;
+ code_piece[code_piece0++] = q;
+ code_piece1 = code_piece0;
+}
+
index f4641be..9511269 100644 (file)
@@ -1,92 +1,13 @@
---- scan-gram.c.orig   2018-07-06 09:26:27.790569234 +1000
-+++ scan-gram.c        2018-07-06 09:54:48.426630707 +1000
-@@ -66,6 +66,73 @@
- /* %endif */
- /* end standard C headers. */
-+char code_piece_temp[100];
-+char *code_piece[10000];
-+int code_piece0, code_piece1;
-+void code_piece_append(const char *str) {
-+ code_piece[code_piece1++] = strdup(str);
-+}
-+void code_piece_insert(int n, const char *str) {
-+ memmove(code_piece + n + 1, code_piece + n, (code_piece1 - n) * sizeof(char *));
-+ code_piece[n] = strdup(str);
-+ ++code_piece1;
-+}
-+void code_piece_esc(const char *p, size_t n) {
-+ size_t i, j = 0;
-+ for (i = 0; i < n; ++i)
-+  switch (p[i]) {
-+  case '<':
-+  case '>':
-+   j += 4;
-+   break;
-+  case '&':
-+   j += 5;
-+   break;
-+  default:
-+   ++j;
-+   break;
-+  }
-+ char *q = malloc(j + 1);
-+ j = 0;
-+ for (i = 0; i < n; ++i)
-+  switch (p[i]) {
-+  case '<':
-+   memcpy(q + j, "&lt;", 4);
-+   j += 4;
-+   break;
-+  case '>':
-+   memcpy(q + j, "&gt;", 4);
-+   j += 4;
-+   break;
-+  case '&':
-+   memcpy(q + j, "&amp;", 5);
-+   j += 5;
-+   break;
-+  default:
-+   q[j++] = p[i];
-+   break;
-+  }
-+ q[j] = 0;
-+ code_piece[code_piece1++] = q;
-+}
-+void code_piece_pack() {
-+ int i;
-+ size_t j = 0;
-+ for (i = code_piece0; i < code_piece1; ++i)
-+  j += strlen(code_piece[i]);
-+ char *q = malloc(j + 1);
-+ j = 0;
-+ for (i = code_piece0; i < code_piece1; ++i) {
-+  int k = strlen(code_piece[i]);
-+  memcpy(q + j, code_piece[i], k);
-+  free(code_piece[i]);
-+  j += k;
-+ }
-+ q[j] = 0;
-+ code_piece[code_piece0++] = q;
-+ code_piece1 = code_piece0;
-+}
-+
- /* %if-c-or-c++ */
- /* flex integer type definitions */
-@@ -253,7 +320,21 @@
+--- scan-code.c.orig   2018-07-26 20:25:29.798247742 +1000
++++ scan-code.c        2018-07-26 20:28:18.702255077 +1000
+@@ -253,7 +253,16 @@
                } \
        while ( 0 )
  
 +#if 1
-+#define flush() \
-+ do { \
-+  code_piece_esc(yytext, yy_c_buf_p - yytext); \
-+  yytext = yy_c_buf_p; \
-+ } while (0)
 +#define unput(c) \
 + do { \
-+  code_piece_esc(yytext, yy_c_buf_p - yytext); \
++  code_piece_escape(yytext, yy_c_buf_p - yytext); \
 +  yyunput(c, (yytext_ptr)); \
 +  yytext = yy_c_buf_p; \
 + } while (0)
  
  #ifndef YY_TYPEDEF_YY_SIZE_T
  #define YY_TYPEDEF_YY_SIZE_T
-@@ -1480,7 +1586,12 @@
-               gram__load_buffer_state( );
+@@ -1024,7 +1033,12 @@
+               code__load_buffer_state( );
                }
  
 +#if 1
 + /* we do this so that "continue;" in an action works correctly */
-+ for (; ; code_piece_esc(yytext, yy_c_buf_p - yytext))
++ for (; ; code_piece_escape(yytext, yy_c_buf_p - yytext))
 +#else
        while ( 1 )             /* loops until end-of-file is reached */
 +#endif
index d390578..c31d066 100644 (file)
@@ -67,6 +67,14 @@ static char *last_string;
 static bool untyped_var_seen;
 
 /* Nick */
+char code_piece_temp[100], *code_piece[10000];
+int code_piece0, code_piece1;
+
+void code_piece_append(const char *str);
+void code_piece_escape(const char *p, size_t n);
+void code_piece_flush(size_t n);
+void code_piece_pack();
+
 int no_handle_action;
 
 %}
@@ -167,14 +175,12 @@ ref      -?[0-9]+|{id}|"["{id}"]"|"$"
   "$"("<"{tag}">")?{ref}  {
     ref_tail_fields = NULL;
     handle_action_dollar (self->rule, yytext, *loc);
- yytext = yy_c_buf_p;
     if (ref_tail_fields)
       obstack_sgrow (&obstack_for_string, ref_tail_fields);
   }
   "@"{ref} {
     ref_tail_fields = NULL;
     handle_action_at (self->rule, yytext, *loc);
- yytext = yy_c_buf_p;
     if (ref_tail_fields)
       obstack_sgrow (&obstack_for_string, ref_tail_fields);
   }
@@ -189,7 +195,8 @@ ref      -?[0-9]+|{id}|"["{id}"]"|"$"
   ;
  sprintf(code_piece_temp + j, "\">");
  code_piece_append(code_piece_temp);
- code_piece_esc(yytext, strlen(yytext));
+ i = strlen(yytext);
+ code_piece_escape(yytext, i);
  code_piece_append("</PYACC_Text_ValueReference>");
     const char *type_name = NULL;
     fetch_type_name (yytext + 1, &type_name, *loc)[-1] = 0;
@@ -197,13 +204,13 @@ ref      -?[0-9]+|{id}|"["{id}"]"|"$"
     obstack_quote (&obstack_for_string, type_name);
     obstack_sgrow (&obstack_for_string, ")[");
     self->is_value_used = true;
- yytext = yy_c_buf_p;
+ yytext += i;
   }
   "@$" {
     obstack_sgrow (&obstack_for_string, "]b4_at_dollar[");
     muscle_percent_define_ensure("locations", the_location, true);
  code_piece_append("<PYACC_Text_ValueLocation>");
flush();
code_piece_flush(strlen(yytext));
  code_piece_append("</PYACC_Text_ValueLocation>");
   }
 }
@@ -677,7 +684,7 @@ handle_action_dollar (symbol_list *rule, char *text, location dollar_loc)
    ;
   sprintf(code_piece_temp + j, "\">");
   code_piece_append(code_piece_temp);
-  code_piece_esc(yytext, yyleng);
+  code_piece_flush(strlen(yytext));
   code_piece_append("</PYACC_Text_ValueReference>");
  }
  else {
@@ -687,7 +694,7 @@ handle_action_dollar (symbol_list *rule, char *text, location dollar_loc)
    ;
   sprintf(code_piece_temp + j, "\" index=\"%d\">", n);
   code_piece_append(code_piece_temp);
-  code_piece_esc(yytext, yyleng);
+  code_piece_flush(strlen(yytext));
   code_piece_append("</PYACC_Text_StackReference>");
  }
  if (no_handle_action)
@@ -790,13 +797,13 @@ handle_action_at (symbol_list *rule, char *text, location at_loc)
 #if 1
  if (n == LHS_REF) {
   code_piece_append("<PYACC_Text_ValueLocation>");
-  code_piece_esc(yytext, strlen(yytext));
+  code_piece_flush(strlen(yytext));
   code_piece_append("</PYACC_Text_ValueLocation>");
  }
  else {
   sprintf(code_piece_temp, "<PYACC_Text_StackLocation index=\"%d\">", n);
   code_piece_append(code_piece_temp);
-  code_piece_esc(yytext, strlen(yytext));
+  code_piece_flush(strlen(yytext));
   code_piece_append("</PYACC_Text_StackLocation>");
  }
  if (no_handle_action)
@@ -926,3 +933,70 @@ code_scanner_free (void)
   /* Reclaim Flex's buffers.  */
   yylex_destroy ();
 }
+
+/* Nick */
+void code_piece_append(const char *str) {
+ code_piece[code_piece1++] = strdup(str);
+}
+
+void code_piece_escape(const char *p, size_t n) {
+ size_t i, j = 0;
+ for (i = 0; i < n; ++i)
+  switch (p[i]) {
+  case '<':
+  case '>':
+   j += 4;
+   break;
+  case '&':
+   j += 5;
+   break;
+  default:
+   ++j;
+   break;
+  }
+ char *q = malloc(j + 1);
+ j = 0;
+ for (i = 0; i < n; ++i)
+  switch (p[i]) {
+  case '<':
+   memcpy(q + j, "&lt;", 4);
+   j += 4;
+   break;
+  case '>':
+   memcpy(q + j, "&gt;", 4);
+   j += 4;
+   break;
+  case '&':
+   memcpy(q + j, "&amp;", 5);
+   j += 5;
+   break;
+  default:
+   q[j++] = p[i];
+   break;
+  }
+ q[j] = 0;
+ code_piece[code_piece1++] = q;
+}
+
+void code_piece_flush(size_t n) {
+ code_piece_escape(yytext, n);
+ yytext += n;
+}
+
+void code_piece_pack() {
+ int i;
+ size_t j = 0;
+ for (i = code_piece0; i < code_piece1; ++i)
+  j += strlen(code_piece[i]);
+ char *q = malloc(j + 1);
+ j = 0;
+ for (i = code_piece0; i < code_piece1; ++i) {
+  int k = strlen(code_piece[i]);
+  memcpy(q + j, code_piece[i], k);
+  free(code_piece[i]);
+  j += k;
+ }
+ q[j] = 0;
+ code_piece[code_piece0++] = q;
+ code_piece1 = code_piece0;
+}
index 63bca81..c9a0c1a 100644 (file)
 /* %endif */
 /* end standard C headers. */
 
-char gram_piece_temp[100];
-char *gram_piece[10000];
-int gram_piece0, gram_piece1;
-void gram_piece_append(const char *str) {
- gram_piece[gram_piece1++] = strdup(str);
-}
-void gram_piece_insert(int n, const char *str) {
- memmove(gram_piece + n + 1, gram_piece + n, (gram_piece1 - n) * sizeof(char *));
- gram_piece[n] = strdup(str);
- ++gram_piece1;
-}
-void gram_piece_esc(const char *p, size_t n) {
- size_t i, j = 0;
- for (i = 0; i < n; ++i)
-  switch (p[i]) {
-  case '<':
-  case '>':
-   j += 4;
-   break;
-  case '&':
-   j += 5;
-   break;
-  default:
-   ++j;
-   break;
-  }
- char *q = malloc(j + 1);
- j = 0;
- for (i = 0; i < n; ++i)
-  switch (p[i]) {
-  case '<':
-   memcpy(q + j, "&lt;", 4);
-   j += 4;
-   break;
-  case '>':
-   memcpy(q + j, "&gt;", 4);
-   j += 4;
-   break;
-  case '&':
-   memcpy(q + j, "&amp;", 5);
-   j += 5;
-   break;
-  default:
-   q[j++] = p[i];
-   break;
-  }
- q[j] = 0;
- gram_piece[gram_piece1++] = q;
-}
-void gram_piece_pack() {
- int i;
- size_t j = 0;
- for (i = gram_piece0; i < gram_piece1; ++i)
-  j += strlen(gram_piece[i]);
- char *q = malloc(j + 1);
- j = 0;
- for (i = gram_piece0; i < gram_piece1; ++i) {
-  int k = strlen(gram_piece[i]);
-  memcpy(q + j, gram_piece[i], k);
-  free(gram_piece[i]);
-  j += k;
- }
- q[j] = 0;
- gram_piece[gram_piece0++] = q;
- gram_piece1 = gram_piece0;
-}
-
 /* %if-c-or-c++ */
 /* flex integer type definitions */
 
@@ -321,14 +254,9 @@ extern FILE *gram_in, *gram_out;
        while ( 0 )
 
 #if 1
-#define flush() \
- do { \
-  gram_piece_esc(yytext, yy_c_buf_p - yytext); \
-  yytext = yy_c_buf_p; \
- } while (0)
 #define unput(c) \
  do { \
-  gram_piece_esc(yytext, yy_c_buf_p - yytext); \
+  gram_piece_escape(yytext, yy_c_buf_p - yytext); \
   yyunput(c, (yytext_ptr)); \
   yytext = yy_c_buf_p; \
  } while (0)
@@ -1064,20 +992,20 @@ int gram__flex_debug = 1;
 
 static yyconst flex_int16_t yy_rule_linenum[130] =
     {   0,
-      185,  188,  189,  190,  198,  216,  217,  218,  219,  220,
-      221,  222,  223,  224,  225,  226,  227,  228,  229,  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,
-      263,  264,  265,  266,  267,  268,  269,  270,  271,  272,
-      273,  275,  279,  280,  281,  283,  295,  309,  326,  331,
-      334,  337,  340,  350,  363,  364,  365,  375,  389,  396,
-      416,  426,  441,  451,  478,  491,  507,  522,  539,  540,
-      551,  562,  563,  575,  591,  601,  628,  640,  662,  663,
-
-      674,  689,  705,  706,  707,  708,  709,  710,  711,  714,
-      716,  730,  748,  753,  754,  760,  761,  772,  778,  784,
-      790,  806,  807,  811,  818,  842,  870,  916,  917
+      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,  364,  375,  376,  377,  387,  401,  408,
+      428,  438,  453,  463,  490,  503,  519,  534,  551,  552,
+      563,  574,  575,  587,  603,  613,  640,  652,  674,  675,
+
+      686,  701,  717,  718,  719,  720,  721,  722,  723,  726,
+      728,  742,  760,  765,  766,  772,  773,  784,  790,  796,
+      802,  818,  819,  823,  830,  854,  882,  928,  929
     } ;
 
 /* The intent behind this definition is that it'll catch
@@ -1131,7 +1059,11 @@ char *gram_text;
 
 #include <src/scan-gram.h>
 
+#if 1
+#define YY_DECL static int real_gram_lex (GRAM_STYPE *val, location *loc)
+#else
 #define YY_DECL GRAM_LEX_DECL
+#endif
 
 /* Location of scanner cursor.  */
 static boundary scanner_cursor;
@@ -1189,6 +1121,16 @@ static int convert_ucn_to_byte (char const *hex_text);
 static void unexpected_eof (boundary, char const *);
 static void unexpected_newline (boundary, char const *);
 
+/* Nick */
+char gram_piece_temp[100], *gram_piece[10000];
+int gram_piece0, gram_piece1;
+
+void gram_piece_append(const char *str);
+void gram_piece_insert(int n, const char *str);
+void gram_piece_escape(const char *p, size_t n);
+void gram_piece_flush(size_t n);
+void gram_piece_pack();
+
 /* A C-like comment in directives/rules. */
 
 /* Strings and characters in directives/rules. */
@@ -1218,7 +1160,7 @@ generics/template types.  */
    white space between the backslash and the newline.  */
 /* An equal sign, with optional leading whitespaces. This is used in some
    deprecated constructs. */
-#line 1141 "src/scan-gram.c"
+#line 1155 "src/scan-gram.c"
 
 #define INITIAL 0
 #define SC_YACC_COMMENT 1
@@ -1476,39 +1418,14 @@ extern int gram_lex (void);
 
 /** The main scanner function which does all the work.
  */
-static int real_yylex(GRAM_STYPE *val, location *loc);
 YY_DECL
-{
- int result = real_yylex(val, loc);
- if (result < 0)
-  return ~result;
- gram_piece_pack();
-#if 1
- gram_piece_esc(yytext, strlen(yytext));
-#else
- size_t n = strlen(yytext);
- if (n) {
-  sprintf(gram_piece_temp, "<token value=\"%d\">", result);
-  gram_piece_append(gram_piece_temp);
-  gram_piece_esc(yytext, n);
-  gram_piece_append("</token>");
- }
- else {
-  sprintf(gram_piece_temp, "<token value=\"%d\" />", result);
-  gram_piece_append(gram_piece_temp);
- }
-#endif
- gram_piece_pack();
- return result;
-}
-static int real_yylex(GRAM_STYPE *val, location *loc)
 {
        register yy_state_type yy_current_state;
        register char *yy_cp, *yy_bp;
        register int yy_act;
     
 /* %% [7.0] user's declarations go here */
-#line 146 "src/scan-gram.l"
+#line 160 "src/scan-gram.l"
 
 
   /* Nesting level.  Either for nested braces, or nested angle brackets
@@ -1545,7 +1462,7 @@ static int real_yylex(GRAM_STYPE *val, location *loc)
   | Scanning white space.  |
   `-----------------------*/
 
-#line 1443 "src/scan-gram.c"
+#line 1457 "src/scan-gram.c"
 
        if ( !(yy_init) )
                {
@@ -1583,7 +1500,7 @@ static int real_yylex(GRAM_STYPE *val, location *loc)
 
 #if 1
  /* we do this so that "continue;" in an action works correctly */
- for (; ; gram_piece_esc(yytext, yy_c_buf_p - yytext))
+ for (; ; gram_piece_escape(yytext, yy_c_buf_p - yytext))
 #else
        while ( 1 )             /* loops until end-of-file is reached */
 #endif
@@ -1664,23 +1581,23 @@ do_action:      /* This label is used only to access EOF actions. */
 /* Comments and white space.  */
 case 1:
 YY_RULE_SETUP
-#line 185 "src/scan-gram.l"
+#line 199 "src/scan-gram.l"
 {
      complain (loc, Wother, _("stray ',' treated as white space"));
   }
        YY_BREAK
 case 2:
 /* rule 2 can match eol */
-#line 189 "src/scan-gram.l"
+#line 203 "src/scan-gram.l"
 case 3:
 /* rule 3 can match eol */
 YY_RULE_SETUP
-#line 189 "src/scan-gram.l"
+#line 203 "src/scan-gram.l"
 continue;
        YY_BREAK
 case 4:
 YY_RULE_SETUP
-#line 190 "src/scan-gram.l"
+#line 204 "src/scan-gram.l"
 {
     token_start = loc->start;
     context_state = YY_START;
@@ -1692,7 +1609,7 @@ YY_RULE_SETUP
 case 5:
 /* rule 5 can match eol */
 YY_RULE_SETUP
-#line 198 "src/scan-gram.l"
+#line 212 "src/scan-gram.l"
 {
     handle_syncline (gram_text + sizeof "#line " - 1, *loc);
   }
@@ -1710,313 +1627,313 @@ YY_RULE_SETUP
 
 case 6:
 YY_RULE_SETUP
-#line 216 "src/scan-gram.l"
+#line 230 "src/scan-gram.l"
 return PERCENT_NONASSOC;
        YY_BREAK
 case 7:
 YY_RULE_SETUP
-#line 217 "src/scan-gram.l"
+#line 231 "src/scan-gram.l"
 return PERCENT_CODE;
        YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 218 "src/scan-gram.l"
+#line 232 "src/scan-gram.l"
 RETURN_PERCENT_FLAG("parse.trace");
        YY_BREAK
 case 9:
 YY_RULE_SETUP
-#line 219 "src/scan-gram.l"
+#line 233 "src/scan-gram.l"
 return PERCENT_DEFAULT_PREC;
        YY_BREAK
 case 10:
 YY_RULE_SETUP
-#line 220 "src/scan-gram.l"
+#line 234 "src/scan-gram.l"
 return PERCENT_DEFINE;
        YY_BREAK
 case 11:
 YY_RULE_SETUP
-#line 221 "src/scan-gram.l"
+#line 235 "src/scan-gram.l"
 return PERCENT_DEFINES;
        YY_BREAK
 case 12:
 YY_RULE_SETUP
-#line 222 "src/scan-gram.l"
+#line 236 "src/scan-gram.l"
 return PERCENT_DESTRUCTOR;
        YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 223 "src/scan-gram.l"
+#line 237 "src/scan-gram.l"
 return PERCENT_DPREC;
        YY_BREAK
 case 14:
 YY_RULE_SETUP
-#line 224 "src/scan-gram.l"
+#line 238 "src/scan-gram.l"
 return PERCENT_EMPTY;
        YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 225 "src/scan-gram.l"
+#line 239 "src/scan-gram.l"
 return PERCENT_ERROR_VERBOSE;
        YY_BREAK
 case 16:
 YY_RULE_SETUP
-#line 226 "src/scan-gram.l"
+#line 240 "src/scan-gram.l"
 return PERCENT_EXPECT;
        YY_BREAK
 case 17:
 YY_RULE_SETUP
-#line 227 "src/scan-gram.l"
+#line 241 "src/scan-gram.l"
 return PERCENT_EXPECT_RR;
        YY_BREAK
 case 18:
 YY_RULE_SETUP
-#line 228 "src/scan-gram.l"
+#line 242 "src/scan-gram.l"
 return PERCENT_FILE_PREFIX;
        YY_BREAK
 case 19:
 YY_RULE_SETUP
-#line 229 "src/scan-gram.l"
+#line 243 "src/scan-gram.l"
 return PERCENT_YACC;
        YY_BREAK
 case 20:
 YY_RULE_SETUP
-#line 230 "src/scan-gram.l"
+#line 244 "src/scan-gram.l"
 return PERCENT_INITIAL_ACTION;
        YY_BREAK
 case 21:
 YY_RULE_SETUP
-#line 231 "src/scan-gram.l"
+#line 245 "src/scan-gram.l"
 return PERCENT_GLR_PARSER;
        YY_BREAK
 case 22:
 YY_RULE_SETUP
-#line 232 "src/scan-gram.l"
+#line 246 "src/scan-gram.l"
 return PERCENT_LANGUAGE;
        YY_BREAK
 case 23:
 YY_RULE_SETUP
-#line 233 "src/scan-gram.l"
+#line 247 "src/scan-gram.l"
 return PERCENT_LEFT;
        YY_BREAK
 case 24:
 YY_RULE_SETUP
-#line 234 "src/scan-gram.l"
+#line 248 "src/scan-gram.l"
 RETURN_PERCENT_PARAM(lex);
        YY_BREAK
 case 25:
 YY_RULE_SETUP
-#line 235 "src/scan-gram.l"
+#line 249 "src/scan-gram.l"
 RETURN_PERCENT_FLAG("locations");
        YY_BREAK
 case 26:
 YY_RULE_SETUP
-#line 236 "src/scan-gram.l"
+#line 250 "src/scan-gram.l"
 return PERCENT_MERGE;
        YY_BREAK
 case 27:
 YY_RULE_SETUP
-#line 237 "src/scan-gram.l"
+#line 251 "src/scan-gram.l"
 return PERCENT_NAME_PREFIX;
        YY_BREAK
 case 28:
 YY_RULE_SETUP
-#line 238 "src/scan-gram.l"
+#line 252 "src/scan-gram.l"
 return PERCENT_NO_DEFAULT_PREC;
        YY_BREAK
 case 29:
 YY_RULE_SETUP
-#line 239 "src/scan-gram.l"
+#line 253 "src/scan-gram.l"
 return PERCENT_NO_LINES;
        YY_BREAK
 case 30:
 YY_RULE_SETUP
-#line 240 "src/scan-gram.l"
+#line 254 "src/scan-gram.l"
 return PERCENT_NONASSOC;
        YY_BREAK
 case 31:
 YY_RULE_SETUP
-#line 241 "src/scan-gram.l"
+#line 255 "src/scan-gram.l"
 return PERCENT_NONDETERMINISTIC_PARSER;
        YY_BREAK
 case 32:
 YY_RULE_SETUP
-#line 242 "src/scan-gram.l"
+#line 256 "src/scan-gram.l"
 return PERCENT_NTERM;
        YY_BREAK
 case 33:
 YY_RULE_SETUP
-#line 243 "src/scan-gram.l"
+#line 257 "src/scan-gram.l"
 return PERCENT_OUTPUT;
        YY_BREAK
 case 34:
 YY_RULE_SETUP
-#line 244 "src/scan-gram.l"
+#line 258 "src/scan-gram.l"
 RETURN_PERCENT_PARAM(both);
        YY_BREAK
 case 35:
 YY_RULE_SETUP
-#line 245 "src/scan-gram.l"
+#line 259 "src/scan-gram.l"
 RETURN_PERCENT_PARAM(parse);
        YY_BREAK
 case 36:
 YY_RULE_SETUP
-#line 246 "src/scan-gram.l"
+#line 260 "src/scan-gram.l"
 return PERCENT_PREC;
        YY_BREAK
 case 37:
 YY_RULE_SETUP
-#line 247 "src/scan-gram.l"
+#line 261 "src/scan-gram.l"
 return PERCENT_PRECEDENCE;
        YY_BREAK
 case 38:
 YY_RULE_SETUP
-#line 248 "src/scan-gram.l"
+#line 262 "src/scan-gram.l"
 return PERCENT_PRINTER;
        YY_BREAK
 case 39:
 YY_RULE_SETUP
-#line 249 "src/scan-gram.l"
+#line 263 "src/scan-gram.l"
 RETURN_PERCENT_FLAG("api.pure");
        YY_BREAK
 case 40:
 YY_RULE_SETUP
-#line 250 "src/scan-gram.l"
+#line 264 "src/scan-gram.l"
 return PERCENT_REQUIRE;
        YY_BREAK
 case 41:
 YY_RULE_SETUP
-#line 251 "src/scan-gram.l"
+#line 265 "src/scan-gram.l"
 return PERCENT_RIGHT;
        YY_BREAK
 case 42:
 YY_RULE_SETUP
-#line 252 "src/scan-gram.l"
+#line 266 "src/scan-gram.l"
 return PERCENT_SKELETON;
        YY_BREAK
 case 43:
 YY_RULE_SETUP
-#line 253 "src/scan-gram.l"
+#line 267 "src/scan-gram.l"
 return PERCENT_START;
        YY_BREAK
 case 44:
 YY_RULE_SETUP
-#line 254 "src/scan-gram.l"
+#line 268 "src/scan-gram.l"
 return PERCENT_TOKEN;
        YY_BREAK
 case 45:
 YY_RULE_SETUP
-#line 255 "src/scan-gram.l"
+#line 269 "src/scan-gram.l"
 return PERCENT_TOKEN;
        YY_BREAK
 case 46:
 YY_RULE_SETUP
-#line 256 "src/scan-gram.l"
+#line 270 "src/scan-gram.l"
 return PERCENT_TOKEN_TABLE;
        YY_BREAK
 case 47:
 YY_RULE_SETUP
-#line 257 "src/scan-gram.l"
+#line 271 "src/scan-gram.l"
 return PERCENT_TYPE;
        YY_BREAK
 case 48:
 YY_RULE_SETUP
-#line 258 "src/scan-gram.l"
+#line 272 "src/scan-gram.l"
 return PERCENT_UNION;
        YY_BREAK
 case 49:
 YY_RULE_SETUP
-#line 259 "src/scan-gram.l"
+#line 273 "src/scan-gram.l"
 return PERCENT_VERBOSE;
        YY_BREAK
 case 50:
 YY_RULE_SETUP
-#line 260 "src/scan-gram.l"
+#line 274 "src/scan-gram.l"
 return PERCENT_YACC;
        YY_BREAK
 /* deprecated */
 case 51:
 YY_RULE_SETUP
-#line 263 "src/scan-gram.l"
+#line 277 "src/scan-gram.l"
 DEPRECATED("%default-prec");
        YY_BREAK
 case 52:
 YY_RULE_SETUP
-#line 264 "src/scan-gram.l"
+#line 278 "src/scan-gram.l"
 DEPRECATED("%define parse.error verbose");
        YY_BREAK
 case 53:
 YY_RULE_SETUP
-#line 265 "src/scan-gram.l"
+#line 279 "src/scan-gram.l"
 DEPRECATED("%expect-rr");
        YY_BREAK
 case 54:
 /* rule 54 can match eol */
 YY_RULE_SETUP
-#line 266 "src/scan-gram.l"
+#line 280 "src/scan-gram.l"
 DEPRECATED("%file-prefix");
        YY_BREAK
 case 55:
 YY_RULE_SETUP
-#line 267 "src/scan-gram.l"
+#line 281 "src/scan-gram.l"
 DEPRECATED("%fixed-output-files");
        YY_BREAK
 case 56:
 /* rule 56 can match eol */
 YY_RULE_SETUP
-#line 268 "src/scan-gram.l"
+#line 282 "src/scan-gram.l"
 DEPRECATED("%name-prefix");
        YY_BREAK
 case 57:
 YY_RULE_SETUP
-#line 269 "src/scan-gram.l"
+#line 283 "src/scan-gram.l"
 DEPRECATED("%no-default-prec");
        YY_BREAK
 case 58:
 YY_RULE_SETUP
-#line 270 "src/scan-gram.l"
+#line 284 "src/scan-gram.l"
 DEPRECATED("%no-lines");
        YY_BREAK
 case 59:
 /* rule 59 can match eol */
 YY_RULE_SETUP
-#line 271 "src/scan-gram.l"
+#line 285 "src/scan-gram.l"
 DEPRECATED("%output");
        YY_BREAK
 case 60:
 YY_RULE_SETUP
-#line 272 "src/scan-gram.l"
+#line 286 "src/scan-gram.l"
 DEPRECATED("%pure-parser");
        YY_BREAK
 case 61:
 YY_RULE_SETUP
-#line 273 "src/scan-gram.l"
+#line 287 "src/scan-gram.l"
 DEPRECATED("%token-table");
        YY_BREAK
 case 62:
 YY_RULE_SETUP
-#line 275 "src/scan-gram.l"
+#line 289 "src/scan-gram.l"
 {
     complain (loc, complaint, _("invalid directive: %s"), quote (gram_text));
   }
        YY_BREAK
 case 63:
 YY_RULE_SETUP
-#line 279 "src/scan-gram.l"
+#line 293 "src/scan-gram.l"
 return EQUAL;
        YY_BREAK
 case 64:
 YY_RULE_SETUP
-#line 280 "src/scan-gram.l"
+#line 294 "src/scan-gram.l"
 return PIPE;
        YY_BREAK
 case 65:
 YY_RULE_SETUP
-#line 281 "src/scan-gram.l"
+#line 295 "src/scan-gram.l"
 return SEMICOLON;
        YY_BREAK
 case 66:
 YY_RULE_SETUP
-#line 283 "src/scan-gram.l"
+#line 297 "src/scan-gram.l"
 {
     val->uniqstr = uniqstr_new (gram_text);
     id_loc = *loc;
@@ -2024,21 +1941,21 @@ YY_RULE_SETUP
     BEGIN SC_AFTER_IDENTIFIER;
  gram_piece_pack();
  gram_piece_append("<PYACC_ID>");
flush();
gram_piece_flush(strlen(gram_text));
  gram_piece_append("</PYACC_ID>");
  gram_piece_pack();
   }
        YY_BREAK
 case 67:
 YY_RULE_SETUP
-#line 295 "src/scan-gram.l"
+#line 309 "src/scan-gram.l"
 {
     val->integer = scan_integer (gram_text, 10, *loc);
 #if 0
  gram_piece_pack();
  sprintf(gram_piece_temp, "<PYACC_Int value=\"%d\">", val->integer);
  gram_piece_append(gram_piece_temp);
- gram_piece_esc(gram_text, yy_c_buf_p - gram_text);
+ gram_piece_escape(gram_text, strlen(gram_text));
  gram_piece_append("</PYACC_Int>");
  gram_piece_pack();
  return ~INT;
@@ -2049,14 +1966,14 @@ YY_RULE_SETUP
        YY_BREAK
 case 68:
 YY_RULE_SETUP
-#line 309 "src/scan-gram.l"
+#line 323 "src/scan-gram.l"
 {
     val->integer = scan_integer (gram_text, 16, *loc);
 #if 0
  gram_piece_pack();
  sprintf(gram_piece_temp, "<PYACC_Int value=\"%d\">", val->integer);
  gram_piece_append(gram_piece_temp);
- gram_piece_esc(gram_text, yy_c_buf_p - gram_text);
+ gram_piece_escape(gram_text, strlen(gram_text));
  gram_piece_append("</PYACC_Int>");
  gram_piece_pack();
  return ~INT;
@@ -2069,7 +1986,7 @@ YY_RULE_SETUP
      accept "1FOO" as "1 FOO".  */
 case 69:
 YY_RULE_SETUP
-#line 326 "src/scan-gram.l"
+#line 340 "src/scan-gram.l"
 {
     complain (loc, complaint, _("invalid identifier: %s"), quote (gram_text));
   }
@@ -2077,25 +1994,25 @@ YY_RULE_SETUP
 /* Characters.  */
 case 70:
 YY_RULE_SETUP
-#line 331 "src/scan-gram.l"
-token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER; gram_piece_pack(); gram_piece_append("<PYACC_Char>"); flush(); gram_piece_append("<PYACC_Text>");
+#line 345 "src/scan-gram.l"
+token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER; gram_piece_pack(); gram_piece_append("<PYACC_Char>"); gram_piece_flush(strlen(gram_text)); gram_piece_append("<PYACC_Text>");
        YY_BREAK
 /* Strings. */
 case 71:
 YY_RULE_SETUP
-#line 334 "src/scan-gram.l"
-token_start = loc->start; BEGIN SC_ESCAPED_STRING; gram_piece_pack(); gram_piece_append("<PYACC_String>"); flush(); gram_piece_append("<PYACC_Text>");
+#line 348 "src/scan-gram.l"
+token_start = loc->start; BEGIN SC_ESCAPED_STRING; gram_piece_pack(); gram_piece_append("<PYACC_String>"); gram_piece_flush(strlen(gram_text)); gram_piece_append("<PYACC_Text>");
        YY_BREAK
 /* Prologue. */
 case 72:
 YY_RULE_SETUP
-#line 337 "src/scan-gram.l"
-code_start = loc->start; BEGIN SC_PROLOGUE; gram_piece_pack(); gram_piece_append("<PYACC_Section1_Prologue>"); flush(); gram_piece_append("<PYACC_Text>");
+#line 351 "src/scan-gram.l"
+code_start = loc->start; BEGIN SC_PROLOGUE; gram_piece_pack(); gram_piece_append("<PYACC_Section1_Prologue>"); gram_piece_flush(strlen(gram_text)); gram_piece_append("<PYACC_Text>");
        YY_BREAK
 /* Code in between braces.  */
 case 73:
 YY_RULE_SETUP
-#line 340 "src/scan-gram.l"
+#line 354 "src/scan-gram.l"
 {
     STRING_GROW;
     nesting = 0;
@@ -2109,15 +2026,13 @@ YY_RULE_SETUP
 case 74:
 /* rule 74 can match eol */
 YY_RULE_SETUP
-#line 350 "src/scan-gram.l"
+#line 364 "src/scan-gram.l"
 {
     nesting = 0;
     code_start = loc->start;
  gram_piece_pack();
  gram_piece_append("<PYACC_BracedPredicate>");
- /* flush all but the opening brace */
- gram_piece_esc(gram_text, yy_c_buf_p - 1 - gram_text);
- gram_text = yy_c_buf_p - 1;
+ gram_piece_flush(strlen(gram_text) - 1);
  gram_piece_append("<PYACC_Text>");
     BEGIN SC_PREDICATE;
   }
@@ -2125,37 +2040,37 @@ YY_RULE_SETUP
 /* A type. */
 case 75:
 YY_RULE_SETUP
-#line 363 "src/scan-gram.l"
+#line 375 "src/scan-gram.l"
 gram_piece_pack(); gram_piece_append("<PYACC_Tag>&lt;<PYACC_Text>*</PYACC_Text>&gt;</PYACC_Tag>"); return ~TAG_ANY; /*return TAG_ANY;*/
        YY_BREAK
 case 76:
 YY_RULE_SETUP
-#line 364 "src/scan-gram.l"
+#line 376 "src/scan-gram.l"
 gram_piece_pack(); gram_piece_append("<PYACC_Tag>&lt;<PYACC_Text />&gt;</PYACC_Tag>"); return ~TAG_NONE; /*return TAG_NONE;*/
        YY_BREAK
 case 77:
 YY_RULE_SETUP
-#line 365 "src/scan-gram.l"
+#line 377 "src/scan-gram.l"
 {
     nesting = 0;
     token_start = loc->start;
     BEGIN SC_TAG;
  gram_piece_pack();
  gram_piece_append("<PYACC_Tag>");
flush();
gram_piece_flush(strlen(gram_text));
  gram_piece_append("<PYACC_Text>");
   }
        YY_BREAK
 case 78:
 YY_RULE_SETUP
-#line 375 "src/scan-gram.l"
+#line 387 "src/scan-gram.l"
 {
     static int percent_percent_count;
     if (++percent_percent_count == 2)
  {
       BEGIN SC_EPILOGUE;
   gram_piece_pack();
-  gram_piece_esc(gram_text, strlen(gram_text));
+  gram_piece_escape(gram_text, strlen(gram_text));
   gram_piece_pack();
   gram_piece_pack();
   return ~PERCENT_PERCENT;
@@ -2165,7 +2080,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 79:
 YY_RULE_SETUP
-#line 389 "src/scan-gram.l"
+#line 401 "src/scan-gram.l"
 {
     bracketed_id_str = NULL;
     bracketed_id_start = loc->start;
@@ -2175,7 +2090,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 80:
 YY_RULE_SETUP
-#line 396 "src/scan-gram.l"
+#line 408 "src/scan-gram.l"
 {
     complain (loc, complaint, "%s: %s",
               ngettext ("invalid character", "invalid characters", gram_leng),
@@ -2183,7 +2098,7 @@ YY_RULE_SETUP
   }
        YY_BREAK
 case YY_STATE_EOF(INITIAL):
-#line 402 "src/scan-gram.l"
+#line 414 "src/scan-gram.l"
 {
     loc->start = loc->end = scanner_cursor;
     yyterminate ();
@@ -2198,7 +2113,7 @@ case YY_STATE_EOF(INITIAL):
 
 case 81:
 YY_RULE_SETUP
-#line 416 "src/scan-gram.l"
+#line 428 "src/scan-gram.l"
 complain (loc, complaint, _("invalid null character"));
        YY_BREAK
 
@@ -2209,7 +2124,7 @@ complain (loc, complaint, _("invalid null character"));
 
 case 82:
 YY_RULE_SETUP
-#line 426 "src/scan-gram.l"
+#line 438 "src/scan-gram.l"
 {
     if (bracketed_id_str)
       {
@@ -2228,12 +2143,12 @@ YY_RULE_SETUP
        YY_BREAK
 case 83:
 YY_RULE_SETUP
-#line 441 "src/scan-gram.l"
+#line 453 "src/scan-gram.l"
 {
     BEGIN (bracketed_id_str ? SC_RETURN_BRACKETED_ID : INITIAL);
     *loc = id_loc;
 #if 1
- gram_piece_esc(gram_text, yy_c_buf_p - gram_text);
+ gram_piece_escape(gram_text, strlen(gram_text));
  return ~ID_COLON;
 #else
     return ID_COLON;
@@ -2242,7 +2157,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 84:
 YY_RULE_SETUP
-#line 451 "src/scan-gram.l"
+#line 463 "src/scan-gram.l"
 {
     ROLLBACK_CURRENT_TOKEN;
     BEGIN (bracketed_id_str ? SC_RETURN_BRACKETED_ID : INITIAL);
@@ -2255,7 +2170,7 @@ YY_RULE_SETUP
   }
        YY_BREAK
 case YY_STATE_EOF(SC_AFTER_IDENTIFIER):
-#line 461 "src/scan-gram.l"
+#line 473 "src/scan-gram.l"
 {
     BEGIN (bracketed_id_str ? SC_RETURN_BRACKETED_ID : INITIAL);
     *loc = id_loc;
@@ -2274,7 +2189,7 @@ case YY_STATE_EOF(SC_AFTER_IDENTIFIER):
 
 case 85:
 YY_RULE_SETUP
-#line 478 "src/scan-gram.l"
+#line 490 "src/scan-gram.l"
 {
     if (bracketed_id_str)
       {
@@ -2291,7 +2206,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 86:
 YY_RULE_SETUP
-#line 491 "src/scan-gram.l"
+#line 503 "src/scan-gram.l"
 {
     BEGIN bracketed_id_context_state;
     if (bracketed_id_str)
@@ -2310,7 +2225,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 87:
 YY_RULE_SETUP
-#line 507 "src/scan-gram.l"
+#line 519 "src/scan-gram.l"
 {
     complain (loc, complaint, "%s: %s",
               ngettext ("invalid character in bracketed name",
@@ -2319,7 +2234,7 @@ YY_RULE_SETUP
   }
        YY_BREAK
 case YY_STATE_EOF(SC_BRACKETED_ID):
-#line 514 "src/scan-gram.l"
+#line 526 "src/scan-gram.l"
 {
     BEGIN bracketed_id_context_state;
     unexpected_eof (bracketed_id_start, "]");
@@ -2330,7 +2245,7 @@ case YY_STATE_EOF(SC_BRACKETED_ID):
 
 case 88:
 YY_RULE_SETUP
-#line 522 "src/scan-gram.l"
+#line 534 "src/scan-gram.l"
 {
     ROLLBACK_CURRENT_TOKEN;
     val->uniqstr = bracketed_id_str;
@@ -2348,17 +2263,17 @@ YY_RULE_SETUP
 
 case 89:
 YY_RULE_SETUP
-#line 539 "src/scan-gram.l"
+#line 551 "src/scan-gram.l"
 BEGIN context_state;
        YY_BREAK
 case 90:
 /* rule 90 can match eol */
 YY_RULE_SETUP
-#line 540 "src/scan-gram.l"
+#line 552 "src/scan-gram.l"
 continue;
        YY_BREAK
 case YY_STATE_EOF(SC_YACC_COMMENT):
-#line 541 "src/scan-gram.l"
+#line 553 "src/scan-gram.l"
 unexpected_eof (token_start, "*/"); BEGIN context_state;
        YY_BREAK
 
@@ -2370,11 +2285,11 @@ unexpected_eof (token_start, "*/"); BEGIN context_state;
 case 91:
 /* rule 91 can match eol */
 YY_RULE_SETUP
-#line 551 "src/scan-gram.l"
+#line 563 "src/scan-gram.l"
 STRING_GROW; BEGIN context_state;
        YY_BREAK
 case YY_STATE_EOF(SC_COMMENT):
-#line 552 "src/scan-gram.l"
+#line 564 "src/scan-gram.l"
 unexpected_eof (token_start, "*/"); BEGIN context_state;
        YY_BREAK
 
@@ -2386,17 +2301,17 @@ unexpected_eof (token_start, "*/"); BEGIN context_state;
 case 92:
 /* rule 92 can match eol */
 YY_RULE_SETUP
-#line 562 "src/scan-gram.l"
+#line 574 "src/scan-gram.l"
 STRING_GROW; BEGIN context_state;
        YY_BREAK
 case 93:
 /* rule 93 can match eol */
 YY_RULE_SETUP
-#line 563 "src/scan-gram.l"
+#line 575 "src/scan-gram.l"
 STRING_GROW;
        YY_BREAK
 case YY_STATE_EOF(SC_LINE_COMMENT):
-#line 564 "src/scan-gram.l"
+#line 576 "src/scan-gram.l"
 BEGIN context_state;
        YY_BREAK
 
@@ -2408,7 +2323,7 @@ BEGIN context_state;
 
 case 94:
 YY_RULE_SETUP
-#line 575 "src/scan-gram.l"
+#line 587 "src/scan-gram.l"
 {
     STRING_FINISH;
     loc->start = token_start;
@@ -2416,7 +2331,7 @@ YY_RULE_SETUP
     BEGIN INITIAL;
 #if 1
  gram_piece_append("</PYACC_Text>");
- gram_piece_esc(gram_text, strlen(gram_text));
+ gram_piece_escape(gram_text, strlen(gram_text));
  gram_piece_append("</PYACC_String>");
  gram_piece_pack();
  return ~STRING;
@@ -2426,13 +2341,13 @@ YY_RULE_SETUP
   }
        YY_BREAK
 case YY_STATE_EOF(SC_ESCAPED_STRING):
-#line 590 "src/scan-gram.l"
+#line 602 "src/scan-gram.l"
 unexpected_eof (token_start, "\"");
        YY_BREAK
 case 95:
 /* rule 95 can match eol */
 YY_RULE_SETUP
-#line 591 "src/scan-gram.l"
+#line 603 "src/scan-gram.l"
 unexpected_newline (token_start, "\"");
        YY_BREAK
 
@@ -2444,7 +2359,7 @@ unexpected_newline (token_start, "\"");
 
 case 96:
 YY_RULE_SETUP
-#line 601 "src/scan-gram.l"
+#line 613 "src/scan-gram.l"
 {
     STRING_FINISH;
     loc->start = token_start;
@@ -2464,7 +2379,7 @@ YY_RULE_SETUP
     BEGIN INITIAL;
 #if 1
  gram_piece_append("</PYACC_Text>");
- gram_piece_esc(gram_text, strlen(gram_text));
+ gram_piece_escape(gram_text, strlen(gram_text));
  gram_piece_append("</PYACC_Char>");
  gram_piece_pack();
  return ~CHAR;
@@ -2476,11 +2391,11 @@ YY_RULE_SETUP
 case 97:
 /* rule 97 can match eol */
 YY_RULE_SETUP
-#line 628 "src/scan-gram.l"
+#line 640 "src/scan-gram.l"
 unexpected_newline (token_start, "'");
        YY_BREAK
 case YY_STATE_EOF(SC_ESCAPED_CHARACTER):
-#line 629 "src/scan-gram.l"
+#line 641 "src/scan-gram.l"
 unexpected_eof (token_start, "'");
        YY_BREAK
 
@@ -2491,7 +2406,7 @@ unexpected_eof (token_start, "'");
 
 case 98:
 YY_RULE_SETUP
-#line 640 "src/scan-gram.l"
+#line 652 "src/scan-gram.l"
 {
     --nesting;
     if (nesting < 0)
@@ -2502,8 +2417,8 @@ YY_RULE_SETUP
         STRING_FREE;
         BEGIN INITIAL;
 #if 1
- gram_piece_append("</PYACC_Text>");
- gram_piece_esc(gram_text, strlen(gram_text));
+ gram_piece_append("</PYACC_Text");
+ gram_piece_escape(gram_text, strlen(gram_text));
  gram_piece_append("</PYACC_Tag>");
  gram_piece_pack();
  return ~TAG;
@@ -2517,16 +2432,16 @@ YY_RULE_SETUP
 case 99:
 /* rule 99 can match eol */
 YY_RULE_SETUP
-#line 662 "src/scan-gram.l"
+#line 674 "src/scan-gram.l"
 STRING_GROW;
        YY_BREAK
 case 100:
 YY_RULE_SETUP
-#line 663 "src/scan-gram.l"
+#line 675 "src/scan-gram.l"
 STRING_GROW; nesting += gram_leng;
        YY_BREAK
 case YY_STATE_EOF(SC_TAG):
-#line 665 "src/scan-gram.l"
+#line 677 "src/scan-gram.l"
 unexpected_eof (token_start, ">");
        YY_BREAK
 
@@ -2537,7 +2452,7 @@ unexpected_eof (token_start, ">");
 
 case 101:
 YY_RULE_SETUP
-#line 674 "src/scan-gram.l"
+#line 686 "src/scan-gram.l"
 {
     unsigned long int c = strtoul (gram_text + 1, NULL, 8);
     if (!c || UCHAR_MAX < c)
@@ -2548,14 +2463,14 @@ YY_RULE_SETUP
       obstack_1grow (&obstack_for_string, c);
   sprintf(gram_piece_temp, "<PYACC_Text_Escape character=\"%d\">", (int)c);
   gram_piece_append(gram_piece_temp);
-  flush();
+  gram_piece_flush(strlen(gram_text));
   gram_piece_append("</PYACC_Text_Escape>"); 
  }
   }
        YY_BREAK
 case 102:
 YY_RULE_SETUP
-#line 689 "src/scan-gram.l"
+#line 701 "src/scan-gram.l"
 {
     verify (UCHAR_MAX < ULONG_MAX);
     unsigned long int c = strtoul (gram_text + 2, NULL, 16);
@@ -2567,55 +2482,55 @@ YY_RULE_SETUP
       obstack_1grow (&obstack_for_string, c);
   sprintf(gram_piece_temp, "<PYACC_Text_Escape character=\"%d\">", (int)c);
   gram_piece_append(gram_piece_temp);
-  flush();
+  gram_piece_flush(strlen(gram_text));
   gram_piece_append("</PYACC_Text_Escape>"); 
  }
   }
        YY_BREAK
 case 103:
 YY_RULE_SETUP
-#line 705 "src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\a'); gram_piece_append("<PYACC_Text_Escape character=\"7\">"); flush(); gram_piece_append("</PYACC_Text_Escape>");
+#line 717 "src/scan-gram.l"
+obstack_1grow (&obstack_for_string, '\a'); gram_piece_append("<PYACC_Text_Escape character=\"7\">"); gram_piece_flush(strlen(gram_text)); gram_piece_append("</PYACC_Text_Escape>");
        YY_BREAK
 case 104:
 YY_RULE_SETUP
-#line 706 "src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\b'); gram_piece_append("<PYACC_Text_Escape character=\"8\">"); flush(); gram_piece_append("</PYACC_Text_Escape>");
+#line 718 "src/scan-gram.l"
+obstack_1grow (&obstack_for_string, '\b'); gram_piece_append("<PYACC_Text_Escape character=\"8\">"); gram_piece_flush(strlen(gram_text)); gram_piece_append("</PYACC_Text_Escape>");
        YY_BREAK
 case 105:
 YY_RULE_SETUP
-#line 707 "src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\f'); gram_piece_append("<PYACC_Text_Escape character=\"12\">"); flush(); gram_piece_append("</PYACC_Text_Escape>");
+#line 719 "src/scan-gram.l"
+obstack_1grow (&obstack_for_string, '\f'); gram_piece_append("<PYACC_Text_Escape character=\"12\">"); gram_piece_flush(strlen(gram_text)); gram_piece_append("</PYACC_Text_Escape>");
        YY_BREAK
 case 106:
 YY_RULE_SETUP
-#line 708 "src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\n'); gram_piece_append("<PYACC_Text_Escape character=\"10\">"); flush(); gram_piece_append("</PYACC_Text_Escape>");
+#line 720 "src/scan-gram.l"
+obstack_1grow (&obstack_for_string, '\n'); gram_piece_append("<PYACC_Text_Escape character=\"10\">"); gram_piece_flush(strlen(gram_text)); gram_piece_append("</PYACC_Text_Escape>");
        YY_BREAK
 case 107:
 YY_RULE_SETUP
-#line 709 "src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\r'); gram_piece_append("<PYACC_Text_Escape character=\"13\">"); flush(); gram_piece_append("</PYACC_Text_Escape>");
+#line 721 "src/scan-gram.l"
+obstack_1grow (&obstack_for_string, '\r'); gram_piece_append("<PYACC_Text_Escape character=\"13\">"); gram_piece_flush(strlen(gram_text)); gram_piece_append("</PYACC_Text_Escape>");
        YY_BREAK
 case 108:
 YY_RULE_SETUP
-#line 710 "src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\t'); gram_piece_append("<PYACC_Text_Escape character=\"9\">"); flush(); gram_piece_append("</PYACC_Text_Escape>");
+#line 722 "src/scan-gram.l"
+obstack_1grow (&obstack_for_string, '\t'); gram_piece_append("<PYACC_Text_Escape character=\"9\">"); gram_piece_flush(strlen(gram_text)); gram_piece_append("</PYACC_Text_Escape>");
        YY_BREAK
 case 109:
 YY_RULE_SETUP
-#line 711 "src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\v'); gram_piece_append("<PYACC_Text_Escape character=\"11\">"); flush(); gram_piece_append("</PYACC_Text_Escape>");
+#line 723 "src/scan-gram.l"
+obstack_1grow (&obstack_for_string, '\v'); gram_piece_append("<PYACC_Text_Escape character=\"11\">"); gram_piece_flush(strlen(gram_text)); gram_piece_append("</PYACC_Text_Escape>");
        YY_BREAK
 /* \\[\"\'?\\] would be shorter, but it confuses xgettext.  */
 case 110:
 YY_RULE_SETUP
-#line 714 "src/scan-gram.l"
-obstack_1grow (&obstack_for_string, gram_text[1]); sprintf(gram_piece_temp, "<PYACC_Text_Escape character=\"%d\">", gram_text[1]); gram_piece_append(gram_piece_temp); flush(); gram_piece_append("</PYACC_Text_Escape>"); 
+#line 726 "src/scan-gram.l"
+obstack_1grow (&obstack_for_string, gram_text[1]); sprintf(gram_piece_temp, "<PYACC_Text_Escape character=\"%d\">", gram_text[1]); gram_piece_append(gram_piece_temp); gram_piece_flush(strlen(gram_text)); gram_piece_append("</PYACC_Text_Escape>"); 
        YY_BREAK
 case 111:
 YY_RULE_SETUP
-#line 716 "src/scan-gram.l"
+#line 728 "src/scan-gram.l"
 {
     int c = convert_ucn_to_byte (gram_text);
     if (c <= 0)
@@ -2626,7 +2541,7 @@ YY_RULE_SETUP
       obstack_1grow (&obstack_for_string, c);
   sprintf(gram_piece_temp, "<PYACC_Text_Escape character=\"%d\">", c);
   gram_piece_append(gram_piece_temp);
-  flush();
+  gram_piece_flush(strlen(gram_text));
   gram_piece_append("</PYACC_Text_Escape>"); 
  }
   }
@@ -2634,7 +2549,7 @@ YY_RULE_SETUP
 case 112:
 /* rule 112 can match eol */
 YY_RULE_SETUP
-#line 730 "src/scan-gram.l"
+#line 742 "src/scan-gram.l"
 {
     char const *p = gram_text + 1;
     /* Quote only if escaping won't make the character visible.  */
@@ -2655,7 +2570,7 @@ YY_RULE_SETUP
 case 113:
 /* rule 113 can match eol */
 YY_RULE_SETUP
-#line 748 "src/scan-gram.l"
+#line 760 "src/scan-gram.l"
 STRING_GROW;
        YY_BREAK
 
@@ -2663,17 +2578,17 @@ STRING_GROW;
 
 case 114:
 YY_RULE_SETUP
-#line 753 "src/scan-gram.l"
+#line 765 "src/scan-gram.l"
 STRING_GROW; BEGIN context_state;
        YY_BREAK
 case 115:
 /* rule 115 can match eol */
 YY_RULE_SETUP
-#line 754 "src/scan-gram.l"
+#line 766 "src/scan-gram.l"
 unexpected_newline (token_start, "'");
        YY_BREAK
 case YY_STATE_EOF(SC_CHARACTER):
-#line 755 "src/scan-gram.l"
+#line 767 "src/scan-gram.l"
 unexpected_eof (token_start, "'");
        YY_BREAK
 
@@ -2681,17 +2596,17 @@ unexpected_eof (token_start, "'");
 
 case 116:
 YY_RULE_SETUP
-#line 760 "src/scan-gram.l"
+#line 772 "src/scan-gram.l"
 STRING_GROW; BEGIN context_state;
        YY_BREAK
 case 117:
 /* rule 117 can match eol */
 YY_RULE_SETUP
-#line 761 "src/scan-gram.l"
+#line 773 "src/scan-gram.l"
 unexpected_newline (token_start, "\"");
        YY_BREAK
 case YY_STATE_EOF(SC_STRING):
-#line 762 "src/scan-gram.l"
+#line 774 "src/scan-gram.l"
 unexpected_eof (token_start, "\"");
        YY_BREAK
 
@@ -2702,7 +2617,7 @@ unexpected_eof (token_start, "\"");
 
 case 118:
 YY_RULE_SETUP
-#line 772 "src/scan-gram.l"
+#line 784 "src/scan-gram.l"
 {
     STRING_GROW;
     context_state = YY_START;
@@ -2712,7 +2627,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 119:
 YY_RULE_SETUP
-#line 778 "src/scan-gram.l"
+#line 790 "src/scan-gram.l"
 {
     STRING_GROW;
     context_state = YY_START;
@@ -2723,7 +2638,7 @@ YY_RULE_SETUP
 case 120:
 /* rule 120 can match eol */
 YY_RULE_SETUP
-#line 784 "src/scan-gram.l"
+#line 796 "src/scan-gram.l"
 {
     STRING_GROW;
     context_state = YY_START;
@@ -2734,7 +2649,7 @@ YY_RULE_SETUP
 case 121:
 /* rule 121 can match eol */
 YY_RULE_SETUP
-#line 790 "src/scan-gram.l"
+#line 802 "src/scan-gram.l"
 {
     STRING_GROW;
     context_state = YY_START;
@@ -2751,13 +2666,13 @@ YY_RULE_SETUP
 case 122:
 /* rule 122 can match eol */
 YY_RULE_SETUP
-#line 806 "src/scan-gram.l"
+#line 818 "src/scan-gram.l"
 STRING_GROW; nesting++;
        YY_BREAK
 case 123:
 /* rule 123 can match eol */
 YY_RULE_SETUP
-#line 807 "src/scan-gram.l"
+#line 819 "src/scan-gram.l"
 STRING_GROW; nesting--;
        YY_BREAK
 /* Tokenize '<<%' correctly (as '<<' '%') rather than incorrrectly
@@ -2765,12 +2680,12 @@ STRING_GROW; nesting--;
 case 124:
 /* rule 124 can match eol */
 YY_RULE_SETUP
-#line 811 "src/scan-gram.l"
+#line 823 "src/scan-gram.l"
 STRING_GROW;
        YY_BREAK
 case YY_STATE_EOF(SC_BRACED_CODE):
 case YY_STATE_EOF(SC_PREDICATE):
-#line 813 "src/scan-gram.l"
+#line 825 "src/scan-gram.l"
 unexpected_eof (code_start, "}");
        YY_BREAK
 
@@ -2778,7 +2693,7 @@ unexpected_eof (code_start, "}");
 
 case 125:
 YY_RULE_SETUP
-#line 818 "src/scan-gram.l"
+#line 830 "src/scan-gram.l"
 {
     obstack_1grow (&obstack_for_string, '}');
 
@@ -2790,7 +2705,7 @@ YY_RULE_SETUP
         val->code = last_string;
         BEGIN INITIAL;
 #if 1
- gram_piece_esc(gram_text, strlen(gram_text));
+ gram_piece_escape(gram_text, strlen(gram_text));
  gram_piece_append("</PYACC_BracedCode>");
  gram_piece_pack();
  return ~BRACED_CODE;
@@ -2805,7 +2720,7 @@ YY_RULE_SETUP
 
 case 126:
 YY_RULE_SETUP
-#line 842 "src/scan-gram.l"
+#line 854 "src/scan-gram.l"
 {
     --nesting;
     if (nesting < 0)
@@ -2815,7 +2730,7 @@ YY_RULE_SETUP
         val->code = last_string;
         BEGIN INITIAL;
 #if 1
- gram_piece_esc(gram_text, strlen(gram_text));
+ gram_piece_escape(gram_text, strlen(gram_text));
  gram_piece_append("</PYACC_Text></PYACC_BracedPredicate>");
  gram_piece_pack();
  return ~BRACED_PREDICATE;
@@ -2835,7 +2750,7 @@ YY_RULE_SETUP
 
 case 127:
 YY_RULE_SETUP
-#line 870 "src/scan-gram.l"
+#line 882 "src/scan-gram.l"
 {
     STRING_FINISH;
     loc->start = code_start;
@@ -2843,7 +2758,7 @@ YY_RULE_SETUP
     BEGIN INITIAL;
 #if 1
  gram_piece_append("</PYACC_Text>");
- gram_piece_esc(gram_text, strlen(gram_text));
+ gram_piece_escape(gram_text, strlen(gram_text));
  gram_piece_append("</PYACC_Section1_Prologue>");
  gram_piece_pack();
  return ~PROLOGUE;
@@ -2853,7 +2768,7 @@ YY_RULE_SETUP
   }
        YY_BREAK
 case YY_STATE_EOF(SC_PROLOGUE):
-#line 886 "src/scan-gram.l"
+#line 898 "src/scan-gram.l"
 unexpected_eof (code_start, "%}");
        YY_BREAK
 
@@ -2864,7 +2779,7 @@ unexpected_eof (code_start, "%}");
 
 
 case YY_STATE_EOF(SC_EPILOGUE):
-#line 897 "src/scan-gram.l"
+#line 909 "src/scan-gram.l"
 {
     STRING_FINISH;
     loc->start = code_start;
@@ -2883,19 +2798,19 @@ case YY_STATE_EOF(SC_EPILOGUE):
   | By default, grow the string obstack with the input.  |
   `-----------------------------------------------------*/
 case 128:
-#line 917 "src/scan-gram.l"
+#line 929 "src/scan-gram.l"
 case 129:
 /* rule 129 can match eol */
 YY_RULE_SETUP
-#line 917 "src/scan-gram.l"
+#line 929 "src/scan-gram.l"
 STRING_GROW;
        YY_BREAK
 case 130:
 YY_RULE_SETUP
-#line 920 "src/scan-gram.l"
+#line 932 "src/scan-gram.l"
 YY_FATAL_ERROR( "flex scanner jammed" );
        YY_BREAK
-#line 2788 "src/scan-gram.c"
+#line 2800 "src/scan-gram.c"
 case YY_STATE_EOF(SC_RETURN_BRACKETED_ID):
        yyterminate();
 
@@ -4029,7 +3944,7 @@ void gram_free (void * ptr )
 
 /* %ok-for-header */
 
-#line 920 "src/scan-gram.l"
+#line 932 "src/scan-gram.l"
 
 
 
@@ -4260,3 +4175,86 @@ gram_scanner_free (void)
   gram_lex_destroy ();
 }
 
+/* Nick */
+void gram_piece_append(const char *str) {
+ gram_piece[gram_piece1++] = strdup(str);
+}
+
+void gram_piece_insert(int n, const char *str) {
+ memmove(gram_piece + n + 1, gram_piece + n, (gram_piece1 - n) * sizeof(char *));
+ gram_piece[n] = strdup(str);
+ ++gram_piece1;
+}
+
+void gram_piece_escape(const char *p, size_t n) {
+ size_t i, j = 0;
+ for (i = 0; i < n; ++i)
+  switch (p[i]) {
+  case '<':
+  case '>':
+   j += 4;
+   break;
+  case '&':
+   j += 5;
+   break;
+  default:
+   ++j;
+   break;
+  }
+ char *q = malloc(j + 1);
+ j = 0;
+ for (i = 0; i < n; ++i)
+  switch (p[i]) {
+  case '<':
+   memcpy(q + j, "&lt;", 4);
+   j += 4;
+   break;
+  case '>':
+   memcpy(q + j, "&gt;", 4);
+   j += 4;
+   break;
+  case '&':
+   memcpy(q + j, "&amp;", 5);
+   j += 5;
+   break;
+  default:
+   q[j++] = p[i];
+   break;
+  }
+ q[j] = 0;
+ gram_piece[gram_piece1++] = q;
+}
+
+void gram_piece_flush(size_t n) {
+ gram_piece_escape(gram_text, n);
+ gram_text += n;
+}
+
+void gram_piece_pack() {
+ int i;
+ size_t j = 0;
+ for (i = gram_piece0; i < gram_piece1; ++i)
+  j += strlen(gram_piece[i]);
+ char *q = malloc(j + 1);
+ j = 0;
+ for (i = gram_piece0; i < gram_piece1; ++i) {
+  int k = strlen(gram_piece[i]);
+  memcpy(q + j, gram_piece[i], k);
+  free(gram_piece[i]);
+  j += k;
+ }
+ q[j] = 0;
+ gram_piece[gram_piece0++] = q;
+ gram_piece1 = gram_piece0;
+}
+
+GRAM_LEX_DECL {
+ int result = real_gram_lex(val, loc);
+ if (result < 0)
+  return ~result;
+ gram_piece_pack();
+ gram_piece_escape(gram_text, strlen(gram_text));
+ gram_piece_pack();
+ return result;
+}
+
index 1f367db..06f57c1 100644 (file)
@@ -1,92 +1,13 @@
---- scan-gram.c.orig   2018-07-06 09:26:27.790569234 +1000
-+++ scan-gram.c        2018-07-06 09:54:48.426630707 +1000
-@@ -66,6 +66,73 @@
- /* %endif */
- /* end standard C headers. */
-+char gram_piece_temp[100];
-+char *gram_piece[10000];
-+int gram_piece0, gram_piece1;
-+void gram_piece_append(const char *str) {
-+ gram_piece[gram_piece1++] = strdup(str);
-+}
-+void gram_piece_insert(int n, const char *str) {
-+ memmove(gram_piece + n + 1, gram_piece + n, (gram_piece1 - n) * sizeof(char *));
-+ gram_piece[n] = strdup(str);
-+ ++gram_piece1;
-+}
-+void gram_piece_esc(const char *p, size_t n) {
-+ size_t i, j = 0;
-+ for (i = 0; i < n; ++i)
-+  switch (p[i]) {
-+  case '<':
-+  case '>':
-+   j += 4;
-+   break;
-+  case '&':
-+   j += 5;
-+   break;
-+  default:
-+   ++j;
-+   break;
-+  }
-+ char *q = malloc(j + 1);
-+ j = 0;
-+ for (i = 0; i < n; ++i)
-+  switch (p[i]) {
-+  case '<':
-+   memcpy(q + j, "&lt;", 4);
-+   j += 4;
-+   break;
-+  case '>':
-+   memcpy(q + j, "&gt;", 4);
-+   j += 4;
-+   break;
-+  case '&':
-+   memcpy(q + j, "&amp;", 5);
-+   j += 5;
-+   break;
-+  default:
-+   q[j++] = p[i];
-+   break;
-+  }
-+ q[j] = 0;
-+ gram_piece[gram_piece1++] = q;
-+}
-+void gram_piece_pack() {
-+ int i;
-+ size_t j = 0;
-+ for (i = gram_piece0; i < gram_piece1; ++i)
-+  j += strlen(gram_piece[i]);
-+ char *q = malloc(j + 1);
-+ j = 0;
-+ for (i = gram_piece0; i < gram_piece1; ++i) {
-+  int k = strlen(gram_piece[i]);
-+  memcpy(q + j, gram_piece[i], k);
-+  free(gram_piece[i]);
-+  j += k;
-+ }
-+ q[j] = 0;
-+ gram_piece[gram_piece0++] = q;
-+ gram_piece1 = gram_piece0;
-+}
-+
- /* %if-c-or-c++ */
- /* flex integer type definitions */
-@@ -253,7 +320,21 @@
+--- scan-gram.c.orig   2018-07-26 20:25:41.122248234 +1000
++++ scan-gram.c        2018-07-26 20:27:30.298252975 +1000
+@@ -253,7 +253,16 @@
                } \
        while ( 0 )
  
 +#if 1
-+#define flush() \
-+ do { \
-+  gram_piece_esc(yytext, yy_c_buf_p - yytext); \
-+  yytext = yy_c_buf_p; \
-+ } while (0)
 +#define unput(c) \
 + do { \
-+  gram_piece_esc(yytext, yy_c_buf_p - yytext); \
++  gram_piece_escape(yytext, yy_c_buf_p - yytext); \
 +  yyunput(c, (yytext_ptr)); \
 +  yytext = yy_c_buf_p; \
 + } while (0)
  
  #ifndef YY_TYPEDEF_YY_SIZE_T
  #define YY_TYPEDEF_YY_SIZE_T
-@@ -1400,8 +1481,33 @@
- /** The main scanner function which does all the work.
-  */
-+static int real_yylex(GRAM_STYPE *val, location *loc);
- YY_DECL
- {
-+ int result = real_yylex(val, loc);
-+ if (result < 0)
-+  return ~result;
-+ gram_piece_pack();
-+#if 1
-+ gram_piece_esc(yytext, strlen(yytext));
-+#else
-+ size_t n = strlen(yytext);
-+ if (n) {
-+  sprintf(gram_piece_temp, "<token value=\"%d\">", result);
-+  gram_piece_append(gram_piece_temp);
-+  gram_piece_esc(yytext, n);
-+  gram_piece_append("</token>");
-+ }
-+ else {
-+  sprintf(gram_piece_temp, "<token value=\"%d\" />", result);
-+  gram_piece_append(gram_piece_temp);
-+ }
-+#endif
-+ gram_piece_pack();
-+ return result;
-+}
-+static int real_yylex(GRAM_STYPE *val, location *loc)
-+{
-       register yy_state_type yy_current_state;
-       register char *yy_cp, *yy_bp;
-       register int yy_act;
-@@ -1480,7 +1586,12 @@
+@@ -1475,7 +1484,12 @@
                gram__load_buffer_state( );
                }
  
 +#if 1
 + /* we do this so that "continue;" in an action works correctly */
-+ for (; ; gram_piece_esc(yytext, yy_c_buf_p - yytext))
++ for (; ; gram_piece_escape(yytext, yy_c_buf_p - yytext))
 +#else
        while ( 1 )             /* loops until end-of-file is reached */
 +#endif
index daf76e9..56ea91f 100644 (file)
 
 #include <src/scan-gram.h>
 
+#if 1
+#define YY_DECL static int real_gram_lex (GRAM_STYPE *val, location *loc)
+#else
 #define YY_DECL GRAM_LEX_DECL
+#endif
 
 /* Location of scanner cursor.  */
 static boundary scanner_cursor;
@@ -101,6 +105,16 @@ static int convert_ucn_to_byte (char const *hex_text);
 static void unexpected_eof (boundary, char const *);
 static void unexpected_newline (boundary, char const *);
 
+/* Nick */
+char gram_piece_temp[100], *gram_piece[10000];
+int gram_piece0, gram_piece1;
+
+void gram_piece_append(const char *str);
+void gram_piece_insert(int n, const char *str);
+void gram_piece_escape(const char *p, size_t n);
+void gram_piece_flush(size_t n);
+void gram_piece_pack();
+
 %}
  /* A C-like comment in directives/rules. */
 %x SC_YACC_COMMENT
@@ -287,7 +301,7 @@ eqopt    ([[:space:]]*=)?
     BEGIN SC_AFTER_IDENTIFIER;
  gram_piece_pack();
  gram_piece_append("<PYACC_ID>");
flush();
gram_piece_flush(strlen(yytext));
  gram_piece_append("</PYACC_ID>");
  gram_piece_pack();
   }
@@ -298,7 +312,7 @@ eqopt    ([[:space:]]*=)?
  gram_piece_pack();
  sprintf(gram_piece_temp, "<PYACC_Int value=\"%d\">", val->integer);
  gram_piece_append(gram_piece_temp);
- gram_piece_esc(yytext, yy_c_buf_p - yytext);
+ gram_piece_escape(yytext, strlen(yytext));
  gram_piece_append("</PYACC_Int>");
  gram_piece_pack();
  return ~INT;
@@ -312,7 +326,7 @@ eqopt    ([[:space:]]*=)?
  gram_piece_pack();
  sprintf(gram_piece_temp, "<PYACC_Int value=\"%d\">", val->integer);
  gram_piece_append(gram_piece_temp);
- gram_piece_esc(yytext, yy_c_buf_p - yytext);
+ gram_piece_escape(yytext, strlen(yytext));
  gram_piece_append("</PYACC_Int>");
  gram_piece_pack();
  return ~INT;
@@ -328,13 +342,13 @@ eqopt    ([[:space:]]*=)?
   }
 
   /* Characters.  */
-  "'"         token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER; gram_piece_pack(); gram_piece_append("<PYACC_Char>"); flush(); gram_piece_append("<PYACC_Text>");
+  "'"         token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER; gram_piece_pack(); gram_piece_append("<PYACC_Char>"); gram_piece_flush(strlen(yytext)); gram_piece_append("<PYACC_Text>");
 
   /* Strings. */
-  "\""        token_start = loc->start; BEGIN SC_ESCAPED_STRING; gram_piece_pack(); gram_piece_append("<PYACC_String>"); flush(); gram_piece_append("<PYACC_Text>");
+  "\""        token_start = loc->start; BEGIN SC_ESCAPED_STRING; gram_piece_pack(); gram_piece_append("<PYACC_String>"); gram_piece_flush(strlen(yytext)); gram_piece_append("<PYACC_Text>");
 
   /* Prologue. */
-  "%{"        code_start = loc->start; BEGIN SC_PROLOGUE; gram_piece_pack(); gram_piece_append("<PYACC_Section1_Prologue>"); flush(); gram_piece_append("<PYACC_Text>");
+  "%{"        code_start = loc->start; BEGIN SC_PROLOGUE; gram_piece_pack(); gram_piece_append("<PYACC_Section1_Prologue>"); gram_piece_flush(strlen(yytext)); gram_piece_append("<PYACC_Text>");
 
   /* Code in between braces.  */
   "{" {
@@ -352,9 +366,7 @@ eqopt    ([[:space:]]*=)?
     code_start = loc->start;
  gram_piece_pack();
  gram_piece_append("<PYACC_BracedPredicate>");
- /* flush all but the opening brace */
- gram_piece_esc(yytext, yy_c_buf_p - 1 - yytext);
- yytext = yy_c_buf_p - 1;
+ gram_piece_flush(strlen(yytext) - 1);
  gram_piece_append("<PYACC_Text>");
     BEGIN SC_PREDICATE;
   }
@@ -368,7 +380,7 @@ eqopt    ([[:space:]]*=)?
     BEGIN SC_TAG;
  gram_piece_pack();
  gram_piece_append("<PYACC_Tag>");
flush();
gram_piece_flush(strlen(yytext));
  gram_piece_append("<PYACC_Text>");
   }
 
@@ -378,7 +390,7 @@ eqopt    ([[:space:]]*=)?
  {
       BEGIN SC_EPILOGUE;
   gram_piece_pack();
-  gram_piece_esc(yytext, strlen(yytext));
+  gram_piece_escape(yytext, strlen(yytext));
   gram_piece_pack();
   gram_piece_pack();
   return ~PERCENT_PERCENT;
@@ -442,7 +454,7 @@ eqopt    ([[:space:]]*=)?
     BEGIN (bracketed_id_str ? SC_RETURN_BRACKETED_ID : INITIAL);
     *loc = id_loc;
 #if 1
- gram_piece_esc(yytext, yy_c_buf_p - yytext);
+ gram_piece_escape(yytext, strlen(yytext));
  return ~ID_COLON;
 #else
     return ID_COLON;
@@ -579,7 +591,7 @@ eqopt    ([[:space:]]*=)?
     BEGIN INITIAL;
 #if 1
  gram_piece_append("</PYACC_Text>");
- gram_piece_esc(yytext, strlen(yytext));
+ gram_piece_escape(yytext, strlen(yytext));
  gram_piece_append("</PYACC_String>");
  gram_piece_pack();
  return ~STRING;
@@ -617,7 +629,7 @@ eqopt    ([[:space:]]*=)?
     BEGIN INITIAL;
 #if 1
  gram_piece_append("</PYACC_Text>");
- gram_piece_esc(yytext, strlen(yytext));
+ gram_piece_escape(yytext, strlen(yytext));
  gram_piece_append("</PYACC_Char>");
  gram_piece_pack();
  return ~CHAR;
@@ -648,7 +660,7 @@ eqopt    ([[:space:]]*=)?
         BEGIN INITIAL;
 #if 1
  gram_piece_append("</PYACC_Text");
- gram_piece_esc(yytext, strlen(yytext));
+ gram_piece_escape(yytext, strlen(yytext));
  gram_piece_append("</PYACC_Tag>");
  gram_piece_pack();
  return ~TAG;
@@ -681,7 +693,7 @@ eqopt    ([[:space:]]*=)?
       obstack_1grow (&obstack_for_string, c);
   sprintf(gram_piece_temp, "<PYACC_Text_Escape character=\"%d\">", (int)c);
   gram_piece_append(gram_piece_temp);
-  flush();
+  gram_piece_flush(strlen(yytext));
   gram_piece_append("</PYACC_Text_Escape>"); 
  }
   }
@@ -697,21 +709,21 @@ eqopt    ([[:space:]]*=)?
       obstack_1grow (&obstack_for_string, c);
   sprintf(gram_piece_temp, "<PYACC_Text_Escape character=\"%d\">", (int)c);
   gram_piece_append(gram_piece_temp);
-  flush();
+  gram_piece_flush(strlen(yytext));
   gram_piece_append("</PYACC_Text_Escape>"); 
  }
   }
 
-  \\a   obstack_1grow (&obstack_for_string, '\a'); gram_piece_append("<PYACC_Text_Escape character=\"7\">"); flush(); gram_piece_append("</PYACC_Text_Escape>");
-  \\b   obstack_1grow (&obstack_for_string, '\b'); gram_piece_append("<PYACC_Text_Escape character=\"8\">"); flush(); gram_piece_append("</PYACC_Text_Escape>");
-  \\f   obstack_1grow (&obstack_for_string, '\f'); gram_piece_append("<PYACC_Text_Escape character=\"12\">"); flush(); gram_piece_append("</PYACC_Text_Escape>");
-  \\n   obstack_1grow (&obstack_for_string, '\n'); gram_piece_append("<PYACC_Text_Escape character=\"10\">"); flush(); gram_piece_append("</PYACC_Text_Escape>");
-  \\r   obstack_1grow (&obstack_for_string, '\r'); gram_piece_append("<PYACC_Text_Escape character=\"13\">"); flush(); gram_piece_append("</PYACC_Text_Escape>");
-  \\t   obstack_1grow (&obstack_for_string, '\t'); gram_piece_append("<PYACC_Text_Escape character=\"9\">"); flush(); gram_piece_append("</PYACC_Text_Escape>");
-  \\v   obstack_1grow (&obstack_for_string, '\v'); gram_piece_append("<PYACC_Text_Escape character=\"11\">"); flush(); gram_piece_append("</PYACC_Text_Escape>");
+  \\a   obstack_1grow (&obstack_for_string, '\a'); gram_piece_append("<PYACC_Text_Escape character=\"7\">"); gram_piece_flush(strlen(yytext)); gram_piece_append("</PYACC_Text_Escape>");
+  \\b   obstack_1grow (&obstack_for_string, '\b'); gram_piece_append("<PYACC_Text_Escape character=\"8\">"); gram_piece_flush(strlen(yytext)); gram_piece_append("</PYACC_Text_Escape>");
+  \\f   obstack_1grow (&obstack_for_string, '\f'); gram_piece_append("<PYACC_Text_Escape character=\"12\">"); gram_piece_flush(strlen(yytext)); gram_piece_append("</PYACC_Text_Escape>");
+  \\n   obstack_1grow (&obstack_for_string, '\n'); gram_piece_append("<PYACC_Text_Escape character=\"10\">"); gram_piece_flush(strlen(yytext)); gram_piece_append("</PYACC_Text_Escape>");
+  \\r   obstack_1grow (&obstack_for_string, '\r'); gram_piece_append("<PYACC_Text_Escape character=\"13\">"); gram_piece_flush(strlen(yytext)); gram_piece_append("</PYACC_Text_Escape>");
+  \\t   obstack_1grow (&obstack_for_string, '\t'); gram_piece_append("<PYACC_Text_Escape character=\"9\">"); gram_piece_flush(strlen(yytext)); gram_piece_append("</PYACC_Text_Escape>");
+  \\v   obstack_1grow (&obstack_for_string, '\v'); gram_piece_append("<PYACC_Text_Escape character=\"11\">"); gram_piece_flush(strlen(yytext)); gram_piece_append("</PYACC_Text_Escape>");
 
   /* \\[\"\'?\\] would be shorter, but it confuses xgettext.  */
-  \\("\""|"'"|"?"|"\\")  obstack_1grow (&obstack_for_string, yytext[1]); sprintf(gram_piece_temp, "<PYACC_Text_Escape character=\"%d\">", yytext[1]); gram_piece_append(gram_piece_temp); flush(); gram_piece_append("</PYACC_Text_Escape>"); 
+  \\("\""|"'"|"?"|"\\")  obstack_1grow (&obstack_for_string, yytext[1]); sprintf(gram_piece_temp, "<PYACC_Text_Escape character=\"%d\">", yytext[1]); gram_piece_append(gram_piece_temp); gram_piece_flush(strlen(yytext)); gram_piece_append("</PYACC_Text_Escape>"); 
  
   \\(u|U[0-9abcdefABCDEF]{4})[0-9abcdefABCDEF]{4} {
     int c = convert_ucn_to_byte (yytext);
@@ -723,7 +735,7 @@ eqopt    ([[:space:]]*=)?
       obstack_1grow (&obstack_for_string, c);
   sprintf(gram_piece_temp, "<PYACC_Text_Escape character=\"%d\">", c);
   gram_piece_append(gram_piece_temp);
-  flush();
+  gram_piece_flush(strlen(yytext));
   gram_piece_append("</PYACC_Text_Escape>"); 
  }
   }
@@ -826,7 +838,7 @@ eqopt    ([[:space:]]*=)?
         val->code = last_string;
         BEGIN INITIAL;
 #if 1
- gram_piece_esc(yytext, strlen(yytext));
+ gram_piece_escape(yytext, strlen(yytext));
  gram_piece_append("</PYACC_BracedCode>");
  gram_piece_pack();
  return ~BRACED_CODE;
@@ -848,7 +860,7 @@ eqopt    ([[:space:]]*=)?
         val->code = last_string;
         BEGIN INITIAL;
 #if 1
- gram_piece_esc(yytext, strlen(yytext));
+ gram_piece_escape(yytext, strlen(yytext));
  gram_piece_append("</PYACC_Text></PYACC_BracedPredicate>");
  gram_piece_pack();
  return ~BRACED_PREDICATE;
@@ -874,7 +886,7 @@ eqopt    ([[:space:]]*=)?
     BEGIN INITIAL;
 #if 1
  gram_piece_append("</PYACC_Text>");
- gram_piece_esc(yytext, strlen(yytext));
+ gram_piece_escape(yytext, strlen(yytext));
  gram_piece_append("</PYACC_Section1_Prologue>");
  gram_piece_pack();
  return ~PROLOGUE;
@@ -1145,3 +1157,86 @@ gram_scanner_free (void)
   /* Reclaim Flex's buffers.  */
   yylex_destroy ();
 }
+
+/* Nick */
+void gram_piece_append(const char *str) {
+ gram_piece[gram_piece1++] = strdup(str);
+}
+
+void gram_piece_insert(int n, const char *str) {
+ memmove(gram_piece + n + 1, gram_piece + n, (gram_piece1 - n) * sizeof(char *));
+ gram_piece[n] = strdup(str);
+ ++gram_piece1;
+}
+
+void gram_piece_escape(const char *p, size_t n) {
+ size_t i, j = 0;
+ for (i = 0; i < n; ++i)
+  switch (p[i]) {
+  case '<':
+  case '>':
+   j += 4;
+   break;
+  case '&':
+   j += 5;
+   break;
+  default:
+   ++j;
+   break;
+  }
+ char *q = malloc(j + 1);
+ j = 0;
+ for (i = 0; i < n; ++i)
+  switch (p[i]) {
+  case '<':
+   memcpy(q + j, "&lt;", 4);
+   j += 4;
+   break;
+  case '>':
+   memcpy(q + j, "&gt;", 4);
+   j += 4;
+   break;
+  case '&':
+   memcpy(q + j, "&amp;", 5);
+   j += 5;
+   break;
+  default:
+   q[j++] = p[i];
+   break;
+  }
+ q[j] = 0;
+ gram_piece[gram_piece1++] = q;
+}
+
+void gram_piece_flush(size_t n) {
+ gram_piece_escape(yytext, n);
+ yytext += n;
+}
+
+void gram_piece_pack() {
+ int i;
+ size_t j = 0;
+ for (i = gram_piece0; i < gram_piece1; ++i)
+  j += strlen(gram_piece[i]);
+ char *q = malloc(j + 1);
+ j = 0;
+ for (i = gram_piece0; i < gram_piece1; ++i) {
+  int k = strlen(gram_piece[i]);
+  memcpy(q + j, gram_piece[i], k);
+  free(gram_piece[i]);
+  j += k;
+ }
+ q[j] = 0;
+ gram_piece[gram_piece0++] = q;
+ gram_piece1 = gram_piece0;
+}
+
+GRAM_LEX_DECL {
+ int result = real_gram_lex(val, loc);
+ if (result < 0)
+  return ~result;
+ gram_piece_pack();
+ gram_piece_escape(yytext, strlen(yytext));
+ gram_piece_pack();
+ return result;
+}
diff --git a/src/scan-skel.c.patch b/src/scan-skel.c.patch
new file mode 100644 (file)
index 0000000..99d4476
--- /dev/null
@@ -0,0 +1,2 @@
+--- scan-skel.c.orig   2018-07-26 20:25:29.798247742 +1000
++++ scan-skel.c        2018-07-26 20:28:18.702255077 +1000