]> git.saurik.com Git - bison.git/commitdiff
%define: accept unquoted values.
authorJoel E. Denny <jdenny@clemson.edu>
Fri, 28 Aug 2009 07:46:37 +0000 (03:46 -0400)
committerJoel E. Denny <jdenny@clemson.edu>
Fri, 28 Aug 2009 12:04:11 +0000 (08:04 -0400)
* NEWS (2.5): Group all %define changes together, and document
this one.  Remove quotes in IELR and canonical LR entry.
* doc/bison.texinfo: Remove quotes in most examples throughout.
(Decl Summary): Update %define documentation.
(Table of Symbols): Likewise.
* src/ielr.c (LrType): Update documentation.
* src/parse-gram.y (content.opt): Add production for ID.
* tests/calc.at: Likewise.
* tests/existing.at: Likewise.
* tests/input.at: Likewise.
* tests/local.at: Likewise.
* tests/push.at: Likewise.
* tests/reduce.at: Likewise.
* tests/torture.at: Likewise.
(cherry picked from commit cf499cff31eabd04e37107484647bdd453137d1d)

Conflicts:

doc/bison.texinfo
src/parse-gram.c
src/parse-gram.h
tests/actions.at
tests/calc.at

13 files changed:
ChangeLog
NEWS
doc/bison.texinfo
src/ielr.c
src/parse-gram.c
src/parse-gram.y
tests/calc.at
tests/existing.at
tests/input.at
tests/local.at
tests/push.at
tests/reduce.at
tests/torture.at

index 360854c17ed016977aa4cb817f9acfd84f94d11d..54db9976e5705aa258bba2c509cdcab611bf603a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+2009-08-28  Joel E. Denny  <jdenny@clemson.edu>
+
+       %define: accept unquoted values.
+       * NEWS (2.5): Group all %define changes together, and document
+       this one.  Remove quotes in IELR and canonical LR entry.
+       * doc/bison.texinfo: Remove quotes in most examples throughout.
+       (Decl Summary): Update %define documentation.
+       (Table of Symbols): Likewise.
+       * src/ielr.c (LrType): Update documentation.
+       * src/parse-gram.y (content.opt): Add production for ID.
+       * tests/calc.at: Likewise.
+       * tests/existing.at: Likewise.
+       * tests/input.at: Likewise.
+       * tests/local.at: Likewise.
+       * tests/push.at: Likewise.
+       * tests/reduce.at: Likewise.
+       * tests/torture.at: Likewise.
+
 2009-08-28  Joel E. Denny  <jdenny@clemson.edu>
 
        %define lr.type: make values lowercase IDs.
 2009-08-28  Joel E. Denny  <jdenny@clemson.edu>
 
        %define lr.type: make values lowercase IDs.
diff --git a/NEWS b/NEWS
index 3dab543cf77fc4dbc05bea9f2df44462bfb08942..0086f414a78e30dc6235c58214116dcc5c9ebc35 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -20,9 +20,9 @@ Bison News
   default.  You can specify the type of parser tables in the grammar
   file with these directives:
 
   default.  You can specify the type of parser tables in the grammar
   file with these directives:
 
-    %define lr.type "lalr"
-    %define lr.type "ielr"
-    %define lr.type "canonical-lr"
+    %define lr.type lalr
+    %define lr.type ielr
+    %define lr.type canonical-lr
 
   The default reduction optimization in the parser tables can also be
   adjusted using `%define lr.default-reductions'.  See the documentation
 
   The default reduction optimization in the parser tables can also be
   adjusted using `%define lr.default-reductions'.  See the documentation
@@ -33,9 +33,11 @@ Bison News
   These features are experimental.  More user feedback will help to
   stabilize them.
 
   These features are experimental.  More user feedback will help to
   stabilize them.
 
-** Multiple %define's for any variable is now an error not a warning.
+** %define improvements.
 
 
-** %define can now be invoked via the command line.
+*** Multiple invocations for any variable is now an error not a warning.
+
+*** Can now be invoked via the command line.
 
   Each of these command-line options
 
 
   Each of these command-line options
 
@@ -54,7 +56,7 @@ Bison News
   quietly override %define, but -D and --define do not.  For further
   details, see the section "Bison Options" in the Bison manual.
 
   quietly override %define, but -D and --define do not.  For further
   details, see the section "Bison Options" in the Bison manual.
 
-** %define variables renamed.
+*** Variables renamed.
 
   The following %define variables
 
 
   The following %define variables
 
@@ -69,7 +71,18 @@ Bison News
   The old names are now deprecated but will be maintained indefinitely
   for backward compatibility.
 
   The old names are now deprecated but will be maintained indefinitely
   for backward compatibility.
 
-** Symbols names
+*** Values no longer need to be quoted in grammar file.
+
+  If a %define value is an identifier, it no longer needs to be placed
+  within quotations marks.  For example,
+
+    %define api.push-pull "push"
+
+  can be rewritten as
+
+    %define api.push-pull push
+
+** Symbol names.
 
   Consistently with directives (such as %error-verbose) and variables
   (e.g. push-pull), symbol names may include dashes in any position,
 
   Consistently with directives (such as %error-verbose) and variables
   (e.g. push-pull), symbol names may include dashes in any position,
index 8ed32e0cc764f1e86e2717d1da2bc88929aeb71e..3e50f5ac37a28346951a2bcf119b9ff7f70135f9 100644 (file)
@@ -4580,7 +4580,7 @@ The following Bison declaration says that you want the parser to be a push
 parser (@pxref{Decl Summary,,%define api.push-pull}):
 
 @example
 parser (@pxref{Decl Summary,,%define api.push-pull}):
 
 @example
-%define api.push-pull "push"
+%define api.push-pull push
 @end example
 
 In almost all cases, you want to ensure that your push parser is also
 @end example
 
 In almost all cases, you want to ensure that your push parser is also
@@ -4591,7 +4591,7 @@ what you are doing, your declarations should look like this:
 
 @example
 %define api.pure
 
 @example
 %define api.pure
-%define api.push-pull "push"
+%define api.push-pull push
 @end example
 
 There is a major notable functional difference between the pure push parser
 @end example
 
 There is a major notable functional difference between the pure push parser
@@ -4640,14 +4640,14 @@ for use by the next invocation of the @code{yypush_parse} function.
 
 Bison also supports both the push parser interface along with the pull parser
 interface in the same generated parser.  In order to get this functionality,
 
 Bison also supports both the push parser interface along with the pull parser
 interface in the same generated parser.  In order to get this functionality,
-you should replace the @code{%define api.push-pull "push"} declaration with the
-@code{%define api.push-pull "both"} declaration.  Doing this will create all of
+you should replace the @code{%define api.push-pull push} declaration with the
+@code{%define api.push-pull both} declaration.  Doing this will create all of
 the symbols mentioned earlier along with the two extra symbols, @code{yyparse}
 and @code{yypull_parse}.  @code{yyparse} can be used exactly as it normally
 would be used.  However, the user should note that it is implemented in the
 generated parser by calling @code{yypull_parse}.
 This makes the @code{yyparse} function that is generated with the
 the symbols mentioned earlier along with the two extra symbols, @code{yyparse}
 and @code{yypull_parse}.  @code{yyparse} can be used exactly as it normally
 would be used.  However, the user should note that it is implemented in the
 generated parser by calling @code{yypull_parse}.
 This makes the @code{yyparse} function that is generated with the
-@code{%define api.push-pull "both"} declaration slower than the normal
+@code{%define api.push-pull both} declaration slower than the normal
 @code{yyparse} function.  If the user
 calls the @code{yypull_parse} function it will parse the rest of the input
 stream.  It is possible to @code{yypush_parse} tokens to select a subgrammar
 @code{yyparse} function.  If the user
 calls the @code{yypull_parse} function it will parse the rest of the input
 stream.  It is possible to @code{yypush_parse} tokens to select a subgrammar
@@ -4664,8 +4664,8 @@ yypstate_delete (ps);
 @end example
 
 Adding the @code{%define api.pure} declaration does exactly the same thing to
 @end example
 
 Adding the @code{%define api.pure} declaration does exactly the same thing to
-the generated parser with @code{%define api.push-pull "both"} as it did for
-@code{%define api.push-pull "push"}.
+the generated parser with @code{%define api.push-pull both} as it did for
+@code{%define api.push-pull push}.
 
 @node Decl Summary
 @subsection Bison Declaration Summary
 
 @node Decl Summary
 @subsection Bison Declaration Summary
@@ -4834,6 +4834,7 @@ already defined, so that the debugging facilities are compiled.
 @end deffn
 
 @deffn {Directive} %define @var{variable}
 @end deffn
 
 @deffn {Directive} %define @var{variable}
+@deffnx {Directive} %define @var{variable} @var{value}
 @deffnx {Directive} %define @var{variable} "@var{value}"
 Define a variable to adjust Bison's behavior.
 The possible choices for @var{variable}, as well as their meanings, depend on
 @deffnx {Directive} %define @var{variable} "@var{value}"
 Define a variable to adjust Bison's behavior.
 The possible choices for @var{variable}, as well as their meanings, depend on
@@ -4843,7 +4844,11 @@ Summary,,%language}, @pxref{Decl Summary,,%skeleton}).
 It is an error if a @var{variable} is defined by @code{%define} multiple
 times, but see @ref{Bison Options,,-D @var{name}[=@var{value}]}.
 
 It is an error if a @var{variable} is defined by @code{%define} multiple
 times, but see @ref{Bison Options,,-D @var{name}[=@var{value}]}.
 
-Omitting @code{"@var{value}"} is always equivalent to specifying it as
+@var{value} must be placed in quotation marks if it contains any
+character other than a letter, underscore, period, dash, or non-initial
+digit.
+
+Omitting @code{"@var{value}"} entirely is always equivalent to specifying
 @code{""}.
 
 Some @var{variable}s may be used as Booleans.
 @code{""}.
 
 Some @var{variable}s may be used as Booleans.
@@ -4851,12 +4856,12 @@ In this case, Bison will complain if the variable definition does not meet one
 of the following four conditions:
 
 @enumerate
 of the following four conditions:
 
 @enumerate
-@item @code{"@var{value}"} is @code{"true"}
+@item @code{@var{value}} is @code{true}
 
 
-@item @code{"@var{value}"} is omitted (or is @code{""}).
-This is equivalent to @code{"true"}.
+@item @code{@var{value}} is omitted (or @code{""} is specified).
+This is equivalent to @code{true}.
 
 
-@item @code{"@var{value}"} is @code{"false"}.
+@item @code{@var{value}} is @code{false}.
 
 @item @var{variable} is never defined.
 In this case, Bison selects a default value, which may depend on the selected
 
 @item @var{variable} is never defined.
 In this case, Bison selects a default value, which may depend on the selected
@@ -4877,7 +4882,7 @@ Some of the accepted @var{variable}s are:
 
 @item Accepted Values: Boolean
 
 
 @item Accepted Values: Boolean
 
-@item Default Value: @code{"false"}
+@item Default Value: @code{false}
 @end itemize
 
 @item api.push-pull
 @end itemize
 
 @item api.push-pull
@@ -4891,9 +4896,9 @@ Some of the accepted @var{variable}s are:
 (The current push parsing interface is experimental and may evolve.
 More user feedback will help to stabilize it.)
 
 (The current push parsing interface is experimental and may evolve.
 More user feedback will help to stabilize it.)
 
-@item Accepted Values: @code{"pull"}, @code{"push"}, @code{"both"}
+@item Accepted Values: @code{pull}, @code{push}, @code{both}
 
 
-@item Default Value: @code{"pull"}
+@item Default Value: @code{pull}
 @end itemize
 
 @item lr.default-reductions
 @end itemize
 
 @item lr.default-reductions
@@ -4920,7 +4925,7 @@ More user feedback will help to stabilize it.)
 
 @item Accepted Values:
 @itemize
 
 @item Accepted Values:
 @itemize
-@item @code{"all"}.
+@item @code{all}.
 For @acronym{LALR} and @acronym{IELR} parsers (@pxref{Decl
 Summary,,lr.type}) by default, all states are permitted to contain
 default reductions.
 For @acronym{LALR} and @acronym{IELR} parsers (@pxref{Decl
 Summary,,lr.type}) by default, all states are permitted to contain
 default reductions.
@@ -4932,7 +4937,7 @@ That is, unlike in a canonical @acronym{LR} state, the lookahead sets of
 reductions in an @acronym{LALR} or @acronym{IELR} state can contain
 tokens that are syntactically incorrect for some left contexts.
 
 reductions in an @acronym{LALR} or @acronym{IELR} state can contain
 tokens that are syntactically incorrect for some left contexts.
 
-@item @code{"consistent"}.
+@item @code{consistent}.
 @cindex consistent states
 A consistent state is a state that has only one possible action.
 If that action is a reduction, then the parser does not need to request
 @cindex consistent states
 A consistent state is a state that has only one possible action.
 If that action is a reduction, then the parser does not need to request
@@ -4944,7 +4949,7 @@ states, then a canonical @acronym{LR} parser reports a syntax error as
 soon as it @emph{needs} the syntactically unacceptable token from the
 scanner.
 
 soon as it @emph{needs} the syntactically unacceptable token from the
 scanner.
 
-@item @code{"accepting"}.
+@item @code{accepting}.
 @cindex accepting state
 By default, the only default reduction permitted in a canonical
 @acronym{LR} parser is the accept action in the accepting state, which
 @cindex accepting state
 By default, the only default reduction permitted in a canonical
 @acronym{LR} parser is the accept action in the accepting state, which
@@ -4956,8 +4961,8 @@ without performing any extra reductions.
 
 @item Default Value:
 @itemize
 
 @item Default Value:
 @itemize
-@item @code{"accepting"} if @code{lr.type} is @code{"canonical-lr"}.
-@item @code{"all"} otherwise.
+@item @code{accepting} if @code{lr.type} is @code{canonical-lr}.
+@item @code{all} otherwise.
 @end itemize
 @end itemize
 
 @end itemize
 @end itemize
 
@@ -4978,7 +4983,7 @@ are useless in the generated parser.
 
 @item Accepted Values: Boolean
 
 
 @item Accepted Values: Boolean
 
-@item Default Value: @code{"false"}
+@item Default Value: @code{false}
 
 @item Caveats:
 
 
 @item Caveats:
 
@@ -5020,7 +5025,7 @@ More user feedback will help to stabilize it.)
 
 @item Accepted Values:
 @itemize
 
 @item Accepted Values:
 @itemize
-@item @code{"lalr"}.
+@item @code{lalr}.
 While Bison generates @acronym{LALR} parser tables by default for
 historical reasons, @acronym{IELR} or canonical @acronym{LR} is almost
 always preferable for deterministic parsers.
 While Bison generates @acronym{LALR} parser tables by default for
 historical reasons, @acronym{IELR} or canonical @acronym{LR} is almost
 always preferable for deterministic parsers.
@@ -5049,7 +5054,7 @@ investigate such problems while ignoring the more subtle differences
 from @acronym{IELR} and canonical @acronym{LR}.
 @end itemize
 
 from @acronym{IELR} and canonical @acronym{LR}.
 @end itemize
 
-@item @code{"ielr"}.
+@item @code{ielr}.
 @acronym{IELR} is a minimal @acronym{LR} algorithm.
 That is, given any grammar (@acronym{LR} or non-@acronym{LR}),
 @acronym{IELR} and canonical @acronym{LR} always accept exactly the same
 @acronym{IELR} is a minimal @acronym{LR} algorithm.
 That is, given any grammar (@acronym{LR} or non-@acronym{LR}),
 @acronym{IELR} and canonical @acronym{LR} always accept exactly the same
@@ -5063,7 +5068,7 @@ grammars, the number of conflicts for @acronym{IELR} is often an order
 of magnitude less as well.
 This can significantly reduce the complexity of developing of a grammar.
 
 of magnitude less as well.
 This can significantly reduce the complexity of developing of a grammar.
 
-@item @code{"canonical-lr"}.
+@item @code{canonical-lr}.
 @cindex delayed syntax errors
 @cindex syntax errors delayed
 The only advantage of canonical @acronym{LR} over @acronym{IELR} is
 @cindex delayed syntax errors
 @cindex syntax errors delayed
 The only advantage of canonical @acronym{LR} over @acronym{IELR} is
@@ -5079,7 +5084,7 @@ Even when canonical @acronym{LR} behavior is ultimately desired,
 facilitate the development of a grammar.
 @end itemize
 
 facilitate the development of a grammar.
 @end itemize
 
-@item Default Value: @code{"lalr"}
+@item Default Value: @code{lalr}
 @end itemize
 
 @item namespace
 @end itemize
 
 @item namespace
@@ -5460,8 +5465,8 @@ exp: @dots{}    @{ @dots{}; *randomness += 1; @dots{} @}
 More user feedback will help to stabilize it.)
 
 You call the function @code{yypush_parse} to parse a single token.  This
 More user feedback will help to stabilize it.)
 
 You call the function @code{yypush_parse} to parse a single token.  This
-function is available if either the @code{%define api.push-pull "push"} or
-@code{%define api.push-pull "both"} declaration is used.
+function is available if either the @code{%define api.push-pull push} or
+@code{%define api.push-pull both} declaration is used.
 @xref{Push Decl, ,A Push Parser}.
 
 @deftypefun int yypush_parse (yypstate *yyps)
 @xref{Push Decl, ,A Push Parser}.
 
 @deftypefun int yypush_parse (yypstate *yyps)
@@ -5478,7 +5483,7 @@ is required to finish parsing the grammar.
 More user feedback will help to stabilize it.)
 
 You call the function @code{yypull_parse} to parse the rest of the input
 More user feedback will help to stabilize it.)
 
 You call the function @code{yypull_parse} to parse the rest of the input
-stream.  This function is available if the @code{%define api.push-pull "both"}
+stream.  This function is available if the @code{%define api.push-pull both}
 declaration is used.
 @xref{Push Decl, ,A Push Parser}.
 
 declaration is used.
 @xref{Push Decl, ,A Push Parser}.
 
@@ -5494,8 +5499,8 @@ The value returned by @code{yypull_parse} is the same as for @code{yyparse}.
 More user feedback will help to stabilize it.)
 
 You call the function @code{yypstate_new} to create a new parser instance.
 More user feedback will help to stabilize it.)
 
 You call the function @code{yypstate_new} to create a new parser instance.
-This function is available if either the @code{%define api.push-pull "push"} or
-@code{%define api.push-pull "both"} declaration is used.
+This function is available if either the @code{%define api.push-pull push} or
+@code{%define api.push-pull both} declaration is used.
 @xref{Push Decl, ,A Push Parser}.
 
 @deftypefun yypstate *yypstate_new (void)
 @xref{Push Decl, ,A Push Parser}.
 
 @deftypefun yypstate *yypstate_new (void)
@@ -5513,8 +5518,8 @@ allocated.
 More user feedback will help to stabilize it.)
 
 You call the function @code{yypstate_delete} to delete a parser instance.
 More user feedback will help to stabilize it.)
 
 You call the function @code{yypstate_delete} to delete a parser instance.
-function is available if either the @code{%define api.push-pull "push"} or
-@code{%define api.push-pull "both"} declaration is used.
+function is available if either the @code{%define api.push-pull push} or
+@code{%define api.push-pull both} declaration is used.
 @xref{Push Decl, ,A Push Parser}.
 
 @deftypefun void yypstate_delete (yypstate *yyps)
 @xref{Push Decl, ,A Push Parser}.
 
 @deftypefun void yypstate_delete (yypstate *yyps)
@@ -9022,7 +9027,7 @@ in a file; Bison itself defines a class representing a @dfn{location},
 a range composed of a pair of positions (possibly spanning several
 files).  The location class is an inner class of the parser; the name
 is @code{Location} by default, and may also be renamed using
 a range composed of a pair of positions (possibly spanning several
 files).  The location class is an inner class of the parser; the name
 is @code{Location} by default, and may also be renamed using
-@code{%define location_type "@var{class-name}}.
+@code{%define location_type "@var{class-name}"}.
 
 The location class treats the position as a completely opaque value.
 By default, the class name is @code{Position}, but this can be changed
 
 The location class treats the position as a completely opaque value.
 By default, the class name is @code{Position}, but this can be changed
@@ -9965,6 +9970,7 @@ Precedence}.
 
 @deffn {Directive} %define @var{define-variable}
 @deffnx {Directive} %define @var{define-variable} @var{value}
 
 @deffn {Directive} %define @var{define-variable}
 @deffnx {Directive} %define @var{define-variable} @var{value}
+@deffnx {Directive} %define @var{define-variable} "@var{value}"
 Define a variable to adjust Bison's behavior.
 @xref{Decl Summary,,%define}.
 @end deffn
 Define a variable to adjust Bison's behavior.
 @xref{Decl Summary,,%define}.
 @end deffn
index 399d53be9b8cf1d914aecf4d1122e24f7c0ac45c..657c3a1d942bad08e8c77c33a6d6a1393b15b4a9 100644 (file)
@@ -35,7 +35,7 @@
 #include "state.h"
 #include "symtab.h"
 
 #include "state.h"
 #include "symtab.h"
 
-/** Records the value of the \%define variable "lr.type".  */
+/** Records the value of the \%define variable lr.type.  */
 typedef enum { LR_TYPE__LALR, LR_TYPE__IELR, LR_TYPE__CANONICAL_LR } LrType;
 
 /**
 typedef enum { LR_TYPE__LALR, LR_TYPE__IELR, LR_TYPE__CANONICAL_LR } LrType;
 
 /**
index d6d3d537bbb472cda15808f2c10efa6e1db4cf4e..742e0fd73376768f163c37053a30dee26037d373 100644 (file)
@@ -560,16 +560,16 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  3
 /* YYLAST -- Last index in YYTABLE.  */
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  3
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   159
+#define YYLAST   160
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  58
 /* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  34
 /* YYNRULES -- Number of rules.  */
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  58
 /* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  34
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  107
+#define YYNRULES  108
 /* YYNRULES -- Number of states.  */
 /* YYNRULES -- Number of states.  */
-#define YYNSTATES  147
+#define YYNSTATES  148
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
@@ -630,7 +630,7 @@ static const yytype_uint16 yyprhs[] =
      180,   182,   184,   187,   190,   194,   196,   199,   201,   204,
      206,   209,   212,   213,   218,   220,   224,   227,   228,   232,
      236,   240,   244,   248,   249,   251,   253,   255,   256,   258,
      180,   182,   184,   187,   190,   194,   196,   199,   201,   204,
      206,   209,   212,   213,   218,   220,   224,   227,   228,   232,
      236,   240,   244,   248,   249,   251,   253,   255,   256,   258,
-     260,   262,   264,   266,   268,   270,   272,   273
+     260,   262,   264,   266,   268,   270,   272,   274,   275
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
@@ -661,9 +661,9 @@ static const yytype_int8 yyrhs[] =
       81,    50,    82,    -1,    81,    52,    -1,    -1,    82,    89,
       83,    -1,    82,    43,    83,    -1,    82,    13,    89,    -1,
       82,    14,     4,    -1,    82,    15,    53,    -1,    -1,    56,
       81,    50,    82,    -1,    81,    52,    -1,    -1,    82,    89,
       83,    -1,    82,    43,    83,    -1,    82,    13,    89,    -1,
       82,    14,     4,    -1,    82,    15,    53,    -1,    -1,    56,
-      -1,    47,    -1,     3,    -1,    -1,     3,    -1,    43,    -1,
-      47,    -1,    44,    -1,    48,    -1,    87,    -1,    90,    -1,
-       3,    -1,    -1,    49,    45,    -1
+      -1,    47,    -1,     3,    -1,    -1,    47,    -1,     3,    -1,
+      43,    -1,    47,    -1,    44,    -1,    48,    -1,    87,    -1,
+      90,    -1,     3,    -1,    -1,    49,    45,    -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
@@ -678,8 +678,8 @@ static const yytype_uint16 yyrline[] =
      442,   443,   448,   450,   455,   456,   460,   461,   462,   463,
      468,   473,   478,   484,   490,   501,   502,   511,   512,   518,
      519,   520,   527,   527,   532,   533,   534,   539,   541,   543,
      442,   443,   448,   450,   455,   456,   460,   461,   462,   463,
      468,   473,   478,   484,   490,   501,   502,   511,   512,   518,
      519,   520,   527,   527,   532,   533,   534,   539,   541,   543,
-     545,   547,   549,   554,   556,   567,   568,   573,   574,   583,
-     603,   605,   614,   619,   620,   625,   632,   634
+     545,   547,   549,   554,   556,   567,   568,   573,   574,   575,
+     584,   604,   606,   615,   620,   621,   626,   633,   635
 };
 #endif
 
 };
 #endif
 
@@ -739,8 +739,8 @@ static const yytype_uint8 yyr1[] =
       71,    71,    72,    72,    73,    73,    74,    74,    74,    74,
       75,    75,    75,    75,    75,    76,    76,    77,    77,    78,
       78,    78,    80,    79,    81,    81,    81,    82,    82,    82,
       71,    71,    72,    72,    73,    73,    74,    74,    74,    74,
       75,    75,    75,    75,    75,    76,    76,    77,    77,    78,
       78,    78,    80,    79,    81,    81,    81,    82,    82,    82,
-      82,    82,    82,    83,    83,    84,    84,    85,    85,    86,
-      87,    87,    88,    89,    89,    90,    91,    91
+      82,    82,    82,    83,    83,    84,    84,    85,    85,    85,
+      86,    87,    87,    88,    89,    89,    90,    91,    91
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
@@ -756,7 +756,7 @@ static const yytype_uint8 yyr2[] =
        1,     1,     2,     2,     3,     1,     2,     1,     2,     1,
        2,     2,     0,     4,     1,     3,     2,     0,     3,     3,
        3,     3,     3,     0,     1,     1,     1,     0,     1,     1,
        1,     1,     2,     2,     3,     1,     2,     1,     2,     1,
        2,     2,     0,     4,     1,     3,     2,     0,     3,     3,
        3,     3,     3,     0,     1,     1,     1,     0,     1,     1,
-       1,     1,     1,     1,     1,     1,     0,     2
+       1,     1,     1,     1,     1,     1,     1,     0,     2
 };
 
 /* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM.
 };
 
 /* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM.
@@ -769,25 +769,25 @@ static const yytype_uint8 yydefact[] =
        0,    16,     0,     0,     0,    20,     0,    41,    23,    24,
        0,     0,    28,     0,     0,     0,    31,    32,    33,     0,
        6,    34,    44,     4,     5,    36,    35,    56,     0,     0,
        0,    16,     0,     0,     0,    20,     0,    41,    23,    24,
        0,     0,    28,     0,     0,     0,    31,    32,    33,     0,
        6,    34,    44,     4,     5,    36,    35,    56,     0,     0,
-       0,     0,     0,    99,     0,    42,    96,    95,    97,    10,
+       0,     0,     0,   100,     0,    42,    96,    95,    97,    10,
       12,    13,    14,     0,    17,    18,    19,    21,     0,    25,
       12,    13,    14,     0,    17,    18,    19,    21,     0,    25,
-       0,    27,    29,    30,   105,   101,   100,   103,    37,   104,
-       0,   102,     0,     0,    77,    79,    93,    45,     0,    57,
+       0,    27,    29,    30,   106,   102,   101,   104,    37,   105,
+       0,   103,     0,     0,    77,    79,    93,    45,     0,    57,
        0,    70,    75,    50,    71,    48,    51,    62,    67,    68,
        0,    70,    75,    50,    71,    48,    51,    62,    67,    68,
-      69,    38,    64,    66,    39,    43,    98,     8,    15,    22,
-      26,    81,    80,     0,    78,     2,    94,    82,    46,    52,
-      58,    60,    76,    72,    73,    63,    65,   107,    87,    59,
-      61,    74,    83,    84,    87,    86,     0,     0,     0,    93,
-      93,    85,    90,    91,    92,    89,    88
+      69,    38,    64,    66,    39,    43,    99,    98,     8,    15,
+      22,    26,    81,    80,     0,    78,     2,    94,    82,    46,
+      52,    58,    60,    76,    72,    73,    63,    65,   108,    87,
+      59,    61,    74,    83,    84,    87,    86,     0,     0,     0,
+      93,    93,    85,    90,    91,    92,    89,    88
 };
 
 /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
       -1,     1,     2,    43,    82,    88,    45,    49,    48,    46,
 };
 
 /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
       -1,     1,     2,    43,    82,    88,    45,    49,    48,    46,
-      47,    90,   119,   120,    96,   101,   102,    92,    93,    83,
-      84,    85,   128,   132,   133,   117,    58,   107,    55,    77,
-      86,   103,    79,   115
+      47,    90,   120,   121,    96,   101,   102,    92,    93,    83,
+      84,    85,   129,   133,   134,   118,    58,   108,    55,    77,
+      86,   103,    79,   116
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
@@ -795,54 +795,55 @@ static const yytype_int16 yydefgoto[] =
 #define YYPACT_NINF -60
 static const yytype_int16 yypact[] =
 {
 #define YYPACT_NINF -60
 static const yytype_int16 yypact[] =
 {
-     -60,     4,   102,   -60,   -60,   -60,     7,    10,    22,   -60,
-     -60,   -60,    -6,   -60,   -60,    27,    40,   -60,    65,    72,
-       2,   -60,    35,    79,    47,   -60,    11,   -60,   -60,   -60,
-      25,    48,   -60,    89,    90,     0,   -60,   -60,   -60,    15,
-     -60,   -60,    52,   -60,   -60,   -60,   -60,    41,    -2,    -2,
-       0,    26,    26,   -60,    59,   -60,   -60,   -60,    92,   -60,
-     -60,   -60,   -60,   100,   -60,   -60,   -60,   -60,   101,   -60,
-     112,   -60,   -60,   -60,   -60,   -60,   -60,   -60,   -60,   -60,
-      64,   -60,    93,     1,   -60,   -60,    49,   -60,    59,   -60,
-       0,   -60,   -60,    -2,    83,    -2,     0,   -60,   -60,   -60,
+     -60,     4,   103,   -60,   -60,   -60,    -2,    -1,    10,   -60,
+     -60,   -60,    17,   -60,   -60,    27,    66,   -60,    72,    79,
+       2,   -60,    47,    88,    49,   -60,    11,   -60,   -60,   -60,
+      25,    50,   -60,    91,    92,     0,   -60,   -60,   -60,    15,
+     -60,   -60,    51,   -60,   -60,   -60,   -60,    48,    -8,    -8,
+       0,    26,    26,   -60,    60,   -60,   -60,   -60,    31,   -60,
+     -60,   -60,   -60,   101,   -60,   -60,   -60,   -60,   102,   -60,
+     113,   -60,   -60,   -60,   -60,   -60,   -60,   -60,   -60,   -60,
+      54,   -60,    65,     1,   -60,   -60,    62,   -60,    60,   -60,
+       0,   -60,   -60,    -8,    83,    -8,     0,   -60,   -60,   -60,
      -60,    26,   -60,   -60,    26,   -60,   -60,   -60,   -60,   -60,
      -60,    26,   -60,   -60,    26,   -60,   -60,   -60,   -60,   -60,
-     -60,   -60,   -60,   103,   -60,   -60,   -60,   -60,   -60,     0,
-     -60,   113,   -60,   143,   -60,   -60,   -60,   -60,   -60,   -60,
-     -60,   -60,   -16,    53,   -60,   -60,     0,   145,    94,    49,
-      49,    53,   -60,   -60,   -60,   -60,   -60
+     -60,   -60,   -60,   -60,   104,   -60,   -60,   -60,   -60,   -60,
+       0,   -60,   142,   -60,   144,   -60,   -60,   -60,   -60,   -60,
+     -60,   -60,   -60,    -9,    53,   -60,   -60,     0,   146,    95,
+      62,    62,    53,   -60,   -60,   -60,   -60,   -60
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-     -60,   -60,   -60,   -60,   148,   -60,   -60,   -60,   -60,   -60,
-     -60,   -60,   -60,    33,   -60,   104,   -42,   -18,   106,   -60,
-      74,   -60,   -60,   -60,    24,   -51,   -60,   -60,   -36,   -10,
+     -60,   -60,   -60,   -60,   149,   -60,   -60,   -60,   -60,   -60,
+     -60,   -60,   -60,    33,   -60,   105,   -42,   -18,   107,   -60,
+      75,   -60,   -60,   -60,    24,   -52,   -60,   -60,   -36,   -11,
      -60,   -35,   -59,   -60
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
    positive, shift that token.  If negative, reduce the rule which
    number is the opposite.  If YYTABLE_NINF, syntax error.  */
      -60,   -35,   -59,   -60
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
    positive, shift that token.  If negative, reduce the rule which
    number is the opposite.  If YYTABLE_NINF, syntax error.  */
-#define YYTABLE_NINF -107
+#define YYTABLE_NINF -108
 static const yytype_int16 yytable[] =
 {
 static const yytype_int16 yytable[] =
 {
-      78,  -106,    80,    74,     3,    62,     4,     5,     6,     7,
+      78,  -107,    80,    74,     3,    62,     4,     5,     6,     7,
        8,     9,    10,    11,    67,    97,    80,    12,   105,    14,
        4,     5,     6,     7,     8,     9,    10,    11,    69,    74,
        8,     9,    10,    11,    67,    97,    80,    12,   105,    14,
        4,     5,     6,     7,     8,     9,    10,    11,    69,    74,
-      56,    12,    27,    14,   134,   124,   135,    53,    94,    94,
-      35,    54,    75,    59,    75,    76,    27,    76,    63,    81,
-     113,    91,   118,    51,    35,   121,    74,    68,    42,   126,
-      50,   125,   126,    81,   131,    52,   136,   137,   138,    60,
-      75,    70,    42,    76,    57,   122,    61,   122,    64,    98,
-      99,   100,    65,    94,   121,    94,    74,   123,   145,   146,
-      66,    71,    72,    73,    89,   106,   139,    75,   140,    87,
-      76,   142,    53,   108,   109,   116,   140,     4,     5,     6,
-       7,     8,     9,    10,    11,   110,   111,   130,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,   112,    74,   144,   127,   143,
-      44,    39,   129,    40,    41,    95,   104,   114,   141,    42
+      56,    12,    27,    14,   106,   125,    75,    94,    94,    76,
+      35,   135,    51,   136,    75,    91,    27,    76,    63,    81,
+     114,    50,   119,    52,    35,   122,    74,    68,    42,   127,
+      53,   126,   127,    81,    54,   132,   137,   138,   139,    59,
+      75,    70,    42,    76,    57,   123,    60,   123,   107,    98,
+      99,   100,    94,    61,    94,   122,    74,   124,   146,   147,
+      64,    65,    66,    71,    72,    73,   140,    75,    87,   141,
+      76,    89,   143,    53,   109,   110,   112,   141,     4,     5,
+       6,     7,     8,     9,    10,    11,   111,   113,   117,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    38,   131,    74,   145,   128,
+     144,    44,    39,   130,    40,    41,    95,   104,   115,   142,
+      42
 };
 
 #define yypact_value_is_default(yystate) \
 };
 
 #define yypact_value_is_default(yystate) \
@@ -856,19 +857,20 @@ static const yytype_uint8 yycheck[] =
       35,     0,     1,     3,     0,     3,     5,     6,     7,     8,
        9,    10,    11,    12,     3,    50,     1,    16,    54,    18,
        5,     6,     7,     8,     9,    10,    11,    12,     3,     3,
       35,     0,     1,     3,     0,     3,     5,     6,     7,     8,
        9,    10,    11,    12,     3,    50,     1,    16,    54,    18,
        5,     6,     7,     8,     9,    10,    11,    12,     3,     3,
-       3,    16,    31,    18,    50,    94,    52,    43,    48,    49,
-      39,    47,    44,     3,    44,    47,    31,    47,    46,    48,
+       3,    16,    31,    18,     3,    94,    44,    48,    49,    47,
+      39,    50,    43,    52,    44,    53,    31,    47,    46,    48,
       49,    53,    88,    43,    39,    90,     3,    46,    57,   101,
       49,    53,    88,    43,    39,    90,     3,    46,    57,   101,
-      53,    96,   104,    48,   123,    43,    13,    14,    15,     4,
-      44,    46,    57,    47,    47,    93,     4,    95,    43,    53,
-      54,    55,     3,    93,   119,    95,     3,     4,   139,   140,
-      43,    43,     3,     3,    53,     3,    43,    44,   133,    47,
-      47,   136,    43,     3,     3,    56,   141,     5,     6,     7,
-       8,     9,    10,    11,    12,     3,    52,     4,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
-      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
-      38,    39,    40,    41,    42,    52,     3,    53,    45,     4,
-       2,    49,   119,    51,    52,    49,    52,    83,   134,    57
+      43,    96,   104,    48,    47,   124,    13,    14,    15,     3,
+      44,    46,    57,    47,    47,    93,     4,    95,    47,    53,
+      54,    55,    93,     4,    95,   120,     3,     4,   140,   141,
+      43,     3,    43,    43,     3,     3,    43,    44,    47,   134,
+      47,    53,   137,    43,     3,     3,    52,   142,     5,     6,
+       7,     8,     9,    10,    11,    12,     3,    52,    56,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    38,    39,    40,    41,    42,     4,     3,    53,    45,
+       4,     2,    49,   120,    51,    52,    49,    52,    83,   135,
+      57
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@ -885,11 +887,11 @@ static const yytype_uint8 yystos[] =
       46,    43,     3,     3,     3,    44,    47,    87,    89,    90,
        1,    48,    62,    77,    78,    79,    88,    47,    63,    53,
       69,    53,    75,    76,    87,    76,    72,    89,    53,    54,
       46,    43,     3,     3,     3,    44,    47,    87,    89,    90,
        1,    48,    62,    77,    78,    79,    88,    47,    63,    53,
       69,    53,    75,    76,    87,    76,    72,    89,    53,    54,
-      55,    73,    74,    89,    73,    86,     3,    85,     3,     3,
-       3,    52,    52,    49,    78,    91,    56,    83,    86,    70,
-      71,    89,    75,     4,    90,    89,    74,    45,    80,    71,
-       4,    90,    81,    82,    50,    52,    13,    14,    15,    43,
-      89,    82,    89,     4,    53,    83,    83
+      55,    73,    74,    89,    73,    86,     3,    47,    85,     3,
+       3,     3,    52,    52,    49,    78,    91,    56,    83,    86,
+      70,    71,    89,    75,     4,    90,    89,    74,    45,    80,
+      71,     4,    90,    81,    82,    50,    52,    13,    14,    15,
+      43,    89,    82,    89,     4,    53,    83,    83
 };
 
 #define yyerrok                (yyerrstatus = 0)
 };
 
 #define yyerrok                (yyerrstatus = 0)
@@ -1044,7 +1046,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
        { fputs (quotearg_style (c_quoting_style, (yyvaluep->chars)), stderr); };
 
 /* Line 721 of yacc.c  */
        { fputs (quotearg_style (c_quoting_style, (yyvaluep->chars)), stderr); };
 
 /* Line 721 of yacc.c  */
-#line 1048 "parse-gram.c"
+#line 1050 "parse-gram.c"
        break;
       case 4: /* "\"integer\"" */
 
        break;
       case 4: /* "\"integer\"" */
 
@@ -1053,7 +1055,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
        { fprintf (stderr, "%d", (yyvaluep->integer)); };
 
 /* Line 721 of yacc.c  */
        { fprintf (stderr, "%d", (yyvaluep->integer)); };
 
 /* Line 721 of yacc.c  */
-#line 1057 "parse-gram.c"
+#line 1059 "parse-gram.c"
        break;
       case 43: /* "\"{...}\"" */
 
        break;
       case 43: /* "\"{...}\"" */
 
@@ -1062,7 +1064,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
        { fprintf (stderr, "{\n%s\n}", (yyvaluep->code)); };
 
 /* Line 721 of yacc.c  */
        { fprintf (stderr, "{\n%s\n}", (yyvaluep->code)); };
 
 /* Line 721 of yacc.c  */
-#line 1066 "parse-gram.c"
+#line 1068 "parse-gram.c"
        break;
       case 44: /* "\"char\"" */
 
        break;
       case 44: /* "\"char\"" */
 
@@ -1071,7 +1073,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
        { fputs (char_name ((yyvaluep->character)), stderr); };
 
 /* Line 721 of yacc.c  */
        { fputs (char_name ((yyvaluep->character)), stderr); };
 
 /* Line 721 of yacc.c  */
-#line 1075 "parse-gram.c"
+#line 1077 "parse-gram.c"
        break;
       case 45: /* "\"epilogue\"" */
 
        break;
       case 45: /* "\"epilogue\"" */
 
@@ -1080,7 +1082,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
        { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
 
 /* Line 721 of yacc.c  */
        { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
 
 /* Line 721 of yacc.c  */
-#line 1084 "parse-gram.c"
+#line 1086 "parse-gram.c"
        break;
       case 47: /* "\"identifier\"" */
 
        break;
       case 47: /* "\"identifier\"" */
 
@@ -1089,7 +1091,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
        { fputs ((yyvaluep->uniqstr), stderr); };
 
 /* Line 721 of yacc.c  */
        { fputs ((yyvaluep->uniqstr), stderr); };
 
 /* Line 721 of yacc.c  */
-#line 1093 "parse-gram.c"
+#line 1095 "parse-gram.c"
        break;
       case 48: /* "\"identifier:\"" */
 
        break;
       case 48: /* "\"identifier:\"" */
 
@@ -1098,7 +1100,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
        { fprintf (stderr, "%s:", (yyvaluep->uniqstr)); };
 
 /* Line 721 of yacc.c  */
        { fprintf (stderr, "%s:", (yyvaluep->uniqstr)); };
 
 /* Line 721 of yacc.c  */
-#line 1102 "parse-gram.c"
+#line 1104 "parse-gram.c"
        break;
       case 51: /* "\"%{...%}\"" */
 
        break;
       case 51: /* "\"%{...%}\"" */
 
@@ -1107,7 +1109,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
        { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
 
 /* Line 721 of yacc.c  */
        { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
 
 /* Line 721 of yacc.c  */
-#line 1111 "parse-gram.c"
+#line 1113 "parse-gram.c"
        break;
       case 53: /* "\"type\"" */
 
        break;
       case 53: /* "\"type\"" */
 
@@ -1116,7 +1118,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
        { fprintf (stderr, "<%s>", (yyvaluep->uniqstr)); };
 
 /* Line 721 of yacc.c  */
        { fprintf (stderr, "<%s>", (yyvaluep->uniqstr)); };
 
 /* Line 721 of yacc.c  */
-#line 1120 "parse-gram.c"
+#line 1122 "parse-gram.c"
        break;
       case 84: /* "variable" */
 
        break;
       case 84: /* "variable" */
 
@@ -1125,7 +1127,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
        { fputs ((yyvaluep->uniqstr), stderr); };
 
 /* Line 721 of yacc.c  */
        { fputs ((yyvaluep->uniqstr), stderr); };
 
 /* Line 721 of yacc.c  */
-#line 1129 "parse-gram.c"
+#line 1131 "parse-gram.c"
        break;
       case 85: /* "content.opt" */
 
        break;
       case 85: /* "content.opt" */
 
@@ -1134,7 +1136,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
        { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
 
 /* Line 721 of yacc.c  */
        { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
 
 /* Line 721 of yacc.c  */
-#line 1138 "parse-gram.c"
+#line 1140 "parse-gram.c"
        break;
       case 86: /* "braceless" */
 
        break;
       case 86: /* "braceless" */
 
@@ -1143,7 +1145,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
        { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
 
 /* Line 721 of yacc.c  */
        { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
 
 /* Line 721 of yacc.c  */
-#line 1147 "parse-gram.c"
+#line 1149 "parse-gram.c"
        break;
       case 87: /* "id" */
 
        break;
       case 87: /* "id" */
 
@@ -1152,7 +1154,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
        { fprintf (stderr, "%s", (yyvaluep->symbol)->tag); };
 
 /* Line 721 of yacc.c  */
        { fprintf (stderr, "%s", (yyvaluep->symbol)->tag); };
 
 /* Line 721 of yacc.c  */
-#line 1156 "parse-gram.c"
+#line 1158 "parse-gram.c"
        break;
       case 88: /* "id_colon" */
 
        break;
       case 88: /* "id_colon" */
 
@@ -1161,7 +1163,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
        { fprintf (stderr, "%s:", (yyvaluep->symbol)->tag); };
 
 /* Line 721 of yacc.c  */
        { fprintf (stderr, "%s:", (yyvaluep->symbol)->tag); };
 
 /* Line 721 of yacc.c  */
-#line 1165 "parse-gram.c"
+#line 1167 "parse-gram.c"
        break;
       case 89: /* "symbol" */
 
        break;
       case 89: /* "symbol" */
 
@@ -1170,7 +1172,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
        { fprintf (stderr, "%s", (yyvaluep->symbol)->tag); };
 
 /* Line 721 of yacc.c  */
        { fprintf (stderr, "%s", (yyvaluep->symbol)->tag); };
 
 /* Line 721 of yacc.c  */
-#line 1174 "parse-gram.c"
+#line 1176 "parse-gram.c"
        break;
       case 90: /* "string_as_id" */
 
        break;
       case 90: /* "string_as_id" */
 
@@ -1179,7 +1181,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
        { fprintf (stderr, "%s", (yyvaluep->symbol)->tag); };
 
 /* Line 721 of yacc.c  */
        { fprintf (stderr, "%s", (yyvaluep->symbol)->tag); };
 
 /* Line 721 of yacc.c  */
-#line 1183 "parse-gram.c"
+#line 1185 "parse-gram.c"
        break;
       default:
        break;
        break;
       default:
        break;
@@ -1710,7 +1712,7 @@ YYLTYPE yylloc;
 }
 
 /* Line 1250 of yacc.c  */
 }
 
 /* Line 1250 of yacc.c  */
-#line 1714 "parse-gram.c"
+#line 1716 "parse-gram.c"
   yylsp[0] = yylloc;
 
   goto yysetstate;
   yylsp[0] = yylloc;
 
   goto yysetstate;
@@ -2587,10 +2589,17 @@ yyreduce:
     { (yyval.chars) = ""; }
     break;
 
     { (yyval.chars) = ""; }
     break;
 
-  case 99:
+  case 98:
+
+/* Line 1463 of yacc.c  */
+#line 574 "parse-gram.y"
+    { (yyval.chars) = (yyvsp[(1) - (1)].uniqstr); }
+    break;
+
+  case 100:
 
 /* Line 1463 of yacc.c  */
 
 /* Line 1463 of yacc.c  */
-#line 584 "parse-gram.y"
+#line 585 "parse-gram.y"
     {
       code_props plain_code;
       (yyvsp[(1) - (1)].code)[strlen ((yyvsp[(1) - (1)].code)) - 1] = '\n';
     {
       code_props plain_code;
       (yyvsp[(1) - (1)].code)[strlen ((yyvsp[(1) - (1)].code)) - 1] = '\n';
@@ -2601,17 +2610,17 @@ yyreduce:
     }
     break;
 
     }
     break;
 
-  case 100:
+  case 101:
 
 /* Line 1463 of yacc.c  */
 
 /* Line 1463 of yacc.c  */
-#line 604 "parse-gram.y"
+#line 605 "parse-gram.y"
     { (yyval.symbol) = symbol_from_uniqstr ((yyvsp[(1) - (1)].uniqstr), (yylsp[(1) - (1)])); }
     break;
 
     { (yyval.symbol) = symbol_from_uniqstr ((yyvsp[(1) - (1)].uniqstr), (yylsp[(1) - (1)])); }
     break;
 
-  case 101:
+  case 102:
 
 /* Line 1463 of yacc.c  */
 
 /* Line 1463 of yacc.c  */
-#line 606 "parse-gram.y"
+#line 607 "parse-gram.y"
     {
       (yyval.symbol) = symbol_get (char_name ((yyvsp[(1) - (1)].character)), (yylsp[(1) - (1)]));
       symbol_class_set ((yyval.symbol), token_sym, (yylsp[(1) - (1)]), false);
     {
       (yyval.symbol) = symbol_get (char_name ((yyvsp[(1) - (1)].character)), (yylsp[(1) - (1)]));
       symbol_class_set ((yyval.symbol), token_sym, (yylsp[(1) - (1)]), false);
@@ -2619,27 +2628,27 @@ yyreduce:
     }
     break;
 
     }
     break;
 
-  case 102:
+  case 103:
 
 /* Line 1463 of yacc.c  */
 
 /* Line 1463 of yacc.c  */
-#line 614 "parse-gram.y"
+#line 615 "parse-gram.y"
     { (yyval.symbol) = symbol_from_uniqstr ((yyvsp[(1) - (1)].uniqstr), (yylsp[(1) - (1)])); }
     break;
 
     { (yyval.symbol) = symbol_from_uniqstr ((yyvsp[(1) - (1)].uniqstr), (yylsp[(1) - (1)])); }
     break;
 
-  case 105:
+  case 106:
 
 /* Line 1463 of yacc.c  */
 
 /* Line 1463 of yacc.c  */
-#line 626 "parse-gram.y"
+#line 627 "parse-gram.y"
     {
       (yyval.symbol) = symbol_get (quotearg_style (c_quoting_style, (yyvsp[(1) - (1)].chars)), (yylsp[(1) - (1)]));
       symbol_class_set ((yyval.symbol), token_sym, (yylsp[(1) - (1)]), false);
     }
     break;
 
     {
       (yyval.symbol) = symbol_get (quotearg_style (c_quoting_style, (yyvsp[(1) - (1)].chars)), (yylsp[(1) - (1)]));
       symbol_class_set ((yyval.symbol), token_sym, (yylsp[(1) - (1)]), false);
     }
     break;
 
-  case 107:
+  case 108:
 
 /* Line 1463 of yacc.c  */
 
 /* Line 1463 of yacc.c  */
-#line 635 "parse-gram.y"
+#line 636 "parse-gram.y"
     {
       code_props plain_code;
       code_props_plain_init (&plain_code, (yyvsp[(2) - (2)].chars), (yylsp[(2) - (2)]));
     {
       code_props plain_code;
       code_props_plain_init (&plain_code, (yyvsp[(2) - (2)].chars), (yylsp[(2) - (2)]));
@@ -2653,7 +2662,7 @@ yyreduce:
 
 
 /* Line 1463 of yacc.c  */
 
 
 /* Line 1463 of yacc.c  */
-#line 2657 "parse-gram.c"
+#line 2666 "parse-gram.c"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -2872,7 +2881,7 @@ yyreturn:
 
 
 /* Line 1683 of yacc.c  */
 
 
 /* Line 1683 of yacc.c  */
-#line 645 "parse-gram.y"
+#line 646 "parse-gram.y"
 
 
 
 
 
 
index c90d14d80cd0098ffa279bb6d096c7f35a9332fb..b60446880ceb4c51e0c8e2d46f2ece513c9a9553 100644 (file)
@@ -571,6 +571,7 @@ variable:
 /* Some content or empty by default. */
 content.opt:
   /* Nothing. */   { $$ = ""; }
 /* Some content or empty by default. */
 content.opt:
   /* Nothing. */   { $$ = ""; }
+| ID { $$ = $1; }
 | STRING
 ;
 
 | STRING
 ;
 
index 802d48302617fdb5a73340f599e6e80b81397d7c..d085e826857fec83358ea340af3e51817e4eea1e 100644 (file)
@@ -576,7 +576,7 @@ AT_CHECK_CALC_LALR([%yacc])
 AT_CHECK_CALC_LALR([%error-verbose])
 
 AT_CHECK_CALC_LALR([%define api.pure %locations])
 AT_CHECK_CALC_LALR([%error-verbose])
 
 AT_CHECK_CALC_LALR([%define api.pure %locations])
-AT_CHECK_CALC_LALR([%define api.push-pull "both" %define api.pure %locations])
+AT_CHECK_CALC_LALR([%define api.push-pull both %define api.pure %locations])
 AT_CHECK_CALC_LALR([%error-verbose %locations])
 
 AT_CHECK_CALC_LALR([%error-verbose %locations %defines %name-prefix "calc" %verbose %yacc])
 AT_CHECK_CALC_LALR([%error-verbose %locations])
 
 AT_CHECK_CALC_LALR([%error-verbose %locations %defines %name-prefix "calc" %verbose %yacc])
@@ -585,7 +585,7 @@ AT_CHECK_CALC_LALR([%debug])
 AT_CHECK_CALC_LALR([%error-verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc])
 
 AT_CHECK_CALC_LALR([%define api.pure %error-verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc])
 AT_CHECK_CALC_LALR([%error-verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc])
 
 AT_CHECK_CALC_LALR([%define api.pure %error-verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc])
-AT_CHECK_CALC_LALR([%define api.push-pull "both" %define api.pure %error-verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc])
+AT_CHECK_CALC_LALR([%define api.push-pull both %define api.pure %error-verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc])
 
 AT_CHECK_CALC_LALR([%define api.pure %error-verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}])
 
 
 AT_CHECK_CALC_LALR([%define api.pure %error-verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}])
 
index 5a89732457ad36456027fc66520f2d0bc7d00213..ba06626b2696a4c666d08dd433e1829cb78cd86f 100644 (file)
@@ -42,18 +42,18 @@ AT_CHECK([[diff -u input-lalr.output input.output \
          [[0]], [$1])])
 
 AT_TEST_TABLES_AND_PARSE([$2[: LALR(1)]], [[LALR]], [[last-state]],
          [[0]], [$1])])
 
 AT_TEST_TABLES_AND_PARSE([$2[: LALR(1)]], [[LALR]], [[last-state]],
-                         [[%define lr.type "lalr"
+                         [[%define lr.type lalr
 ]$3],
                          [$4], [$5], [$6], [$7],
                          [AT_LALR1_DIFF_CHECK([$8])$9], [$10], [$11], [$12])
 AT_TEST_TABLES_AND_PARSE([$2[: IELR(1)]], [[IELR]], [[last-state]],
 ]$3],
                          [$4], [$5], [$6], [$7],
                          [AT_LALR1_DIFF_CHECK([$8])$9], [$10], [$11], [$12])
 AT_TEST_TABLES_AND_PARSE([$2[: IELR(1)]], [[IELR]], [[last-state]],
-                         [[%define lr.type "ielr"
+                         [[%define lr.type ielr
 ]$3],
                          [$4], [$5], [$6], [$7],
                          [AT_LALR1_DIFF_CHECK([$8])$9], [$10], [$11], [$12])
 AT_TEST_TABLES_AND_PARSE([$2[: Canonical LR(1)]], [[canonical LR]],
                          [[last-state,no-xml]],
 ]$3],
                          [$4], [$5], [$6], [$7],
                          [AT_LALR1_DIFF_CHECK([$8])$9], [$10], [$11], [$12])
 AT_TEST_TABLES_AND_PARSE([$2[: Canonical LR(1)]], [[canonical LR]],
                          [[last-state,no-xml]],
-                         [[%define lr.type "canonical-lr"
+                         [[%define lr.type canonical-lr
 ]$3],
                          [$4], [$5], [$6], [$7],
                          [$9], [$10], [$11], [$12])
 ]$3],
                          [$4], [$5], [$6], [$7],
                          [$9], [$10], [$11], [$12])
index 3c04d580600abb316a6026c5c23e66f4a4991e86..8a38cd5def983d1e1683b98b70d25d6555a91d37 100644 (file)
@@ -1004,7 +1004,7 @@ AT_SETUP([[%define enum variables]])
 
 # Front-end.
 AT_DATA([[input.y]],
 
 # Front-end.
 AT_DATA([[input.y]],
-[[%define lr.default-reductions "bogus"
+[[%define lr.default-reductions bogus
 %%
 start: ;
 ]])
 %%
 start: ;
 ]])
@@ -1017,7 +1017,7 @@ input.y:1.9-29: accepted value: `accepting'
 
 # Back-end.
 AT_DATA([[input.y]],
 
 # Back-end.
 AT_DATA([[input.y]],
-[[%define api.push-pull "neither"
+[[%define api.push-pull neither
 %%
 start: ;
 ]])
 %%
 start: ;
 ]])
@@ -1052,7 +1052,7 @@ input.y:1.9-21: accepted value: `both'
 ]])
 
 AT_DATA([[input.y]],
 ]])
 
 AT_DATA([[input.y]],
-[[%define lr.keep_unreachable_states "maybe"
+[[%define lr.keep_unreachable_states maybe
 %%
 start: ;
 ]])
 %%
 start: ;
 ]])
@@ -1096,11 +1096,11 @@ AT_BISON_CHECK([[input.y]], [0], [],
 ])
 
 AT_CHECK_API_PURE([[%language "c++" %defines]], [[]])
 ])
 
 AT_CHECK_API_PURE([[%language "c++" %defines]], [[]])
-AT_CHECK_API_PURE([[%language "c++" %defines]], [["false"]])
+AT_CHECK_API_PURE([[%language "c++" %defines]], [[false]])
 AT_CHECK_API_PURE([[%language "c++" %defines %glr-parser]], [[""]])
 AT_CHECK_API_PURE([[%language "c++" %defines %glr-parser]], [[""]])
-AT_CHECK_API_PURE([[%language "c++" %defines %glr-parser]], [["false"]])
-AT_CHECK_API_PURE([[%language "java"]], [["true"]])
-AT_CHECK_API_PURE([[%language "java"]], [["false"]])
+AT_CHECK_API_PURE([[%language "c++" %defines %glr-parser]], [[false]])
+AT_CHECK_API_PURE([[%language "java"]], [[true]])
+AT_CHECK_API_PURE([[%language "java"]], [[false]])
 
 AT_CLEANUP
 
 
 AT_CLEANUP
 
index 38cd295ad7368ba3ee71d92bccbc24746e7737a3..c71b12da1f0ef611a1a71c1d342489fa29cb4b30 100644 (file)
@@ -77,7 +77,7 @@ m4_pushdef([AT_LOCATION_IF],
 [m4_bmatch([$3], [%locations], [$1], [$2])])
 m4_pushdef([AT_PURE_IF],
 [m4_bmatch([$3], [%define  *api\.pure\|%pure-parser],
 [m4_bmatch([$3], [%locations], [$1], [$2])])
 m4_pushdef([AT_PURE_IF],
 [m4_bmatch([$3], [%define  *api\.pure\|%pure-parser],
-           [m4_bmatch([$3], [%define  *api\.pure *"false"], [$2], [$1])],
+           [m4_bmatch([$3], [%define  *api\.pure *"?false"?], [$2], [$1])],
            [$2])])
 m4_pushdef([AT_PURE_AND_LOC_IF],
 [m4_bmatch([$3], [%locations], [AT_PURE_IF($@)], [$2])])
            [$2])])
 m4_pushdef([AT_PURE_AND_LOC_IF],
 [m4_bmatch([$3], [%locations], [AT_PURE_IF($@)], [$2])])
index bf48c682c6c65bb2bc18010726b9cc789f67895f..831be0c06311a660718e2520de038334b31ed4bc 100644 (file)
@@ -33,7 +33,7 @@ AT_DATA_GRAMMAR([[input.y]],
   void yyerror (char const *msg);
 %}
 
   void yyerror (char const *msg);
 %}
 
-%define api.pure %define api.push-pull "push"
+%define api.pure %define api.push-pull push
 
 %%
 
 
 %%
 
@@ -93,7 +93,7 @@ AT_DATA_GRAMMAR([[input.y]],
   int yylex (void);
 %}
 
   int yylex (void);
 %}
 
-%define api.push-pull "]$1["
+%define api.push-pull ]$1[
 
 %%
 
 
 %%
 
@@ -156,7 +156,7 @@ AT_SETUP([[Push Parsing: Unsupported Skeletons]])
 
 AT_DATA([[input.y]],
 [[%glr-parser
 
 AT_DATA([[input.y]],
 [[%glr-parser
-%define api.push-pull "push"
+%define api.push-pull push
 %%
 start: ;
 ]])
 %%
 start: ;
 ]])
index 45a856a5277fc6206ad2b73c4aa6232f54eb5990..e1e336785a0351d09019e9a8081ae9ca4fb9d078 100644 (file)
@@ -375,19 +375,19 @@ m4_define([AT_TEST_LR_TYPE],
 AT_TEST_TABLES_AND_PARSE([[no %define lr.type: ]$1],
                          [[LALR]], [[]],
                          [$2], m4_shiftn(2, $@))
 AT_TEST_TABLES_AND_PARSE([[no %define lr.type: ]$1],
                          [[LALR]], [[]],
                          [$2], m4_shiftn(2, $@))
-AT_TEST_TABLES_AND_PARSE([[%define lr.type "lalr": ]$1],
+AT_TEST_TABLES_AND_PARSE([[%define lr.type lalr: ]$1],
                          [[LALR]], [[]],
                          [[LALR]], [[]],
-                         [[%define lr.type "lalr"
+                         [[%define lr.type lalr
 ]$2],
                          m4_shiftn(2, $@))
 ]$2],
                          m4_shiftn(2, $@))
-AT_TEST_TABLES_AND_PARSE([[%define lr.type "ielr": ]$1],
+AT_TEST_TABLES_AND_PARSE([[%define lr.type ielr: ]$1],
                          [[IELR]], [[]],
                          [[IELR]], [[]],
-                         [[%define lr.type "ielr"
+                         [[%define lr.type ielr
 ]$2],
                          m4_shiftn(2, $@))
 ]$2],
                          m4_shiftn(2, $@))
-AT_TEST_TABLES_AND_PARSE([[%define lr.type "canonical-lr": ]$1],
+AT_TEST_TABLES_AND_PARSE([[%define lr.type canonical-lr: ]$1],
                          [[canonical LR]], [[]],
                          [[canonical LR]], [[]],
-                         [[%define lr.type "canonical-lr"
+                         [[%define lr.type canonical-lr
 ]$2],
                          m4_shiftn(2, $@))
 ])
 ]$2],
                          m4_shiftn(2, $@))
 ])
@@ -1454,17 +1454,17 @@ AT_TEST_TABLES_AND_PARSE([[no %define lr.default-reductions]],
                          [[all]], [[]],
                          [[]],
                          [$1], [$2], [[]], [$3])
                          [[all]], [[]],
                          [[]],
                          [$1], [$2], [[]], [$3])
-AT_TEST_TABLES_AND_PARSE([[%define lr.default-reductions "all"]],
+AT_TEST_TABLES_AND_PARSE([[%define lr.default-reductions all]],
                          [[all]], [[]],
                          [[all]], [[]],
-                         [[%define lr.default-reductions "all"]],
+                         [[%define lr.default-reductions all]],
                          [$1], [$2], [[]], [$3])
                          [$1], [$2], [[]], [$3])
-AT_TEST_TABLES_AND_PARSE([[%define lr.default-reductions "consistent"]],
+AT_TEST_TABLES_AND_PARSE([[%define lr.default-reductions consistent]],
                          [[consistent]], [[]],
                          [[consistent]], [[]],
-                         [[%define lr.default-reductions "consistent"]],
+                         [[%define lr.default-reductions consistent]],
                          [$1], [$2], [[]], [$3])
                          [$1], [$2], [[]], [$3])
-AT_TEST_TABLES_AND_PARSE([[%define lr.default-reductions "accepting"]],
+AT_TEST_TABLES_AND_PARSE([[%define lr.default-reductions accepting]],
                          [[accepting]], [[]],
                          [[accepting]], [[]],
-                         [[%define lr.default-reductions "accepting"]],
+                         [[%define lr.default-reductions accepting]],
                          [$1], [$2], [[]], [$3])
 ])
 
                          [$1], [$2], [[]], [$3])
 ])
 
index 91b3b1b93e1183381b3a0002de9055ac6660577c..47435cbcbc6dae69ced8fc4e9236d7b7343440bd 100644 (file)
@@ -496,7 +496,7 @@ AT_PARSER_CHECK([./input 10000], 2, [], [ignore],
 # just helps guarantee we don't let the YYSTACK_USE_ALLOCA feature affect
 # push parsers.
 AT_DATA_STACK_TORTURE([AT_USE_ALLOCA],
 # just helps guarantee we don't let the YYSTACK_USE_ALLOCA feature affect
 # push parsers.
 AT_DATA_STACK_TORTURE([AT_USE_ALLOCA],
-[[%define api.push-pull "both"
+[[%define api.push-pull both
 ]])
 AT_PARSER_CHECK([./input 20], 0, [], [ignore],
                 [[VALGRIND_OPTS="$VALGRIND_OPTS --log-fd=1"]])
 ]])
 AT_PARSER_CHECK([./input 20], 0, [], [ignore],
                 [[VALGRIND_OPTS="$VALGRIND_OPTS --log-fd=1"]])
@@ -534,7 +534,7 @@ AT_PARSER_CHECK([./input 10000], 2, [], [ignore],
                 [[VALGRIND_OPTS="$VALGRIND_OPTS --log-fd=1"]])
 
 AT_DATA_STACK_TORTURE([AT_USE_ALLOCA],
                 [[VALGRIND_OPTS="$VALGRIND_OPTS --log-fd=1"]])
 
 AT_DATA_STACK_TORTURE([AT_USE_ALLOCA],
-[[%define api.push-pull "both"
+[[%define api.push-pull both
 ]])
 AT_PARSER_CHECK([./input 20], 0, [], [ignore],
                 [[VALGRIND_OPTS="$VALGRIND_OPTS --log-fd=1"]])
 ]])
 AT_PARSER_CHECK([./input 20], 0, [], [ignore],
                 [[VALGRIND_OPTS="$VALGRIND_OPTS --log-fd=1"]])