Add markup in scan-code.l scanner, add extra piece vector and copying scheme to overl...
authorNick Downing <downing.nick@gmail.com>
Fri, 6 Jul 2018 04:47:59 +0000 (14:47 +1000)
committerNick Downing <downing.nick@gmail.com>
Fri, 6 Jul 2018 05:39:24 +0000 (15:39 +1000)
12 files changed:
.gitignore
src/parse-gram.c
src/parse-gram.c.patch
src/parse-gram.h
src/parse-gram.y
src/reader.c
src/scan-code.c
src/scan-code.c.patch [new file with mode: 0644]
src/scan-code.l
src/scan-gram.c
src/scan-gram.c.patch
src/scan-gram.l

index ccaade6..2c60396 100644 (file)
@@ -64,6 +64,7 @@ src/.dirstamp
 src/bison
 src/parse-gram.c.orig
 src/parse-gram.output
+src/scan-code.c.orig
 src/scan-gram.c.orig
 src/yacc
 tests/atconfig
index 83db9cd..6a778ca 100644 (file)
@@ -120,7 +120,7 @@ extern int gram_debug;
 
   #include "symlist.h"
   #include "symtab.h"
-#line 221 "src/parse-gram.y" /* yacc.c:355  */
+#line 227 "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 805 "src/parse-gram.y" /* yacc.c:355  */
+#line 846 "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 182 "src/parse-gram.y" /* yacc.c:355  */
+#line 188 "src/parse-gram.y" /* yacc.c:355  */
 unsigned char character;
-#line 186 "src/parse-gram.y" /* yacc.c:355  */
+#line 192 "src/parse-gram.y" /* yacc.c:355  */
 char *code;
-#line 191 "src/parse-gram.y" /* yacc.c:355  */
+#line 197 "src/parse-gram.y" /* yacc.c:355  */
 uniqstr uniqstr;
-#line 199 "src/parse-gram.y" /* yacc.c:355  */
+#line 205 "src/parse-gram.y" /* yacc.c:355  */
 int integer;
-#line 203 "src/parse-gram.y" /* yacc.c:355  */
+#line 209 "src/parse-gram.y" /* yacc.c:355  */
 symbol *symbol;
-#line 208 "src/parse-gram.y" /* yacc.c:355  */
+#line 214 "src/parse-gram.y" /* yacc.c:355  */
 assoc assoc;
-#line 211 "src/parse-gram.y" /* yacc.c:355  */
+#line 217 "src/parse-gram.y" /* yacc.c:355  */
 symbol_list *list;
-#line 214 "src/parse-gram.y" /* yacc.c:355  */
+#line 220 "src/parse-gram.y" /* yacc.c:355  */
 named_ref *named_ref;
-#line 241 "src/parse-gram.y" /* yacc.c:355  */
+#line 247 "src/parse-gram.y" /* yacc.c:355  */
 param_type param;
-#line 496 "src/parse-gram.y" /* yacc.c:355  */
+#line 528 "src/parse-gram.y" /* yacc.c:355  */
 code_props_type code_type;
-#line 807 "src/parse-gram.y" /* yacc.c:355  */
+#line 848 "src/parse-gram.y" /* yacc.c:355  */
 
   struct
   {
@@ -326,7 +326,13 @@ int gram_parse (void);
   #define YYTYPE_INT8 int_fast8_t
   #define YYTYPE_UINT16 uint_fast16_t
   #define YYTYPE_UINT8 uint_fast8_t
-#line 231 "src/parse-gram.y" /* yacc.c:359  */
+
+  /* Nick */
+  extern char *code_piece[];
+  extern int code_piece0;
+  void code_piece_append(const char *str);
+  void code_piece_pack();
+#line 237 "src/parse-gram.y" /* yacc.c:359  */
 
   /** Add a lex-param and/or a parse-param.
    *
@@ -337,7 +343,7 @@ int gram_parse (void);
   static void add_param (param_type type, char *decl, location loc);
   static param_type current_param = param_none;
 
-#line 341 "src/parse-gram.c" /* yacc.c:359  */
+#line 347 "src/parse-gram.c" /* yacc.c:359  */
 
 #ifdef short
 # undef short
@@ -619,18 +625,18 @@ static const yytype_uint8 yytranslate[] =
   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,   264,   264,   279,   290,   294,   295,   301,   307,   314,
-     318,   325,   333,   337,   341,   345,   352,   359,   363,   367,
-     371,   375,   379,   379,   383,   387,   413,   417,   421,   425,
-     429,   430,   439,   440,   441,   447,   464,   470,   476,   486,
-     499,   500,   510,   511,   517,   531,   531,   538,   538,   545,
-     560,   580,   581,   582,   583,   587,   590,   595,   597,   602,
-     607,   619,   621,   626,   627,   631,   632,   636,   641,   645,
-     653,   658,   663,   671,   680,   693,   694,   703,   704,   710,
-     711,   712,   719,   719,   729,   733,   737,   742,   754,   759,
-     764,   766,   771,   776,   781,   789,   790,   800,   801,   826,
-     827,   828,   829,   841,   843,   852,   857,   858,   863,   871,
-     872
+       0,   270,   270,   285,   296,   300,   301,   313,   319,   326,
+     330,   337,   345,   349,   353,   357,   364,   376,   380,   384,
+     388,   392,   396,   396,   400,   404,   430,   434,   438,   442,
+     446,   447,   456,   457,   458,   464,   486,   492,   498,   513,
+     531,   532,   542,   543,   549,   568,   568,   575,   575,   582,
+     597,   617,   618,   619,   620,   624,   627,   632,   634,   639,
+     644,   656,   658,   663,   664,   668,   669,   673,   678,   682,
+     690,   695,   700,   708,   717,   730,   731,   740,   741,   747,
+     748,   749,   756,   756,   766,   770,   774,   779,   791,   796,
+     805,   807,   812,   817,   822,   830,   831,   841,   842,   867,
+     868,   869,   870,   882,   884,   893,   898,   899,   904,   912,
+     913
 };
 #endif
 
@@ -1002,79 +1008,79 @@ yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvalue
   switch (yytype)
     {
           case 3: /* "string"  */
-#line 188 "src/parse-gram.y" /* yacc.c:684  */
+#line 194 "src/parse-gram.y" /* yacc.c:684  */
       { fputs (quotearg_style (c_quoting_style, ((*yyvaluep).code)), yyo); }
-#line 1008 "src/parse-gram.c" /* yacc.c:684  */
+#line 1014 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 23: /* "%<flag>"  */
-#line 196 "src/parse-gram.y" /* yacc.c:684  */
+#line 202 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%%%s", ((*yyvaluep).uniqstr)); }
-#line 1014 "src/parse-gram.c" /* yacc.c:684  */
+#line 1020 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 39: /* "{...}"  */
-#line 189 "src/parse-gram.y" /* yacc.c:684  */
+#line 195 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "{\n%s\n}", ((*yyvaluep).code)); }
-#line 1020 "src/parse-gram.c" /* yacc.c:684  */
+#line 1026 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 40: /* "%?{...}"  */
-#line 189 "src/parse-gram.y" /* yacc.c:684  */
+#line 195 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "{\n%s\n}", ((*yyvaluep).code)); }
-#line 1026 "src/parse-gram.c" /* yacc.c:684  */
+#line 1032 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 41: /* "[identifier]"  */
-#line 194 "src/parse-gram.y" /* yacc.c:684  */
+#line 200 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "[%s]", ((*yyvaluep).uniqstr)); }
-#line 1032 "src/parse-gram.c" /* yacc.c:684  */
+#line 1038 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 42: /* "char"  */
-#line 184 "src/parse-gram.y" /* yacc.c:684  */
+#line 190 "src/parse-gram.y" /* yacc.c:684  */
       { fputs (char_name (((*yyvaluep).character)), yyo); }
-#line 1038 "src/parse-gram.c" /* yacc.c:684  */
+#line 1044 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 43: /* "epilogue"  */
-#line 189 "src/parse-gram.y" /* yacc.c:684  */
+#line 195 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "{\n%s\n}", ((*yyvaluep).code)); }
-#line 1044 "src/parse-gram.c" /* yacc.c:684  */
+#line 1050 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 45: /* "identifier"  */
-#line 193 "src/parse-gram.y" /* yacc.c:684  */
+#line 199 "src/parse-gram.y" /* yacc.c:684  */
       { fputs (((*yyvaluep).uniqstr), yyo); }
-#line 1050 "src/parse-gram.c" /* yacc.c:684  */
+#line 1056 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 46: /* "identifier:"  */
-#line 195 "src/parse-gram.y" /* yacc.c:684  */
+#line 201 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%s:", ((*yyvaluep).uniqstr)); }
-#line 1056 "src/parse-gram.c" /* yacc.c:684  */
+#line 1062 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 49: /* "%{...%}"  */
-#line 189 "src/parse-gram.y" /* yacc.c:684  */
+#line 195 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "{\n%s\n}", ((*yyvaluep).code)); }
-#line 1062 "src/parse-gram.c" /* yacc.c:684  */
+#line 1068 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 51: /* "<tag>"  */
-#line 197 "src/parse-gram.y" /* yacc.c:684  */
+#line 203 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "<%s>", ((*yyvaluep).uniqstr)); }
-#line 1068 "src/parse-gram.c" /* yacc.c:684  */
+#line 1074 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 54: /* "integer"  */
-#line 201 "src/parse-gram.y" /* yacc.c:684  */
+#line 207 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%d", ((*yyvaluep).integer)); }
-#line 1074 "src/parse-gram.c" /* yacc.c:684  */
+#line 1080 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 55: /* "%param"  */
-#line 244 "src/parse-gram.y" /* yacc.c:684  */
+#line 250 "src/parse-gram.y" /* yacc.c:684  */
       {
   switch (((*yyvaluep).param))
     {
@@ -1087,35 +1093,35 @@ yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvalue
       case param_none: aver (false); break;
     }
 }
-#line 1091 "src/parse-gram.c" /* yacc.c:684  */
+#line 1097 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 65: /* code_props_type  */
-#line 497 "src/parse-gram.y" /* yacc.c:684  */
+#line 529 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%s", code_props_type_string (((*yyvaluep).code_type))); }
-#line 1097 "src/parse-gram.c" /* yacc.c:684  */
+#line 1103 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 74: /* symbol.prec  */
-#line 205 "src/parse-gram.y" /* yacc.c:684  */
+#line 211 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%s", ((*yyvaluep).symbol)->tag); }
-#line 1103 "src/parse-gram.c" /* yacc.c:684  */
+#line 1109 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 78: /* tag  */
-#line 197 "src/parse-gram.y" /* yacc.c:684  */
+#line 203 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "<%s>", ((*yyvaluep).uniqstr)); }
-#line 1109 "src/parse-gram.c" /* yacc.c:684  */
+#line 1115 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 88: /* variable  */
-#line 193 "src/parse-gram.y" /* yacc.c:684  */
+#line 199 "src/parse-gram.y" /* yacc.c:684  */
       { fputs (((*yyvaluep).uniqstr), yyo); }
-#line 1115 "src/parse-gram.c" /* yacc.c:684  */
+#line 1121 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 89: /* value  */
-#line 816 "src/parse-gram.y" /* yacc.c:684  */
+#line 857 "src/parse-gram.y" /* yacc.c:684  */
       {
   switch (((*yyvaluep).value).kind)
     {
@@ -1124,31 +1130,31 @@ yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvalue
     case muscle_string:  fprintf (yyo, "\"%s\"", ((*yyvaluep).value).chars); break;
     }
 }
-#line 1128 "src/parse-gram.c" /* yacc.c:684  */
+#line 1134 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 90: /* id  */
-#line 205 "src/parse-gram.y" /* yacc.c:684  */
+#line 211 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%s", ((*yyvaluep).symbol)->tag); }
-#line 1134 "src/parse-gram.c" /* yacc.c:684  */
+#line 1140 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 91: /* id_colon  */
-#line 206 "src/parse-gram.y" /* yacc.c:684  */
+#line 212 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%s:", ((*yyvaluep).symbol)->tag); }
-#line 1140 "src/parse-gram.c" /* yacc.c:684  */
+#line 1146 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 92: /* symbol  */
-#line 205 "src/parse-gram.y" /* yacc.c:684  */
+#line 211 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%s", ((*yyvaluep).symbol)->tag); }
-#line 1146 "src/parse-gram.c" /* yacc.c:684  */
+#line 1152 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
     case 93: /* string_as_id  */
-#line 205 "src/parse-gram.y" /* yacc.c:684  */
+#line 211 "src/parse-gram.y" /* yacc.c:684  */
       { fprintf (yyo, "%s", ((*yyvaluep).symbol)->tag); }
-#line 1152 "src/parse-gram.c" /* yacc.c:684  */
+#line 1158 "src/parse-gram.c" /* yacc.c:684  */
         break;
 
 
@@ -1742,25 +1748,28 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio
 | yyparse.  |
 `----------*/
 
-extern char piece_temp[];
-extern char *piece[];
-extern int piece0, piece1;
-void piece_insert(int n, const void *str);
-int piece2, piece3;
+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(piece + piece3 + 3, piece + piece3 + 1, (piece1 - piece3 - 1) * sizeof(char *));
piece[piece3 + 1] = strdup("");
piece[piece3 + 2] = strdup("");
- piece3 += 2;
- piece0 += 2;
- piece1 += 2;
+ 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 { piece_insert(piece2 + (n) * 2, (str)); ++piece0; ++piece3; } while (0)
+ do { gram_piece_insert(gram_piece2 + (n) * 2, (str)); ++gram_piece0; ++gram_piece3; } while (0)
 #define insert_after(n, str) \
- do { piece_insert(piece2 + (n) * 2 + 1, (str)); ++piece0; ++piece3; } while (0)
+ do { gram_piece_insert(gram_piece2 + (n) * 2 + 1, (str)); ++gram_piece0; ++gram_piece3; } while (0)
 int
 yyparse (void)
 {
@@ -1862,7 +1871,7 @@ YYLTYPE yylloc = yyloc_default;
   yychar = YYEMPTY; /* Cause a token to be read.  */
 
 /* User initialization code.  */
-#line 108 "src/parse-gram.y" /* yacc.c:1430  */
+#line 114 "src/parse-gram.y" /* yacc.c:1430  */
 {
   /* Bison's grammar can initial empty locations, hence a default
      location is needed. */
@@ -1870,7 +1879,7 @@ YYLTYPE yylloc = yyloc_default;
   boundary_set (&yylloc.end, current_file, 1, 1);
 }
 
-#line 1855 "src/parse-gram.c" /* yacc.c:1430  */
+#line 1861 "src/parse-gram.c" /* yacc.c:1430  */
   yylsp[0] = yylloc;
   goto yysetstate;
 
@@ -2046,15 +2055,15 @@ yyreduce:
   /* yyn is the number of a rule to reduce with.  */
   yylen = yyr2[yyn];
  int n = ((int)(yyvsp - yyvsa) - yylen) * 2;
- piece2 = n + 1;
- piece3 = n + yylen * 2;
gram_piece2 = n + 1;
gram_piece3 = n + yylen * 2;
  if (yylen == 0) {
-  memmove(piece + n + 2, piece + n, (piece1 - n) * sizeof(char *));
-  piece[n] = strdup("");
-  piece[n + 1] = strdup("");
-  piece3 = n + 2;
-  piece0 += 2;
-  piece1 += 2;
+  memmove(gram_piece + n + 2, gram_piece + n, (gram_piece1 - n) * sizeof(char *));
+  gram_piece[n] = strdup("");
+  gram_piece[n + 1] = strdup("");
+  gram_piece3 = n + 2;
+  gram_piece0 += 2;
+  gram_piece1 += 2;
  }
 
   /* If YYLEN is nonzero, implement the default value of the action:
@@ -2076,84 +2085,90 @@ yyreduce:
     switch (yyn)
       {
           case 2:
-#line 265 "src/parse-gram.y" /* yacc.c:1648  */
+#line 271 "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 2057 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2063 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 3:
-#line 280 "src/parse-gram.y" /* yacc.c:1648  */
+#line 286 "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 */
  if (yychar == YYEMPTY)
   yychar = yylex(&yylval, &yylloc);
- char *temp = piece[piece2 + 1];
piece[piece2 + 1] = piece[piece2]; /* empty */
piece[piece2] = piece[piece2 - 1]; /* empty */
piece[piece2 - 1] = temp;
+ char *temp = gram_piece[gram_piece2 + 1];
gram_piece[gram_piece2 + 1] = gram_piece[gram_piece2]; /* empty */
gram_piece[gram_piece2] = gram_piece[gram_piece2 - 1]; /* empty */
gram_piece[gram_piece2 - 1] = temp;
  }
-#line 2072 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2078 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 6:
-#line 296 "src/parse-gram.y" /* yacc.c:1648  */
+#line 302 "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>%{");
       muscle_code_grow (union_seen ? "post_prologue" : "pre_prologue",
                         translate_code ((yyvsp[0].code), (yylsp[0]), true), (yylsp[0]));
       code_scanner_last_string_free ();
+ code_piece_append("%}</PYACC_Section1_Prologue>");
+ code_piece_pack();
+ free(gram_piece[gram_piece2]);
+ gram_piece[gram_piece2] = strdup(code_piece[code_piece0 - 1]);
     }
-#line 2082 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2094 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 7:
-#line 302 "src/parse-gram.y" /* yacc.c:1648  */
+#line 314 "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 2092 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2104 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 8:
-#line 308 "src/parse-gram.y" /* yacc.c:1648  */
+#line 320 "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 2103 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2115 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 9:
-#line 314 "src/parse-gram.y" /* yacc.c:1648  */
+#line 326 "src/parse-gram.y" /* yacc.c:1648  */
     { defines_flag = true; /*}*/
  insert_after(0, "</PYACC_Section1_Define>");
  insert_before(0, "<PYACC_Section1_Define>");
  }
-#line 2112 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2124 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 10:
-#line 319 "src/parse-gram.y" /* yacc.c:1648  */
+#line 331 "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 2123 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2135 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 11:
-#line 326 "src/parse-gram.y" /* yacc.c:1648  */
+#line 338 "src/parse-gram.y" /* yacc.c:1648  */
     {
       muscle_percent_define_insert ("parse.error", (yylsp[0]), muscle_keyword,
                                     "verbose",
@@ -2161,129 +2176,134 @@ yyreduce:
  insert_after(0, "</PYACC_Section1_ErrorVerbose>");
  insert_before(0, "<PYACC_Section1_ErrorVerbose>");
     }
-#line 2135 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2147 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 12:
-#line 333 "src/parse-gram.y" /* yacc.c:1648  */
+#line 345 "src/parse-gram.y" /* yacc.c:1648  */
     { expected_sr_conflicts = (yyvsp[0].integer); /*}*/
  insert_after(1, "</PYACC_Section1_Expect>");
  insert_before(0, "<PYACC_Section1_Expect>");
  }
-#line 2144 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2156 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 13:
-#line 337 "src/parse-gram.y" /* yacc.c:1648  */
+#line 349 "src/parse-gram.y" /* yacc.c:1648  */
     { expected_rr_conflicts = (yyvsp[0].integer); /*}*/
  insert_after(1, "</PYACC_Section1_ExpectRR>");
  insert_before(0, "<PYACC_Section1_ExpectRR>");
  }
-#line 2153 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2165 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 14:
-#line 341 "src/parse-gram.y" /* yacc.c:1648  */
+#line 353 "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 2162 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2174 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 15:
-#line 346 "src/parse-gram.y" /* yacc.c:1648  */
+#line 358 "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 2173 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2185 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 16:
-#line 353 "src/parse-gram.y" /* yacc.c:1648  */
+#line 365 "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]));
       code_scanner_last_string_free ();
+ code_piece_append("</PYACC_BracedCode>");
+ code_piece_pack();
+ free(gram_piece[gram_piece2 + 2]);
+ gram_piece[gram_piece2 + 2] = strdup(code_piece[code_piece0 - 1]);
  insert_after(1, "</PYACC_Section1_InitialAction>");
  insert_before(0, "<PYACC_Section1_InitialAction>");
     }
-#line 2184 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2201 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 17:
-#line 359 "src/parse-gram.y" /* yacc.c:1648  */
+#line 376 "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 2193 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2210 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 18:
-#line 363 "src/parse-gram.y" /* yacc.c:1648  */
+#line 380 "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 2202 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2219 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 19:
-#line 367 "src/parse-gram.y" /* yacc.c:1648  */
+#line 384 "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 2211 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2228 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 20:
-#line 371 "src/parse-gram.y" /* yacc.c:1648  */
+#line 388 "src/parse-gram.y" /* yacc.c:1648  */
     { nondeterministic_parser = true; /*}*/
  insert_after(0, "</PYACC_Section1_NonDeterministicParser>");
  insert_before(0, "<PYACC_Section1_NonDeterministicParser>");
  }
-#line 2220 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2237 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 21:
-#line 375 "src/parse-gram.y" /* yacc.c:1648  */
+#line 392 "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 2229 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2246 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 22:
-#line 379 "src/parse-gram.y" /* yacc.c:1648  */
+#line 396 "src/parse-gram.y" /* yacc.c:1648  */
     { current_param = (yyvsp[0].param); }
-#line 2235 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2252 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 23:
-#line 379 "src/parse-gram.y" /* yacc.c:1648  */
+#line 396 "src/parse-gram.y" /* yacc.c:1648  */
     { current_param = param_none; /*}*/
  insert_after(2, "</PYACC_Section1_Param>");
  insert_before(0, "<PYACC_Section1_Param>");
  }
-#line 2244 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2261 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 24:
-#line 383 "src/parse-gram.y" /* yacc.c:1648  */
+#line 400 "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 2253 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2270 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 25:
-#line 388 "src/parse-gram.y" /* yacc.c:1648  */
+#line 405 "src/parse-gram.y" /* yacc.c:1648  */
     {
       char const *skeleton_user = (yyvsp[0].code);
       if (strchr (skeleton_user, '/'))
@@ -2309,64 +2329,69 @@ yyreduce:
  insert_after(1, "</PYACC_Section1_Skeleton>");
  insert_before(0, "<PYACC_Section1_Skeleton>");
     }
-#line 2283 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2300 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 26:
-#line 413 "src/parse-gram.y" /* yacc.c:1648  */
+#line 430 "src/parse-gram.y" /* yacc.c:1648  */
     { token_table_flag = true; /*}*/
  insert_after(0, "</PYACC_Section1_TokenTable>");
  insert_before(0, "<PYACC_Section1_TokenTable>");
  }
-#line 2292 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2309 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 27:
-#line 417 "src/parse-gram.y" /* yacc.c:1648  */
+#line 434 "src/parse-gram.y" /* yacc.c:1648  */
     { report_flag |= report_states; /*}*/
  insert_after(0, "</PYACC_Section1_Verbose>");
  insert_before(0, "<PYACC_Section1_Verbose>");
  }
-#line 2301 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2318 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 28:
-#line 421 "src/parse-gram.y" /* yacc.c:1648  */
+#line 438 "src/parse-gram.y" /* yacc.c:1648  */
     { yacc_flag = true; /*}*/
  insert_after(0, "</PYACC_Section1_YACC>");
  insert_before(0, "<PYACC_Section1_YACC>");
  }
-#line 2310 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2327 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 30:
-#line 429 "src/parse-gram.y" /* yacc.c:1648  */
+#line 446 "src/parse-gram.y" /* yacc.c:1648  */
     { add_param (current_param, (yyvsp[0].code), (yylsp[0])); }
-#line 2316 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2333 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 31:
-#line 430 "src/parse-gram.y" /* yacc.c:1648  */
+#line 447 "src/parse-gram.y" /* yacc.c:1648  */
     { add_param (current_param, (yyvsp[0].code), (yylsp[0])); }
-#line 2322 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2339 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 34:
-#line 442 "src/parse-gram.y" /* yacc.c:1648  */
+#line 459 "src/parse-gram.y" /* yacc.c:1648  */
     {
       grammar_start_symbol_set ((yyvsp[0].symbol), (yylsp[0]));
  insert_after(1, "</PYACC_Section1Or2_Start>");
  insert_before(0, "<PYACC_Section1Or2_Start>");
     }
-#line 2332 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2349 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 35:
-#line 448 "src/parse-gram.y" /* yacc.c:1648  */
+#line 465 "src/parse-gram.y" /* yacc.c:1648  */
     {
       code_props code;
       code_props_symbol_action_init (&code, (yyvsp[-1].code), (yylsp[-1]));
+ code_piece_append("<PYACC_BracedCode>");
       code_props_translate_code (&code);
+ code_piece_append("</PYACC_BracedCode>");
+ code_piece_pack();
+ free(gram_piece[gram_piece2 + 2]);
+ gram_piece[gram_piece2 + 2] = strdup(code_piece[code_piece0 - 1]);
       {
         symbol_list *list;
         for (list = (yyvsp[0].list); list; list = list->next)
@@ -2376,131 +2401,146 @@ yyreduce:
  insert_after(2, "</PYACC_Section1Or2_CodeProps>");
  insert_after(2, "</PYACC_Section1Or2_CodeProps_GenericSymList>");
  insert_before(2, "<PYACC_Section1Or2_CodeProps_GenericSymList>");
- sprintf(piece_temp, "<PYACC_Section1Or2_CodeProps type=\"%d\">", (yyvsp[-2].code_type));
- insert_before(0, piece_temp);
+ sprintf(gram_piece_temp, "<PYACC_Section1Or2_CodeProps type=\"%d\">", (yyvsp[-2].code_type));
+ insert_before(0, gram_piece_temp);
     }
-#line 2353 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2375 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 36:
-#line 465 "src/parse-gram.y" /* yacc.c:1648  */
+#line 487 "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 2363 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2385 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 37:
-#line 471 "src/parse-gram.y" /* yacc.c:1648  */
+#line 493 "src/parse-gram.y" /* yacc.c:1648  */
     {
       default_prec = false;
  insert_after(0, "</PYACC_Section1Or2_DefaultPrec>");
  insert_before(0, "<PYACC_Section1Or2_DefaultPrec>");
     }
-#line 2373 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2395 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 38:
-#line 477 "src/parse-gram.y" /* yacc.c:1648  */
+#line 499 "src/parse-gram.y" /* yacc.c:1648  */
     {
       /* Do not invoke muscle_percent_code_grow here since it invokes
          muscle_user_name_list_grow.  */
+ code_piece_append("<PYACC_BracedCode>");
       muscle_code_grow ("percent_code()",
                         translate_code_braceless ((yyvsp[0].code), (yylsp[0])), (yylsp[0]));
       code_scanner_last_string_free ();
+ code_piece_append("</PYACC_BracedCode>");
+ code_piece_pack();
+ free(gram_piece[gram_piece2 + 2]);
+ gram_piece[gram_piece2 + 2] = strdup(code_piece[code_piece0 - 1]);
  insert_after(1, "</PYACC_Section1Or2_Code>");
  insert_before(0, "<PYACC_Section1Or2_Code><PYACC_IDNone />");
     }
-#line 2387 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2414 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 39:
-#line 487 "src/parse-gram.y" /* yacc.c:1648  */
+#line 514 "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]));
       code_scanner_last_string_free ();
+ code_piece_append("</PYACC_BracedCode>");
+ code_piece_pack();
+ free(gram_piece[gram_piece2 + 4]);
+ gram_piece[gram_piece2 + 4] = strdup(code_piece[code_piece0 - 1]);
  insert_after(2, "</PYACC_Section1Or2_Code>");
  insert_before(0, "<PYACC_Section1Or2_Code>");
     }
-#line 2398 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2430 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 40:
-#line 499 "src/parse-gram.y" /* yacc.c:1648  */
+#line 531 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.code_type) = destructor; }
-#line 2404 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2436 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 41:
-#line 500 "src/parse-gram.y" /* yacc.c:1648  */
+#line 532 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.code_type) = printer; }
-#line 2410 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2442 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 42:
-#line 510 "src/parse-gram.y" /* yacc.c:1648  */
+#line 542 "src/parse-gram.y" /* yacc.c:1648  */
     { insert_before(0, "<PYACC_IDNone />"); }
-#line 2416 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2448 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 43:
-#line 511 "src/parse-gram.y" /* yacc.c:1648  */
+#line 543 "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 2424 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2456 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 44:
-#line 518 "src/parse-gram.y" /* yacc.c:1648  */
+#line 550 "src/parse-gram.y" /* yacc.c:1648  */
     {
       union_seen = true;
+ code_piece_append("<PYACC_BracedCode>");
       muscle_code_grow ("union_members", translate_code_braceless ((yyvsp[0].code), (yylsp[0])), (yylsp[0]));
       code_scanner_last_string_free ();
+ code_piece_append("</PYACC_BracedCode>");
+ code_piece_pack();
+ free(gram_piece[gram_piece2 + 4]);
+ gram_piece[gram_piece2 + 4] = strdup(code_piece[code_piece0 - 1]);
  insert_after(2, "</PYACC_Section1Or2_Union>");
  insert_before(0, "<PYACC_Section1Or2_Union>");
     }
-#line 2436 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2473 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 45:
-#line 531 "src/parse-gram.y" /* yacc.c:1648  */
+#line 568 "src/parse-gram.y" /* yacc.c:1648  */
     { current_class = nterm_sym; }
-#line 2442 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2479 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 46:
-#line 532 "src/parse-gram.y" /* yacc.c:1648  */
+#line 569 "src/parse-gram.y" /* yacc.c:1648  */
     {
       current_class = unknown_sym;
       current_type = NULL;
  insert_after(2, "</PYACC_Section1Or2_NTerm>");
  insert_before(0, "<PYACC_Section1Or2_NTerm>");
     }
-#line 2453 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2490 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 47:
-#line 538 "src/parse-gram.y" /* yacc.c:1648  */
+#line 575 "src/parse-gram.y" /* yacc.c:1648  */
     { current_class = token_sym; }
-#line 2459 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2496 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 48:
-#line 539 "src/parse-gram.y" /* yacc.c:1648  */
+#line 576 "src/parse-gram.y" /* yacc.c:1648  */
     {
       current_class = unknown_sym;
       current_type = NULL;
  insert_after(2, "</PYACC_Section1Or2_Token>");
  insert_before(0, "<PYACC_Section1Or2_Token>");
     }
-#line 2470 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2507 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 49:
-#line 546 "src/parse-gram.y" /* yacc.c:1648  */
+#line 583 "src/parse-gram.y" /* yacc.c:1648  */
     {
       symbol_list *list;
       tag_seen = true;
@@ -2512,11 +2552,11 @@ yyreduce:
  insert_before(2, "<PYACC_Section1Or2_Type_Symbols>");
  insert_before(0, "<PYACC_Section1Or2_Type>");
     }
-#line 2486 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2523 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 50:
-#line 561 "src/parse-gram.y" /* yacc.c:1648  */
+#line 598 "src/parse-gram.y" /* yacc.c:1648  */
     {
       symbol_list *list;
       ++current_prec;
@@ -2530,73 +2570,73 @@ yyreduce:
  insert_after(2, "</PYACC_Section1Or2_Precedence>");
  insert_after(2, "</PYACC_Section1Or2_Precedence_Symbols>");
  insert_before(2, "<PYACC_Section1Or2_Precedence_Symbols>");
- sprintf(piece_temp, "<PYACC_Section1Or2_Precedence type=\"%d\">", (yyvsp[-2].assoc)); 
- insert_before(0, piece_temp);
+ sprintf(gram_piece_temp, "<PYACC_Section1Or2_Precedence type=\"%d\">", (yyvsp[-2].assoc)); 
+ insert_before(0, gram_piece_temp);
     }
-#line 2507 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2544 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 51:
-#line 580 "src/parse-gram.y" /* yacc.c:1648  */
+#line 617 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.assoc) = left_assoc; }
-#line 2513 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2550 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 52:
-#line 581 "src/parse-gram.y" /* yacc.c:1648  */
+#line 618 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.assoc) = right_assoc;  }
-#line 2519 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2556 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 53:
-#line 582 "src/parse-gram.y" /* yacc.c:1648  */
+#line 619 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.assoc) = non_assoc; }
-#line 2525 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2562 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 54:
-#line 583 "src/parse-gram.y" /* yacc.c:1648  */
+#line 620 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.assoc) = precedence_assoc; }
-#line 2531 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2568 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 55:
-#line 587 "src/parse-gram.y" /* yacc.c:1648  */
+#line 624 "src/parse-gram.y" /* yacc.c:1648  */
     { current_type = NULL; /*}*/
  insert_before(0, "<PYACC_TagNone />");
  }
-#line 2539 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2576 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 56:
-#line 590 "src/parse-gram.y" /* yacc.c:1648  */
+#line 627 "src/parse-gram.y" /* yacc.c:1648  */
     { current_type = (yyvsp[0].uniqstr); tag_seen = true; }
-#line 2545 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2582 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 57:
-#line 596 "src/parse-gram.y" /* yacc.c:1648  */
+#line 633 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.list) = symbol_list_sym_new ((yyvsp[0].symbol), (yylsp[0])); }
-#line 2551 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2588 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 58:
-#line 598 "src/parse-gram.y" /* yacc.c:1648  */
+#line 635 "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 2557 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2594 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 59:
-#line 603 "src/parse-gram.y" /* yacc.c:1648  */
+#line 640 "src/parse-gram.y" /* yacc.c:1648  */
     {
       (yyval.symbol) = (yyvsp[0].symbol);
       symbol_class_set ((yyvsp[0].symbol), token_sym, (yylsp[0]), false);
     }
-#line 2566 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2603 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 60:
-#line 608 "src/parse-gram.y" /* yacc.c:1648  */
+#line 645 "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]));
@@ -2604,92 +2644,92 @@ yyreduce:
  insert_after(1, "<PYACC_Section1Or2_Precedence_Symbols_Symbol>");
  insert_before(0, "<PYACC_Sectino1Or2_Precedence_Symbols_Symbol>");
     }
-#line 2578 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2615 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 61:
-#line 620 "src/parse-gram.y" /* yacc.c:1648  */
+#line 657 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.list) = symbol_list_sym_new ((yyvsp[0].symbol), (yylsp[0])); }
-#line 2584 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2621 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 62:
-#line 622 "src/parse-gram.y" /* yacc.c:1648  */
+#line 659 "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 2590 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2627 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 63:
-#line 626 "src/parse-gram.y" /* yacc.c:1648  */
+#line 663 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.list) = (yyvsp[0].list); }
-#line 2596 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2633 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 64:
-#line 627 "src/parse-gram.y" /* yacc.c:1648  */
+#line 664 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.list) = symbol_list_append ((yyvsp[-1].list), (yyvsp[0].list)); }
-#line 2602 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2639 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 65:
-#line 631 "src/parse-gram.y" /* yacc.c:1648  */
+#line 668 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.list) = symbol_list_sym_new ((yyvsp[0].symbol), (yylsp[0])); }
-#line 2608 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2645 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 66:
-#line 632 "src/parse-gram.y" /* yacc.c:1648  */
+#line 669 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.list) = symbol_list_type_new ((yyvsp[0].uniqstr), (yylsp[0])); }
-#line 2614 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2651 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 67:
-#line 637 "src/parse-gram.y" /* yacc.c:1648  */
+#line 674 "src/parse-gram.y" /* yacc.c:1648  */
     {
  insert_after(0, "</PYACC_Tag");
  insert_before(0, "<PYACC_Tag type=\"0\">");
  }
-#line 2623 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2660 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 68:
-#line 641 "src/parse-gram.y" /* yacc.c:1648  */
+#line 678 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.uniqstr) = uniqstr_new ("*"); /*}*/
  insert_after(0, "</PYACC_Tag");
  insert_before(0, "<PYACC_Tag type=\"1\">");
  }
-#line 2632 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2669 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 69:
-#line 645 "src/parse-gram.y" /* yacc.c:1648  */
+#line 682 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.uniqstr) = uniqstr_new (""); /*}*/
  insert_after(0, "</PYACC_Tag");
  insert_before(0, "<PYACC_Tag type=\"2\">");
  }
-#line 2641 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2678 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 70:
-#line 654 "src/parse-gram.y" /* yacc.c:1648  */
+#line 691 "src/parse-gram.y" /* yacc.c:1648  */
     {
       current_type = (yyvsp[0].uniqstr);
       tag_seen = true;
     }
-#line 2650 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2687 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 71:
-#line 659 "src/parse-gram.y" /* yacc.c:1648  */
+#line 696 "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]));
     }
-#line 2659 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2696 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 72:
-#line 664 "src/parse-gram.y" /* yacc.c:1648  */
+#line 701 "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]));
@@ -2697,11 +2737,11 @@ yyreduce:
  insert_after(1, "</PYACC_Section1Or2_SymbolDef>");
  insert_before(0, "<PYACC_Section1Or2_SymbolDef>");
     }
-#line 2671 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2708 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 73:
-#line 672 "src/parse-gram.y" /* yacc.c:1648  */
+#line 709 "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]));
@@ -2710,11 +2750,11 @@ yyreduce:
  insert_after(0, "<PYACC_IntNone />");
  insert_before(0, "<PYACC_Section1Or2_SymbolDef>");
     }
-#line 2684 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2721 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 74:
-#line 681 "src/parse-gram.y" /* yacc.c:1648  */
+#line 718 "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]));
@@ -2723,214 +2763,232 @@ yyreduce:
  insert_after(2, "</PYACC_Section1Or2_SymbolDef>");
  insert_before(0, "<PYACC_Section1Or2_SymbolDef>");
     }
-#line 2697 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2734 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 81:
-#line 713 "src/parse-gram.y" /* yacc.c:1648  */
+#line 750 "src/parse-gram.y" /* yacc.c:1648  */
     {
       yyerrok;
     }
-#line 2705 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2742 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 82:
-#line 719 "src/parse-gram.y" /* yacc.c:1648  */
+#line 756 "src/parse-gram.y" /* yacc.c:1648  */
     { current_lhs ((yyvsp[-1].symbol), (yylsp[-1]), (yyvsp[0].named_ref)); }
-#line 2711 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2748 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 83:
-#line 720 "src/parse-gram.y" /* yacc.c:1648  */
+#line 757 "src/parse-gram.y" /* yacc.c:1648  */
     {
     /* Free the current lhs. */
     current_lhs (0, (yylsp[-3]), 0);
  insert_after(3, "</PYACC_Section2_Rules>");
  insert_before(0, "<PYACC_Section2_Rules>");
   }
-#line 2722 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2759 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 84:
-#line 729 "src/parse-gram.y" /* yacc.c:1648  */
+#line 766 "src/parse-gram.y" /* yacc.c:1648  */
     { grammar_current_rule_end ((yylsp[0])); /*}*/
  insert_after(0, "</PYACC_Section2_Rules_RHS>");
  insert_before(0, "<PYACC_Section2_Rules_RHS>");
  }
-#line 2731 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2768 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 85:
-#line 733 "src/parse-gram.y" /* yacc.c:1648  */
+#line 770 "src/parse-gram.y" /* yacc.c:1648  */
     { grammar_current_rule_end ((yylsp[0])); /*}*/
  insert_after(2, "</PYACC_Section2_Rules_RHS>");
  insert_before(2, "<PYACC_Section2_Rules_RHS>");
  }
-#line 2740 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2777 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 87:
-#line 743 "src/parse-gram.y" /* yacc.c:1648  */
+#line 780 "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 */
  /* therefore, move inter-token text from the right of us over to the left */
  if (yychar == YYEMPTY)
   yychar = yylex(&yylval, &yylloc);
- char *temp = piece[piece2 + 1];
piece[piece2 + 1] = piece[piece2]; /* empty */
piece[piece2] = piece[piece2 - 1]; /* empty */
piece[piece2 - 1] = temp;
+ char *temp = gram_piece[gram_piece2 + 1];
gram_piece[gram_piece2 + 1] = gram_piece[gram_piece2]; /* empty */
gram_piece[gram_piece2] = gram_piece[gram_piece2 - 1]; /* empty */
gram_piece[gram_piece2 - 1] = temp;
  }
-#line 2756 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2793 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 88:
-#line 755 "src/parse-gram.y" /* yacc.c:1648  */
+#line 792 "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_Section2_Rules_RHS_Symbol>");
  insert_before(1, "<PYACC_Section2_Rules_RHS_Symbol>");
  }
-#line 2765 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2802 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 89:
-#line 760 "src/parse-gram.y" /* yacc.c:1648  */
-    { grammar_current_rule_action_append ((yyvsp[-1].code), (yylsp[-1]), (yyvsp[0].named_ref), false); /*}*/
+#line 797 "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();
+ free(gram_piece[gram_piece2 + 2]);
+ gram_piece[gram_piece2 + 2] = strdup(code_piece[code_piece0 - 1]);
  insert_after(2, "</PYACC_Section2_Rules_RHS_Action>");
  insert_before(1, "<PYACC_Section2_Rules_RHS_Action>");
  }
-#line 2774 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2815 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 90:
-#line 765 "src/parse-gram.y" /* yacc.c:1648  */
+#line 806 "src/parse-gram.y" /* yacc.c:1648  */
     { grammar_current_rule_action_append ((yyvsp[0].code), (yylsp[0]), NULL, true); }
-#line 2780 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2821 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 91:
-#line 767 "src/parse-gram.y" /* yacc.c:1648  */
+#line 808 "src/parse-gram.y" /* yacc.c:1648  */
     { grammar_current_rule_empty_set ((yylsp[0])); /*}*/
  insert_after(1, "</PYACC_Section2_Rules_RHS_Empty>");
  insert_before(1, "<PYACC_Section2_Rules_RHS_Empty>");
  }
-#line 2789 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2830 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 92:
-#line 772 "src/parse-gram.y" /* yacc.c:1648  */
+#line 813 "src/parse-gram.y" /* yacc.c:1648  */
     { grammar_current_rule_prec_set ((yyvsp[0].symbol), (yylsp[0])); /*}*/
  insert_after(2, "</PYACC_Section2_Rules_RHS_Prec>");
  insert_before(1, "<PYACC_Section2_Rules_RHS_Prec>");
  }
-#line 2798 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2839 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 93:
-#line 777 "src/parse-gram.y" /* yacc.c:1648  */
+#line 818 "src/parse-gram.y" /* yacc.c:1648  */
     { grammar_current_rule_dprec_set ((yyvsp[0].integer), (yylsp[0])); /*}*/
  insert_after(2, "</PYACC_Section2_Rules_RHS_DPrec>");
  insert_before(1, "<PYACC_Section2_Rules_RHS_DPrec>");
  }
-#line 2807 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2848 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 94:
-#line 782 "src/parse-gram.y" /* yacc.c:1648  */
+#line 823 "src/parse-gram.y" /* yacc.c:1648  */
     { grammar_current_rule_merge_set ((yyvsp[0].uniqstr), (yylsp[0])); /*}*/
  insert_after(2, "</PYACC_Section2_Rules_RHS_Merge>");
  insert_before(1, "<PYACC_Section2_Rules_RHS_Merge>");
  }
-#line 2816 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2857 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 95:
-#line 789 "src/parse-gram.y" /* yacc.c:1648  */
+#line 830 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.named_ref) = 0; }
-#line 2822 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2863 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 96:
-#line 790 "src/parse-gram.y" /* yacc.c:1648  */
+#line 831 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.named_ref) = named_ref_new ((yyvsp[0].uniqstr), (yylsp[0])); }
-#line 2828 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2869 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 98:
-#line 801 "src/parse-gram.y" /* yacc.c:1648  */
+#line 842 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.uniqstr) = uniqstr_new ((yyvsp[0].code)); }
-#line 2834 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2875 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 99:
-#line 826 "src/parse-gram.y" /* yacc.c:1648  */
+#line 867 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.value).kind = muscle_keyword; (yyval.value).chars = ""; }
-#line 2840 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2881 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 100:
-#line 827 "src/parse-gram.y" /* yacc.c:1648  */
+#line 868 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.value).kind = muscle_keyword; (yyval.value).chars = (yyvsp[0].uniqstr); }
-#line 2846 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2887 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 101:
-#line 828 "src/parse-gram.y" /* yacc.c:1648  */
+#line 869 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.value).kind = muscle_string;  (yyval.value).chars = (yyvsp[0].code); }
-#line 2852 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2893 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 102:
-#line 829 "src/parse-gram.y" /* yacc.c:1648  */
+#line 870 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.value).kind = muscle_code;    (yyval.value).chars = strip_braces ((yyvsp[0].code)); }
-#line 2858 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2899 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 103:
-#line 842 "src/parse-gram.y" /* yacc.c:1648  */
+#line 883 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.symbol) = symbol_from_uniqstr ((yyvsp[0].uniqstr), (yylsp[0])); }
-#line 2864 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2905 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 104:
-#line 844 "src/parse-gram.y" /* yacc.c:1648  */
+#line 885 "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 2874 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2915 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 105:
-#line 852 "src/parse-gram.y" /* yacc.c:1648  */
+#line 893 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.symbol) = symbol_from_uniqstr ((yyvsp[0].uniqstr), (yylsp[0])); }
-#line 2880 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2921 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 108:
-#line 864 "src/parse-gram.y" /* yacc.c:1648  */
+#line 905 "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 2889 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2930 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 110:
-#line 873 "src/parse-gram.y" /* yacc.c:1648  */
+#line 914 "src/parse-gram.y" /* yacc.c:1648  */
     {
+#if 0
+ int gram_piece0_save = gram_piece0, gram_piece1_save = gram_piece1;
+ gram_piece0 = gram_piece1;
+ /*gram_piece_append("<PYACC_Epilogue>");*/
+#endif
       muscle_code_grow ("epilogue", translate_code ((yyvsp[0].code), (yylsp[0]), true), (yylsp[0]));
       code_scanner_last_string_free ();
+#if 0
+ /*gram_piece_append("</PYACC_Epilogue>");*/
+ gram_piece_pack();
+ /* delete marked up code from lexer and use that from translate_code() */
+ free(gram_piece[gram_piece2 + 2]);
+ gram_piece[gram_piece2 + 2] = gram_piece[gram_piece0 - 1];
+ gram_piece0 = gram_piece0_save;
+ gram_piece1 = gram_piece1_save;
+#endif
  insert_after(1, "</PYACC_Section3>");
  insert_after(0, "<PYACC_Section3>");
     }
-#line 2900 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2955 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
 
-#line 2904 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2959 "src/parse-gram.c" /* yacc.c:1648  */
         default: break;
       }
     if (yychar_backup != yychar)
@@ -2938,21 +2996,21 @@ yyreduce:
   }
  int i;
  size_t j = 0;
- for (i = piece2; i < piece3; ++i)
-  j += strlen(piece[i]);
+ for (i = gram_piece2; i < gram_piece3; ++i)
+  j += strlen(gram_piece[i]);
  char *q = malloc(j + 1);
  j = 0;
- for (i = piece2; i < piece3; ++i) {
-  size_t k = strlen(piece[i]);
-  memcpy(q + j, piece[i], k);
-  free(piece[i]);
+ for (i = gram_piece2; i < gram_piece3; ++i) {
+  size_t k = strlen(gram_piece[i]);
+  memcpy(q + j, gram_piece[i], k);
+  free(gram_piece[i]);
   j += k;
  }
  q[j] = 0;
- memmove(piece + piece2 + 1, piece + piece3, (piece1 - piece3) * sizeof(char *));
piece[piece2] = q;
piece0 += piece2 + 1 - piece3;
piece1 += piece2 + 1 - piece3;
+ memmove(gram_piece + gram_piece2 + 1, gram_piece + gram_piece3, (gram_piece1 - gram_piece3) * sizeof(char *));
gram_piece[gram_piece2] = q;
gram_piece0 += gram_piece2 + 1 - gram_piece3;
gram_piece1 += gram_piece2 + 1 - gram_piece3;
   /* User semantic actions sometimes alter yychar, and that requires
      that yytoken be updated with the new translation.  We take the
      approach of translating immediately before every use of yytoken.
@@ -3193,7 +3251,7 @@ yyreturn:
 #endif
   return yyresult;
 }
-#line 881 "src/parse-gram.y" /* yacc.c:1907  */
+#line 936 "src/parse-gram.y" /* yacc.c:1907  */
 
 
 /* Return the location of the left-hand side of a rule whose
index 07dc3e1..afd9d6a 100644 (file)
@@ -1,70 +1,73 @@
---- parse-gram.c.orig  2018-06-23 14:56:48.644152186 +1000
-+++ parse-gram.c       2018-06-23 14:57:33.624150282 +1000
-@@ -1742,6 +1742,25 @@
+--- 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 piece_temp[];
-+extern char *piece[];
-+extern int piece0, piece1;
-+void piece_insert(int n, const void *str);
-+int piece2, piece3;
++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(piece + piece3 + 3, piece + piece3 + 1, (piece1 - piece3 - 1) * sizeof(char *));
-+ piece[piece3 + 1] = strdup("");
-+ piece[piece3 + 2] = strdup("");
-+ piece3 += 2;
-+ piece0 += 2;
-+ piece1 += 2;
++ 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 { piece_insert(piece2 + (n) * 2, (str)); ++piece0; ++piece3; } while (0)
++ do { gram_piece_insert(gram_piece2 + (n) * 2, (str)); ++gram_piece0; ++gram_piece3; } while (0)
 +#define insert_after(n, str) \
-+ do { piece_insert(piece2 + (n) * 2 + 1, (str)); ++piece0; ++piece3; } while (0)
++ do { gram_piece_insert(gram_piece2 + (n) * 2 + 1, (str)); ++gram_piece0; ++gram_piece3; } while (0)
  int
  yyparse (void)
  {
-@@ -2026,6 +2045,17 @@
+@@ -2026,6 +2048,17 @@
  yyreduce:
    /* yyn is the number of a rule to reduce with.  */
    yylen = yyr2[yyn];
 + int n = ((int)(yyvsp - yyvsa) - yylen) * 2;
-+ piece2 = n + 1;
-+ piece3 = n + yylen * 2;
++ gram_piece2 = n + 1;
++ gram_piece3 = n + yylen * 2;
 + if (yylen == 0) {
-+  memmove(piece + n + 2, piece + n, (piece1 - n) * sizeof(char *));
-+  piece[n] = strdup("");
-+  piece[n + 1] = strdup("");
-+  piece3 = n + 2;
-+  piece0 += 2;
-+  piece1 += 2;
++  memmove(gram_piece + n + 2, gram_piece + n, (gram_piece1 - n) * sizeof(char *));
++  gram_piece[n] = strdup("");
++  gram_piece[n + 1] = strdup("");
++  gram_piece3 = n + 2;
++  gram_piece0 += 2;
++  gram_piece1 += 2;
 + }
  
    /* If YYLEN is nonzero, implement the default value of the action:
       '$$ = $1'.
-@@ -2792,6 +2822,23 @@
+@@ -2906,6 +2939,23 @@
      if (yychar_backup != yychar)
        YY_LAC_DISCARD ("yychar change");
    }
 + int i;
 + size_t j = 0;
-+ for (i = piece2; i < piece3; ++i)
-+  j += strlen(piece[i]);
++ for (i = gram_piece2; i < gram_piece3; ++i)
++  j += strlen(gram_piece[i]);
 + char *q = malloc(j + 1);
 + j = 0;
-+ for (i = piece2; i < piece3; ++i) {
-+  size_t k = strlen(piece[i]);
-+  memcpy(q + j, piece[i], k);
-+  free(piece[i]);
++ for (i = gram_piece2; i < gram_piece3; ++i) {
++  size_t k = strlen(gram_piece[i]);
++  memcpy(q + j, gram_piece[i], k);
++  free(gram_piece[i]);
 +  j += k;
 + }
 + q[j] = 0;
-+ memmove(piece + piece2 + 1, piece + piece3, (piece1 - piece3) * sizeof(char *));
-+ piece[piece2] = q;
-+ piece0 += piece2 + 1 - piece3;
-+ piece1 += piece2 + 1 - piece3;
++ memmove(gram_piece + gram_piece2 + 1, gram_piece + gram_piece3, (gram_piece1 - gram_piece3) * sizeof(char *));
++ gram_piece[gram_piece2] = q;
++ gram_piece0 += gram_piece2 + 1 - gram_piece3;
++ gram_piece1 += gram_piece2 + 1 - gram_piece3;
    /* User semantic actions sometimes alter yychar, and that requires
       that yytoken be updated with the new translation.  We take the
       approach of translating immediately before every use of yytoken.
index 88bb4bb..9d5a02c 100644 (file)
@@ -52,7 +52,7 @@ extern int gram_debug;
 
   #include "symlist.h"
   #include "symtab.h"
-#line 221 "src/parse-gram.y" /* yacc.c:1910  */
+#line 227 "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 805 "src/parse-gram.y" /* yacc.c:1910  */
+#line 846 "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 182 "src/parse-gram.y" /* yacc.c:1910  */
+#line 188 "src/parse-gram.y" /* yacc.c:1910  */
 unsigned char character;
-#line 186 "src/parse-gram.y" /* yacc.c:1910  */
+#line 192 "src/parse-gram.y" /* yacc.c:1910  */
 char *code;
-#line 191 "src/parse-gram.y" /* yacc.c:1910  */
+#line 197 "src/parse-gram.y" /* yacc.c:1910  */
 uniqstr uniqstr;
-#line 199 "src/parse-gram.y" /* yacc.c:1910  */
+#line 205 "src/parse-gram.y" /* yacc.c:1910  */
 int integer;
-#line 203 "src/parse-gram.y" /* yacc.c:1910  */
+#line 209 "src/parse-gram.y" /* yacc.c:1910  */
 symbol *symbol;
-#line 208 "src/parse-gram.y" /* yacc.c:1910  */
+#line 214 "src/parse-gram.y" /* yacc.c:1910  */
 assoc assoc;
-#line 211 "src/parse-gram.y" /* yacc.c:1910  */
+#line 217 "src/parse-gram.y" /* yacc.c:1910  */
 symbol_list *list;
-#line 214 "src/parse-gram.y" /* yacc.c:1910  */
+#line 220 "src/parse-gram.y" /* yacc.c:1910  */
 named_ref *named_ref;
-#line 241 "src/parse-gram.y" /* yacc.c:1910  */
+#line 247 "src/parse-gram.y" /* yacc.c:1910  */
 param_type param;
-#line 496 "src/parse-gram.y" /* yacc.c:1910  */
+#line 528 "src/parse-gram.y" /* yacc.c:1910  */
 code_props_type code_type;
-#line 807 "src/parse-gram.y" /* yacc.c:1910  */
+#line 848 "src/parse-gram.y" /* yacc.c:1910  */
 
   struct
   {
index b7ab751..311a4c2 100644 (file)
   #define YYTYPE_INT8 int_fast8_t
   #define YYTYPE_UINT16 uint_fast16_t
   #define YYTYPE_UINT8 uint_fast8_t
+
+  /* Nick */
+  extern char *code_piece[];
+  extern int code_piece0;
+  void code_piece_append(const char *str);
+  void code_piece_pack();
 }
 
 %define api.prefix {gram_}
@@ -282,10 +288,10 @@ prologue_declarations:
  /* therefore, move inter-token text from the right of us over to the left */
  if (yychar == YYEMPTY)
   yychar = yylex(&yylval, &yylloc);
- char *temp = piece[piece2 + 1];
piece[piece2 + 1] = piece[piece2]; /* empty */
piece[piece2] = piece[piece2 - 1]; /* empty */
piece[piece2 - 1] = temp;
+ char *temp = gram_piece[gram_piece2 + 1];
gram_piece[gram_piece2 + 1] = gram_piece[gram_piece2]; /* empty */
gram_piece[gram_piece2] = gram_piece[gram_piece2 - 1]; /* empty */
gram_piece[gram_piece2 - 1] = temp;
  }
 | prologue_declarations prologue_declaration
 ;
@@ -294,9 +300,15 @@ prologue_declaration:
   grammar_declaration
 | "%{...%}"
     {
+ /* inserting %{...%} below is a hack as we may lose some whitespace near it */
+ code_piece_append("<PYACC_Section1_Prologue>%{");
       muscle_code_grow (union_seen ? "post_prologue" : "pre_prologue",
                         translate_code ($1, @1, true), @1);
       code_scanner_last_string_free ();
+ code_piece_append("%}</PYACC_Section1_Prologue>");
+ code_piece_pack();
+ free(gram_piece[gram_piece2]);
+ gram_piece[gram_piece2] = strdup(code_piece[code_piece0 - 1]);
     }
 | "%<flag>"
     {
@@ -351,8 +363,13 @@ prologue_declaration:
     }
 | "%initial-action" "{...}"
     {
+ code_piece_append("<PYACC_BracedCode>");
       muscle_code_grow ("initial_action", translate_code ($2, @2, false), @2);
       code_scanner_last_string_free ();
+ code_piece_append("</PYACC_BracedCode>");
+ code_piece_pack();
+ free(gram_piece[gram_piece2 + 2]);
+ gram_piece[gram_piece2 + 2] = strdup(code_piece[code_piece0 - 1]);
  insert_after(1, "</PYACC_Section1_InitialAction>");
  insert_before(0, "<PYACC_Section1_InitialAction>");
     }
@@ -448,7 +465,12 @@ grammar_declaration:
     {
       code_props code;
       code_props_symbol_action_init (&code, $2, @2);
+ code_piece_append("<PYACC_BracedCode>");
       code_props_translate_code (&code);
+ code_piece_append("</PYACC_BracedCode>");
+ code_piece_pack();
+ free(gram_piece[gram_piece2 + 2]);
+ gram_piece[gram_piece2 + 2] = strdup(code_piece[code_piece0 - 1]);
       {
         symbol_list *list;
         for (list = $3; list; list = list->next)
@@ -458,8 +480,8 @@ grammar_declaration:
  insert_after(2, "</PYACC_Section1Or2_CodeProps>");
  insert_after(2, "</PYACC_Section1Or2_CodeProps_GenericSymList>");
  insert_before(2, "<PYACC_Section1Or2_CodeProps_GenericSymList>");
- sprintf(piece_temp, "<PYACC_Section1Or2_CodeProps type=\"%d\">", $1);
- insert_before(0, piece_temp);
+ sprintf(gram_piece_temp, "<PYACC_Section1Or2_CodeProps type=\"%d\">", $1);
+ insert_before(0, gram_piece_temp);
     }
 | "%default-prec"
     {
@@ -477,16 +499,26 @@ grammar_declaration:
     {
       /* Do not invoke muscle_percent_code_grow here since it invokes
          muscle_user_name_list_grow.  */
+ code_piece_append("<PYACC_BracedCode>");
       muscle_code_grow ("percent_code()",
                         translate_code_braceless ($2, @2), @2);
       code_scanner_last_string_free ();
+ code_piece_append("</PYACC_BracedCode>");
+ code_piece_pack();
+ free(gram_piece[gram_piece2 + 2]);
+ gram_piece[gram_piece2 + 2] = strdup(code_piece[code_piece0 - 1]);
  insert_after(1, "</PYACC_Section1Or2_Code>");
  insert_before(0, "<PYACC_Section1Or2_Code><PYACC_IDNone />");
     }
 | "%code" ID "{...}"
     {
+ code_piece_append("<PYACC_BracedCode>");
       muscle_percent_code_grow ($2, @2, translate_code_braceless ($3, @3), @3);
       code_scanner_last_string_free ();
+ code_piece_append("</PYACC_BracedCode>");
+ code_piece_pack();
+ free(gram_piece[gram_piece2 + 4]);
+ gram_piece[gram_piece2 + 4] = strdup(code_piece[code_piece0 - 1]);
  insert_after(2, "</PYACC_Section1Or2_Code>");
  insert_before(0, "<PYACC_Section1Or2_Code>");
     }
@@ -517,8 +549,13 @@ grammar_declaration:
   "%union" union_name "{...}"
     {
       union_seen = true;
+ code_piece_append("<PYACC_BracedCode>");
       muscle_code_grow ("union_members", translate_code_braceless ($3, @3), @3);
       code_scanner_last_string_free ();
+ code_piece_append("</PYACC_BracedCode>");
+ code_piece_pack();
+ free(gram_piece[gram_piece2 + 4]);
+ gram_piece[gram_piece2 + 4] = strdup(code_piece[code_piece0 - 1]);
  insert_after(2, "</PYACC_Section1Or2_Union>");
  insert_before(0, "<PYACC_Section1Or2_Union>");
     }
@@ -571,8 +608,8 @@ precedence_declaration:
  insert_after(2, "</PYACC_Section1Or2_Precedence>");
  insert_after(2, "</PYACC_Section1Or2_Precedence_Symbols>");
  insert_before(2, "<PYACC_Section1Or2_Precedence_Symbols>");
- sprintf(piece_temp, "<PYACC_Section1Or2_Precedence type=\"%d\">", $1); 
- insert_before(0, piece_temp);
+ sprintf(gram_piece_temp, "<PYACC_Section1Or2_Precedence type=\"%d\">", $1); 
+ insert_before(0, gram_piece_temp);
     }
 ;
 
@@ -746,10 +783,10 @@ rhs:
  /* therefore, move inter-token text from the right of us over to the left */
  if (yychar == YYEMPTY)
   yychar = yylex(&yylval, &yylloc);
- char *temp = piece[piece2 + 1];
piece[piece2 + 1] = piece[piece2]; /* empty */
piece[piece2] = piece[piece2 - 1]; /* empty */
piece[piece2 - 1] = temp;
+ char *temp = gram_piece[gram_piece2 + 1];
gram_piece[gram_piece2 + 1] = gram_piece[gram_piece2]; /* empty */
gram_piece[gram_piece2] = gram_piece[gram_piece2 - 1]; /* empty */
gram_piece[gram_piece2 - 1] = temp;
  } 
 | rhs symbol named_ref.opt
     { grammar_current_rule_symbol_append ($2, @2, $3); /*}*/
@@ -757,7 +794,11 @@ rhs:
  insert_before(1, "<PYACC_Section2_Rules_RHS_Symbol>");
  }
 | rhs "{...}" named_ref.opt
-    { grammar_current_rule_action_append ($2, @2, $3, false); /*}*/
+    { code_piece_append("<PYACC_BracedCode>"); grammar_current_rule_action_append ($2, @2, $3, false); /*}*/
+ code_piece_append("</PYACC_BracedCode>");
+ code_piece_pack();
+ free(gram_piece[gram_piece2 + 2]);
+ gram_piece[gram_piece2 + 2] = strdup(code_piece[code_piece0 - 1]);
  insert_after(2, "</PYACC_Section2_Rules_RHS_Action>");
  insert_before(1, "<PYACC_Section2_Rules_RHS_Action>");
  }
@@ -871,8 +912,22 @@ epilogue.opt:
   %empty
 | "%%" EPILOGUE
     {
+#if 0
+ int gram_piece0_save = gram_piece0, gram_piece1_save = gram_piece1;
+ gram_piece0 = gram_piece1;
+ /*gram_piece_append("<PYACC_Epilogue>");*/
+#endif
       muscle_code_grow ("epilogue", translate_code ($2, @2, true), @2);
       code_scanner_last_string_free ();
+#if 0
+ /*gram_piece_append("</PYACC_Epilogue>");*/
+ gram_piece_pack();
+ /* delete marked up code from lexer and use that from translate_code() */
+ free(gram_piece[gram_piece2 + 2]);
+ gram_piece[gram_piece2 + 2] = gram_piece[gram_piece0 - 1];
+ gram_piece0 = gram_piece0_save;
+ gram_piece1 = gram_piece1_save;
+#endif
  insert_after(1, "</PYACC_Section3>");
  insert_after(0, "<PYACC_Section3>");
     }
index 8229efa..802c15a 100644 (file)
@@ -529,6 +529,15 @@ grammar_current_rule_action_append (const char *action, location loc,
 {
   if (current_rule->action_props.code)
     grammar_midrule_action ();
+#if 1 /* redundantly translate code immediately to capture the syntax */
+ extern int no_handle_action;
+ no_handle_action = 1;
+ code_props_rule_action_init(&current_rule->action_props, action, loc,
+  current_rule, name, is_predicate);
+ code_props_translate_code(&current_rule->action_props);
+ code_scanner_last_string_free();
+ no_handle_action = 0;
+#endif
   /* After all symbol declarations have been parsed, packgram invokes
      code_props_translate_code.  */
   code_props_rule_action_init (&current_rule->action_props, action, loc,
@@ -667,18 +676,18 @@ reader (void)
   gram_debug = trace_flag & trace_parse;
   gram_scanner_initialize ();
 #if 1
- void piece_append(const char *str);
- piece_append("<RefList><PYACC ref=\"0\">");
+ void gram_piece_append(const char *str);
gram_piece_append("<RefList><PYACC ref=\"0\">");
 #endif
   gram_parse ();
 #if 1
- piece_append("</PYACC></RefList>");
gram_piece_append("</PYACC></RefList>");
 
- extern char *piece[];
- extern int piece1;
+ extern char *gram_piece[];
+ extern int gram_piece1;
  int i;
- for (i = 0; i < piece1; ++i)
-  fputs(piece[i], stderr);
+ for (i = 0; i < gram_piece1; ++i)
+  fputs(gram_piece[i], stderr);
 #endif
   prepare_percent_define_front_end_variables ();
 
@@ -798,7 +807,12 @@ check_and_convert_grammar (void)
   {
     symbol_list *sym;
     for (sym = grammar; sym; sym = sym->next)
+ {
       code_props_translate_code (&sym->action_props);
+  /* pack the code (though we don't need it) to avoid code_piece[] overflow */
+  void code_piece_pack(void);
+  code_piece_pack();
+ }
   }
 
   /* Convert the grammar into the format described in gram.h.  */
index 68b9f70..27c4b40 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 */
 
@@ -253,7 +320,21 @@ 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); \
+  yyunput(c, (yytext_ptr)); \
+  yytext = yy_c_buf_p; \
+ } while (0)
+#else
 #define unput(c) yyunput( c, (yytext_ptr)  )
+#endif
 
 #ifndef YY_TYPEDEF_YY_SIZE_T
 #define YY_TYPEDEF_YY_SIZE_T
@@ -623,8 +704,8 @@ int code__flex_debug = 1;
 
 static yyconst flex_int16_t yy_rule_linenum[18] =
     {   0,
-      114,  124,  125,  135,  140,  145,  151,  152,  153,  154,
-      156,  164,  170,  180,  188,  198,  201
+      122,  132,  133,  143,  148,  153,  159,  160,  161,  162,
+      164,  172,  182,  196,  208,  222,  225
     } ;
 
 /* The intent behind this definition is that it'll catch
@@ -701,6 +782,14 @@ static char *last_string;
 /* True if an untyped $$ or $n was seen.  */
 static bool untyped_var_seen;
 
+/* Nick */
+int no_handle_action;
+const char *before_tag, *after_tag;
+
+static int in_text;
+static void start_text(void);
+static void stop_text(void);
+
 /* C and C++ comments in code. */
 
 /* Strings and characters in code. */
@@ -717,7 +806,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 721 "src/scan-code.c"
+#line 729 "src/scan-code.c"
 
 #define INITIAL 0
 #define SC_COMMENT 1
@@ -968,7 +1057,7 @@ YY_DECL
        register int yy_act;
     
 /* %% [7.0] user's declarations go here */
-#line 96 "src/scan-code.l"
+#line 104 "src/scan-code.l"
 
 
 
@@ -985,7 +1074,7 @@ YY_DECL
   | Scanning a C comment.  The initial '/ *' is already eaten.  |
   `------------------------------------------------------------*/
 
-#line 989 "src/scan-code.c"
+#line 997 "src/scan-code.c"
 
        if ( !(yy_init) )
                {
@@ -1021,7 +1110,12 @@ YY_DECL
                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))
+#else
        while ( 1 )             /* loops until end-of-file is reached */
+#endif
                {
 /* %% [8.0] yymore()-related code goes here */
                yy_cp = (yy_c_buf_p);
@@ -1098,7 +1192,7 @@ do_action:        /* This label is used only to access EOF actions. */
 case 1:
 /* rule 1 can match eol */
 YY_RULE_SETUP
-#line 114 "src/scan-code.l"
+#line 122 "src/scan-code.l"
 STRING_GROW; BEGIN sc_context;
        YY_BREAK
 
@@ -1110,13 +1204,13 @@ STRING_GROW; BEGIN sc_context;
 case 2:
 /* rule 2 can match eol */
 YY_RULE_SETUP
-#line 124 "src/scan-code.l"
+#line 132 "src/scan-code.l"
 STRING_GROW; BEGIN sc_context;
        YY_BREAK
 case 3:
 /* rule 3 can match eol */
 YY_RULE_SETUP
-#line 125 "src/scan-code.l"
+#line 133 "src/scan-code.l"
 STRING_GROW;
        YY_BREAK
 
@@ -1128,7 +1222,7 @@ STRING_GROW;
 case 4:
 /* rule 4 can match eol */
 YY_RULE_SETUP
-#line 135 "src/scan-code.l"
+#line 143 "src/scan-code.l"
 STRING_GROW;
        YY_BREAK
 
@@ -1136,7 +1230,7 @@ STRING_GROW;
 
 case 5:
 YY_RULE_SETUP
-#line 140 "src/scan-code.l"
+#line 148 "src/scan-code.l"
 STRING_GROW; BEGIN sc_context;
        YY_BREAK
 
@@ -1144,7 +1238,7 @@ STRING_GROW; BEGIN sc_context;
 
 case 6:
 YY_RULE_SETUP
-#line 145 "src/scan-code.l"
+#line 153 "src/scan-code.l"
 STRING_GROW; BEGIN sc_context;
        YY_BREAK
 
@@ -1152,29 +1246,29 @@ STRING_GROW; BEGIN sc_context;
 
 case 7:
 YY_RULE_SETUP
-#line 151 "src/scan-code.l"
-STRING_GROW; BEGIN SC_CHARACTER;
+#line 159 "src/scan-code.l"
+STRING_GROW; BEGIN SC_CHARACTER; start_text();
        YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 152 "src/scan-code.l"
-STRING_GROW; BEGIN SC_STRING;
+#line 160 "src/scan-code.l"
+STRING_GROW; BEGIN SC_STRING; start_text();
        YY_BREAK
 case 9:
 /* rule 9 can match eol */
 YY_RULE_SETUP
-#line 153 "src/scan-code.l"
-STRING_GROW; BEGIN SC_COMMENT;
+#line 161 "src/scan-code.l"
+STRING_GROW; BEGIN SC_COMMENT; start_text();
        YY_BREAK
 case 10:
 /* rule 10 can match eol */
 YY_RULE_SETUP
-#line 154 "src/scan-code.l"
-STRING_GROW; BEGIN SC_LINE_COMMENT;
+#line 162 "src/scan-code.l"
+STRING_GROW; BEGIN SC_LINE_COMMENT; start_text();
        YY_BREAK
 case 11:
 YY_RULE_SETUP
-#line 156 "src/scan-code.l"
+#line 164 "src/scan-code.l"
 {
     complain (loc, Wother, _("stray '%s'"), code_text);
     obstack_escape (&obstack_for_string, code_text);
@@ -1185,22 +1279,30 @@ YY_RULE_SETUP
 
 case 12:
 YY_RULE_SETUP
-#line 164 "src/scan-code.l"
+#line 172 "src/scan-code.l"
 {
     ref_tail_fields = NULL;
     handle_action_dollar (self->rule, code_text, *loc);
     if (ref_tail_fields)
       obstack_sgrow (&obstack_for_string, ref_tail_fields);
+ stop_text();
+ code_piece_append(before_tag);
+ flush();
+ code_piece_append(after_tag);
   }
        YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 170 "src/scan-code.l"
+#line 182 "src/scan-code.l"
 {
     ref_tail_fields = NULL;
     handle_action_at (self->rule, code_text, *loc);
     if (ref_tail_fields)
       obstack_sgrow (&obstack_for_string, ref_tail_fields);
+ stop_text();
+ code_piece_append(before_tag);
+ flush();
+ code_piece_append(after_tag);
   }
        YY_BREAK
 
@@ -1208,7 +1310,7 @@ YY_RULE_SETUP
 
 case 14:
 YY_RULE_SETUP
-#line 180 "src/scan-code.l"
+#line 196 "src/scan-code.l"
 {
     const char *type_name = NULL;
     fetch_type_name (code_text + 1, &type_name, *loc)[-1] = 0;
@@ -1216,14 +1318,22 @@ YY_RULE_SETUP
     obstack_quote (&obstack_for_string, type_name);
     obstack_sgrow (&obstack_for_string, ")[");
     self->is_value_used = true;
+ stop_text();
+ code_piece_append("<PYACC_ValueReference>");
+ flush();
+ code_piece_append("</PYACC_ValueReference>");
   }
        YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 188 "src/scan-code.l"
+#line 208 "src/scan-code.l"
 {
     obstack_sgrow (&obstack_for_string, "]b4_at_dollar[");
     muscle_percent_define_ensure("locations", the_location, true);
+ stop_text();
+ code_piece_append("<PYACC_ValueLocation>");
+ flush();
+ code_piece_append("</PYACC_ValueLocation>");
   }
        YY_BREAK
 
@@ -1232,15 +1342,15 @@ YY_RULE_SETUP
 /* Escape M4 quoting characters in C code.  */
 case 16:
 YY_RULE_SETUP
-#line 198 "src/scan-code.l"
-obstack_escape (&obstack_for_string, code_text);
+#line 222 "src/scan-code.l"
+obstack_escape (&obstack_for_string, code_text); start_text();
        YY_BREAK
 /* By default, grow the string obstack with the input.  */
 case 17:
 /* rule 17 can match eol */
 YY_RULE_SETUP
-#line 201 "src/scan-code.l"
-STRING_GROW;
+#line 225 "src/scan-code.l"
+STRING_GROW; start_text();
        YY_BREAK
 /* End of processing. */
 case YY_STATE_EOF(INITIAL):
@@ -1250,16 +1360,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 204 "src/scan-code.l"
-STRING_FINISH; return last_string;
+#line 228 "src/scan-code.l"
+STRING_FINISH; stop_text(); /*code_piece_pack(); --code_piece0;*/ return last_string;
        YY_BREAK
 
 case 18:
 YY_RULE_SETUP
-#line 207 "src/scan-code.l"
+#line 231 "src/scan-code.l"
 YY_FATAL_ERROR( "flex scanner jammed" );
        YY_BREAK
-#line 1263 "src/scan-code.c"
+#line 1287 "src/scan-code.c"
 
        case YY_END_OF_BUFFER:
                {
@@ -2346,7 +2456,7 @@ void code_free (void * ptr )
 
 /* %ok-for-header */
 
-#line 207 "src/scan-code.l"
+#line 231 "src/scan-code.l"
 
 
 
@@ -2796,6 +2906,19 @@ handle_action_dollar (symbol_list *rule, char *text, location dollar_loc)
 
   n = parse_ref (cp, effective_rule, effective_rule_length,
                  rule->midrule_parent_rhs_index, text, dollar_loc, '$');
+#if 1
+ if (n == LHS_REF) {
+  before_tag = "<PYACC_ValueReference>";
+  after_tag = "</PYACC_ValueReference>";
+ }
+ else {
+  sprintf(code_piece_temp, "<PYACC_StackReference index=\"%d\">", n);
+  before_tag = code_piece_temp;
+  after_tag = "</PYACC_StackReference>";
+ }
+ if (no_handle_action)
+  return;
+#endif
 
   /* End type_name. */
   if (type_name)
@@ -2890,6 +3013,19 @@ handle_action_at (symbol_list *rule, char *text, location at_loc)
 
   n = parse_ref (cp, effective_rule, effective_rule_length,
                        rule->midrule_parent_rhs_index, text, at_loc, '@');
+#if 1
+ if (n == LHS_REF) {
+  before_tag = "<PYACC_ValueLocation>";
+  after_tag = "</PYACC_ValueLocation>";
+ }
+ else {
+  sprintf(code_piece_temp, "<PYACC_StackLocation index=\"%d\">", n);
+  before_tag = code_piece_temp;
+  after_tag = "</PYACC_StackLocation>";
+ }
+ if (no_handle_action)
+  return;
+#endif
   switch (n)
     {
     case INVALID_REF:
@@ -3015,3 +3151,18 @@ code_scanner_free (void)
   code_lex_destroy ();
 }
 
+/* Nick */
+static void start_text(void) {
+ if (in_text == 0) {
+  code_piece_append("<PYACC_Text>");
+  in_text = 1;
+ }
+}
+
+static void stop_text(void) {
+ if (in_text) {
+  code_piece_append("</PYACC_Text>");
+  in_text = 0;
+ }
+}
+
diff --git a/src/scan-code.c.patch b/src/scan-code.c.patch
new file mode 100644 (file)
index 0000000..f4641be
--- /dev/null
@@ -0,0 +1,111 @@
+--- 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 @@
+               } \
+       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); \
++  yyunput(c, (yytext_ptr)); \
++  yytext = yy_c_buf_p; \
++ } while (0)
++#else
+ #define unput(c) yyunput( c, (yytext_ptr)  )
++#endif
+ #ifndef YY_TYPEDEF_YY_SIZE_T
+ #define YY_TYPEDEF_YY_SIZE_T
+@@ -1480,7 +1586,12 @@
+               gram__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))
++#else
+       while ( 1 )             /* loops until end-of-file is reached */
++#endif
+               {
+ /* %% [8.0] yymore()-related code goes here */
+               yy_cp = (yy_c_buf_p);
index e79e885..02ac732 100644 (file)
@@ -66,6 +66,14 @@ static char *last_string;
 /* True if an untyped $$ or $n was seen.  */
 static bool untyped_var_seen;
 
+/* Nick */
+int no_handle_action;
+const char *before_tag, *after_tag;
+
+static int in_text;
+static void start_text(void);
+static void stop_text(void);
+
 %}
  /* C and C++ comments in code. */
 %x SC_COMMENT SC_LINE_COMMENT
@@ -148,10 +156,10 @@ ref      -?[0-9]+|{id}|"["{id}"]"|"$"
 
 <SC_RULE_ACTION,SC_SYMBOL_ACTION>
 {
-  "'"              STRING_GROW; BEGIN SC_CHARACTER;
-  "\""             STRING_GROW; BEGIN SC_STRING;
-  "/"{splice}"*"   STRING_GROW; BEGIN SC_COMMENT;
-  "/"{splice}"/"   STRING_GROW; BEGIN SC_LINE_COMMENT;
+  "'"              STRING_GROW; BEGIN SC_CHARACTER; start_text();
+  "\""             STRING_GROW; BEGIN SC_STRING; start_text();
+  "/"{splice}"*"   STRING_GROW; BEGIN SC_COMMENT; start_text();
+  "/"{splice}"/"   STRING_GROW; BEGIN SC_LINE_COMMENT; start_text();
 
   [$@]  {
     complain (loc, Wother, _("stray '%s'"), yytext);
@@ -166,12 +174,20 @@ ref      -?[0-9]+|{id}|"["{id}"]"|"$"
     handle_action_dollar (self->rule, yytext, *loc);
     if (ref_tail_fields)
       obstack_sgrow (&obstack_for_string, ref_tail_fields);
+ stop_text();
+ code_piece_append(before_tag);
+ flush();
+ code_piece_append(after_tag);
   }
   "@"{ref} {
     ref_tail_fields = NULL;
     handle_action_at (self->rule, yytext, *loc);
     if (ref_tail_fields)
       obstack_sgrow (&obstack_for_string, ref_tail_fields);
+ stop_text();
+ code_piece_append(before_tag);
+ flush();
+ code_piece_append(after_tag);
   }
 }
 
@@ -184,10 +200,18 @@ ref      -?[0-9]+|{id}|"["{id}"]"|"$"
     obstack_quote (&obstack_for_string, type_name);
     obstack_sgrow (&obstack_for_string, ")[");
     self->is_value_used = true;
+ stop_text();
+ code_piece_append("<PYACC_ValueReference>");
+ flush();
+ code_piece_append("</PYACC_ValueReference>");
   }
   "@$" {
     obstack_sgrow (&obstack_for_string, "]b4_at_dollar[");
     muscle_percent_define_ensure("locations", the_location, true);
+ stop_text();
+ code_piece_append("<PYACC_ValueLocation>");
+ flush();
+ code_piece_append("</PYACC_ValueLocation>");
   }
 }
 
@@ -195,13 +219,13 @@ ref      -?[0-9]+|{id}|"["{id}"]"|"$"
 <*>
 {
   /* Escape M4 quoting characters in C code.  */
-  [$@\[\]]    obstack_escape (&obstack_for_string, yytext);
+  [$@\[\]]    obstack_escape (&obstack_for_string, yytext); start_text();
 
   /* By default, grow the string obstack with the input.  */
-  .|\n        STRING_GROW;
+  .|\n        STRING_GROW; start_text();
 
  /* End of processing. */
-  <<EOF>>     STRING_FINISH; return last_string;
+  <<EOF>>     STRING_FINISH; stop_text(); /*code_piece_pack(); --code_piece0;*/ return last_string;
 }
 
 %%
@@ -652,6 +676,19 @@ handle_action_dollar (symbol_list *rule, char *text, location dollar_loc)
 
   n = parse_ref (cp, effective_rule, effective_rule_length,
                  rule->midrule_parent_rhs_index, text, dollar_loc, '$');
+#if 1
+ if (n == LHS_REF) {
+  before_tag = "<PYACC_ValueReference>";
+  after_tag = "</PYACC_ValueReference>";
+ }
+ else {
+  sprintf(code_piece_temp, "<PYACC_StackReference index=\"%d\">", n);
+  before_tag = code_piece_temp;
+  after_tag = "</PYACC_StackReference>";
+ }
+ if (no_handle_action)
+  return;
+#endif
 
   /* End type_name. */
   if (type_name)
@@ -746,6 +783,19 @@ handle_action_at (symbol_list *rule, char *text, location at_loc)
 
   n = parse_ref (cp, effective_rule, effective_rule_length,
                        rule->midrule_parent_rhs_index, text, at_loc, '@');
+#if 1
+ if (n == LHS_REF) {
+  before_tag = "<PYACC_ValueLocation>";
+  after_tag = "</PYACC_ValueLocation>";
+ }
+ else {
+  sprintf(code_piece_temp, "<PYACC_StackLocation index=\"%d\">", n);
+  before_tag = code_piece_temp;
+  after_tag = "</PYACC_StackLocation>";
+ }
+ if (no_handle_action)
+  return;
+#endif
   switch (n)
     {
     case INVALID_REF:
@@ -870,3 +920,18 @@ code_scanner_free (void)
   /* Reclaim Flex's buffers.  */
   yylex_destroy ();
 }
+
+/* Nick */
+static void start_text(void) {
+ if (in_text == 0) {
+  code_piece_append("<PYACC_Text>");
+  in_text = 1;
+ }
+}
+
+static void stop_text(void) {
+ if (in_text) {
+  code_piece_append("</PYACC_Text>");
+  in_text = 0;
+ }
+}
index 1a9cc6c..7d2fa45 100644 (file)
 /* %endif */
 /* end standard C headers. */
 
-char piece_temp[100];
-char *piece[10000];
-int piece0;
-int piece1;
-void piece_append(const char *str) {
- piece[piece1++] = strdup(str);
+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 piece_insert(int n, const char *str) {
- memmove(piece + n + 1, piece + n, (piece1 - n) * sizeof(char *));
- piece[n] = strdup(str);
- ++piece1;
+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++ */
@@ -269,12 +323,12 @@ extern FILE *gram_in, *gram_out;
 #if 1
 #define flush() \
  do { \
-  piece_esc(yytext, yy_c_buf_p - yytext); \
+  gram_piece_esc(yytext, yy_c_buf_p - yytext); \
   yytext = yy_c_buf_p; \
  } while (0)
 #define unput(c) \
  do { \
-  piece_esc(yytext, yy_c_buf_p - yytext); \
+  gram_piece_esc(yytext, yy_c_buf_p - yytext); \
   yyunput(c, (yytext_ptr)); \
   yytext = yy_c_buf_p; \
  } while (0)
@@ -1428,83 +1482,28 @@ extern int gram_lex (void);
 /** The main scanner function which does all the work.
  */
 static int real_yylex(GRAM_STYPE *val, location *loc);
-static void 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;
- piece[piece1++] = q;
-}
-static void piece_pack() {
- int i;
- size_t j = 0;
- for (i = piece0; i < piece1; ++i)
-  j += strlen(piece[i]);
- char *q = malloc(j + 1);
- j = 0;
- for (i = piece0; i < piece1; ++i) {
-  int k = strlen(piece[i]);
-  memcpy(q + j, piece[i], k);
-  free(piece[i]);
-  j += k;
- }
- q[j] = 0;
- piece[piece0++] = q;
- piece1 = piece0;
-}
 YY_DECL
 {
  int result = real_yylex(val, loc);
  if (result < 0)
   return ~result;
- piece_pack();
gram_piece_pack();
 #if 1
- piece_esc(yytext, strlen(yytext));
gram_piece_esc(yytext, strlen(yytext));
 #else
  size_t n = strlen(yytext);
  if (n) {
-  sprintf(piece_temp, "<token value=\"%d\">", result);
-  piece_append(piece_temp);
-  piece_esc(yytext, n);
-  piece_append("</token>");
+  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(piece_temp, "<token value=\"%d\" />", result);
-  piece_append(piece_temp);
+  sprintf(gram_piece_temp, "<token value=\"%d\" />", result);
+  gram_piece_append(gram_piece_temp);
  }
 #endif
- piece_pack();
gram_piece_pack();
  return result;
 }
 static int real_yylex(GRAM_STYPE *val, location *loc)
@@ -1589,7 +1588,7 @@ static int real_yylex(GRAM_STYPE *val, location *loc)
 
 #if 1
  /* we do this so that "continue;" in an action works correctly */
- for (; ; piece_esc(yytext, yy_c_buf_p - yytext))
+ for (; ; gram_piece_esc(yytext, yy_c_buf_p - yytext))
 #else
        while ( 1 )             /* loops until end-of-file is reached */
 #endif
@@ -2028,11 +2027,11 @@ YY_RULE_SETUP
     id_loc = *loc;
     bracketed_id_str = NULL;
     BEGIN SC_AFTER_IDENTIFIER;
- piece_pack();
- piece_append("<PYACC_ID>");
gram_piece_pack();
gram_piece_append("<PYACC_ID>");
  flush();
- piece_append("</PYACC_ID>");
- piece_pack();
gram_piece_append("</PYACC_ID>");
gram_piece_pack();
   }
        YY_BREAK
 case 67:
@@ -2041,12 +2040,12 @@ YY_RULE_SETUP
 {
     val->integer = scan_integer (gram_text, 10, *loc);
 #if 1
- piece_pack();
- sprintf(piece_temp, "<PYACC_Int value=\"%d\">", val->integer);
piece_append(piece_temp);
- piece_esc(gram_text, yy_c_buf_p - gram_text);
- piece_append("</PYACC_Int>");
- piece_pack();
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_append("</PYACC_Int>");
gram_piece_pack();
  return ~INT;
 #else
     return INT;
@@ -2059,12 +2058,12 @@ YY_RULE_SETUP
 {
     val->integer = scan_integer (gram_text, 16, *loc);
 #if 1
- piece_pack();
- sprintf(piece_temp, "<PYACC_Int value=\"%d\">", val->integer);
piece_append(piece_temp);
- piece_esc(gram_text, yy_c_buf_p - gram_text);
- piece_append("</PYACC_Int>");
- piece_pack();
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_append("</PYACC_Int>");
gram_piece_pack();
  return ~INT;
 #else
     return INT;
@@ -2084,19 +2083,19 @@ YY_RULE_SETUP
 case 70:
 YY_RULE_SETUP
 #line 336 "src/scan-gram.l"
-token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER; piece_pack(); piece_append("<PYACC_Char>");
+token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER; gram_piece_pack(); gram_piece_append("<PYACC_Char>");
        YY_BREAK
 /* Strings. */
 case 71:
 YY_RULE_SETUP
 #line 339 "src/scan-gram.l"
-token_start = loc->start; BEGIN SC_ESCAPED_STRING; piece_pack(); piece_append("<PYACC_String>");
+token_start = loc->start; BEGIN SC_ESCAPED_STRING; gram_piece_pack(); gram_piece_append("<PYACC_String>");
        YY_BREAK
 /* Prologue. */
 case 72:
 YY_RULE_SETUP
 #line 342 "src/scan-gram.l"
-code_start = loc->start; BEGIN SC_PROLOGUE; piece_pack(); piece_append("<PYACC_Section1_Prologue>"); flush(); start_text();
+code_start = loc->start; BEGIN SC_PROLOGUE; gram_piece_pack(); gram_piece_append("<PYACC_Section1_Prologue>"); flush(); start_text();
        YY_BREAK
 /* Code in between braces.  */
 case 73:
@@ -2107,8 +2106,8 @@ YY_RULE_SETUP
     nesting = 0;
     code_start = loc->start;
     BEGIN SC_BRACED_CODE;
- piece_pack();
- piece_append("<PYACC_BracedCode>");
gram_piece_pack();
gram_piece_append("<PYACC_BracedCode>");
 #if 1 /* include the braces */
  start_text();
  flush();
@@ -2123,8 +2122,8 @@ YY_RULE_SETUP
 {
     nesting = 0;
     code_start = loc->start;
- piece_pack();
- piece_append("<PYACC_BracedPredicate>");
gram_piece_pack();
gram_piece_append("<PYACC_BracedPredicate>");
     BEGIN SC_PREDICATE;
   }
        YY_BREAK
@@ -2146,8 +2145,8 @@ YY_RULE_SETUP
     nesting = 0;
     token_start = loc->start;
     BEGIN SC_TAG;
- piece_pack();
- piece_append("<Tag>");
gram_piece_pack();
gram_piece_append("<Tag>");
   }
        YY_BREAK
 case 78:
@@ -2158,10 +2157,10 @@ YY_RULE_SETUP
     if (++percent_percent_count == 2)
  {
       BEGIN SC_EPILOGUE;
-  piece_pack();
-  piece_esc(gram_text, strlen(gram_text));
-  piece_pack();
-  piece_pack();
+  gram_piece_pack();
+  gram_piece_esc(gram_text, strlen(gram_text));
+  gram_piece_pack();
+  gram_piece_pack();
   start_text();
   return ~PERCENT_PERCENT;
  }
@@ -2238,7 +2237,7 @@ YY_RULE_SETUP
     BEGIN (bracketed_id_str ? SC_RETURN_BRACKETED_ID : INITIAL);
     *loc = id_loc;
 #if 1
- piece_esc(gram_text, yy_c_buf_p - gram_text);
gram_piece_esc(gram_text, yy_c_buf_p - gram_text);
  return ~ID_COLON;
 #else
     return ID_COLON;
@@ -2421,9 +2420,9 @@ YY_RULE_SETUP
     BEGIN INITIAL;
 #if 1
  stop_text();
- piece_esc(gram_text, strlen(gram_text));
- piece_append("</PYACC_String>");
- piece_pack();
gram_piece_esc(gram_text, strlen(gram_text));
gram_piece_append("</PYACC_String>");
gram_piece_pack();
  return ~STRING;
 #else
     return STRING;
@@ -2469,9 +2468,9 @@ YY_RULE_SETUP
     BEGIN INITIAL;
 #if 1
  stop_text();
- piece_esc(gram_text, strlen(gram_text));
- piece_append("</PYACC_Char>");
- piece_pack();
gram_piece_esc(gram_text, strlen(gram_text));
gram_piece_append("</PYACC_Char>");
gram_piece_pack();
  return ~CHAR;
 #else
     return CHAR;
@@ -2507,9 +2506,9 @@ YY_RULE_SETUP
         STRING_FREE;
         BEGIN INITIAL;
 #if 1
- piece_esc(gram_text, strlen(gram_text));
- piece_append("</Tag>");
- piece_pack();
gram_piece_esc(gram_text, strlen(gram_text));
gram_piece_append("</Tag>");
gram_piece_pack();
  return ~TAG;
 #else
         return TAG;
@@ -2551,10 +2550,10 @@ YY_RULE_SETUP
  {
       obstack_1grow (&obstack_for_string, c);
   stop_text();
-  sprintf(piece_temp, "<PYACC_Escape character=\"%d\">", (int)c);
-  piece_append(piece_temp);
+  sprintf(gram_piece_temp, "<PYACC_Escape character=\"%d\">", (int)c);
+  gram_piece_append(gram_piece_temp);
   flush();
-  piece_append("</PYACC_Escape>"); 
+  gram_piece_append("</PYACC_Escape>"); 
  }
   }
        YY_BREAK
@@ -2571,53 +2570,53 @@ YY_RULE_SETUP
  {
       obstack_1grow (&obstack_for_string, c);
   stop_text();
-  sprintf(piece_temp, "<PYACC_Escape character=\"%d\">", (int)c);
-  piece_append(piece_temp);
+  sprintf(gram_piece_temp, "<PYACC_Escape character=\"%d\">", (int)c);
+  gram_piece_append(gram_piece_temp);
   flush();
-  piece_append("</PYACC_Escape>"); 
+  gram_piece_append("</PYACC_Escape>"); 
  }
   }
        YY_BREAK
 case 103:
 YY_RULE_SETUP
 #line 710 "src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\a'); stop_text(); piece_append("<PYACC_Escape character=\"7\">"); flush(); piece_append("</PYACC_Escape>");
+obstack_1grow (&obstack_for_string, '\a'); stop_text(); gram_piece_append("<PYACC_Escape character=\"7\">"); flush(); gram_piece_append("</PYACC_Escape>");
        YY_BREAK
 case 104:
 YY_RULE_SETUP
 #line 711 "src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\b'); stop_text(); piece_append("<PYACC_Escape character=\"8\">"); flush(); piece_append("</PYACC_Escape>");
+obstack_1grow (&obstack_for_string, '\b'); stop_text(); gram_piece_append("<PYACC_Escape character=\"8\">"); flush(); gram_piece_append("</PYACC_Escape>");
        YY_BREAK
 case 105:
 YY_RULE_SETUP
 #line 712 "src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\f'); stop_text(); piece_append("<PYACC_Escape character=\"12\">"); flush(); piece_append("</PYACC_Escape>");
+obstack_1grow (&obstack_for_string, '\f'); stop_text(); gram_piece_append("<PYACC_Escape character=\"12\">"); flush(); gram_piece_append("</PYACC_Escape>");
        YY_BREAK
 case 106:
 YY_RULE_SETUP
 #line 713 "src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\n'); stop_text(); piece_append("<PYACC_Escape character=\"10\">"); flush(); piece_append("</PYACC_Escape>");
+obstack_1grow (&obstack_for_string, '\n'); stop_text(); gram_piece_append("<PYACC_Escape character=\"10\">"); flush(); gram_piece_append("</PYACC_Escape>");
        YY_BREAK
 case 107:
 YY_RULE_SETUP
 #line 714 "src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\r'); stop_text(); piece_append("<PYACC_Escape character=\"13\">"); flush(); piece_append("</PYACC_Escape>");
+obstack_1grow (&obstack_for_string, '\r'); stop_text(); gram_piece_append("<PYACC_Escape character=\"13\">"); flush(); gram_piece_append("</PYACC_Escape>");
        YY_BREAK
 case 108:
 YY_RULE_SETUP
 #line 715 "src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\t'); stop_text(); piece_append("<PYACC_Escape character=\"9\">"); flush(); piece_append("</PYACC_Escape>");
+obstack_1grow (&obstack_for_string, '\t'); stop_text(); gram_piece_append("<PYACC_Escape character=\"9\">"); flush(); gram_piece_append("</PYACC_Escape>");
        YY_BREAK
 case 109:
 YY_RULE_SETUP
 #line 716 "src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\v'); stop_text(); piece_append("<PYACC_Escape character=\"11\">"); flush(); piece_append("</PYACC_Escape>");
+obstack_1grow (&obstack_for_string, '\v'); stop_text(); gram_piece_append("<PYACC_Escape character=\"11\">"); flush(); gram_piece_append("</PYACC_Escape>");
        YY_BREAK
 /* \\[\"\'?\\] would be shorter, but it confuses xgettext.  */
 case 110:
 YY_RULE_SETUP
 #line 719 "src/scan-gram.l"
-obstack_1grow (&obstack_for_string, gram_text[1]); stop_text(); sprintf(piece_temp, "<PYACC_Escape character=\"%d\">", gram_text[1]); piece_append(piece_temp); flush(); piece_append("</PYACC_Escape>"); 
+obstack_1grow (&obstack_for_string, gram_text[1]); stop_text(); sprintf(gram_piece_temp, "<PYACC_Escape character=\"%d\">", gram_text[1]); gram_piece_append(gram_piece_temp); flush(); gram_piece_append("</PYACC_Escape>"); 
        YY_BREAK
 case 111:
 YY_RULE_SETUP
@@ -2630,10 +2629,10 @@ YY_RULE_SETUP
     else
  {
       obstack_1grow (&obstack_for_string, c);
-  sprintf(piece_temp, "<PYACC_Escape character=\"%d\">", c);
-  piece_append(piece_temp);
+  sprintf(gram_piece_temp, "<PYACC_Escape character=\"%d\">", c);
+  gram_piece_append(gram_piece_temp);
   flush();
-  piece_append("</PYACC_Escape>"); 
+  gram_piece_append("</PYACC_Escape>"); 
  }
   }
        YY_BREAK
@@ -2802,14 +2801,14 @@ YY_RULE_SETUP
 #if 1
 #if 1 /* include the braces */
  start_text();
- piece_esc(gram_text, strlen(gram_text));
gram_piece_esc(gram_text, strlen(gram_text));
 #endif
  stop_text();
- piece_append("</PYACC_BracedCode>");
gram_piece_append("</PYACC_BracedCode>");
 #if 0 /* don't include the braces */
- piece_esc(gram_text, strlen(gram_text));
-#endif 
- piece_pack();
gram_piece_esc(gram_text, strlen(gram_text));
+#endif
gram_piece_pack();
  return ~BRACED_CODE;
 #else
         return BRACED_CODE;
@@ -2833,9 +2832,9 @@ YY_RULE_SETUP
         BEGIN INITIAL;
 #if 1
  stop_text();
- piece_esc(gram_text, strlen(gram_text));
- piece_append("</PYACC_BracedPredicate>");
- piece_pack();
gram_piece_esc(gram_text, strlen(gram_text));
gram_piece_append("</PYACC_BracedPredicate>");
gram_piece_pack();
  return ~BRACED_PREDICATE;
 #else
         return BRACED_PREDICATE;
@@ -2861,9 +2860,9 @@ YY_RULE_SETUP
     BEGIN INITIAL;
 #if 1
  stop_text();
- piece_esc(gram_text, strlen(gram_text));
- piece_append("</PYACC_Section1_Prologue>");
- piece_pack();
gram_piece_esc(gram_text, strlen(gram_text));
gram_piece_append("</PYACC_Section1_Prologue>");
gram_piece_pack();
  return ~PROLOGUE;
 #else
     return PROLOGUE;
@@ -2890,7 +2889,7 @@ case YY_STATE_EOF(SC_EPILOGUE):
     BEGIN INITIAL;
 #if 1
  stop_text();
- piece_pack();
gram_piece_pack();
  return ~EPILOGUE;
 #else
     return EPILOGUE;
@@ -4282,14 +4281,14 @@ gram_scanner_free (void)
 /* Nick */
 static void start_text(void) {
  if (in_text == 0) {
-  piece_append("<PYACC_Text>");
+  gram_piece_append("<PYACC_Text>");
   in_text = 1;
  }
 }
 
 static void stop_text(void) {
  if (in_text) {
-  piece_append("</PYACC_Text>");
+  gram_piece_append("</PYACC_Text>");
   in_text = 0;
  }
 }
index f41bf48..1f367db 100644 (file)
@@ -1,53 +1,21 @@
---- scan-gram.c.orig   2018-06-23 14:56:48.656152185 +1000
-+++ scan-gram.c        2018-06-23 14:57:16.820150994 +1000
-@@ -66,6 +66,19 @@
+--- 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 piece_temp[100];
-+char *piece[10000];
-+int piece0;
-+int piece1;
-+void piece_append(const char *str) {
-+ piece[piece1++] = strdup(str);
++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 piece_insert(int n, const char *str) {
-+ memmove(piece + n + 1, piece + n, (piece1 - n) * sizeof(char *));
-+ piece[n] = strdup(str);
-+ ++piece1;
++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;
 +}
-+
- /* %if-c-or-c++ */
- /* flex integer type definitions */
-@@ -253,7 +266,21 @@
-               } \
-       while ( 0 )
-+#if 1
-+#define flush() \
-+ do { \
-+  piece_esc(yytext, yy_c_buf_p - yytext); \
-+  yytext = yy_c_buf_p; \
-+ } while (0)
-+#define unput(c) \
-+ do { \
-+  piece_esc(yytext, yy_c_buf_p - yytext); \
-+  yyunput(c, (yytext_ptr)); \
-+  yytext = yy_c_buf_p; \
-+ } while (0)
-+#else
- #define unput(c) yyunput( c, (yytext_ptr)  )
-+#endif
- #ifndef YY_TYPEDEF_YY_SIZE_T
- #define YY_TYPEDEF_YY_SIZE_T
-@@ -1395,8 +1422,88 @@
- /** The main scanner function which does all the work.
-  */
-+static int real_yylex(GRAM_STYPE *val, location *loc);
-+static void piece_esc(const char *p, size_t n) {
++void gram_piece_esc(const char *p, size_t n) {
 + size_t i, j = 0;
 + for (i = 0; i < n; ++i)
 +  switch (p[i]) {
 +   break;
 +  }
 + q[j] = 0;
-+ piece[piece1++] = q;
++ gram_piece[gram_piece1++] = q;
 +}
-+static void piece_pack() {
++void gram_piece_pack() {
 + int i;
 + size_t j = 0;
-+ for (i = piece0; i < piece1; ++i)
-+  j += strlen(piece[i]);
++ for (i = gram_piece0; i < gram_piece1; ++i)
++  j += strlen(gram_piece[i]);
 + char *q = malloc(j + 1);
 + j = 0;
-+ for (i = piece0; i < piece1; ++i) {
-+  int k = strlen(piece[i]);
-+  memcpy(q + j, piece[i], k);
-+  free(piece[i]);
++ 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;
-+ piece[piece0++] = q;
-+ piece1 = piece0;
++ gram_piece[gram_piece0++] = q;
++ gram_piece1 = gram_piece0;
 +}
++
+ /* %if-c-or-c++ */
+ /* flex integer type definitions */
+@@ -253,7 +320,21 @@
+               } \
+       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); \
++  yyunput(c, (yytext_ptr)); \
++  yytext = yy_c_buf_p; \
++ } while (0)
++#else
+ #define unput(c) yyunput( c, (yytext_ptr)  )
++#endif
+ #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;
-+ piece_pack();
++ gram_piece_pack();
 +#if 1
-+ piece_esc(yytext, strlen(yytext));
++ gram_piece_esc(yytext, strlen(yytext));
 +#else
 + size_t n = strlen(yytext);
 + if (n) {
-+  sprintf(piece_temp, "<token value=\"%d\">", result);
-+  piece_append(piece_temp);
-+  piece_esc(yytext, n);
-+  piece_append("</token>");
++  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(piece_temp, "<token value=\"%d\" />", result);
-+  piece_append(piece_temp);
++  sprintf(gram_piece_temp, "<token value=\"%d\" />", result);
++  gram_piece_append(gram_piece_temp);
 + }
 +#endif
-+ piece_pack();
++ 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;
-@@ -1475,7 +1582,12 @@
+@@ -1480,7 +1586,12 @@
                gram__load_buffer_state( );
                }
  
 +#if 1
 + /* we do this so that "continue;" in an action works correctly */
-+ for (; ; piece_esc(yytext, yy_c_buf_p - yytext))
++ for (; ; gram_piece_esc(yytext, yy_c_buf_p - yytext))
 +#else
        while ( 1 )             /* loops until end-of-file is reached */
 +#endif
index d32da0c..f47725c 100644 (file)
@@ -290,22 +290,22 @@ eqopt    ([[:space:]]*=)?
     id_loc = *loc;
     bracketed_id_str = NULL;
     BEGIN SC_AFTER_IDENTIFIER;
- piece_pack();
- piece_append("<PYACC_ID>");
gram_piece_pack();
gram_piece_append("<PYACC_ID>");
  flush();
- piece_append("</PYACC_ID>");
- piece_pack();
gram_piece_append("</PYACC_ID>");
gram_piece_pack();
   }
 
   {int} {
     val->integer = scan_integer (yytext, 10, *loc);
 #if 1
- piece_pack();
- sprintf(piece_temp, "<PYACC_Int value=\"%d\">", val->integer);
piece_append(piece_temp);
- piece_esc(yytext, yy_c_buf_p - yytext);
- piece_append("</PYACC_Int>");
- piece_pack();
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_append("</PYACC_Int>");
gram_piece_pack();
  return ~INT;
 #else
     return INT;
@@ -314,12 +314,12 @@ eqopt    ([[:space:]]*=)?
   0[xX][0-9abcdefABCDEF]+ {
     val->integer = scan_integer (yytext, 16, *loc);
 #if 1
- piece_pack();
- sprintf(piece_temp, "<PYACC_Int value=\"%d\">", val->integer);
piece_append(piece_temp);
- piece_esc(yytext, yy_c_buf_p - yytext);
- piece_append("</PYACC_Int>");
- piece_pack();
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_append("</PYACC_Int>");
gram_piece_pack();
  return ~INT;
 #else
     return INT;
@@ -333,13 +333,13 @@ eqopt    ([[:space:]]*=)?
   }
 
   /* Characters.  */
-  "'"         token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER; piece_pack(); piece_append("<PYACC_Char>");
+  "'"         token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER; gram_piece_pack(); gram_piece_append("<PYACC_Char>");
 
   /* Strings. */
-  "\""        token_start = loc->start; BEGIN SC_ESCAPED_STRING; piece_pack(); piece_append("<PYACC_String>");
+  "\""        token_start = loc->start; BEGIN SC_ESCAPED_STRING; gram_piece_pack(); gram_piece_append("<PYACC_String>");
 
   /* Prologue. */
-  "%{"        code_start = loc->start; BEGIN SC_PROLOGUE; piece_pack(); piece_append("<PYACC_Section1_Prologue>"); flush(); start_text();
+  "%{"        code_start = loc->start; BEGIN SC_PROLOGUE; gram_piece_pack(); gram_piece_append("<PYACC_Section1_Prologue>"); flush(); start_text();
 
   /* Code in between braces.  */
   "{" {
@@ -347,8 +347,8 @@ eqopt    ([[:space:]]*=)?
     nesting = 0;
     code_start = loc->start;
     BEGIN SC_BRACED_CODE;
- piece_pack();
- piece_append("<PYACC_BracedCode>");
gram_piece_pack();
gram_piece_append("<PYACC_BracedCode>");
 #if 1 /* include the braces */
  start_text();
  flush();
@@ -359,8 +359,8 @@ eqopt    ([[:space:]]*=)?
   "%?"[ \f\n\t\v]*"{" {
     nesting = 0;
     code_start = loc->start;
- piece_pack();
- piece_append("<PYACC_BracedPredicate>");
gram_piece_pack();
gram_piece_append("<PYACC_BracedPredicate>");
     BEGIN SC_PREDICATE;
   }
 
@@ -371,8 +371,8 @@ eqopt    ([[:space:]]*=)?
     nesting = 0;
     token_start = loc->start;
     BEGIN SC_TAG;
- piece_pack();
- piece_append("<Tag>");
gram_piece_pack();
gram_piece_append("<Tag>");
   }
 
   "%%" {
@@ -380,10 +380,10 @@ eqopt    ([[:space:]]*=)?
     if (++percent_percent_count == 2)
  {
       BEGIN SC_EPILOGUE;
-  piece_pack();
-  piece_esc(yytext, strlen(yytext));
-  piece_pack();
-  piece_pack();
+  gram_piece_pack();
+  gram_piece_esc(yytext, strlen(yytext));
+  gram_piece_pack();
+  gram_piece_pack();
   start_text();
   return ~PERCENT_PERCENT;
  }
@@ -446,7 +446,7 @@ eqopt    ([[:space:]]*=)?
     BEGIN (bracketed_id_str ? SC_RETURN_BRACKETED_ID : INITIAL);
     *loc = id_loc;
 #if 1
- piece_esc(yytext, yy_c_buf_p - yytext);
gram_piece_esc(yytext, yy_c_buf_p - yytext);
  return ~ID_COLON;
 #else
     return ID_COLON;
@@ -583,9 +583,9 @@ eqopt    ([[:space:]]*=)?
     BEGIN INITIAL;
 #if 1
  stop_text();
- piece_esc(yytext, strlen(yytext));
- piece_append("</PYACC_String>");
- piece_pack();
gram_piece_esc(yytext, strlen(yytext));
gram_piece_append("</PYACC_String>");
gram_piece_pack();
  return ~STRING;
 #else
     return STRING;
@@ -621,9 +621,9 @@ eqopt    ([[:space:]]*=)?
     BEGIN INITIAL;
 #if 1
  stop_text();
- piece_esc(yytext, strlen(yytext));
- piece_append("</PYACC_Char>");
- piece_pack();
gram_piece_esc(yytext, strlen(yytext));
gram_piece_append("</PYACC_Char>");
gram_piece_pack();
  return ~CHAR;
 #else
     return CHAR;
@@ -651,9 +651,9 @@ eqopt    ([[:space:]]*=)?
         STRING_FREE;
         BEGIN INITIAL;
 #if 1
- piece_esc(yytext, strlen(yytext));
- piece_append("</Tag>");
- piece_pack();
gram_piece_esc(yytext, strlen(yytext));
gram_piece_append("</Tag>");
gram_piece_pack();
  return ~TAG;
 #else
         return TAG;
@@ -683,10 +683,10 @@ eqopt    ([[:space:]]*=)?
  {
       obstack_1grow (&obstack_for_string, c);
   stop_text();
-  sprintf(piece_temp, "<PYACC_Escape character=\"%d\">", (int)c);
-  piece_append(piece_temp);
+  sprintf(gram_piece_temp, "<PYACC_Escape character=\"%d\">", (int)c);
+  gram_piece_append(gram_piece_temp);
   flush();
-  piece_append("</PYACC_Escape>"); 
+  gram_piece_append("</PYACC_Escape>"); 
  }
   }
 
@@ -700,23 +700,23 @@ eqopt    ([[:space:]]*=)?
  {
       obstack_1grow (&obstack_for_string, c);
   stop_text();
-  sprintf(piece_temp, "<PYACC_Escape character=\"%d\">", (int)c);
-  piece_append(piece_temp);
+  sprintf(gram_piece_temp, "<PYACC_Escape character=\"%d\">", (int)c);
+  gram_piece_append(gram_piece_temp);
   flush();
-  piece_append("</PYACC_Escape>"); 
+  gram_piece_append("</PYACC_Escape>"); 
  }
   }
 
-  \\a   obstack_1grow (&obstack_for_string, '\a'); stop_text(); piece_append("<PYACC_Escape character=\"7\">"); flush(); piece_append("</PYACC_Escape>");
-  \\b   obstack_1grow (&obstack_for_string, '\b'); stop_text(); piece_append("<PYACC_Escape character=\"8\">"); flush(); piece_append("</PYACC_Escape>");
-  \\f   obstack_1grow (&obstack_for_string, '\f'); stop_text(); piece_append("<PYACC_Escape character=\"12\">"); flush(); piece_append("</PYACC_Escape>");
-  \\n   obstack_1grow (&obstack_for_string, '\n'); stop_text(); piece_append("<PYACC_Escape character=\"10\">"); flush(); piece_append("</PYACC_Escape>");
-  \\r   obstack_1grow (&obstack_for_string, '\r'); stop_text(); piece_append("<PYACC_Escape character=\"13\">"); flush(); piece_append("</PYACC_Escape>");
-  \\t   obstack_1grow (&obstack_for_string, '\t'); stop_text(); piece_append("<PYACC_Escape character=\"9\">"); flush(); piece_append("</PYACC_Escape>");
-  \\v   obstack_1grow (&obstack_for_string, '\v'); stop_text(); piece_append("<PYACC_Escape character=\"11\">"); flush(); piece_append("</PYACC_Escape>");
+  \\a   obstack_1grow (&obstack_for_string, '\a'); stop_text(); gram_piece_append("<PYACC_Escape character=\"7\">"); flush(); gram_piece_append("</PYACC_Escape>");
+  \\b   obstack_1grow (&obstack_for_string, '\b'); stop_text(); gram_piece_append("<PYACC_Escape character=\"8\">"); flush(); gram_piece_append("</PYACC_Escape>");
+  \\f   obstack_1grow (&obstack_for_string, '\f'); stop_text(); gram_piece_append("<PYACC_Escape character=\"12\">"); flush(); gram_piece_append("</PYACC_Escape>");
+  \\n   obstack_1grow (&obstack_for_string, '\n'); stop_text(); gram_piece_append("<PYACC_Escape character=\"10\">"); flush(); gram_piece_append("</PYACC_Escape>");
+  \\r   obstack_1grow (&obstack_for_string, '\r'); stop_text(); gram_piece_append("<PYACC_Escape character=\"13\">"); flush(); gram_piece_append("</PYACC_Escape>");
+  \\t   obstack_1grow (&obstack_for_string, '\t'); stop_text(); gram_piece_append("<PYACC_Escape character=\"9\">"); flush(); gram_piece_append("</PYACC_Escape>");
+  \\v   obstack_1grow (&obstack_for_string, '\v'); stop_text(); gram_piece_append("<PYACC_Escape character=\"11\">"); flush(); gram_piece_append("</PYACC_Escape>");
 
   /* \\[\"\'?\\] would be shorter, but it confuses xgettext.  */
-  \\("\""|"'"|"?"|"\\")  obstack_1grow (&obstack_for_string, yytext[1]); stop_text(); sprintf(piece_temp, "<PYACC_Escape character=\"%d\">", yytext[1]); piece_append(piece_temp); flush(); piece_append("</PYACC_Escape>"); 
+  \\("\""|"'"|"?"|"\\")  obstack_1grow (&obstack_for_string, yytext[1]); stop_text(); sprintf(gram_piece_temp, "<PYACC_Escape character=\"%d\">", yytext[1]); gram_piece_append(gram_piece_temp); flush(); gram_piece_append("</PYACC_Escape>"); 
  
   \\(u|U[0-9abcdefABCDEF]{4})[0-9abcdefABCDEF]{4} {
     int c = convert_ucn_to_byte (yytext);
@@ -726,10 +726,10 @@ eqopt    ([[:space:]]*=)?
     else
  {
       obstack_1grow (&obstack_for_string, c);
-  sprintf(piece_temp, "<PYACC_Escape character=\"%d\">", c);
-  piece_append(piece_temp);
+  sprintf(gram_piece_temp, "<PYACC_Escape character=\"%d\">", c);
+  gram_piece_append(gram_piece_temp);
   flush();
-  piece_append("</PYACC_Escape>"); 
+  gram_piece_append("</PYACC_Escape>"); 
  }
   }
   \\(.|\n)      {
@@ -837,14 +837,14 @@ eqopt    ([[:space:]]*=)?
 #if 1
 #if 1 /* include the braces */
  start_text();
- piece_esc(yytext, strlen(yytext));
gram_piece_esc(yytext, strlen(yytext));
 #endif
  stop_text();
- piece_append("</PYACC_BracedCode>");
gram_piece_append("</PYACC_BracedCode>");
 #if 0 /* don't include the braces */
- piece_esc(yytext, strlen(yytext));
gram_piece_esc(yytext, strlen(yytext));
 #endif
- piece_pack();
gram_piece_pack();
  return ~BRACED_CODE;
 #else
         return BRACED_CODE;
@@ -865,9 +865,9 @@ eqopt    ([[:space:]]*=)?
         BEGIN INITIAL;
 #if 1
  stop_text();
- piece_esc(yytext, strlen(yytext));
- piece_append("</PYACC_BracedPredicate>");
- piece_pack();
gram_piece_esc(yytext, strlen(yytext));
gram_piece_append("</PYACC_BracedPredicate>");
gram_piece_pack();
  return ~BRACED_PREDICATE;
 #else
         return BRACED_PREDICATE;
@@ -891,9 +891,9 @@ eqopt    ([[:space:]]*=)?
     BEGIN INITIAL;
 #if 1
  stop_text();
- piece_esc(yytext, strlen(yytext));
- piece_append("</PYACC_Section1_Prologue>");
- piece_pack();
gram_piece_esc(yytext, strlen(yytext));
gram_piece_append("</PYACC_Section1_Prologue>");
gram_piece_pack();
  return ~PROLOGUE;
 #else
     return PROLOGUE;
@@ -918,7 +918,7 @@ eqopt    ([[:space:]]*=)?
     BEGIN INITIAL;
 #if 1
  stop_text();
- piece_pack();
gram_piece_pack();
  return ~EPILOGUE;
 #else
     return EPILOGUE;
@@ -1167,14 +1167,14 @@ gram_scanner_free (void)
 /* Nick */
 static void start_text(void) {
  if (in_text == 0) {
-  piece_append("<PYACC_Text>");
+  gram_piece_append("<PYACC_Text>");
   in_text = 1;
  }
 }
 
 static void stop_text(void) {
  if (in_text) {
-  piece_append("</PYACC_Text>");
+  gram_piece_append("</PYACC_Text>");
   in_text = 0;
  }
 }