Minor fixes to markup of rules, actions and strings
authorNick Downing <downing.nick@gmail.com>
Tue, 3 Jul 2018 00:18:53 +0000 (10:18 +1000)
committerNick Downing <downing.nick@gmail.com>
Tue, 3 Jul 2018 01:34:19 +0000 (11:34 +1000)
.gitignore
src/parse-gram.c
src/parse-gram.h
src/parse-gram.y
src/scan-gram.c
src/scan-gram.l

index 71d30da..ccaade6 100644 (file)
@@ -63,6 +63,7 @@ src/.deps/
 src/.dirstamp
 src/bison
 src/parse-gram.c.orig
+src/parse-gram.output
 src/scan-gram.c.orig
 src/yacc
 tests/atconfig
index 144a2d5..2d5ff0e 100644 (file)
@@ -129,7 +129,7 @@ extern int gram_debug;
     param_parse  = 1 << 1,
     param_both   = param_lex | param_parse
   } param_type;
-#line 798 "src/parse-gram.y" /* yacc.c:355  */
+#line 807 "src/parse-gram.y" /* yacc.c:355  */
 #include "muscle-tab.h"
 
 #line 136 "src/parse-gram.c" /* yacc.c:355  */
@@ -223,7 +223,7 @@ named_ref *named_ref;
 param_type param;
 #line 496 "src/parse-gram.y" /* yacc.c:355  */
 code_props_type code_type;
-#line 800 "src/parse-gram.y" /* yacc.c:355  */
+#line 809 "src/parse-gram.y" /* yacc.c:355  */
 
   struct
   {
@@ -627,10 +627,10 @@ static const yytype_uint16 yyrline[] =
      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,   731,   735,   739,   744,   747,   752,
-     757,   759,   764,   769,   774,   782,   783,   793,   794,   819,
-     820,   821,   822,   834,   836,   845,   850,   851,   856,   864,
-     865
+     711,   712,   719,   719,   731,   735,   739,   744,   756,   761,
+     766,   768,   773,   778,   783,   791,   792,   802,   803,   828,
+     829,   830,   831,   843,   845,   854,   859,   860,   865,   873,
+     874
 };
 #endif
 
@@ -1115,7 +1115,7 @@ yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvalue
         break;
 
     case 89: /* value  */
-#line 809 "src/parse-gram.y" /* yacc.c:684  */
+#line 818 "src/parse-gram.y" /* yacc.c:684  */
       {
   switch (((*yyvaluep).value).kind)
     {
@@ -2774,156 +2774,165 @@ yyreduce:
   case 87:
 #line 745 "src/parse-gram.y" /* yacc.c:1648  */
     { grammar_current_rule_begin (current_lhs_symbol, current_lhs_location,
-                                  current_lhs_named_ref); }
-#line 2749 "src/parse-gram.c" /* yacc.c:1648  */
+                                  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;
+ }
+#line 2758 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 88:
-#line 748 "src/parse-gram.y" /* yacc.c:1648  */
+#line 757 "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_RHSes_RHS_Symbol>");
  insert_before(1, "<PYACC_Section2_Rules_RHSes_RHS_Symbol>");
  }
-#line 2758 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2767 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 89:
-#line 753 "src/parse-gram.y" /* yacc.c:1648  */
+#line 762 "src/parse-gram.y" /* yacc.c:1648  */
     { grammar_current_rule_action_append ((yyvsp[-1].code), (yylsp[-1]), (yyvsp[0].named_ref), false); /*}*/
  insert_after(2, "</PYACC_Section2_Rules_RHSes_RHS_Action>");
- insert_after(0, "<PYACC_Section2_Rules_RHSes_RHS_Action>");
+ insert_before(1, "<PYACC_Section2_Rules_RHSes_RHS_Action>");
  }
-#line 2767 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2776 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 90:
-#line 758 "src/parse-gram.y" /* yacc.c:1648  */
+#line 767 "src/parse-gram.y" /* yacc.c:1648  */
     { grammar_current_rule_action_append ((yyvsp[0].code), (yylsp[0]), NULL, true); }
-#line 2773 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2782 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 91:
-#line 760 "src/parse-gram.y" /* yacc.c:1648  */
+#line 769 "src/parse-gram.y" /* yacc.c:1648  */
     { grammar_current_rule_empty_set ((yylsp[0])); /*}*/
  insert_after(1, "</PYACC_Section2_Rules_RHSes_RHS_Empty>");
  insert_before(1, "<PYACC_Section2_Rules_RHSes_RHS_Empty>");
  }
-#line 2782 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2791 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 92:
-#line 765 "src/parse-gram.y" /* yacc.c:1648  */
+#line 774 "src/parse-gram.y" /* yacc.c:1648  */
     { grammar_current_rule_prec_set ((yyvsp[0].symbol), (yylsp[0])); /*}*/
  insert_after(2, "</PYACC_Section2_Rules_RHSes_RHS_Prec>");
  insert_before(1, "<PYACC_Section2_Rules_RHSes_RHS_Prec>");
  }
-#line 2791 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2800 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 93:
-#line 770 "src/parse-gram.y" /* yacc.c:1648  */
+#line 779 "src/parse-gram.y" /* yacc.c:1648  */
     { grammar_current_rule_dprec_set ((yyvsp[0].integer), (yylsp[0])); /*}*/
  insert_after(2, "</PYACC_Section2_Rules_RHSes_RHS_DPrec>");
  insert_before(1, "<PYACC_Section2_Rules_RHSes_RHS_DPrec>");
  }
-#line 2800 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2809 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 94:
-#line 775 "src/parse-gram.y" /* yacc.c:1648  */
+#line 784 "src/parse-gram.y" /* yacc.c:1648  */
     { grammar_current_rule_merge_set ((yyvsp[0].uniqstr), (yylsp[0])); /*}*/
  insert_after(2, "</PYACC_Section2_Rules_RHSes_RHS_Merge>");
  insert_before(1, "<PYACC_Section2_Rules_RHSes_RHS_Merge>");
  }
-#line 2809 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2818 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 95:
-#line 782 "src/parse-gram.y" /* yacc.c:1648  */
+#line 791 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.named_ref) = 0; }
-#line 2815 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2824 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 96:
-#line 783 "src/parse-gram.y" /* yacc.c:1648  */
+#line 792 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.named_ref) = named_ref_new ((yyvsp[0].uniqstr), (yylsp[0])); }
-#line 2821 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2830 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 98:
-#line 794 "src/parse-gram.y" /* yacc.c:1648  */
+#line 803 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.uniqstr) = uniqstr_new ((yyvsp[0].code)); }
-#line 2827 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2836 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 99:
-#line 819 "src/parse-gram.y" /* yacc.c:1648  */
+#line 828 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.value).kind = muscle_keyword; (yyval.value).chars = ""; }
-#line 2833 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2842 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 100:
-#line 820 "src/parse-gram.y" /* yacc.c:1648  */
+#line 829 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.value).kind = muscle_keyword; (yyval.value).chars = (yyvsp[0].uniqstr); }
-#line 2839 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2848 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 101:
-#line 821 "src/parse-gram.y" /* yacc.c:1648  */
+#line 830 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.value).kind = muscle_string;  (yyval.value).chars = (yyvsp[0].code); }
-#line 2845 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2854 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 102:
-#line 822 "src/parse-gram.y" /* yacc.c:1648  */
+#line 831 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.value).kind = muscle_code;    (yyval.value).chars = strip_braces ((yyvsp[0].code)); }
-#line 2851 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2860 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 103:
-#line 835 "src/parse-gram.y" /* yacc.c:1648  */
+#line 844 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.symbol) = symbol_from_uniqstr ((yyvsp[0].uniqstr), (yylsp[0])); }
-#line 2857 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2866 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 104:
-#line 837 "src/parse-gram.y" /* yacc.c:1648  */
+#line 846 "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 2867 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2876 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 105:
-#line 845 "src/parse-gram.y" /* yacc.c:1648  */
+#line 854 "src/parse-gram.y" /* yacc.c:1648  */
     { (yyval.symbol) = symbol_from_uniqstr ((yyvsp[0].uniqstr), (yylsp[0])); }
-#line 2873 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2882 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 108:
-#line 857 "src/parse-gram.y" /* yacc.c:1648  */
+#line 866 "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 2882 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2891 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
   case 110:
-#line 866 "src/parse-gram.y" /* yacc.c:1648  */
+#line 875 "src/parse-gram.y" /* yacc.c:1648  */
     {
       muscle_code_grow ("epilogue", translate_code ((yyvsp[0].code), (yylsp[0]), true), (yylsp[0]));
       code_scanner_last_string_free ();
  insert_after(1, "</PYACC_Section3>");
  insert_after(0, "<PYACC_Section3>");
     }
-#line 2893 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2902 "src/parse-gram.c" /* yacc.c:1648  */
     break;
 
 
-#line 2897 "src/parse-gram.c" /* yacc.c:1648  */
+#line 2906 "src/parse-gram.c" /* yacc.c:1648  */
         default: break;
       }
     if (yychar_backup != yychar)
@@ -3186,7 +3195,7 @@ yyreturn:
 #endif
   return yyresult;
 }
-#line 874 "src/parse-gram.y" /* yacc.c:1907  */
+#line 883 "src/parse-gram.y" /* yacc.c:1907  */
 
 
 /* Return the location of the left-hand side of a rule whose
index 663883e..ec0f447 100644 (file)
@@ -61,7 +61,7 @@ extern int gram_debug;
     param_parse  = 1 << 1,
     param_both   = param_lex | param_parse
   } param_type;
-#line 798 "src/parse-gram.y" /* yacc.c:1910  */
+#line 807 "src/parse-gram.y" /* yacc.c:1910  */
 #include "muscle-tab.h"
 
 #line 68 "src/parse-gram.h" /* yacc.c:1910  */
@@ -155,7 +155,7 @@ named_ref *named_ref;
 param_type param;
 #line 496 "src/parse-gram.y" /* yacc.c:1910  */
 code_props_type code_type;
-#line 800 "src/parse-gram.y" /* yacc.c:1910  */
+#line 809 "src/parse-gram.y" /* yacc.c:1910  */
 
   struct
   {
index bffa7d5..09f6259 100644 (file)
@@ -743,7 +743,16 @@ rhses.1:
 rhs:
   %empty
     { grammar_current_rule_begin (current_lhs_symbol, current_lhs_location,
-                                  current_lhs_named_ref); }
+                                  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;
+ } 
 | rhs symbol named_ref.opt
     { grammar_current_rule_symbol_append ($2, @2, $3); /*}*/
  insert_after(2, "</PYACC_Section2_Rules_RHSes_RHS_Symbol>");
@@ -752,7 +761,7 @@ rhs:
 | rhs "{...}" named_ref.opt
     { grammar_current_rule_action_append ($2, @2, $3, false); /*}*/
  insert_after(2, "</PYACC_Section2_Rules_RHSes_RHS_Action>");
- insert_after(0, "<PYACC_Section2_Rules_RHSes_RHS_Action>");
+ insert_before(1, "<PYACC_Section2_Rules_RHSes_RHS_Action>");
  }
 | rhs "%?{...}"
     { grammar_current_rule_action_append ($2, @2, NULL, true); }
index 2602f3a..6a03b57 100644 (file)
@@ -1010,20 +1010,20 @@ int gram__flex_debug = 1;
 
 static yyconst flex_int16_t yy_rule_linenum[130] =
     {   0,
-      189,  192,  193,  194,  202,  220,  221,  222,  223,  224,
-      225,  226,  227,  228,  229,  230,  231,  232,  233,  234,
-      235,  236,  237,  238,  239,  240,  241,  242,  243,  244,
-      245,  246,  247,  248,  249,  250,  251,  252,  253,  254,
-      255,  256,  257,  258,  259,  260,  261,  262,  263,  264,
-      267,  268,  269,  270,  271,  272,  273,  274,  275,  276,
-      277,  279,  283,  284,  285,  287,  299,  313,  330,  335,
-      338,  341,  344,  356,  367,  368,  369,  377,  384,  391,
+      190,  193,  194,  195,  203,  221,  222,  223,  224,  225,
+      226,  227,  228,  229,  230,  231,  232,  233,  234,  235,
+      236,  237,  238,  239,  240,  241,  242,  243,  244,  245,
+      246,  247,  248,  249,  250,  251,  252,  253,  254,  255,
+      256,  257,  258,  259,  260,  261,  262,  263,  264,  265,
+      268,  269,  270,  271,  272,  273,  274,  275,  276,  277,
+      278,  280,  284,  285,  286,  288,  300,  314,  331,  336,
+      339,  342,  345,  355,  364,  365,  366,  374,  384,  391,
       411,  421,  436,  446,  473,  486,  502,  517,  534,  535,
       546,  557,  558,  570,  586,  596,  623,  635,  656,  657,
 
       668,  684,  701,  702,  703,  704,  705,  706,  707,  710,
-      712,  727,  749,  754,  755,  761,  762,  773,  779,  785,
-      791,  807,  808,  812,  819,  844,  873,  914,  915
+      712,  726,  744,  749,  750,  756,  757,  768,  775,  782,
+      789,  806,  807,  811,  818,  843,  872,  913,  914
     } ;
 
 /* The intent behind this definition is that it'll catch
@@ -1137,7 +1137,8 @@ static void unexpected_newline (boundary, char const *);
 
 /* Nick */
 static int in_text;
-static void flush_text(void);
+static void start_text(void);
+static void stop_text(void);
 
 /* A C-like comment in directives/rules. */
 
@@ -1168,7 +1169,7 @@ generics/template types.  */
    white space between the backslash and the newline.  */
 /* An equal sign, with optional leading whitespaces. This is used in some
    deprecated constructs. */
-#line 1145 "src/scan-gram.c"
+#line 1146 "src/scan-gram.c"
 
 #define INITIAL 0
 #define SC_YACC_COMMENT 1
@@ -1513,7 +1514,7 @@ static int real_yylex(GRAM_STYPE *val, location *loc)
        register int yy_act;
     
 /* %% [7.0] user's declarations go here */
-#line 150 "src/scan-gram.l"
+#line 151 "src/scan-gram.l"
 
 
   /* Nesting level.  Either for nested braces, or nested angle brackets
@@ -1550,7 +1551,7 @@ static int real_yylex(GRAM_STYPE *val, location *loc)
   | Scanning white space.  |
   `-----------------------*/
 
-#line 1447 "src/scan-gram.c"
+#line 1448 "src/scan-gram.c"
 
        if ( !(yy_init) )
                {
@@ -1669,23 +1670,23 @@ do_action:      /* This label is used only to access EOF actions. */
 /* Comments and white space.  */
 case 1:
 YY_RULE_SETUP
-#line 189 "src/scan-gram.l"
+#line 190 "src/scan-gram.l"
 {
      complain (loc, Wother, _("stray ',' treated as white space"));
   }
        YY_BREAK
 case 2:
 /* rule 2 can match eol */
-#line 193 "src/scan-gram.l"
+#line 194 "src/scan-gram.l"
 case 3:
 /* rule 3 can match eol */
 YY_RULE_SETUP
-#line 193 "src/scan-gram.l"
+#line 194 "src/scan-gram.l"
 continue;
        YY_BREAK
 case 4:
 YY_RULE_SETUP
-#line 194 "src/scan-gram.l"
+#line 195 "src/scan-gram.l"
 {
     token_start = loc->start;
     context_state = YY_START;
@@ -1697,7 +1698,7 @@ YY_RULE_SETUP
 case 5:
 /* rule 5 can match eol */
 YY_RULE_SETUP
-#line 202 "src/scan-gram.l"
+#line 203 "src/scan-gram.l"
 {
     handle_syncline (gram_text + sizeof "#line " - 1, *loc);
   }
@@ -1715,313 +1716,313 @@ YY_RULE_SETUP
 
 case 6:
 YY_RULE_SETUP
-#line 220 "src/scan-gram.l"
+#line 221 "src/scan-gram.l"
 return PERCENT_NONASSOC;
        YY_BREAK
 case 7:
 YY_RULE_SETUP
-#line 221 "src/scan-gram.l"
+#line 222 "src/scan-gram.l"
 return PERCENT_CODE;
        YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 222 "src/scan-gram.l"
+#line 223 "src/scan-gram.l"
 RETURN_PERCENT_FLAG("parse.trace");
        YY_BREAK
 case 9:
 YY_RULE_SETUP
-#line 223 "src/scan-gram.l"
+#line 224 "src/scan-gram.l"
 return PERCENT_DEFAULT_PREC;
        YY_BREAK
 case 10:
 YY_RULE_SETUP
-#line 224 "src/scan-gram.l"
+#line 225 "src/scan-gram.l"
 return PERCENT_DEFINE;
        YY_BREAK
 case 11:
 YY_RULE_SETUP
-#line 225 "src/scan-gram.l"
+#line 226 "src/scan-gram.l"
 return PERCENT_DEFINES;
        YY_BREAK
 case 12:
 YY_RULE_SETUP
-#line 226 "src/scan-gram.l"
+#line 227 "src/scan-gram.l"
 return PERCENT_DESTRUCTOR;
        YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 227 "src/scan-gram.l"
+#line 228 "src/scan-gram.l"
 return PERCENT_DPREC;
        YY_BREAK
 case 14:
 YY_RULE_SETUP
-#line 228 "src/scan-gram.l"
+#line 229 "src/scan-gram.l"
 return PERCENT_EMPTY;
        YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 229 "src/scan-gram.l"
+#line 230 "src/scan-gram.l"
 return PERCENT_ERROR_VERBOSE;
        YY_BREAK
 case 16:
 YY_RULE_SETUP
-#line 230 "src/scan-gram.l"
+#line 231 "src/scan-gram.l"
 return PERCENT_EXPECT;
        YY_BREAK
 case 17:
 YY_RULE_SETUP
-#line 231 "src/scan-gram.l"
+#line 232 "src/scan-gram.l"
 return PERCENT_EXPECT_RR;
        YY_BREAK
 case 18:
 YY_RULE_SETUP
-#line 232 "src/scan-gram.l"
+#line 233 "src/scan-gram.l"
 return PERCENT_FILE_PREFIX;
        YY_BREAK
 case 19:
 YY_RULE_SETUP
-#line 233 "src/scan-gram.l"
+#line 234 "src/scan-gram.l"
 return PERCENT_YACC;
        YY_BREAK
 case 20:
 YY_RULE_SETUP
-#line 234 "src/scan-gram.l"
+#line 235 "src/scan-gram.l"
 return PERCENT_INITIAL_ACTION;
        YY_BREAK
 case 21:
 YY_RULE_SETUP
-#line 235 "src/scan-gram.l"
+#line 236 "src/scan-gram.l"
 return PERCENT_GLR_PARSER;
        YY_BREAK
 case 22:
 YY_RULE_SETUP
-#line 236 "src/scan-gram.l"
+#line 237 "src/scan-gram.l"
 return PERCENT_LANGUAGE;
        YY_BREAK
 case 23:
 YY_RULE_SETUP
-#line 237 "src/scan-gram.l"
+#line 238 "src/scan-gram.l"
 return PERCENT_LEFT;
        YY_BREAK
 case 24:
 YY_RULE_SETUP
-#line 238 "src/scan-gram.l"
+#line 239 "src/scan-gram.l"
 RETURN_PERCENT_PARAM(lex);
        YY_BREAK
 case 25:
 YY_RULE_SETUP
-#line 239 "src/scan-gram.l"
+#line 240 "src/scan-gram.l"
 RETURN_PERCENT_FLAG("locations");
        YY_BREAK
 case 26:
 YY_RULE_SETUP
-#line 240 "src/scan-gram.l"
+#line 241 "src/scan-gram.l"
 return PERCENT_MERGE;
        YY_BREAK
 case 27:
 YY_RULE_SETUP
-#line 241 "src/scan-gram.l"
+#line 242 "src/scan-gram.l"
 return PERCENT_NAME_PREFIX;
        YY_BREAK
 case 28:
 YY_RULE_SETUP
-#line 242 "src/scan-gram.l"
+#line 243 "src/scan-gram.l"
 return PERCENT_NO_DEFAULT_PREC;
        YY_BREAK
 case 29:
 YY_RULE_SETUP
-#line 243 "src/scan-gram.l"
+#line 244 "src/scan-gram.l"
 return PERCENT_NO_LINES;
        YY_BREAK
 case 30:
 YY_RULE_SETUP
-#line 244 "src/scan-gram.l"
+#line 245 "src/scan-gram.l"
 return PERCENT_NONASSOC;
        YY_BREAK
 case 31:
 YY_RULE_SETUP
-#line 245 "src/scan-gram.l"
+#line 246 "src/scan-gram.l"
 return PERCENT_NONDETERMINISTIC_PARSER;
        YY_BREAK
 case 32:
 YY_RULE_SETUP
-#line 246 "src/scan-gram.l"
+#line 247 "src/scan-gram.l"
 return PERCENT_NTERM;
        YY_BREAK
 case 33:
 YY_RULE_SETUP
-#line 247 "src/scan-gram.l"
+#line 248 "src/scan-gram.l"
 return PERCENT_OUTPUT;
        YY_BREAK
 case 34:
 YY_RULE_SETUP
-#line 248 "src/scan-gram.l"
+#line 249 "src/scan-gram.l"
 RETURN_PERCENT_PARAM(both);
        YY_BREAK
 case 35:
 YY_RULE_SETUP
-#line 249 "src/scan-gram.l"
+#line 250 "src/scan-gram.l"
 RETURN_PERCENT_PARAM(parse);
        YY_BREAK
 case 36:
 YY_RULE_SETUP
-#line 250 "src/scan-gram.l"
+#line 251 "src/scan-gram.l"
 return PERCENT_PREC;
        YY_BREAK
 case 37:
 YY_RULE_SETUP
-#line 251 "src/scan-gram.l"
+#line 252 "src/scan-gram.l"
 return PERCENT_PRECEDENCE;
        YY_BREAK
 case 38:
 YY_RULE_SETUP
-#line 252 "src/scan-gram.l"
+#line 253 "src/scan-gram.l"
 return PERCENT_PRINTER;
        YY_BREAK
 case 39:
 YY_RULE_SETUP
-#line 253 "src/scan-gram.l"
+#line 254 "src/scan-gram.l"
 RETURN_PERCENT_FLAG("api.pure");
        YY_BREAK
 case 40:
 YY_RULE_SETUP
-#line 254 "src/scan-gram.l"
+#line 255 "src/scan-gram.l"
 return PERCENT_REQUIRE;
        YY_BREAK
 case 41:
 YY_RULE_SETUP
-#line 255 "src/scan-gram.l"
+#line 256 "src/scan-gram.l"
 return PERCENT_RIGHT;
        YY_BREAK
 case 42:
 YY_RULE_SETUP
-#line 256 "src/scan-gram.l"
+#line 257 "src/scan-gram.l"
 return PERCENT_SKELETON;
        YY_BREAK
 case 43:
 YY_RULE_SETUP
-#line 257 "src/scan-gram.l"
+#line 258 "src/scan-gram.l"
 return PERCENT_START;
        YY_BREAK
 case 44:
 YY_RULE_SETUP
-#line 258 "src/scan-gram.l"
+#line 259 "src/scan-gram.l"
 return PERCENT_TOKEN;
        YY_BREAK
 case 45:
 YY_RULE_SETUP
-#line 259 "src/scan-gram.l"
+#line 260 "src/scan-gram.l"
 return PERCENT_TOKEN;
        YY_BREAK
 case 46:
 YY_RULE_SETUP
-#line 260 "src/scan-gram.l"
+#line 261 "src/scan-gram.l"
 return PERCENT_TOKEN_TABLE;
        YY_BREAK
 case 47:
 YY_RULE_SETUP
-#line 261 "src/scan-gram.l"
+#line 262 "src/scan-gram.l"
 return PERCENT_TYPE;
        YY_BREAK
 case 48:
 YY_RULE_SETUP
-#line 262 "src/scan-gram.l"
+#line 263 "src/scan-gram.l"
 return PERCENT_UNION;
        YY_BREAK
 case 49:
 YY_RULE_SETUP
-#line 263 "src/scan-gram.l"
+#line 264 "src/scan-gram.l"
 return PERCENT_VERBOSE;
        YY_BREAK
 case 50:
 YY_RULE_SETUP
-#line 264 "src/scan-gram.l"
+#line 265 "src/scan-gram.l"
 return PERCENT_YACC;
        YY_BREAK
 /* deprecated */
 case 51:
 YY_RULE_SETUP
-#line 267 "src/scan-gram.l"
+#line 268 "src/scan-gram.l"
 DEPRECATED("%default-prec");
        YY_BREAK
 case 52:
 YY_RULE_SETUP
-#line 268 "src/scan-gram.l"
+#line 269 "src/scan-gram.l"
 DEPRECATED("%define parse.error verbose");
        YY_BREAK
 case 53:
 YY_RULE_SETUP
-#line 269 "src/scan-gram.l"
+#line 270 "src/scan-gram.l"
 DEPRECATED("%expect-rr");
        YY_BREAK
 case 54:
 /* rule 54 can match eol */
 YY_RULE_SETUP
-#line 270 "src/scan-gram.l"
+#line 271 "src/scan-gram.l"
 DEPRECATED("%file-prefix");
        YY_BREAK
 case 55:
 YY_RULE_SETUP
-#line 271 "src/scan-gram.l"
+#line 272 "src/scan-gram.l"
 DEPRECATED("%fixed-output-files");
        YY_BREAK
 case 56:
 /* rule 56 can match eol */
 YY_RULE_SETUP
-#line 272 "src/scan-gram.l"
+#line 273 "src/scan-gram.l"
 DEPRECATED("%name-prefix");
        YY_BREAK
 case 57:
 YY_RULE_SETUP
-#line 273 "src/scan-gram.l"
+#line 274 "src/scan-gram.l"
 DEPRECATED("%no-default-prec");
        YY_BREAK
 case 58:
 YY_RULE_SETUP
-#line 274 "src/scan-gram.l"
+#line 275 "src/scan-gram.l"
 DEPRECATED("%no-lines");
        YY_BREAK
 case 59:
 /* rule 59 can match eol */
 YY_RULE_SETUP
-#line 275 "src/scan-gram.l"
+#line 276 "src/scan-gram.l"
 DEPRECATED("%output");
        YY_BREAK
 case 60:
 YY_RULE_SETUP
-#line 276 "src/scan-gram.l"
+#line 277 "src/scan-gram.l"
 DEPRECATED("%pure-parser");
        YY_BREAK
 case 61:
 YY_RULE_SETUP
-#line 277 "src/scan-gram.l"
+#line 278 "src/scan-gram.l"
 DEPRECATED("%token-table");
        YY_BREAK
 case 62:
 YY_RULE_SETUP
-#line 279 "src/scan-gram.l"
+#line 280 "src/scan-gram.l"
 {
     complain (loc, complaint, _("invalid directive: %s"), quote (gram_text));
   }
        YY_BREAK
 case 63:
 YY_RULE_SETUP
-#line 283 "src/scan-gram.l"
+#line 284 "src/scan-gram.l"
 return EQUAL;
        YY_BREAK
 case 64:
 YY_RULE_SETUP
-#line 284 "src/scan-gram.l"
+#line 285 "src/scan-gram.l"
 return PIPE;
        YY_BREAK
 case 65:
 YY_RULE_SETUP
-#line 285 "src/scan-gram.l"
+#line 286 "src/scan-gram.l"
 return SEMICOLON;
        YY_BREAK
 case 66:
 YY_RULE_SETUP
-#line 287 "src/scan-gram.l"
+#line 288 "src/scan-gram.l"
 {
     val->uniqstr = uniqstr_new (gram_text);
     id_loc = *loc;
@@ -2036,7 +2037,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 67:
 YY_RULE_SETUP
-#line 299 "src/scan-gram.l"
+#line 300 "src/scan-gram.l"
 {
     val->integer = scan_integer (gram_text, 10, *loc);
 #if 1
@@ -2054,7 +2055,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 68:
 YY_RULE_SETUP
-#line 313 "src/scan-gram.l"
+#line 314 "src/scan-gram.l"
 {
     val->integer = scan_integer (gram_text, 16, *loc);
 #if 1
@@ -2074,7 +2075,7 @@ YY_RULE_SETUP
      accept "1FOO" as "1 FOO".  */
 case 69:
 YY_RULE_SETUP
-#line 330 "src/scan-gram.l"
+#line 331 "src/scan-gram.l"
 {
     complain (loc, complaint, _("invalid identifier: %s"), quote (gram_text));
   }
@@ -2082,25 +2083,25 @@ YY_RULE_SETUP
 /* Characters.  */
 case 70:
 YY_RULE_SETUP
-#line 335 "src/scan-gram.l"
-token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER; piece_pack(); piece_append("<PYACC_Char>"); in_text = 0;
+#line 336 "src/scan-gram.l"
+token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER; piece_pack(); piece_append("<PYACC_Char>");
        YY_BREAK
 /* Strings. */
 case 71:
 YY_RULE_SETUP
-#line 338 "src/scan-gram.l"
-token_start = loc->start; BEGIN SC_ESCAPED_STRING; piece_pack(); piece_append("<PYACC_String>"); in_text = 0;
+#line 339 "src/scan-gram.l"
+token_start = loc->start; BEGIN SC_ESCAPED_STRING; piece_pack(); piece_append("<PYACC_String>");
        YY_BREAK
 /* Prologue. */
 case 72:
 YY_RULE_SETUP
-#line 341 "src/scan-gram.l"
-code_start = loc->start; BEGIN SC_PROLOGUE; piece_pack(); piece_append("<PYACC_Section1_Prologue>"); flush(); piece_append("<PYACC_Text>");
+#line 342 "src/scan-gram.l"
+code_start = loc->start; BEGIN SC_PROLOGUE; piece_pack(); piece_append("<PYACC_Section1_Prologue>"); flush(); start_text();
        YY_BREAK
 /* Code in between braces.  */
 case 73:
 YY_RULE_SETUP
-#line 344 "src/scan-gram.l"
+#line 345 "src/scan-gram.l"
 {
     STRING_GROW;
     nesting = 0;
@@ -2108,39 +2109,35 @@ YY_RULE_SETUP
     BEGIN SC_BRACED_CODE;
  piece_pack();
  piece_append("<PYACC_BracedCode>");
- flush();
- piece_append("<PYACC_Text>");
   }
        YY_BREAK
 /* Semantic predicate. */
 case 74:
 /* rule 74 can match eol */
 YY_RULE_SETUP
-#line 356 "src/scan-gram.l"
+#line 355 "src/scan-gram.l"
 {
     nesting = 0;
     code_start = loc->start;
  piece_pack();
  piece_append("<PYACC_BracedPredicate>");
- flush();
- piece_append("<PYACC_Text>");
     BEGIN SC_PREDICATE;
   }
        YY_BREAK
 /* A type. */
 case 75:
 YY_RULE_SETUP
-#line 367 "src/scan-gram.l"
+#line 364 "src/scan-gram.l"
 return TAG_ANY;
        YY_BREAK
 case 76:
 YY_RULE_SETUP
-#line 368 "src/scan-gram.l"
+#line 365 "src/scan-gram.l"
 return TAG_NONE;
        YY_BREAK
 case 77:
 YY_RULE_SETUP
-#line 369 "src/scan-gram.l"
+#line 366 "src/scan-gram.l"
 {
     nesting = 0;
     token_start = loc->start;
@@ -2151,11 +2148,14 @@ YY_RULE_SETUP
        YY_BREAK
 case 78:
 YY_RULE_SETUP
-#line 377 "src/scan-gram.l"
+#line 374 "src/scan-gram.l"
 {
     static int percent_percent_count;
     if (++percent_percent_count == 2)
+ {
       BEGIN SC_EPILOGUE;
+  in_text = 1; /* not really in text, just suppress the <PYACC_Text> tag */
+ }
     return PERCENT_PERCENT;
   }
        YY_BREAK
@@ -2411,7 +2411,7 @@ YY_RULE_SETUP
     val->code = last_string;
     BEGIN INITIAL;
 #if 1
flush_text();
stop_text();
  piece_esc(gram_text, strlen(gram_text));
  piece_append("</PYACC_String>");
  piece_pack();
@@ -2459,7 +2459,7 @@ YY_RULE_SETUP
     STRING_FREE;
     BEGIN INITIAL;
 #if 1
flush_text();
stop_text();
  piece_esc(gram_text, strlen(gram_text));
  piece_append("</PYACC_Char>");
  piece_pack();
@@ -2541,7 +2541,7 @@ YY_RULE_SETUP
     else
  {
       obstack_1grow (&obstack_for_string, c);
-  flush_text();
+  stop_text();
   sprintf(piece_temp, "<PYACC_Escape char=\"%d\">", (int)c);
   piece_append(piece_temp);
   flush();
@@ -2561,7 +2561,7 @@ YY_RULE_SETUP
     else
  {
       obstack_1grow (&obstack_for_string, c);
-  flush_text();
+  stop_text();
   sprintf(piece_temp, "<PYACC_Escape char=\"%d\">", (int)c);
   piece_append(piece_temp);
   flush();
@@ -2572,43 +2572,43 @@ YY_RULE_SETUP
 case 103:
 YY_RULE_SETUP
 #line 701 "src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\a'); flush_text(); piece_append("<PYACC_Escape char=\"7\">"); flush(); piece_append("</PYACC_Escape>");
+obstack_1grow (&obstack_for_string, '\a'); stop_text(); piece_append("<PYACC_Escape char=\"7\">"); flush(); piece_append("</PYACC_Escape>");
        YY_BREAK
 case 104:
 YY_RULE_SETUP
 #line 702 "src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\b'); flush_text(); piece_append("<PYACC_Escape char=\"8\">"); flush(); piece_append("</PYACC_Escape>");
+obstack_1grow (&obstack_for_string, '\b'); stop_text(); piece_append("<PYACC_Escape char=\"8\">"); flush(); piece_append("</PYACC_Escape>");
        YY_BREAK
 case 105:
 YY_RULE_SETUP
 #line 703 "src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\f'); flush_text(); piece_append("<PYACC_Escape char=\"12\">"); flush(); piece_append("</PYACC_Escape>");
+obstack_1grow (&obstack_for_string, '\f'); stop_text(); piece_append("<PYACC_Escape char=\"12\">"); flush(); piece_append("</PYACC_Escape>");
        YY_BREAK
 case 106:
 YY_RULE_SETUP
 #line 704 "src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\n'); flush_text(); piece_append("<PYACC_Escape char=\"10\">"); flush(); piece_append("</PYACC_Escape>");
+obstack_1grow (&obstack_for_string, '\n'); stop_text(); piece_append("<PYACC_Escape char=\"10\">"); flush(); piece_append("</PYACC_Escape>");
        YY_BREAK
 case 107:
 YY_RULE_SETUP
 #line 705 "src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\r'); flush_text(); piece_append("<PYACC_Escape char=\"13\">"); flush(); piece_append("</PYACC_Escape>");
+obstack_1grow (&obstack_for_string, '\r'); stop_text(); piece_append("<PYACC_Escape char=\"13\">"); flush(); piece_append("</PYACC_Escape>");
        YY_BREAK
 case 108:
 YY_RULE_SETUP
 #line 706 "src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\t'); flush_text(); piece_append("<PYACC_Escape char=\"9\">"); flush(); piece_append("</PYACC_Escape>");
+obstack_1grow (&obstack_for_string, '\t'); stop_text(); piece_append("<PYACC_Escape char=\"9\">"); flush(); piece_append("</PYACC_Escape>");
        YY_BREAK
 case 109:
 YY_RULE_SETUP
 #line 707 "src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\v'); flush_text(); piece_append("<PYACC_Escape char=\"11\">"); flush(); piece_append("</PYACC_Escape>");
+obstack_1grow (&obstack_for_string, '\v'); stop_text(); piece_append("<PYACC_Escape char=\"11\">"); flush(); piece_append("</PYACC_Escape>");
        YY_BREAK
 /* \\[\"\'?\\] would be shorter, but it confuses xgettext.  */
 case 110:
 YY_RULE_SETUP
 #line 710 "src/scan-gram.l"
-obstack_1grow (&obstack_for_string, gram_text[1]); flush_text(); sprintf(piece_temp, "<PYACC_Escape char=\"%d\">", gram_text[1]); piece_append(piece_temp); flush(); piece_append("</PYACC_Escape>"); 
+obstack_1grow (&obstack_for_string, gram_text[1]); stop_text(); sprintf(piece_temp, "<PYACC_Escape char=\"%d\">", gram_text[1]); piece_append(piece_temp); flush(); piece_append("</PYACC_Escape>"); 
        YY_BREAK
 case 111:
 YY_RULE_SETUP
@@ -2621,7 +2621,6 @@ YY_RULE_SETUP
     else
  {
       obstack_1grow (&obstack_for_string, c);
-  flush_text();
   sprintf(piece_temp, "<PYACC_Escape char=\"%d\">", c);
   piece_append(piece_temp);
   flush();
@@ -2632,7 +2631,7 @@ YY_RULE_SETUP
 case 112:
 /* rule 112 can match eol */
 YY_RULE_SETUP
-#line 727 "src/scan-gram.l"
+#line 726 "src/scan-gram.l"
 {
     char const *p = gram_text + 1;
     /* Quote only if escaping won't make the character visible.  */
@@ -2642,10 +2641,6 @@ YY_RULE_SETUP
       p = quotearg_style_mem (escape_quoting_style, p, 1);
     complain (loc, complaint, _("invalid character after \\-escape: %s"),
                  p);
- if (in_text == 0) {
-  piece_append("<PYACC_Text>");
-  in_text = 1;
- }
   }
        YY_BREAK
 
@@ -2657,7 +2652,7 @@ YY_RULE_SETUP
 case 113:
 /* rule 113 can match eol */
 YY_RULE_SETUP
-#line 749 "src/scan-gram.l"
+#line 744 "src/scan-gram.l"
 STRING_GROW;
        YY_BREAK
 
@@ -2665,17 +2660,17 @@ STRING_GROW;
 
 case 114:
 YY_RULE_SETUP
-#line 754 "src/scan-gram.l"
+#line 749 "src/scan-gram.l"
 STRING_GROW; BEGIN context_state;
        YY_BREAK
 case 115:
 /* rule 115 can match eol */
 YY_RULE_SETUP
-#line 755 "src/scan-gram.l"
+#line 750 "src/scan-gram.l"
 unexpected_newline (token_start, "'");
        YY_BREAK
 case YY_STATE_EOF(SC_CHARACTER):
-#line 756 "src/scan-gram.l"
+#line 751 "src/scan-gram.l"
 unexpected_eof (token_start, "'");
        YY_BREAK
 
@@ -2683,17 +2678,17 @@ unexpected_eof (token_start, "'");
 
 case 116:
 YY_RULE_SETUP
-#line 761 "src/scan-gram.l"
+#line 756 "src/scan-gram.l"
 STRING_GROW; BEGIN context_state;
        YY_BREAK
 case 117:
 /* rule 117 can match eol */
 YY_RULE_SETUP
-#line 762 "src/scan-gram.l"
+#line 757 "src/scan-gram.l"
 unexpected_newline (token_start, "\"");
        YY_BREAK
 case YY_STATE_EOF(SC_STRING):
-#line 763 "src/scan-gram.l"
+#line 758 "src/scan-gram.l"
 unexpected_eof (token_start, "\"");
        YY_BREAK
 
@@ -2704,43 +2699,47 @@ unexpected_eof (token_start, "\"");
 
 case 118:
 YY_RULE_SETUP
-#line 773 "src/scan-gram.l"
+#line 768 "src/scan-gram.l"
 {
     STRING_GROW;
     context_state = YY_START;
     token_start = loc->start;
     BEGIN SC_CHARACTER;
+ start_text();
   }
        YY_BREAK
 case 119:
 YY_RULE_SETUP
-#line 779 "src/scan-gram.l"
+#line 775 "src/scan-gram.l"
 {
     STRING_GROW;
     context_state = YY_START;
     token_start = loc->start;
     BEGIN SC_STRING;
+ start_text();
   }
        YY_BREAK
 case 120:
 /* rule 120 can match eol */
 YY_RULE_SETUP
-#line 785 "src/scan-gram.l"
+#line 782 "src/scan-gram.l"
 {
     STRING_GROW;
     context_state = YY_START;
     token_start = loc->start;
     BEGIN SC_COMMENT;
+ start_text();
   }
        YY_BREAK
 case 121:
 /* rule 121 can match eol */
 YY_RULE_SETUP
-#line 791 "src/scan-gram.l"
+#line 789 "src/scan-gram.l"
 {
     STRING_GROW;
     context_state = YY_START;
     BEGIN SC_LINE_COMMENT;
+ start_text();
   }
        YY_BREAK
 
@@ -2753,26 +2752,26 @@ YY_RULE_SETUP
 case 122:
 /* rule 122 can match eol */
 YY_RULE_SETUP
-#line 807 "src/scan-gram.l"
-STRING_GROW; nesting++;
+#line 806 "src/scan-gram.l"
+STRING_GROW; nesting++; start_text();
        YY_BREAK
 case 123:
 /* rule 123 can match eol */
 YY_RULE_SETUP
-#line 808 "src/scan-gram.l"
-STRING_GROW; nesting--;
+#line 807 "src/scan-gram.l"
+STRING_GROW; nesting--; start_text();
        YY_BREAK
 /* Tokenize '<<%' correctly (as '<<' '%') rather than incorrrectly
      (as '<' '<%').  */
 case 124:
 /* rule 124 can match eol */
 YY_RULE_SETUP
-#line 812 "src/scan-gram.l"
-STRING_GROW;
+#line 811 "src/scan-gram.l"
+STRING_GROW; start_text();
        YY_BREAK
 case YY_STATE_EOF(SC_BRACED_CODE):
 case YY_STATE_EOF(SC_PREDICATE):
-#line 814 "src/scan-gram.l"
+#line 813 "src/scan-gram.l"
 unexpected_eof (code_start, "}");
        YY_BREAK
 
@@ -2780,7 +2779,7 @@ unexpected_eof (code_start, "}");
 
 case 125:
 YY_RULE_SETUP
-#line 819 "src/scan-gram.l"
+#line 818 "src/scan-gram.l"
 {
     obstack_1grow (&obstack_for_string, '}');
 
@@ -2792,7 +2791,7 @@ YY_RULE_SETUP
         val->code = last_string;
         BEGIN INITIAL;
 #if 1
piece_append("</PYACC_Text>");
stop_text();
  piece_esc(gram_text, strlen(gram_text));
  piece_append("</PYACC_BracedCode>");
  piece_pack();
@@ -2808,7 +2807,7 @@ YY_RULE_SETUP
 
 case 126:
 YY_RULE_SETUP
-#line 844 "src/scan-gram.l"
+#line 843 "src/scan-gram.l"
 {
     --nesting;
     if (nesting < 0)
@@ -2818,7 +2817,7 @@ YY_RULE_SETUP
         val->code = last_string;
         BEGIN INITIAL;
 #if 1
piece_append("</PYACC_Text>");
stop_text();
  piece_esc(gram_text, strlen(gram_text));
  piece_append("</PYACC_BracedPredicate>");
  piece_pack();
@@ -2839,14 +2838,14 @@ YY_RULE_SETUP
 
 case 127:
 YY_RULE_SETUP
-#line 873 "src/scan-gram.l"
+#line 872 "src/scan-gram.l"
 {
     STRING_FINISH;
     loc->start = code_start;
     val->code = last_string;
     BEGIN INITIAL;
 #if 1
piece_append("</PYACC_Text>");
stop_text();
  piece_esc(gram_text, strlen(gram_text));
  piece_append("</PYACC_Section1_Prologue>");
  piece_pack();
@@ -2857,7 +2856,7 @@ YY_RULE_SETUP
   }
        YY_BREAK
 case YY_STATE_EOF(SC_PROLOGUE):
-#line 889 "src/scan-gram.l"
+#line 888 "src/scan-gram.l"
 unexpected_eof (code_start, "%}");
        YY_BREAK
 
@@ -2868,7 +2867,7 @@ unexpected_eof (code_start, "%}");
 
 
 case YY_STATE_EOF(SC_EPILOGUE):
-#line 900 "src/scan-gram.l"
+#line 899 "src/scan-gram.l"
 {
     STRING_FINISH;
     loc->start = code_start;
@@ -2882,19 +2881,19 @@ case YY_STATE_EOF(SC_EPILOGUE):
   | By default, grow the string obstack with the input.  |
   `-----------------------------------------------------*/
 case 128:
-#line 915 "src/scan-gram.l"
+#line 914 "src/scan-gram.l"
 case 129:
 /* rule 129 can match eol */
 YY_RULE_SETUP
-#line 915 "src/scan-gram.l"
-STRING_GROW;
+#line 914 "src/scan-gram.l"
+STRING_GROW; start_text();
        YY_BREAK
 case 130:
 YY_RULE_SETUP
 #line 917 "src/scan-gram.l"
 YY_FATAL_ERROR( "flex scanner jammed" );
        YY_BREAK
-#line 2786 "src/scan-gram.c"
+#line 2785 "src/scan-gram.c"
 case YY_STATE_EOF(SC_RETURN_BRACKETED_ID):
        yyterminate();
 
@@ -4260,7 +4259,14 @@ gram_scanner_free (void)
 }
 
 /* Nick */
-static void flush_text(void) {
+static void start_text(void) {
+ if (in_text == 0) {
+  piece_append("<PYACC_Text>");
+  in_text = 1;
+ }
+}
+
+static void stop_text(void) {
  if (in_text) {
   piece_append("</PYACC_Text>");
   in_text = 0;
index b553121..ad09fce 100644 (file)
@@ -103,7 +103,8 @@ static void unexpected_newline (boundary, char const *);
 
 /* Nick */
 static int in_text;
-static void flush_text(void);
+static void start_text(void);
+static void stop_text(void);
 
 %}
  /* A C-like comment in directives/rules. */
@@ -332,13 +333,13 @@ eqopt    ([[:space:]]*=)?
   }
 
   /* Characters.  */
-  "'"         token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER; piece_pack(); piece_append("<PYACC_Char>"); in_text = 0;
+  "'"         token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER; piece_pack(); piece_append("<PYACC_Char>");
 
   /* Strings. */
-  "\""        token_start = loc->start; BEGIN SC_ESCAPED_STRING; piece_pack(); piece_append("<PYACC_String>"); in_text = 0;
+  "\""        token_start = loc->start; BEGIN SC_ESCAPED_STRING; piece_pack(); piece_append("<PYACC_String>");
 
   /* Prologue. */
-  "%{"        code_start = loc->start; BEGIN SC_PROLOGUE; piece_pack(); piece_append("<PYACC_Section1_Prologue>"); flush(); piece_append("<PYACC_Text>");
+  "%{"        code_start = loc->start; BEGIN SC_PROLOGUE; piece_pack(); piece_append("<PYACC_Section1_Prologue>"); flush(); start_text();
 
   /* Code in between braces.  */
   "{" {
@@ -348,8 +349,6 @@ eqopt    ([[:space:]]*=)?
     BEGIN SC_BRACED_CODE;
  piece_pack();
  piece_append("<PYACC_BracedCode>");
- flush();
- piece_append("<PYACC_Text>");
   }
 
   /* Semantic predicate. */
@@ -358,8 +357,6 @@ eqopt    ([[:space:]]*=)?
     code_start = loc->start;
  piece_pack();
  piece_append("<PYACC_BracedPredicate>");
- flush();
- piece_append("<PYACC_Text>");
     BEGIN SC_PREDICATE;
   }
 
@@ -377,7 +374,10 @@ eqopt    ([[:space:]]*=)?
   "%%" {
     static int percent_percent_count;
     if (++percent_percent_count == 2)
+ {
       BEGIN SC_EPILOGUE;
+  in_text = 1; /* not really in text, just suppress the <PYACC_Text> tag */
+ }
     return PERCENT_PERCENT;
   }
 
@@ -573,7 +573,7 @@ eqopt    ([[:space:]]*=)?
     val->code = last_string;
     BEGIN INITIAL;
 #if 1
flush_text();
stop_text();
  piece_esc(yytext, strlen(yytext));
  piece_append("</PYACC_String>");
  piece_pack();
@@ -611,7 +611,7 @@ eqopt    ([[:space:]]*=)?
     STRING_FREE;
     BEGIN INITIAL;
 #if 1
flush_text();
stop_text();
  piece_esc(yytext, strlen(yytext));
  piece_append("</PYACC_Char>");
  piece_pack();
@@ -673,7 +673,7 @@ eqopt    ([[:space:]]*=)?
     else
  {
       obstack_1grow (&obstack_for_string, c);
-  flush_text();
+  stop_text();
   sprintf(piece_temp, "<PYACC_Escape char=\"%d\">", (int)c);
   piece_append(piece_temp);
   flush();
@@ -690,7 +690,7 @@ eqopt    ([[:space:]]*=)?
     else
  {
       obstack_1grow (&obstack_for_string, c);
-  flush_text();
+  stop_text();
   sprintf(piece_temp, "<PYACC_Escape char=\"%d\">", (int)c);
   piece_append(piece_temp);
   flush();
@@ -698,16 +698,16 @@ eqopt    ([[:space:]]*=)?
  }
   }
 
-  \\a   obstack_1grow (&obstack_for_string, '\a'); flush_text(); piece_append("<PYACC_Escape char=\"7\">"); flush(); piece_append("</PYACC_Escape>");
-  \\b   obstack_1grow (&obstack_for_string, '\b'); flush_text(); piece_append("<PYACC_Escape char=\"8\">"); flush(); piece_append("</PYACC_Escape>");
-  \\f   obstack_1grow (&obstack_for_string, '\f'); flush_text(); piece_append("<PYACC_Escape char=\"12\">"); flush(); piece_append("</PYACC_Escape>");
-  \\n   obstack_1grow (&obstack_for_string, '\n'); flush_text(); piece_append("<PYACC_Escape char=\"10\">"); flush(); piece_append("</PYACC_Escape>");
-  \\r   obstack_1grow (&obstack_for_string, '\r'); flush_text(); piece_append("<PYACC_Escape char=\"13\">"); flush(); piece_append("</PYACC_Escape>");
-  \\t   obstack_1grow (&obstack_for_string, '\t'); flush_text(); piece_append("<PYACC_Escape char=\"9\">"); flush(); piece_append("</PYACC_Escape>");
-  \\v   obstack_1grow (&obstack_for_string, '\v'); flush_text(); piece_append("<PYACC_Escape char=\"11\">"); flush(); piece_append("</PYACC_Escape>");
+  \\a   obstack_1grow (&obstack_for_string, '\a'); stop_text(); piece_append("<PYACC_Escape char=\"7\">"); flush(); piece_append("</PYACC_Escape>");
+  \\b   obstack_1grow (&obstack_for_string, '\b'); stop_text(); piece_append("<PYACC_Escape char=\"8\">"); flush(); piece_append("</PYACC_Escape>");
+  \\f   obstack_1grow (&obstack_for_string, '\f'); stop_text(); piece_append("<PYACC_Escape char=\"12\">"); flush(); piece_append("</PYACC_Escape>");
+  \\n   obstack_1grow (&obstack_for_string, '\n'); stop_text(); piece_append("<PYACC_Escape char=\"10\">"); flush(); piece_append("</PYACC_Escape>");
+  \\r   obstack_1grow (&obstack_for_string, '\r'); stop_text(); piece_append("<PYACC_Escape char=\"13\">"); flush(); piece_append("</PYACC_Escape>");
+  \\t   obstack_1grow (&obstack_for_string, '\t'); stop_text(); piece_append("<PYACC_Escape char=\"9\">"); flush(); piece_append("</PYACC_Escape>");
+  \\v   obstack_1grow (&obstack_for_string, '\v'); stop_text(); piece_append("<PYACC_Escape char=\"11\">"); flush(); piece_append("</PYACC_Escape>");
 
   /* \\[\"\'?\\] would be shorter, but it confuses xgettext.  */
-  \\("\""|"'"|"?"|"\\")  obstack_1grow (&obstack_for_string, yytext[1]); flush_text(); sprintf(piece_temp, "<PYACC_Escape char=\"%d\">", yytext[1]); piece_append(piece_temp); flush(); piece_append("</PYACC_Escape>"); 
+  \\("\""|"'"|"?"|"\\")  obstack_1grow (&obstack_for_string, yytext[1]); stop_text(); sprintf(piece_temp, "<PYACC_Escape char=\"%d\">", yytext[1]); piece_append(piece_temp); flush(); piece_append("</PYACC_Escape>"); 
  
   \\(u|U[0-9abcdefABCDEF]{4})[0-9abcdefABCDEF]{4} {
     int c = convert_ucn_to_byte (yytext);
@@ -717,7 +717,6 @@ eqopt    ([[:space:]]*=)?
     else
  {
       obstack_1grow (&obstack_for_string, c);
-  flush_text();
   sprintf(piece_temp, "<PYACC_Escape char=\"%d\">", c);
   piece_append(piece_temp);
   flush();
@@ -733,10 +732,6 @@ eqopt    ([[:space:]]*=)?
       p = quotearg_style_mem (escape_quoting_style, p, 1);
     complain (loc, complaint, _("invalid character after \\-escape: %s"),
                  p);
- if (in_text == 0) {
-  piece_append("<PYACC_Text>");
-  in_text = 1;
- }
   }
 }
 
@@ -775,23 +770,27 @@ eqopt    ([[:space:]]*=)?
     context_state = YY_START;
     token_start = loc->start;
     BEGIN SC_CHARACTER;
+ start_text();
   }
   "\"" {
     STRING_GROW;
     context_state = YY_START;
     token_start = loc->start;
     BEGIN SC_STRING;
+ start_text();
   }
   "/"{splice}"*" {
     STRING_GROW;
     context_state = YY_START;
     token_start = loc->start;
     BEGIN SC_COMMENT;
+ start_text();
   }
   "/"{splice}"/" {
     STRING_GROW;
     context_state = YY_START;
     BEGIN SC_LINE_COMMENT;
+ start_text();
   }
 }
 
@@ -804,12 +803,12 @@ eqopt    ([[:space:]]*=)?
 
 <SC_BRACED_CODE,SC_PREDICATE>
 {
-  "{"|"<"{splice}"%"  STRING_GROW; nesting++;
-  "%"{splice}">"      STRING_GROW; nesting--;
+  "{"|"<"{splice}"%"  STRING_GROW; nesting++; start_text();
+  "%"{splice}">"      STRING_GROW; nesting--; start_text();
 
   /* Tokenize '<<%' correctly (as '<<' '%') rather than incorrrectly
      (as '<' '<%').  */
-  "<"{splice}"<"  STRING_GROW;
+  "<"{splice}"<"  STRING_GROW; start_text();
 
   <<EOF>>   unexpected_eof (code_start, "}");
 }
@@ -827,7 +826,7 @@ eqopt    ([[:space:]]*=)?
         val->code = last_string;
         BEGIN INITIAL;
 #if 1
piece_append("</PYACC_Text>");
stop_text();
  piece_esc(yytext, strlen(yytext));
  piece_append("</PYACC_BracedCode>");
  piece_pack();
@@ -850,7 +849,7 @@ eqopt    ([[:space:]]*=)?
         val->code = last_string;
         BEGIN INITIAL;
 #if 1
piece_append("</PYACC_Text>");
stop_text();
  piece_esc(yytext, strlen(yytext));
  piece_append("</PYACC_BracedPredicate>");
  piece_pack();
@@ -876,7 +875,7 @@ eqopt    ([[:space:]]*=)?
     val->code = last_string;
     BEGIN INITIAL;
 #if 1
piece_append("</PYACC_Text>");
stop_text();
  piece_esc(yytext, strlen(yytext));
  piece_append("</PYACC_Section1_Prologue>");
  piece_pack();
@@ -912,7 +911,8 @@ eqopt    ([[:space:]]*=)?
   `-----------------------------------------------------*/
 
 <SC_COMMENT,SC_LINE_COMMENT,SC_BRACED_CODE,SC_PREDICATE,SC_PROLOGUE,SC_EPILOGUE,SC_STRING,SC_CHARACTER,SC_ESCAPED_STRING,SC_ESCAPED_CHARACTER>. |
-  <SC_COMMENT,SC_LINE_COMMENT,SC_BRACED_CODE,SC_PREDICATE,SC_PROLOGUE,SC_EPILOGUE>\n    STRING_GROW;
+  <SC_COMMENT,SC_LINE_COMMENT,SC_BRACED_CODE,SC_PREDICATE,SC_PROLOGUE,SC_EPILOGUE>\n    STRING_GROW; start_text();
+
 
 %%
 
@@ -1144,7 +1144,14 @@ gram_scanner_free (void)
 }
 
 /* Nick */
-static void flush_text(void) {
+static void start_text(void) {
+ if (in_text == 0) {
+  piece_append("<PYACC_Text>");
+  in_text = 1;
+ }
+}
+
+static void stop_text(void) {
  if (in_text) {
   piece_append("</PYACC_Text>");
   in_text = 0;