]> git.saurik.com Git - bison.git/blobdiff - doc/bison.texinfo
Merge remote-tracking branch 'origin/maint'
[bison.git] / doc / bison.texinfo
index 26639b522c38083e3dcb9f3c52a0f175f0874e7f..4aac8d3d9f40d71ce4e5fd93e5c20ec5477ee0b0 100644 (file)
@@ -226,6 +226,7 @@ Bison Declarations
 * Type Decl::         Declaring the choice of type for a nonterminal symbol.
 * Initial Action Decl::  Code run before parsing starts.
 * Destructor Decl::   Declaring how symbols are freed.
+* Printer Decl::      Declaring how symbol values are displayed.
 * Expect Decl::       Suppressing warnings about parsing conflicts.
 * Start Decl::        Specifying the start symbol.
 * Pure Decl::         Requesting a reentrant parser.
@@ -299,6 +300,12 @@ Debugging Your Parser
 * Understanding::     Understanding the structure of your parser.
 * Tracing::           Tracing the execution of your parser.
 
+Tracing Your Parser
+
+* Enabling Traces::             Activating run-time trace support
+* Mfcalc Traces::               Extending @code{mfcalc} to support traces
+* The YYPRINT Macro::           Obsolete interface for semantic value reports
+
 Invoking Bison
 
 * Bison Options::     All the options described in detail,
@@ -320,6 +327,11 @@ C++ Parsers
 * C++ Scanner Interface::       Exchanges between yylex and parse
 * A Complete C++ Example::      Demonstrating their use
 
+C++ Location Values
+
+* C++ position::                One point in the source file
+* C++ location::                Two points in the source file
+
 A Complete C++ Example
 
 * Calc++ --- C++ Calculator::   The specifications
@@ -540,7 +552,6 @@ lexicography, not grammar.)
 
 Here is a simple C function subdivided into tokens:
 
-@ifinfo
 @example
 int             /* @r{keyword `int'} */
 square (int x)  /* @r{identifier, open-paren, keyword `int',}
@@ -550,16 +561,6 @@ square (int x)  /* @r{identifier, open-paren, keyword `int',}
                    @r{identifier, semicolon} */
 @}               /* @r{close-brace} */
 @end example
-@end ifinfo
-@ifnotinfo
-@example
-int             /* @r{keyword `int'} */
-square (int x)  /* @r{identifier, open-paren, keyword `int', identifier, close-paren} */
-@{               /* @r{open-brace} */
-  return x * x; /* @r{keyword `return', identifier, asterisk, identifier, semicolon} */
-@}               /* @r{close-brace} */
-@end example
-@end ifnotinfo
 
 The syntactic groupings of C include the expression, the statement, the
 declaration, and the function definition.  These are represented in the
@@ -641,8 +642,7 @@ the statement; the naked semicolon, and the colon, are Bison punctuation
 used in every rule.
 
 @example
-stmt:   RETURN expr ';'
-        ;
+stmt: RETURN expr ';' ;
 @end example
 
 @noindent
@@ -714,8 +714,7 @@ For example, here is a rule that says an expression can be the sum of
 two subexpressions:
 
 @example
-expr: expr '+' expr   @{ $$ = $1 + $3; @}
-        ;
+expr: expr '+' expr   @{ $$ = $1 + $3; @} ;
 @end example
 
 @noindent
@@ -895,30 +894,32 @@ parses a vastly simplified form of Pascal type declarations.
 %%
 
 @group
-type_decl : TYPE ID '=' type ';'
-     ;
+type_decl: TYPE ID '=' type ';' ;
 @end group
 
 @group
-type : '(' id_list ')'
-     | expr DOTDOT expr
-     ;
+type:
+  '(' id_list ')'
+| expr DOTDOT expr
+;
 @end group
 
 @group
-id_list : ID
-     | id_list ',' ID
-     ;
+id_list:
+  ID
+| id_list ',' ID
+;
 @end group
 
 @group
-expr : '(' expr ')'
-     | expr '+' expr
-     | expr '-' expr
-     | expr '*' expr
-     | expr '/' expr
-     | ID
-     ;
+expr:
+  '(' expr ')'
+| expr '+' expr
+| expr '-' expr
+| expr '*' expr
+| expr '/' expr
+| ID
+;
 @end group
 @end example
 
@@ -998,30 +999,35 @@ Let's consider an example, vastly simplified from a C++ grammar.
 
 %%
 
-prog :
-     | prog stmt   @{ printf ("\n"); @}
-     ;
+prog:
+  /* Nothing.  */
+| prog stmt   @{ printf ("\n"); @}
+;
 
-stmt : expr ';'  %dprec 1
-     | decl      %dprec 2
-     ;
+stmt:
+  expr ';'  %dprec 1
+| decl      %dprec 2
+;
 
-expr : ID               @{ printf ("%s ", $$); @}
-     | TYPENAME '(' expr ')'
-                        @{ printf ("%s <cast> ", $1); @}
-     | expr '+' expr    @{ printf ("+ "); @}
-     | expr '=' expr    @{ printf ("= "); @}
-     ;
+expr:
+  ID               @{ printf ("%s ", $$); @}
+| TYPENAME '(' expr ')'
+                   @{ printf ("%s <cast> ", $1); @}
+| expr '+' expr    @{ printf ("+ "); @}
+| expr '=' expr    @{ printf ("= "); @}
+;
 
-decl : TYPENAME declarator ';'
-                        @{ printf ("%s <declare> ", $1); @}
-     | TYPENAME declarator '=' expr ';'
-                        @{ printf ("%s <init-declare> ", $1); @}
-     ;
+decl:
+  TYPENAME declarator ';'
+                   @{ printf ("%s <declare> ", $1); @}
+| TYPENAME declarator '=' expr ';'
+                   @{ printf ("%s <init-declare> ", $1); @}
+;
 
-declarator : ID         @{ printf ("\"%s\" ", $1); @}
-     | '(' declarator ')'
-     ;
+declarator:
+  ID               @{ printf ("\"%s\" ", $1); @}
+| '(' declarator ')'
+;
 @end example
 
 @noindent
@@ -1090,9 +1096,10 @@ other.  To do so, you could change the declaration of @code{stmt} as
 follows:
 
 @example
-stmt : expr ';'  %merge <stmtMerge>
-     | decl      %merge <stmtMerge>
-     ;
+stmt:
+  expr ';'  %merge <stmtMerge>
+| decl      %merge <stmtMerge>
+;
 @end example
 
 @noindent
@@ -1204,12 +1211,12 @@ in user code, without having Bison treat this rejection as an error
 if there are alternative parses. (This feature is experimental and may
 evolve.  We welcome user feedback.)  For example,
 
-@smallexample
-widget :
-          %?@{ new_syntax @} "widget" id new_args   @{ $$ = f($3, $4); @}
-       |  %?@{ !new_syntax @} "widget" id old_args  @{ $$ = f($3, $4); @}
-       ;
-@end smallexample
+@example
+widget:
+  %?@{  new_syntax @} "widget" id new_args  @{ $$ = f($3, $4); @}
+| %?@{ !new_syntax @} "widget" id old_args  @{ $$ = f($3, $4); @}
+;
+@end example
 
 @noindent
 is one way to allow the same parser to handle two different syntaxes for
@@ -1230,12 +1237,14 @@ There is a subtle difference between semantic predicates and ordinary
 actions in nondeterministic mode, since the latter are deferred.
 For example, we could try to rewrite the previous example as
 
-@smallexample
-widget :
-          @{ if (!new_syntax) YYERROR; @} "widget" id new_args  @{ $$ = f($3, $4); @}
-       |  @{ if (new_syntax) YYERROR; @} "widget" id old_args   @{ $$ = f($3, $4); @}
-       ;
-@end smallexample
+@example
+widget:
+  @{ if (!new_syntax) YYERROR; @}
+    "widget" id new_args  @{ $$ = f($3, $4); @}
+|  @{ if (new_syntax) YYERROR; @}
+    "widget" id old_args   @{ $$ = f($3, $4); @}
+;
+@end example
 
 @noindent
 (reversing the sense of the predicate tests to cause an error when they are
@@ -1572,25 +1581,28 @@ Here are the grammar rules for the reverse polish notation calculator.
 @comment file: rpcalc.y
 @example
 @group
-input:    /* empty */
-        | input line
+input:
+  /* empty */
+| input line
 ;
 @end group
 
 @group
-line:     '\n'
-        | exp '\n'      @{ printf ("%.10g\n", $1); @}
+line:
+  '\n'
+| exp '\n'      @{ printf ("%.10g\n", $1); @}
 ;
 @end group
 
 @group
-exp:      NUM           @{ $$ = $1;           @}
-        | exp exp '+'   @{ $$ = $1 + $2;      @}
-        | exp exp '-'   @{ $$ = $1 - $2;      @}
-        | exp exp '*'   @{ $$ = $1 * $2;      @}
-        | exp exp '/'   @{ $$ = $1 / $2;      @}
-        | exp exp '^'   @{ $$ = pow ($1, $2); @}  /* Exponentiation */
-        | exp 'n'       @{ $$ = -$1;          @}  /* Unary minus    */
+exp:
+  NUM           @{ $$ = $1;           @}
+| exp exp '+'   @{ $$ = $1 + $2;      @}
+| exp exp '-'   @{ $$ = $1 - $2;      @}
+| exp exp '*'   @{ $$ = $1 * $2;      @}
+| exp exp '/'   @{ $$ = $1 / $2;      @}
+| exp exp '^'   @{ $$ = pow ($1, $2); @}  /* Exponentiation */
+| exp 'n'       @{ $$ = -$1;          @}  /* Unary minus    */
 ;
 @end group
 %%
@@ -1626,8 +1638,9 @@ rule are referred to as @code{$1}, @code{$2}, and so on.
 Consider the definition of @code{input}:
 
 @example
-input:    /* empty */
-        | input line
+input:
+  /* empty */
+| input line
 ;
 @end example
 
@@ -1660,8 +1673,9 @@ input tokens; we will arrange for the latter to happen at end-of-input.
 Now consider the definition of @code{line}:
 
 @example
-line:     '\n'
-        | exp '\n'  @{ printf ("%.10g\n", $1); @}
+line:
+  '\n'
+| exp '\n'  @{ printf ("%.10g\n", $1); @}
 ;
 @end example
 
@@ -1688,21 +1702,22 @@ The second handles an addition-expression, which looks like two expressions
 followed by a plus-sign.  The third handles subtraction, and so on.
 
 @example
-exp:      NUM
-        | exp exp '+'     @{ $$ = $1 + $2;    @}
-        | exp exp '-'     @{ $$ = $1 - $2;    @}
-        @dots{}
-        ;
+exp:
+  NUM
+| exp exp '+'     @{ $$ = $1 + $2;    @}
+| exp exp '-'     @{ $$ = $1 - $2;    @}
+@dots{}
+;
 @end example
 
 We have used @samp{|} to join all the rules for @code{exp}, but we could
 equally well have written them separately:
 
 @example
-exp:      NUM ;
-exp:      exp exp '+'     @{ $$ = $1 + $2;    @} ;
-exp:      exp exp '-'     @{ $$ = $1 - $2;    @} ;
-        @dots{}
+exp: NUM ;
+exp: exp exp '+'     @{ $$ = $1 + $2; @};
+exp: exp exp '-'     @{ $$ = $1 - $2; @};
+@dots{}
 @end example
 
 Most of the rules have actions that compute the value of the expression in
@@ -1723,16 +1738,17 @@ not require it.  You can add or change white space as much as you wish.
 For example, this:
 
 @example
-exp   : NUM | exp exp '+' @{$$ = $1 + $2; @} | @dots{} ;
+exp: NUM | exp exp '+' @{$$ = $1 + $2; @} | @dots{} ;
 @end example
 
 @noindent
 means the same thing as this:
 
 @example
-exp:      NUM
-        | exp exp '+'    @{ $$ = $1 + $2; @}
-        | @dots{}
+exp:
+  NUM
+| exp exp '+'    @{ $$ = $1 + $2; @}
+| @dots{}
 ;
 @end example
 
@@ -1980,26 +1996,29 @@ parentheses nested to arbitrary depth.  Here is the Bison code for
 
 %% /* The grammar follows.  */
 @group
-input:    /* empty */
-        | input line
+input:
+  /* empty */
+| input line
 ;
 @end group
 
 @group
-line:     '\n'
-        | exp '\n'  @{ printf ("\t%.10g\n", $1); @}
+line:
+  '\n'
+| exp '\n'  @{ printf ("\t%.10g\n", $1); @}
 ;
 @end group
 
 @group
-exp:      NUM                @{ $$ = $1;           @}
-        | exp '+' exp        @{ $$ = $1 + $3;      @}
-        | exp '-' exp        @{ $$ = $1 - $3;      @}
-        | exp '*' exp        @{ $$ = $1 * $3;      @}
-        | exp '/' exp        @{ $$ = $1 / $3;      @}
-        | '-' exp  %prec NEG @{ $$ = -$2;          @}
-        | exp '^' exp        @{ $$ = pow ($1, $3); @}
-        | '(' exp ')'        @{ $$ = $2;           @}
+exp:
+  NUM                @{ $$ = $1;           @}
+| exp '+' exp        @{ $$ = $1 + $3;      @}
+| exp '-' exp        @{ $$ = $1 - $3;      @}
+| exp '*' exp        @{ $$ = $1 * $3;      @}
+| exp '/' exp        @{ $$ = $1 / $3;      @}
+| '-' exp  %prec NEG @{ $$ = -$2;          @}
+| exp '^' exp        @{ $$ = pow ($1, $3); @}
+| '(' exp ')'        @{ $$ = $2;           @}
 ;
 @end group
 %%
@@ -2063,9 +2082,10 @@ been added to one of the alternatives for @code{line}:
 
 @example
 @group
-line:     '\n'
-        | exp '\n'   @{ printf ("\t%.10g\n", $1); @}
-        | error '\n' @{ yyerrok;                  @}
+line:
+  '\n'
+| exp '\n'   @{ printf ("\t%.10g\n", $1); @}
+| error '\n' @{ yyerrok;                  @}
 ;
 @end group
 @end example
@@ -2156,41 +2176,44 @@ wrong expressions or subexpressions.
 
 @example
 @group
-input   : /* empty */
-        | input line
+input:
+  /* empty */
+| input line
 ;
 @end group
 
 @group
-line    : '\n'
-        | exp '\n' @{ printf ("%d\n", $1); @}
+line:
+  '\n'
+| exp '\n' @{ printf ("%d\n", $1); @}
 ;
 @end group
 
 @group
-exp     : NUM           @{ $$ = $1; @}
-        | exp '+' exp   @{ $$ = $1 + $3; @}
-        | exp '-' exp   @{ $$ = $1 - $3; @}
-        | exp '*' exp   @{ $$ = $1 * $3; @}
+exp:
+  NUM           @{ $$ = $1; @}
+| exp '+' exp   @{ $$ = $1 + $3; @}
+| exp '-' exp   @{ $$ = $1 - $3; @}
+| exp '*' exp   @{ $$ = $1 * $3; @}
 @end group
 @group
-        | exp '/' exp
-            @{
-              if ($3)
-                $$ = $1 / $3;
-              else
-                @{
-                  $$ = 1;
-                  fprintf (stderr, "%d.%d-%d.%d: division by zero",
-                           @@3.first_line, @@3.first_column,
-                           @@3.last_line, @@3.last_column);
-                @}
-            @}
+| exp '/' exp
+    @{
+      if ($3)
+        $$ = $1 / $3;
+      else
+        @{
+          $$ = 1;
+          fprintf (stderr, "%d.%d-%d.%d: division by zero",
+                   @@3.first_line, @@3.first_column,
+                   @@3.last_line, @@3.last_column);
+        @}
+    @}
 @end group
 @group
-        | '-' exp %prec NEG     @{ $$ = -$2; @}
-        | exp '^' exp           @{ $$ = pow ($1, $3); @}
-        | '(' exp ')'           @{ $$ = $2; @}
+| '-' exp %prec NEG     @{ $$ = -$2; @}
+| exp '^' exp           @{ $$ = pow ($1, $3); @}
+| '(' exp ')'           @{ $$ = $2; @}
 @end group
 @end example
 
@@ -2360,8 +2383,8 @@ Note that multiple assignment and nested function calls are permitted.
 
 Here are the C and Bison declarations for the multi-function calculator.
 
-@comment file: mfcalc.y
-@smallexample
+@comment file: mfcalc.y: 1
+@example
 @group
 %@{
   #include <stdio.h>  /* For printf, etc. */
@@ -2371,6 +2394,7 @@ Here are the C and Bison declarations for the multi-function calculator.
   void yyerror (char const *);
 %@}
 @end group
+
 @group
 %union @{
   double    val;   /* For returning numbers.  */
@@ -2378,7 +2402,7 @@ Here are the C and Bison declarations for the multi-function calculator.
 @}
 @end group
 %token <val>  NUM        /* Simple double precision number.  */
-%token <tptr> VAR FNCT   /* Variable and Function.  */
+%token <tptr> VAR FNCT   /* Variable and function.  */
 %type  <val>  exp
 
 @group
@@ -2388,8 +2412,7 @@ Here are the C and Bison declarations for the multi-function calculator.
 %precedence NEG /* negation--unary minus */
 %right '^'      /* exponentiation */
 @end group
-%% /* The grammar follows.  */
-@end smallexample
+@end example
 
 The above grammar introduces only two new features of the Bison language.
 These features allow semantic values to have various data types
@@ -2420,39 +2443,42 @@ Here are the grammar rules for the multi-function calculator.
 Most of them are copied directly from @code{calc}; three rules,
 those which mention @code{VAR} or @code{FNCT}, are new.
 
-@comment file: mfcalc.y
-@smallexample
+@comment file: mfcalc.y: 3
+@example
+%% /* The grammar follows.  */
 @group
-input:   /* empty */
-        | input line
+input:
+  /* empty */
+| input line
 ;
 @end group
 
 @group
 line:
-          '\n'
-        | exp '\n'   @{ printf ("%.10g\n", $1); @}
-        | error '\n' @{ yyerrok;                @}
+  '\n'
+| exp '\n'   @{ printf ("%.10g\n", $1); @}
+| error '\n' @{ yyerrok;                @}
 ;
 @end group
 
 @group
-exp:      NUM                @{ $$ = $1;                         @}
-        | VAR                @{ $$ = $1->value.var;              @}
-        | VAR '=' exp        @{ $$ = $3; $1->value.var = $3;     @}
-        | FNCT '(' exp ')'   @{ $$ = (*($1->value.fnctptr))($3); @}
-        | exp '+' exp        @{ $$ = $1 + $3;                    @}
-        | exp '-' exp        @{ $$ = $1 - $3;                    @}
-        | exp '*' exp        @{ $$ = $1 * $3;                    @}
-        | exp '/' exp        @{ $$ = $1 / $3;                    @}
-        | '-' exp  %prec NEG @{ $$ = -$2;                        @}
-        | exp '^' exp        @{ $$ = pow ($1, $3);               @}
-        | '(' exp ')'        @{ $$ = $2;                         @}
+exp:
+  NUM                @{ $$ = $1;                         @}
+| VAR                @{ $$ = $1->value.var;              @}
+| VAR '=' exp        @{ $$ = $3; $1->value.var = $3;     @}
+| FNCT '(' exp ')'   @{ $$ = (*($1->value.fnctptr))($3); @}
+| exp '+' exp        @{ $$ = $1 + $3;                    @}
+| exp '-' exp        @{ $$ = $1 - $3;                    @}
+| exp '*' exp        @{ $$ = $1 * $3;                    @}
+| exp '/' exp        @{ $$ = $1 / $3;                    @}
+| '-' exp  %prec NEG @{ $$ = -$2;                        @}
+| exp '^' exp        @{ $$ = pow ($1, $3);               @}
+| '(' exp ')'        @{ $$ = $2;                         @}
 ;
 @end group
 /* End of grammar.  */
 %%
-@end smallexample
+@end example
 
 @node Mfcalc Symbol Table
 @subsection The @code{mfcalc} Symbol Table
@@ -2468,7 +2494,7 @@ definition, which is kept in the header @file{calc.h}, is as follows.  It
 provides for either functions or variables to be placed in the table.
 
 @comment file: calc.h
-@smallexample
+@example
 @group
 /* Function type.  */
 typedef double (*func_t) (double);
@@ -2498,13 +2524,13 @@ extern symrec *sym_table;
 symrec *putsym (char const *, int);
 symrec *getsym (char const *);
 @end group
-@end smallexample
+@end example
 
 The new version of @code{main} will call @code{init_table} to initialize
 the symbol table:
 
-@comment file: mfcalc.y
-@smallexample
+@comment file: mfcalc.y: 3
+@example
 @group
 struct init
 @{
@@ -2545,7 +2571,7 @@ init_table (void)
     @}
 @}
 @end group
-@end smallexample
+@end example
 
 By simply editing the initialization list and adding the necessary include
 files, you can add additional functions to the calculator.
@@ -2557,8 +2583,8 @@ linked to the front of the list, and a pointer to the object is returned.
 The function @code{getsym} is passed the name of the symbol to look up.  If
 found, a pointer to that symbol is returned; otherwise zero is returned.
 
-@comment file: mfcalc.y
-@smallexample
+@comment file: mfcalc.y: 3
+@example
 #include <stdlib.h> /* malloc. */
 #include <string.h> /* strlen. */
 
@@ -2589,7 +2615,7 @@ getsym (char const *sym_name)
   return 0;
 @}
 @end group
-@end smallexample
+@end example
 
 @node Mfcalc Lexer
 @subsection The @code{mfcalc} Lexer
@@ -2609,8 +2635,8 @@ returned to @code{yyparse}.
 No change is needed in the handling of numeric values and arithmetic
 operators in @code{yylex}.
 
-@comment file: mfcalc.y
-@smallexample
+@comment file: mfcalc.y: 3
+@example
 @group
 #include <ctype.h>
 @end group
@@ -2688,16 +2714,17 @@ yylex (void)
   return c;
 @}
 @end group
-@end smallexample
+@end example
 
 @node Mfcalc Main
 @subsection The @code{mfcalc} Main
 
 The error reporting function is unchanged, and the new version of
-@code{main} includes a call to @code{init_table}:
+@code{main} includes a call to @code{init_table} and sets the @code{yydebug}
+on user demand (@xref{Tracing, , Tracing Your Parser}, for details):
 
-@comment file: mfcalc.y
-@smallexample
+@comment file: mfcalc.y: 3
+@example
 @group
 /* Called by yyparse on error.  */
 void
@@ -2711,11 +2738,16 @@ yyerror (char const *s)
 int
 main (int argc, char const* argv[])
 @{
+  int i;
+  /* Enable parse traces on option -p.  */
+  for (i = 1; i < argc; ++i)
+    if (!strcmp(argv[i], "-p"))
+      yydebug = 1;
   init_table ();
   return yyparse ();
 @}
 @end group
-@end smallexample
+@end example
 
 This program is both powerful and flexible.  You may easily add new
 functions, and it is a simple job to modify this code to install
@@ -2818,7 +2850,7 @@ prototype functions that take arguments of type @code{YYSTYPE}.  This
 can be done with two @var{Prologue} blocks, one before and one after the
 @code{%union} declaration.
 
-@smallexample
+@example
 %@{
   #define _GNU_SOURCE
   #include <stdio.h>
@@ -2836,7 +2868,7 @@ can be done with two @var{Prologue} blocks, one before and one after the
 %@}
 
 @dots{}
-@end smallexample
+@end example
 
 When in doubt, it is usually safer to put prologue code before all
 Bison declarations, rather than after.  For example, any definitions
@@ -2864,7 +2896,7 @@ location, or it can be one of @code{requires}, @code{provides},
 
 Look again at the example of the previous section:
 
-@smallexample
+@example
 %@{
   #define _GNU_SOURCE
   #include <stdio.h>
@@ -2882,7 +2914,7 @@ Look again at the example of the previous section:
 %@}
 
 @dots{}
-@end smallexample
+@end example
 
 @noindent
 Notice that there are two @var{Prologue} sections here, but there's a
@@ -2911,7 +2943,7 @@ To avoid this subtle @code{%union} dependency, rewrite the example using a
 Let's go ahead and add the new @code{YYLTYPE} definition and the
 @code{trace_token} prototype at the same time:
 
-@smallexample
+@example
 %code top @{
   #define _GNU_SOURCE
   #include <stdio.h>
@@ -2943,7 +2975,7 @@ Let's go ahead and add the new @code{YYLTYPE} definition and the
 @}
 
 @dots{}
-@end smallexample
+@end example
 
 @noindent
 In this way, @code{%code top} and the unqualified @code{%code} achieve the same
@@ -2967,7 +2999,7 @@ lines are dependency code required by the @code{YYSTYPE} and @code{YYLTYPE}
 definitions.
 Thus, they belong in one or more @code{%code requires}:
 
-@smallexample
+@example
 @group
 %code top @{
   #define _GNU_SOURCE
@@ -3010,7 +3042,7 @@ Thus, they belong in one or more @code{%code requires}:
 @end group
 
 @dots{}
-@end smallexample
+@end example
 
 @noindent
 Now Bison will insert @code{#include "ptypes.h"} and the new
@@ -3044,7 +3076,7 @@ this function is not a dependency required by @code{YYSTYPE} or
 sufficient.  Instead, move its prototype from the unqualified
 @code{%code} to a @code{%code provides}:
 
-@smallexample
+@example
 @group
 %code top @{
   #define _GNU_SOURCE
@@ -3092,7 +3124,7 @@ sufficient.  Instead, move its prototype from the unqualified
 @end group
 
 @dots{}
-@end smallexample
+@end example
 
 @noindent
 Bison will insert the @code{trace_token} prototype into both the
@@ -3118,21 +3150,21 @@ organize your grammar file.
 For example, you may organize semantic-type-related directives by semantic
 type:
 
-@smallexample
+@example
 @group
 %code requires @{ #include "type1.h" @}
 %union @{ type1 field1; @}
 %destructor @{ type1_free ($$); @} <field1>
-%printer @{ type1_print ($$); @} <field1>
+%printer @{ type1_print (yyoutput, $$); @} <field1>
 @end group
 
 @group
 %code requires @{ #include "type2.h" @}
 %union @{ type2 field2; @}
 %destructor @{ type2_free ($$); @} <field2>
-%printer @{ type2_print ($$); @} <field2>
+%printer @{ type2_print (yyoutput, $$); @} <field2>
 @end group
-@end smallexample
+@end example
 
 @noindent
 You could even place each of the above directive groups in the rules section of
@@ -3360,8 +3392,7 @@ A Bison grammar rule has the following general form:
 
 @example
 @group
-@var{result}: @var{components}@dots{}
-        ;
+@var{result}: @var{components}@dots{};
 @end group
 @end example
 
@@ -3374,8 +3405,7 @@ For example,
 
 @example
 @group
-exp:      exp '+' exp
-        ;
+exp: exp '+' exp;
 @end group
 @end example
 
@@ -3420,10 +3450,11 @@ be joined with the vertical-bar character @samp{|} as follows:
 
 @example
 @group
-@var{result}:    @var{rule1-components}@dots{}
-        | @var{rule2-components}@dots{}
-        @dots{}
-        ;
+@var{result}:
+  @var{rule1-components}@dots{}
+| @var{rule2-components}@dots{}
+@dots{}
+;
 @end group
 @end example
 
@@ -3436,15 +3467,17 @@ comma-separated sequence of zero or more @code{exp} groupings:
 
 @example
 @group
-expseq:   /* empty */
-        | expseq1
-        ;
+expseq:
+  /* empty */
+| expseq1
+;
 @end group
 
 @group
-expseq1:  exp
-        | expseq1 ',' exp
-        ;
+expseq1:
+  exp
+| expseq1 ',' exp
+;
 @end group
 @end example
 
@@ -3464,9 +3497,10 @@ comma-separated sequence of one or more expressions:
 
 @example
 @group
-expseq1:  exp
-        | expseq1 ',' exp
-        ;
+expseq1:
+  exp
+| expseq1 ',' exp
+;
 @end group
 @end example
 
@@ -3479,9 +3513,10 @@ the same construct is defined using @dfn{right recursion}:
 
 @example
 @group
-expseq1:  exp
-        | exp ',' expseq1
-        ;
+expseq1:
+  exp
+| exp ',' expseq1
+;
 @end group
 @end example
 
@@ -3505,15 +3540,17 @@ For example:
 
 @example
 @group
-expr:     primary
-        | primary '+' primary
-        ;
+expr:
+  primary
+| primary '+' primary
+;
 @end group
 
 @group
-primary:  constant
-        | '(' expr ')'
-        ;
+primary:
+  constant
+| '(' expr ')'
+;
 @end group
 @end example
 
@@ -3635,9 +3672,9 @@ Here is a typical example:
 
 @example
 @group
-exp:    @dots{}
-        | exp '+' exp
-            @{ $$ = $1 + $3; @}
+exp:
+@dots{}
+| exp '+' exp     @{ $$ = $1 + $3; @}
 @end group
 @end example
 
@@ -3645,9 +3682,9 @@ Or, in terms of named references:
 
 @example
 @group
-exp[result]:    @dots{}
-        | exp[left] '+' exp[right]
-            @{ $result = $left + $right; @}
+exp[result]:
+@dots{}
+| exp[left] '+' exp[right]  @{ $result = $left + $right; @}
 @end group
 @end example
 
@@ -3694,15 +3731,16 @@ is a case in which you can use this reliably:
 
 @example
 @group
-foo:      expr bar '+' expr  @{ @dots{} @}
-        | expr bar '-' expr  @{ @dots{} @}
-        ;
+foo:
+  expr bar '+' expr  @{ @dots{} @}
+| expr bar '-' expr  @{ @dots{} @}
+;
 @end group
 
 @group
-bar:      /* empty */
-        @{ previous_expr = $0; @}
-        ;
+bar:
+  /* empty */    @{ previous_expr = $0; @}
+;
 @end group
 @end example
 
@@ -3732,9 +3770,9 @@ in the rule.  In this example,
 
 @example
 @group
-exp:    @dots{}
-        | exp '+' exp
-            @{ $$ = $1 + $3; @}
+exp:
+  @dots{}
+| exp '+' exp    @{ $$ = $1 + $3; @}
 @end group
 @end example
 
@@ -3801,11 +3839,11 @@ remove it afterward.  Here is how it is done:
 
 @example
 @group
-stmt:   LET '(' var ')'
-                @{ $<context>$ = push_context ();
-                  declare_variable ($3); @}
-        stmt    @{ $$ = $6;
-                  pop_context ($<context>5); @}
+stmt:
+  LET '(' var ')'
+    @{ $<context>$ = push_context (); declare_variable ($3); @}
+  stmt
+    @{ $$ = $6; pop_context ($<context>5); @}
 @end group
 @end example
 
@@ -3847,15 +3885,19 @@ declare a destructor for that symbol:
 
 %%
 
-stmt:  let stmt
-               @{ $$ = $2;
-                 pop_context ($1); @}
-       ;
+stmt:
+  let stmt
+    @{
+      $$ = $2;
+      pop_context ($1);
+    @};
 
-let:   LET '(' var ')'
-               @{ $$ = push_context ();
-                 declare_variable ($3); @}
-       ;
+let:
+  LET '(' var ')'
+    @{
+      $$ = push_context ();
+      declare_variable ($3);
+    @};
 
 @end group
 @end example
@@ -3874,9 +3916,10 @@ declaration or not:
 
 @example
 @group
-compound: '@{' declarations statements '@}'
-        | '@{' statements '@}'
-        ;
+compound:
+  '@{' declarations statements '@}'
+| '@{' statements '@}'
+;
 @end group
 @end example
 
@@ -3885,12 +3928,13 @@ But when we add a mid-rule action as follows, the rules become nonfunctional:
 
 @example
 @group
-compound: @{ prepare_for_local_variables (); @}
-          '@{' declarations statements '@}'
+compound:
+  @{ prepare_for_local_variables (); @}
+     '@{' declarations statements '@}'
 @end group
 @group
-        | '@{' statements '@}'
-        ;
+|    '@{' statements '@}'
+;
 @end group
 @end example
 
@@ -3907,11 +3951,12 @@ actions into the two rules, like this:
 
 @example
 @group
-compound: @{ prepare_for_local_variables (); @}
-          '@{' declarations statements '@}'
-        | @{ prepare_for_local_variables (); @}
-          '@{' statements '@}'
-        ;
+compound:
+  @{ prepare_for_local_variables (); @}
+    '@{' declarations statements '@}'
+| @{ prepare_for_local_variables (); @}
+    '@{' statements '@}'
+;
 @end group
 @end example
 
@@ -3925,10 +3970,11 @@ does work is to put the action after the open-brace, like this:
 
 @example
 @group
-compound: '@{' @{ prepare_for_local_variables (); @}
-          declarations statements '@}'
-        | '@{' statements '@}'
-        ;
+compound:
+  '@{' @{ prepare_for_local_variables (); @}
+    declarations statements '@}'
+| '@{' statements '@}'
+;
 @end group
 @end example
 
@@ -3941,18 +3987,16 @@ serves as a subroutine:
 
 @example
 @group
-subroutine: /* empty */
-          @{ prepare_for_local_variables (); @}
-        ;
-
+subroutine:
+  /* empty */  @{ prepare_for_local_variables (); @}
+;
 @end group
 
 @group
-compound: subroutine
-          '@{' declarations statements '@}'
-        | subroutine
-          '@{' statements '@}'
-        ;
+compound:
+  subroutine '@{' declarations statements '@}'
+| subroutine '@{' statements '@}'
+;
 @end group
 @end example
 
@@ -4037,24 +4081,25 @@ Here is a basic example using the default data type for locations:
 
 @example
 @group
-exp:    @dots{}
-        | exp '/' exp
-            @{
-              @@$.first_column = @@1.first_column;
-              @@$.first_line = @@1.first_line;
-              @@$.last_column = @@3.last_column;
-              @@$.last_line = @@3.last_line;
-              if ($3)
-                $$ = $1 / $3;
-              else
-                @{
-                  $$ = 1;
-                  fprintf (stderr,
-                           "Division by zero, l%d,c%d-l%d,c%d",
-                           @@3.first_line, @@3.first_column,
-                           @@3.last_line, @@3.last_column);
-                @}
-            @}
+exp:
+  @dots{}
+| exp '/' exp
+    @{
+      @@$.first_column = @@1.first_column;
+      @@$.first_line = @@1.first_line;
+      @@$.last_column = @@3.last_column;
+      @@$.last_line = @@3.last_line;
+      if ($3)
+        $$ = $1 / $3;
+      else
+        @{
+          $$ = 1;
+          fprintf (stderr,
+                   "Division by zero, l%d,c%d-l%d,c%d",
+                   @@3.first_line, @@3.first_column,
+                   @@3.last_line, @@3.last_column);
+        @}
+    @}
 @end group
 @end example
 
@@ -4068,20 +4113,21 @@ example above simply rewrites this way:
 
 @example
 @group
-exp:    @dots{}
-        | exp '/' exp
-            @{
-              if ($3)
-                $$ = $1 / $3;
-              else
-                @{
-                  $$ = 1;
-                  fprintf (stderr,
-                           "Division by zero, l%d,c%d-l%d,c%d",
-                           @@3.first_line, @@3.first_column,
-                           @@3.last_line, @@3.last_column);
-                @}
-            @}
+exp:
+  @dots{}
+| exp '/' exp
+    @{
+      if ($3)
+        $$ = $1 / $3;
+      else
+        @{
+          $$ = 1;
+          fprintf (stderr,
+                   "Division by zero, l%d,c%d-l%d,c%d",
+                   @@3.first_line, @@3.first_column,
+                   @@3.last_line, @@3.last_column);
+        @}
+    @}
 @end group
 @end example
 
@@ -4122,27 +4168,27 @@ parameter is the number of discarded symbols.
 
 By default, @code{YYLLOC_DEFAULT} is defined this way:
 
-@smallexample
-@group
-# define YYLLOC_DEFAULT(Current, Rhs, N)                                \
-    do                                                                  \
-      if (N)                                                            \
-        @{                                                               \
-          (Current).first_line   = YYRHSLOC(Rhs, 1).first_line;         \
-          (Current).first_column = YYRHSLOC(Rhs, 1).first_column;       \
-          (Current).last_line    = YYRHSLOC(Rhs, N).last_line;          \
-          (Current).last_column  = YYRHSLOC(Rhs, N).last_column;        \
-        @}                                                               \
-      else                                                              \
-        @{                                                               \
-          (Current).first_line   = (Current).last_line   =              \
-            YYRHSLOC(Rhs, 0).last_line;                                 \
-          (Current).first_column = (Current).last_column =              \
-            YYRHSLOC(Rhs, 0).last_column;                               \
-        @}                                                               \
-    while (0)
-@end group
-@end smallexample
+@example
+@group
+# define YYLLOC_DEFAULT(Cur, Rhs, N)                      \
+do                                                        \
+  if (N)                                                  \
+    @{                                                     \
+      (Cur).first_line   = YYRHSLOC(Rhs, 1).first_line;   \
+      (Cur).first_column = YYRHSLOC(Rhs, 1).first_column; \
+      (Cur).last_line    = YYRHSLOC(Rhs, N).last_line;    \
+      (Cur).last_column  = YYRHSLOC(Rhs, N).last_column;  \
+    @}                                                     \
+  else                                                    \
+    @{                                                     \
+      (Cur).first_line   = (Cur).last_line   =            \
+        YYRHSLOC(Rhs, 0).last_line;                       \
+      (Cur).first_column = (Cur).last_column =            \
+        YYRHSLOC(Rhs, 0).last_column;                     \
+    @}                                                     \
+while (0)
+@end group
+@end example
 
 @noindent
 where @code{YYRHSLOC (rhs, k)} is the location of the @var{k}th symbol
@@ -4289,6 +4335,7 @@ and Context-Free Grammars}).
 * Type Decl::         Declaring the choice of type for a nonterminal symbol.
 * Initial Action Decl::  Code run before parsing starts.
 * Destructor Decl::   Declaring how symbols are freed.
+* Printer Decl::      Declaring how symbol values are displayed.
 * Expect Decl::       Suppressing warnings about parsing conflicts.
 * Start Decl::        Specifying the start symbol.
 * Pure Decl::         Requesting a reentrant parser.
@@ -4660,7 +4707,7 @@ symbol that has no declared semantic type tag.
 @noindent
 For example:
 
-@smallexample
+@example
 %union @{ char *string; @}
 %token <string> STRING1
 %token <string> STRING2
@@ -4675,7 +4722,7 @@ For example:
 %destructor @{ free ($$); @} <*>
 %destructor @{ free ($$); printf ("%d", @@$.first_line); @} STRING1 string1
 %destructor @{ printf ("Discarding tagless symbol.\n"); @} <>
-@end smallexample
+@end example
 
 @noindent
 guarantees that, when the parser discards any user-defined symbol that has a
@@ -4700,9 +4747,9 @@ reference it in your grammar.
 However, it may invoke one of them for the end token (token 0) if you
 redefine it from @code{$end} to, for example, @code{END}:
 
-@smallexample
+@example
 %token END 0
-@end smallexample
+@end example
 
 @cindex actions in mid-rule
 @cindex mid-rule actions
@@ -4748,6 +4795,69 @@ error via @code{YYERROR} are not discarded automatically.  As a rule
 of thumb, destructors are invoked only when user actions cannot manage
 the memory.
 
+@node Printer Decl
+@subsection Printing Semantic Values
+@cindex printing semantic values
+@findex %printer
+@findex <*>
+@findex <>
+When run-time traces are enabled (@pxref{Tracing, ,Tracing Your Parser}),
+the parser reports its actions, such as reductions.  When a symbol involved
+in an action is reported, only its kind is displayed, as the parser cannot
+know how semantic values should be formatted.
+
+The @code{%printer} directive defines code that is called when a symbol is
+reported.  Its syntax is the same as @code{%destructor} (@pxref{Destructor
+Decl, , Freeing Discarded Symbols}).
+
+@deffn {Directive} %printer @{ @var{code} @} @var{symbols}
+@findex %printer
+@vindex yyoutput
+@c This is the same text as for %destructor.
+Invoke the braced @var{code} whenever the parser displays one of the
+@var{symbols}.  Within @var{code}, @code{yyoutput} denotes the output stream
+(a @code{FILE*} in C, and an @code{std::ostream&} in C++),
+@code{$$} designates the semantic value associated with the symbol, and
+@code{@@$} its location.  The additional parser parameters are also
+available (@pxref{Parser Function, , The Parser Function @code{yyparse}}).
+
+The @var{symbols} are defined as for @code{%destructor} (@pxref{Destructor
+Decl, , Freeing Discarded Symbols}.): they can be per-type (e.g.,
+@samp{<ival>}), per-symbol (e.g., @samp{exp}, @samp{NUM}, @samp{"float"}),
+typed per-default (i.e., @samp{<*>}, or untyped per-default (i.e.,
+@samp{<>}).
+@end deffn
+
+@noindent
+For example:
+
+@example
+%union @{ char *string; @}
+%token <string> STRING1
+%token <string> STRING2
+%type  <string> string1
+%type  <string> string2
+%union @{ char character; @}
+%token <character> CHR
+%type  <character> chr
+%token TAGLESS
+
+%printer @{ fprintf (yyoutput, "'%c'", $$); @} <character>
+%printer @{ fprintf (yyoutput, "&%p", $$); @} <*>
+%printer @{ fprintf (yyoutput, "\"%s\"", $$); @} STRING1 string1
+%printer @{ fprintf (yyoutput, "<>"); @} <>
+@end example
+
+@noindent
+guarantees that, when the parser print any symbol that has a semantic type
+tag other than @code{<character>}, it display the address of the semantic
+value by default.  However, when the parser displays a @code{STRING1} or a
+@code{string1}, it formats it as a string in double quotes.  It performs
+only the second @code{%printer} in this case, so it prints only once.
+Finally, the parser print @samp{<>} for any symbol, such as @code{TAGLESS},
+that has no semantic type tag.  See also
+
+
 @node Expect Decl
 @subsection Suppressing Conflict Warnings
 @cindex suppressing conflict warnings
@@ -5298,25 +5408,25 @@ Some of the accepted @var{variable}s are:
 @item Purpose: Specify the namespace for the parser class.
 For example, if you specify:
 
-@smallexample
+@example
 %define api.namespace "foo::bar"
-@end smallexample
+@end example
 
 Bison uses @code{foo::bar} verbatim in references such as:
 
-@smallexample
+@example
 foo::bar::parser::semantic_type
-@end smallexample
+@end example
 
 However, to open a namespace, Bison removes any leading @code{::} and then
 splits on any remaining occurrences:
 
-@smallexample
+@example
 namespace foo @{ namespace bar @{
   class position;
   class location;
 @} @}
-@end smallexample
+@end example
 
 @item Accepted Values:
 Any absolute or relative C++ namespace reference without a trailing
@@ -5331,10 +5441,10 @@ for the lexical analyzer function.  Thus, if you specify
 api.namespace} so that @code{%name-prefix} @emph{only} affects the
 lexical analyzer function.  For example, if you specify:
 
-@smallexample
+@example
 %define api.namespace "foo"
 %name-prefix "bar::"
-@end smallexample
+@end example
 
 The parser namespace is @code{foo} and @code{yylex} is referenced as
 @code{bar::lex}.
@@ -5687,12 +5797,12 @@ should usually be more appropriate than @code{%code top}.  However,
 occasionally it is necessary to insert code much nearer the top of the
 parser implementation file.  For example:
 
-@smallexample
+@example
 %code top @{
   #define _GNU_SOURCE
   #include <stdio.h>
 @}
-@end smallexample
+@end example
 
 @item Location(s): Near the top of the parser implementation file.
 @end itemize
@@ -5896,7 +6006,7 @@ This function is available if either the @samp{%define api.push-pull push} or
 @samp{%define api.push-pull both} declaration is used.
 @xref{Push Decl, ,A Push Parser}.
 
-@deftypefun yypstate *yypstate_new (void)
+@deftypefun {yypstate*} yypstate_new (void)
 The function will return a valid parser instance if there was memory available
 or 0 if no memory was available.
 In impure mode, it will also return 0 if a parser instance is currently
@@ -6014,7 +6124,7 @@ assuming that the characters of the token are stored in
 @code{token_buffer}, and assuming that the token does not contain any
 characters like @samp{"} that require escaping.
 
-@smallexample
+@example
 for (i = 0; i < YYNTOKENS; i++)
   @{
     if (yytname[i] != 0
@@ -6025,7 +6135,7 @@ for (i = 0; i < YYNTOKENS; i++)
         && yytname[i][strlen (token_buffer) + 2] == 0)
       break;
   @}
-@end smallexample
+@end example
 
 The @code{yytname} table is generated only if you use the
 @code{%token-table} declaration.  @xref{Decl Summary}.
@@ -6329,17 +6439,17 @@ union specified by the @code{%union} declaration.
 @xref{Action Types, ,Data Types of Values in Actions}.
 @end deffn
 
-@deffn {Macro} YYABORT;
+@deffn {Macro} YYABORT @code{;}
 Return immediately from @code{yyparse}, indicating failure.
 @xref{Parser Function, ,The Parser Function @code{yyparse}}.
 @end deffn
 
-@deffn {Macro} YYACCEPT;
+@deffn {Macro} YYACCEPT @code{;}
 Return immediately from @code{yyparse}, indicating success.
 @xref{Parser Function, ,The Parser Function @code{yyparse}}.
 @end deffn
 
-@deffn {Macro} YYBACKUP (@var{token}, @var{value});
+@deffn {Macro} YYBACKUP (@var{token}, @var{value})@code{;}
 @findex YYBACKUP
 Unshift a token.  This macro is allowed only for rules that reduce
 a single value, and only when there is no lookahead token.
@@ -6357,18 +6467,15 @@ In either case, the rest of the action is not executed.
 @end deffn
 
 @deffn {Macro} YYEMPTY
-@vindex YYEMPTY
 Value stored in @code{yychar} when there is no lookahead token.
 @end deffn
 
 @deffn {Macro} YYEOF
-@vindex YYEOF
 Value stored in @code{yychar} when the lookahead is the end of the input
 stream.
 @end deffn
 
-@deffn {Macro} YYERROR;
-@findex YYERROR
+@deffn {Macro} YYERROR @code{;}
 Cause an immediate syntax error.  This statement initiates error
 recovery just as if the parser itself had detected an error; however, it
 does not call @code{yyerror}, and does not print any message.  If you
@@ -6392,7 +6499,7 @@ Actions}).
 @xref{Lookahead, ,Lookahead Tokens}.
 @end deffn
 
-@deffn {Macro} yyclearin;
+@deffn {Macro} yyclearin @code{;}
 Discard the current lookahead token.  This is useful primarily in
 error rules.
 Do not invoke @code{yyclearin} in a deferred semantic action (@pxref{GLR
@@ -6400,7 +6507,7 @@ Semantic Actions}).
 @xref{Error Recovery}.
 @end deffn
 
-@deffn {Macro} yyerrok;
+@deffn {Macro} yyerrok @code{;}
 Resume generating error messages immediately for subsequent syntax
 errors.  This is useful primarily in error rules.
 @xref{Error Recovery}.
@@ -6633,16 +6740,18 @@ factorial operators (@samp{!}), and allow parentheses for grouping.
 
 @example
 @group
-expr:     term '+' expr
-        | term
-        ;
+expr:
+  term '+' expr
+| term
+;
 @end group
 
 @group
-term:     '(' expr ')'
-        | term '!'
-        | NUMBER
-        ;
+term:
+  '(' expr ')'
+| term '!'
+| NUMBER
+;
 @end group
 @end example
 
@@ -6680,9 +6789,9 @@ statements, with a pair of rules like this:
 @example
 @group
 if_stmt:
-          IF expr THEN stmt
-        | IF expr THEN stmt ELSE stmt
-        ;
+  IF expr THEN stmt
+| IF expr THEN stmt ELSE stmt
+;
 @end group
 @end example
 
@@ -6749,20 +6858,22 @@ the conflict:
 %%
 @end group
 @group
-stmt:     expr
-        | if_stmt
-        ;
+stmt:
+  expr
+| if_stmt
+;
 @end group
 
 @group
 if_stmt:
-          IF expr THEN stmt
-        | IF expr THEN stmt ELSE stmt
-        ;
+  IF expr THEN stmt
+| IF expr THEN stmt ELSE stmt
+;
 @end group
 
-expr:     variable
-        ;
+expr:
+  variable
+;
 @end example
 
 @node Precedence
@@ -6791,12 +6902,13 @@ input @w{@samp{1 - 2 * 3}} can be parsed in two different ways):
 
 @example
 @group
-expr:     expr '-' expr
-        | expr '*' expr
-        | expr '<' expr
-        | '(' expr ')'
-        @dots{}
-        ;
+expr:
+  expr '-' expr
+| expr '*' expr
+| expr '<' expr
+| '(' expr ')'
+@dots{}
+;
 @end group
 @end example
 
@@ -7001,10 +7113,11 @@ Now the precedence of @code{UMINUS} can be used in specific rules:
 
 @example
 @group
-exp:    @dots{}
-        | exp '-' exp
-        @dots{}
-        | '-' exp %prec UMINUS
+exp:
+  @dots{}
+| exp '-' exp
+  @dots{}
+| '-' exp %prec UMINUS
 @end group
 @end example
 
@@ -7070,20 +7183,18 @@ of zero or more @code{word} groupings.
 
 @example
 @group
-sequence: /* empty */
-                @{ printf ("empty sequence\n"); @}
-        | maybeword
-        | sequence word
-                @{ printf ("added word %s\n", $2); @}
-        ;
+sequence:
+  /* empty */    @{ printf ("empty sequence\n"); @}
+| maybeword
+| sequence word  @{ printf ("added word %s\n", $2); @}
+;
 @end group
 
 @group
-maybeword: /* empty */
-                @{ printf ("empty maybeword\n"); @}
-        | word
-                @{ printf ("single word %s\n", $1); @}
-        ;
+maybeword:
+  /* empty */   @{ printf ("empty maybeword\n"); @}
+| word          @{ printf ("single word %s\n", $1); @}
+;
 @end group
 @end example
 
@@ -7111,28 +7222,30 @@ reduce/reduce conflict must be studied and usually eliminated.  Here is the
 proper way to define @code{sequence}:
 
 @example
-sequence: /* empty */
-                @{ printf ("empty sequence\n"); @}
-        | sequence word
-                @{ printf ("added word %s\n", $2); @}
-        ;
+sequence:
+  /* empty */    @{ printf ("empty sequence\n"); @}
+| sequence word  @{ printf ("added word %s\n", $2); @}
+;
 @end example
 
 Here is another common error that yields a reduce/reduce conflict:
 
 @example
-sequence: /* empty */
-        | sequence words
-        | sequence redirects
-        ;
+sequence:
+  /* empty */
+| sequence words
+| sequence redirects
+;
 
-words:    /* empty */
-        | words word
-        ;
+words:
+  /* empty */
+| words word
+;
 
-redirects:/* empty */
-        | redirects redirect
-        ;
+redirects:
+  /* empty */
+| redirects redirect
+;
 @end example
 
 @noindent
@@ -7151,10 +7264,11 @@ Here are two ways to correct these rules.  First, to make it a single level
 of sequence:
 
 @example
-sequence: /* empty */
-        | sequence word
-        | sequence redirect
-        ;
+sequence:
+  /* empty */
+| sequence word
+| sequence redirect
+;
 @end example
 
 Second, to prevent either a @code{words} or a @code{redirects}
@@ -7162,22 +7276,25 @@ from being empty:
 
 @example
 @group
-sequence: /* empty */
-        | sequence words
-        | sequence redirects
-        ;
+sequence:
+  /* empty */
+| sequence words
+| sequence redirects
+;
 @end group
 
 @group
-words:    word
-        | words word
-        ;
+words:
+  word
+| words word
+;
 @end group
 
 @group
-redirects:redirect
-        | redirects redirect
-        ;
+redirects:
+  redirect
+| redirects redirect
+;
 @end group
 @end example
 
@@ -7193,30 +7310,27 @@ Here is an example:
 %token ID
 
 %%
-def:    param_spec return_spec ','
-        ;
+def: param_spec return_spec ',';
 param_spec:
-             type
-        |    name_list ':' type
-        ;
+  type
+| name_list ':' type
+;
 @end group
 @group
 return_spec:
-             type
-        |    name ':' type
-        ;
+  type
+| name ':' type
+;
 @end group
 @group
-type:        ID
-        ;
+type: ID;
 @end group
 @group
-name:        ID
-        ;
+name: ID;
 name_list:
-             name
-        |    name ',' name_list
-        ;
+  name
+| name ',' name_list
+;
 @end group
 @end example
 
@@ -7265,11 +7379,10 @@ distinct.  In the above example, adding one rule to
 %%
 @dots{}
 return_spec:
-             type
-        |    name ':' type
-        /* This rule is never used.  */
-        |    ID BOGUS
-        ;
+  type
+| name ':' type
+| ID BOGUS       /* This rule is never used.  */
+;
 @end group
 @end example
 
@@ -7289,13 +7402,13 @@ rather than the one for @code{name}.
 
 @example
 param_spec:
-             type
-        |    name_list ':' type
-        ;
+  type
+| name_list ':' type
+;
 return_spec:
-             type
-        |    ID ':' type
-        ;
+  type
+| ID ':' type
+;
 @end example
 
 For a more detailed exposition of LALR(1) parsers and parser
@@ -7655,7 +7768,7 @@ semantic actions, but none of these are performed during the exploratory
 parse.  Finally, the base of the temporary stack used during an exploratory
 parse is a pointer into the normal parser state stack so that the stack is
 never physically copied.  In our experience, the performance penalty of LAC
-has proven insignificant for practical grammars.
+has proved insignificant for practical grammars.
 @end itemize
 
 While the LAC algorithm shares techniques that have been recognized in the
@@ -7872,20 +7985,21 @@ in the current context, the parse can continue.
 For example:
 
 @example
-stmnts:  /* empty string */
-        | stmnts '\n'
-        | stmnts exp '\n'
-        | stmnts error '\n'
+stmts:
+  /* empty string */
+| stmts '\n'
+| stmts exp '\n'
+| stmts error '\n'
 @end example
 
 The fourth rule in this example says that an error followed by a newline
-makes a valid addition to any @code{stmnts}.
+makes a valid addition to any @code{stmts}.
 
 What happens if a syntax error occurs in the middle of an @code{exp}?  The
 error recovery rule, interpreted strictly, applies to the precise sequence
-of a @code{stmnts}, an @code{error} and a newline.  If an error occurs in
+of a @code{stmts}, an @code{error} and a newline.  If an error occurs in
 the middle of an @code{exp}, there will probably be some additional tokens
-and subexpressions on the stack after the last @code{stmnts}, and there
+and subexpressions on the stack after the last @code{stmts}, and there
 will be tokens to read before the next newline.  So the rule is not
 applicable in the ordinary way.
 
@@ -7893,7 +8007,7 @@ But Bison can force the situation to fit the rule, by discarding part of
 the semantic context and part of the input.  First it discards states
 and objects from the stack until it gets back to a state in which the
 @code{error} token is acceptable.  (This means that the subexpressions
-already parsed are discarded, back to the last complete @code{stmnts}.)
+already parsed are discarded, back to the last complete @code{stmts}.)
 At this point the @code{error} token can be shifted.  Then, if the old
 lookahead token is not acceptable to be shifted next, the parser reads
 tokens and discards them until it finds a token which is acceptable.  In
@@ -7907,7 +8021,7 @@ error recovery.  A simple and useful strategy is simply to skip the rest of
 the current input line or current statement if an error is detected:
 
 @example
-stmnt: error ';'  /* On error, skip until ';' is read.  */
+stmt: error ';'  /* On error, skip until ';' is read.  */
 @end example
 
 It is also useful to recover to the matching close-delimiter of an
@@ -7916,20 +8030,21 @@ close-delimiter will probably appear to be unmatched, and generate another,
 spurious error message:
 
 @example
-primary:  '(' expr ')'
-        | '(' error ')'
-        @dots{}
-        ;
+primary:
+  '(' expr ')'
+| '(' error ')'
+@dots{}
+;
 @end example
 
 Error recovery strategies are necessarily guesses.  When they guess wrong,
 one syntax error often leads to another.  In the above example, the error
 recovery rule guesses that an error is due to bad input within one
-@code{stmnt}.  Suppose that instead a spurious semicolon is inserted in the
-middle of a valid @code{stmnt}.  After the error recovery rule recovers
+@code{stmt}.  Suppose that instead a spurious semicolon is inserted in the
+middle of a valid @code{stmt}.  After the error recovery rule recovers
 from the first error, another syntax error will be found straightaway,
 since the text following the spurious semicolon is also an invalid
-@code{stmnt}.
+@code{stmt}.
 
 To prevent an outpouring of error messages, the parser will output no error
 message for another syntax error that happens shortly after the first; only
@@ -8041,18 +8156,16 @@ duplication, with actions omitted for brevity:
 @example
 @group
 initdcl:
-          declarator maybeasm '='
-          init
-        | declarator maybeasm
-        ;
+  declarator maybeasm '=' init
+| declarator maybeasm
+;
 @end group
 
 @group
 notype_initdcl:
-          notype_declarator maybeasm '='
-          init
-        | notype_declarator maybeasm
-        ;
+  notype_declarator maybeasm '=' init
+| notype_declarator maybeasm
+;
 @end group
 @end example
 
@@ -8093,24 +8206,21 @@ as an identifier if it appears in that context.  Here is how you can do it:
 @dots{}
 @end group
 @group
-expr:   IDENTIFIER
-        | constant
-        | HEX '('
-                @{ hexflag = 1; @}
-          expr ')'
-                @{ hexflag = 0;
-                   $$ = $4; @}
-        | expr '+' expr
-                @{ $$ = make_sum ($1, $3); @}
-        @dots{}
-        ;
+expr:
+  IDENTIFIER
+| constant
+| HEX '('        @{ hexflag = 1; @}
+    expr ')'     @{ hexflag = 0; $$ = $4; @}
+| expr '+' expr  @{ $$ = make_sum ($1, $3); @}
+@dots{}
+;
 @end group
 
 @group
 constant:
-          INTEGER
-        | STRING
-        ;
+  INTEGER
+| STRING
+;
 @end group
 @end example
 
@@ -8136,12 +8246,12 @@ For example, in C-like languages, a typical error recovery rule is to skip
 tokens until the next semicolon, and then start a new statement, like this:
 
 @example
-stmt:   expr ';'
-        | IF '(' expr ')' stmt @{ @dots{} @}
-        @dots{}
-        error ';'
-                @{ hexflag = 0; @}
-        ;
+stmt:
+  expr ';'
+| IF '(' expr ')' stmt @{ @dots{} @}
+@dots{}
+| error ';'  @{ hexflag = 0; @}
+;
 @end example
 
 If there is a syntax error in the middle of a @samp{hex (@var{expr})}
@@ -8158,11 +8268,11 @@ and skips to the close-parenthesis:
 
 @example
 @group
-expr:   @dots{}
-        | '(' expr ')'
-                @{ $$ = $2; @}
-        | '(' error ')'
-        @dots{}
+expr:
+  @dots{}
+| '(' expr ')'   @{ $$ = $2; @}
+| '(' error ')'
+@dots{}
 @end group
 @end example
 
@@ -8184,12 +8294,10 @@ clear the flag.
 @node Debugging
 @chapter Debugging Your Parser
 
-Developing a parser can be a challenge, especially if you don't
-understand the algorithm (@pxref{Algorithm, ,The Bison Parser
-Algorithm}).  Even so, sometimes a detailed description of the automaton
-can help (@pxref{Understanding, , Understanding Your Parser}), or
-tracing the execution of the parser can give some insight on why it
-behaves improperly (@pxref{Tracing, , Tracing Your Parser}).
+Developing a parser can be a challenge, especially if you don't understand
+the algorithm (@pxref{Algorithm, ,The Bison Parser Algorithm}).  This
+chapter explains how to generate and read the detailed description of the
+automaton, and how to enable and understand the parser run-time traces.
 
 @menu
 * Understanding::     Understanding the structure of your parser.
@@ -8206,7 +8314,7 @@ tune or simply fix a parser.  Bison provides two different
 representation of it, either textually or graphically (as a DOT file).
 
 The textual file is generated when the options @option{--report} or
-@option{--verbose} are specified, see @xref{Invocation, , Invoking
+@option{--verbose} are specified, see @ref{Invocation, , Invoking
 Bison}.  Its name is made by removing @samp{.tab.c} or @samp{.c} from
 the parser implementation file name, and adding @samp{.output}
 instead.  Therefore, if the grammar file is @file{foo.y}, then the
@@ -8220,12 +8328,13 @@ The following grammar file, @file{calc.y}, will be used in the sequel:
 %left '+' '-'
 %left '*'
 %%
-exp: exp '+' exp
-   | exp '-' exp
-   | exp '*' exp
-   | exp '/' exp
-   | NUM
-   ;
+exp:
+  exp '+' exp
+| exp '-' exp
+| exp '*' exp
+| exp '/' exp
+| NUM
+;
 useless: STR;
 %%
 @end example
@@ -8245,26 +8354,6 @@ creates a file @file{calc.output} with contents detailed below.  The
 order of the output and the exact presentation might vary, but the
 interpretation is the same.
 
-The first section includes details on conflicts that were solved thanks
-to precedence and/or associativity:
-
-@example
-Conflict in state 8 between rule 2 and token '+' resolved as reduce.
-Conflict in state 8 between rule 2 and token '-' resolved as reduce.
-Conflict in state 8 between rule 2 and token '*' resolved as shift.
-@exdent @dots{}
-@end example
-
-@noindent
-The next section lists states that still have conflicts.
-
-@example
-State 8 conflicts: 1 shift/reduce
-State 9 conflicts: 1 shift/reduce
-State 10 conflicts: 1 shift/reduce
-State 11 conflicts: 4 shift/reduce
-@end example
-
 @noindent
 @cindex token, useless
 @cindex useless token
@@ -8272,36 +8361,45 @@ State 11 conflicts: 4 shift/reduce
 @cindex useless nonterminal
 @cindex rule, useless
 @cindex useless rule
-The next section reports useless tokens, nonterminal and rules.  Useless
-nonterminals and rules are removed in order to produce a smaller parser,
-but useless tokens are preserved, since they might be used by the
-scanner (note the difference between ``useless'' and ``unused''
-below):
+The first section reports useless tokens, nonterminals and rules.  Useless
+nonterminals and rules are removed in order to produce a smaller parser, but
+useless tokens are preserved, since they might be used by the scanner (note
+the difference between ``useless'' and ``unused'' below):
 
 @example
-Nonterminals useless in grammar:
+Nonterminals useless in grammar
    useless
 
-Terminals unused in grammar:
+Terminals unused in grammar
    STR
 
-Rules useless in grammar:
-#6     useless: STR;
+Rules useless in grammar
+    6 useless: STR
 @end example
 
 @noindent
-The next section reproduces the exact grammar that Bison used:
+The next section lists states that still have conflicts.
+
+@example
+State 8 conflicts: 1 shift/reduce
+State 9 conflicts: 1 shift/reduce
+State 10 conflicts: 1 shift/reduce
+State 11 conflicts: 4 shift/reduce
+@end example
+
+@noindent
+Then Bison reproduces the exact grammar it used:
 
 @example
 Grammar
 
-  Number, Line, Rule
-    0   5 $accept -> exp $end
-    1   5 exp -> exp '+' exp
-    2   6 exp -> exp '-' exp
-    3   7 exp -> exp '*' exp
-    4   8 exp -> exp '/' exp
-    5   9 exp -> NUM
+    0 $accept: exp $end
+
+    1 exp: exp '+' exp
+    2    | exp '-' exp
+    3    | exp '*' exp
+    4    | exp '/' exp
+    5    | NUM
 @end example
 
 @noindent
@@ -8318,14 +8416,15 @@ $end (0) 0
 '/' (47) 4
 error (256)
 NUM (258) 5
+STR (259)
 @end group
 
 @group
 Nonterminals, with rules where they appear
 
-$accept (8)
+$accept (9)
     on left: 0
-exp (9)
+exp (10)
     on left: 1 2 3 4 5, on right: 0 1 2 3 4
 @end group
 @end example
@@ -8342,11 +8441,11 @@ the location of the input cursor.
 @example
 state 0
 
-    $accept  ->  . exp $   (rule 0)
+    0 $accept: . exp $end
 
-    NUM         shift, and go to state 1
+    NUM  shift, and go to state 1
 
-    exp         go to state 2
+    exp  go to state 2
 @end example
 
 This reads as follows: ``state 0 corresponds to being at the very
@@ -8372,27 +8471,27 @@ you want to see more detail you can invoke @command{bison} with
 @example
 state 0
 
-    $accept  ->  . exp $   (rule 0)
-    exp  ->  . exp '+' exp   (rule 1)
-    exp  ->  . exp '-' exp   (rule 2)
-    exp  ->  . exp '*' exp   (rule 3)
-    exp  ->  . exp '/' exp   (rule 4)
-    exp  ->  . NUM   (rule 5)
+    0 $accept: . exp $end
+    1 exp: . exp '+' exp
+    2    | . exp '-' exp
+    3    | . exp '*' exp
+    4    | . exp '/' exp
+    5    | . NUM
 
-    NUM         shift, and go to state 1
+    NUM  shift, and go to state 1
 
-    exp         go to state 2
+    exp  go to state 2
 @end example
 
 @noindent
-In the state 1...
+In the state 1@dots{}
 
 @example
 state 1
 
-    exp  ->  NUM .   (rule 5)
+    5 exp: NUM .
 
-    $default    reduce using rule 5 (exp)
+    $default  reduce using rule 5 (exp)
 @end example
 
 @noindent
@@ -8404,24 +8503,24 @@ jump to state 2 (@samp{exp: go to state 2}).
 @example
 state 2
 
-    $accept  ->  exp . $   (rule 0)
-    exp  ->  exp . '+' exp   (rule 1)
-    exp  ->  exp . '-' exp   (rule 2)
-    exp  ->  exp . '*' exp   (rule 3)
-    exp  ->  exp . '/' exp   (rule 4)
+    0 $accept: exp . $end
+    1 exp: exp . '+' exp
+    2    | exp . '-' exp
+    3    | exp . '*' exp
+    4    | exp . '/' exp
 
-    $           shift, and go to state 3
-    '+'         shift, and go to state 4
-    '-'         shift, and go to state 5
-    '*'         shift, and go to state 6
-    '/'         shift, and go to state 7
+    $end  shift, and go to state 3
+    '+'   shift, and go to state 4
+    '-'   shift, and go to state 5
+    '*'   shift, and go to state 6
+    '/'   shift, and go to state 7
 @end example
 
 @noindent
 In state 2, the automaton can only shift a symbol.  For instance,
-because of the item @samp{exp -> exp . '+' exp}, if the lookahead is
+because of the item @samp{exp: exp . '+' exp}, if the lookahead is
 @samp{+} it is shifted onto the parse stack, and the automaton
-jumps to state 4, corresponding to the item @samp{exp -> exp '+' . exp}.
+jumps to state 4, corresponding to the item @samp{exp: exp '+' . exp}.
 Since there is no default action, any lookahead not listed triggers a syntax
 error.
 
@@ -8432,14 +8531,14 @@ state}:
 @example
 state 3
 
-    $accept  ->  exp $ .   (rule 0)
+    0 $accept: exp $end .
 
-    $default    accept
+    $default  accept
 @end example
 
 @noindent
-the initial rule is completed (the start symbol and the end
-of input were read), the parsing exits successfully.
+the initial rule is completed (the start symbol and the end-of-input were
+read), the parsing exits successfully.
 
 The interpretation of states 4 to 7 is straightforward, and is left to
 the reader.
@@ -8447,35 +8546,38 @@ the reader.
 @example
 state 4
 
-    exp  ->  exp '+' . exp   (rule 1)
+    1 exp: exp '+' . exp
+
+    NUM  shift, and go to state 1
 
-    NUM         shift, and go to state 1
+    exp  go to state 8
 
-    exp         go to state 8
 
 state 5
 
-    exp  ->  exp '-' . exp   (rule 2)
+    2 exp: exp '-' . exp
 
-    NUM         shift, and go to state 1
+    NUM  shift, and go to state 1
+
+    exp  go to state 9
 
-    exp         go to state 9
 
 state 6
 
-    exp  ->  exp '*' . exp   (rule 3)
+    3 exp: exp '*' . exp
+
+    NUM  shift, and go to state 1
 
-    NUM         shift, and go to state 1
+    exp  go to state 10
 
-    exp         go to state 10
 
 state 7
 
-    exp  ->  exp '/' . exp   (rule 4)
+    4 exp: exp '/' . exp
 
-    NUM         shift, and go to state 1
+    NUM  shift, and go to state 1
 
-    exp         go to state 11
+    exp  go to state 11
 @end example
 
 As was announced in beginning of the report, @samp{State 8 conflicts:
@@ -8484,17 +8586,17 @@ As was announced in beginning of the report, @samp{State 8 conflicts:
 @example
 state 8
 
-    exp  ->  exp . '+' exp   (rule 1)
-    exp  ->  exp '+' exp .   (rule 1)
-    exp  ->  exp . '-' exp   (rule 2)
-    exp  ->  exp . '*' exp   (rule 3)
-    exp  ->  exp . '/' exp   (rule 4)
+    1 exp: exp . '+' exp
+    1    | exp '+' exp .
+    2    | exp . '-' exp
+    3    | exp . '*' exp
+    4    | exp . '/' exp
 
-    '*'         shift, and go to state 6
-    '/'         shift, and go to state 7
+    '*'  shift, and go to state 6
+    '/'  shift, and go to state 7
 
-    '/'         [reduce using rule 1 (exp)]
-    $default    reduce using rule 1 (exp)
+    '/'       [reduce using rule 1 (exp)]
+    $default  reduce using rule 1 (exp)
 @end example
 
 Indeed, there are two actions associated to the lookahead @samp{/}:
@@ -8508,7 +8610,7 @@ NUM}, which corresponds to reducing rule 1.
 
 Because in deterministic parsing a single decision can be made, Bison
 arbitrarily chose to disable the reduction, see @ref{Shift/Reduce, ,
-Shift/Reduce Conflicts}.  Discarded actions are reported in between
+Shift/Reduce Conflicts}.  Discarded actions are reported between
 square brackets.
 
 Note that all the previous states had a single possible action: either
@@ -8527,72 +8629,85 @@ with some set of possible lookahead tokens.  When run with
 @example
 state 8
 
-    exp  ->  exp . '+' exp   (rule 1)
-    exp  ->  exp '+' exp .  [$, '+', '-', '/']   (rule 1)
-    exp  ->  exp . '-' exp   (rule 2)
-    exp  ->  exp . '*' exp   (rule 3)
-    exp  ->  exp . '/' exp   (rule 4)
+    1 exp: exp . '+' exp
+    1    | exp '+' exp .  [$end, '+', '-', '/']
+    2    | exp . '-' exp
+    3    | exp . '*' exp
+    4    | exp . '/' exp
 
-    '*'         shift, and go to state 6
-    '/'         shift, and go to state 7
+    '*'  shift, and go to state 6
+    '/'  shift, and go to state 7
 
-    '/'         [reduce using rule 1 (exp)]
-    $default    reduce using rule 1 (exp)
+    '/'       [reduce using rule 1 (exp)]
+    $default  reduce using rule 1 (exp)
 @end example
 
+Note however that while @samp{NUM + NUM / NUM} is ambiguous (which results in
+the conflicts on @samp{/}), @samp{NUM + NUM * NUM} is not: the conflict was
+solved thanks to associativity and precedence directives.  If invoked with
+@option{--report=solved}, Bison includes information about the solved
+conflicts in the report:
+
+@example
+Conflict between rule 1 and token '+' resolved as reduce (%left '+').
+Conflict between rule 1 and token '-' resolved as reduce (%left '-').
+Conflict between rule 1 and token '*' resolved as shift ('+' < '*').
+@end example
+
+
 The remaining states are similar:
 
 @example
 @group
 state 9
 
-    exp  ->  exp . '+' exp   (rule 1)
-    exp  ->  exp . '-' exp   (rule 2)
-    exp  ->  exp '-' exp .   (rule 2)
-    exp  ->  exp . '*' exp   (rule 3)
-    exp  ->  exp . '/' exp   (rule 4)
+    1 exp: exp . '+' exp
+    2    | exp . '-' exp
+    2    | exp '-' exp .
+    3    | exp . '*' exp
+    4    | exp . '/' exp
 
-    '*'         shift, and go to state 6
-    '/'         shift, and go to state 7
+    '*'  shift, and go to state 6
+    '/'  shift, and go to state 7
 
-    '/'         [reduce using rule 2 (exp)]
-    $default    reduce using rule 2 (exp)
+    '/'       [reduce using rule 2 (exp)]
+    $default  reduce using rule 2 (exp)
 @end group
 
 @group
 state 10
 
-    exp  ->  exp . '+' exp   (rule 1)
-    exp  ->  exp . '-' exp   (rule 2)
-    exp  ->  exp . '*' exp   (rule 3)
-    exp  ->  exp '*' exp .   (rule 3)
-    exp  ->  exp . '/' exp   (rule 4)
+    1 exp: exp . '+' exp
+    2    | exp . '-' exp
+    3    | exp . '*' exp
+    3    | exp '*' exp .
+    4    | exp . '/' exp
 
-    '/'         shift, and go to state 7
+    '/'  shift, and go to state 7
 
-    '/'         [reduce using rule 3 (exp)]
-    $default    reduce using rule 3 (exp)
+    '/'       [reduce using rule 3 (exp)]
+    $default  reduce using rule 3 (exp)
 @end group
 
 @group
 state 11
 
-    exp  ->  exp . '+' exp   (rule 1)
-    exp  ->  exp . '-' exp   (rule 2)
-    exp  ->  exp . '*' exp   (rule 3)
-    exp  ->  exp . '/' exp   (rule 4)
-    exp  ->  exp '/' exp .   (rule 4)
+    1 exp: exp . '+' exp
+    2    | exp . '-' exp
+    3    | exp . '*' exp
+    4    | exp . '/' exp
+    4    | exp '/' exp .
 
-    '+'         shift, and go to state 4
-    '-'         shift, and go to state 5
-    '*'         shift, and go to state 6
-    '/'         shift, and go to state 7
+    '+'  shift, and go to state 4
+    '-'  shift, and go to state 5
+    '*'  shift, and go to state 6
+    '/'  shift, and go to state 7
 
-    '+'         [reduce using rule 4 (exp)]
-    '-'         [reduce using rule 4 (exp)]
-    '*'         [reduce using rule 4 (exp)]
-    '/'         [reduce using rule 4 (exp)]
-    $default    reduce using rule 4 (exp)
+    '+'       [reduce using rule 4 (exp)]
+    '-'       [reduce using rule 4 (exp)]
+    '*'       [reduce using rule 4 (exp)]
+    '/'       [reduce using rule 4 (exp)]
+    $default  reduce using rule 4 (exp)
 @end group
 @end example
 
@@ -8609,9 +8724,17 @@ associativity of @samp{/} is not specified.
 @cindex debugging
 @cindex tracing the parser
 
-If a Bison grammar compiles properly but doesn't do what you want when it
-runs, the @code{yydebug} parser-trace feature can help you figure out why.
+When a Bison grammar compiles properly but parses ``incorrectly'', the
+@code{yydebug} parser-trace feature helps figuring out why.
 
+@menu
+* Enabling Traces::    Activating run-time trace support
+* Mfcalc Traces::      Extending @code{mfcalc} to support traces
+* The YYPRINT Macro::  Obsolete interface for semantic value reports
+@end menu
+
+@node Enabling Traces
+@subsection  Enabling Traces
 There are several means to enable compilation of trace facilities:
 
 @table @asis
@@ -8645,6 +8768,7 @@ portability matter to you, this is the preferred solution.
 We suggest that you always enable the trace option so that debugging is
 always possible.
 
+@findex YYFPRINTF
 The trace facility outputs messages with macro calls of the form
 @code{YYFPRINTF (stderr, @var{format}, @var{args})} where
 @var{format} and @var{args} are the usual @code{printf} format and variadic
@@ -8674,9 +8798,9 @@ Each time a rule is reduced, which rule it is, and the complete contents
 of the state stack afterward.
 @end itemize
 
-To make sense of this information, it helps to refer to the listing file
-produced by the Bison @samp{-v} option (@pxref{Invocation, ,Invoking
-Bison}).  This file shows the meaning of each state in terms of
+To make sense of this information, it helps to refer to the automaton
+description file (@pxref{Understanding, ,Understanding Your Parser}).
+This file shows the meaning of each state in terms of
 positions in various rules, and also what each state will do with each
 possible input token.  As you read the successive trace messages, you
 can see that the parser is functioning according to its specification in
@@ -8684,27 +8808,206 @@ the listing file.  Eventually you will arrive at the place where
 something undesirable happens, and you will see which parts of the
 grammar are to blame.
 
-The parser implementation file is a C program and you can use C
+The parser implementation file is a C/C++/Java program and you can use
 debuggers on it, but it's not easy to interpret what it is doing.  The
 parser function is a finite-state machine interpreter, and aside from
 the actions it executes the same code over and over.  Only the values
 of variables show where in the grammar it is working.
 
+@node Mfcalc Traces
+@subsection Enabling Debug Traces for @code{mfcalc}
+
+The debugging information normally gives the token type of each token read,
+but not its semantic value.  The @code{%printer} directive allows specify
+how semantic values are reported, see @ref{Printer Decl, , Printing
+Semantic Values}.  For backward compatibility, Yacc like C parsers may also
+use the @code{YYPRINT} (@pxref{The YYPRINT Macro, , The @code{YYPRINT}
+Macro}), but its use is discouraged.
+
+As a demonstration of @code{%printer}, consider the multi-function
+calculator, @code{mfcalc} (@pxref{Multi-function Calc}).  To enable run-time
+traces, and semantic value reports, insert the following directives in its
+prologue:
+
+@comment file: mfcalc.y: 2
+@example
+/* Generate the parser description file.  */
+%verbose
+/* Enable run-time traces (yydebug).  */
+%define parse.trace
+
+/* Formatting semantic values.  */
+%printer @{ fprintf (yyoutput, "%s", $$->name); @} VAR;
+%printer @{ fprintf (yyoutput, "%s()", $$->name); @} FNCT;
+%printer @{ fprintf (yyoutput, "%g", $$); @} <val>;
+@end example
+
+The @code{%define} directive instructs Bison to generate run-time trace
+support.  Then, activation of these traces is controlled at run-time by the
+@code{yydebug} variable, which is disabled by default.  Because these traces
+will refer to the ``states'' of the parser, it is helpful to ask for the
+creation of a description of that parser; this is the purpose of (admittedly
+ill-named) @code{%verbose} directive.
+
+The set of @code{%printer} directives demonstrates how to format the
+semantic value in the traces.  Note that the specification can be done
+either on the symbol type (e.g., @code{VAR} or @code{FNCT}), or on the type
+tag: since @code{<val>} is the type for both @code{NUM} and @code{exp}, this
+printer will be used for them.
+
+Here is a sample of the information provided by run-time traces.  The traces
+are sent onto standard error.
+
+@example
+$ @kbd{echo 'sin(1-1)' | ./mfcalc -p}
+Starting parse
+Entering state 0
+Reducing stack by rule 1 (line 34):
+-> $$ = nterm input ()
+Stack now 0
+Entering state 1
+@end example
+
+@noindent
+This first batch shows a specific feature of this grammar: the first rule
+(which is in line 34 of @file{mfcalc.y} can be reduced without even having
+to look for the first token.  The resulting left-hand symbol (@code{$$}) is
+a valueless (@samp{()}) @code{input} non terminal (@code{nterm}).
+
+Then the parser calls the scanner.
+@example
+Reading a token: Next token is token FNCT (sin())
+Shifting token FNCT (sin())
+Entering state 6
+@end example
+
+@noindent
+That token (@code{token}) is a function (@code{FNCT}) whose value is
+@samp{sin} as formatted per our @code{%printer} specification: @samp{sin()}.
+The parser stores (@code{Shifting}) that token, and others, until it can do
+something about it.
+
+@example
+Reading a token: Next token is token '(' ()
+Shifting token '(' ()
+Entering state 14
+Reading a token: Next token is token NUM (1.000000)
+Shifting token NUM (1.000000)
+Entering state 4
+Reducing stack by rule 6 (line 44):
+   $1 = token NUM (1.000000)
+-> $$ = nterm exp (1.000000)
+Stack now 0 1 6 14
+Entering state 24
+@end example
+
+@noindent
+The previous reduction demonstrates the @code{%printer} directive for
+@code{<val>}: both the token @code{NUM} and the resulting non-terminal
+@code{exp} have @samp{1} as value.
+
+@example
+Reading a token: Next token is token '-' ()
+Shifting token '-' ()
+Entering state 17
+Reading a token: Next token is token NUM (1.000000)
+Shifting token NUM (1.000000)
+Entering state 4
+Reducing stack by rule 6 (line 44):
+   $1 = token NUM (1.000000)
+-> $$ = nterm exp (1.000000)
+Stack now 0 1 6 14 24 17
+Entering state 26
+Reading a token: Next token is token ')' ()
+Reducing stack by rule 11 (line 49):
+   $1 = nterm exp (1.000000)
+   $2 = token '-' ()
+   $3 = nterm exp (1.000000)
+-> $$ = nterm exp (0.000000)
+Stack now 0 1 6 14
+Entering state 24
+@end example
+
+@noindent
+The rule for the subtraction was just reduced.  The parser is about to
+discover the end of the call to @code{sin}.
+
+@example
+Next token is token ')' ()
+Shifting token ')' ()
+Entering state 31
+Reducing stack by rule 9 (line 47):
+   $1 = token FNCT (sin())
+   $2 = token '(' ()
+   $3 = nterm exp (0.000000)
+   $4 = token ')' ()
+-> $$ = nterm exp (0.000000)
+Stack now 0 1
+Entering state 11
+@end example
+
+@noindent
+Finally, the end-of-line allow the parser to complete the computation, and
+display its result.
+
+@example
+Reading a token: Next token is token '\n' ()
+Shifting token '\n' ()
+Entering state 22
+Reducing stack by rule 4 (line 40):
+   $1 = nterm exp (0.000000)
+   $2 = token '\n' ()
+@result{} 0
+-> $$ = nterm line ()
+Stack now 0 1
+Entering state 10
+Reducing stack by rule 2 (line 35):
+   $1 = nterm input ()
+   $2 = nterm line ()
+-> $$ = nterm input ()
+Stack now 0
+Entering state 1
+@end example
+
+The parser has returned into state 1, in which it is waiting for the next
+expression to evaluate, or for the end-of-file token, which causes the
+completion of the parsing.
+
+@example
+Reading a token: Now at end of input.
+Shifting token $end ()
+Entering state 2
+Stack now 0 1 2
+Cleanup: popping token $end ()
+Cleanup: popping nterm input ()
+@end example
+
+
+@node The YYPRINT Macro
+@subsection The @code{YYPRINT} Macro
+
+@findex YYPRINT
+Before @code{%printer} support, semantic values could be displayed using the
+@code{YYPRINT} macro, which works only for terminal symbols and only with
+the @file{yacc.c} skeleton.
+
+@deffn {Macro} YYPRINT (@var{stream}, @var{token}, @var{value});
 @findex YYPRINT
-The debugging information normally gives the token type of each token
-read, but not its semantic value.  You can optionally define a macro
-named @code{YYPRINT} to provide a way to print the value.  If you define
-@code{YYPRINT}, it should take three arguments.  The parser will pass a
-standard I/O stream, the numeric code for the token type, and the token
-value (from @code{yylval}).
+If you define @code{YYPRINT}, it should take three arguments.  The parser
+will pass a standard I/O stream, the numeric code for the token type, and
+the token value (from @code{yylval}).
+
+For @file{yacc.c} only.  Obsoleted by @code{%printer}.
+@end deffn
 
 Here is an example of @code{YYPRINT} suitable for the multi-function
 calculator (@pxref{Mfcalc Declarations, ,Declarations for @code{mfcalc}}):
 
-@smallexample
+@example
 %@{
   static void print_token_value (FILE *, int, YYSTYPE);
-  #define YYPRINT(file, type, value) print_token_value (file, type, value)
+  #define YYPRINT(File, Type, Value)            \
+    print_token_value (File, Type, Value)
 %@}
 
 @dots{} %% @dots{} %% @dots{}
@@ -8717,7 +9020,7 @@ print_token_value (FILE *file, int type, YYSTYPE value)
   else if (type == NUM)
     fprintf (file, "%d", value.val);
 @}
-@end smallexample
+@end example
 
 @c ================================================= Invoking Bison
 
@@ -8843,7 +9146,7 @@ Also warn about mid-rule values that are used but not set.
 For example, warn about unset @code{$$} in the mid-rule action in:
 
 @example
- exp: '1' @{ $1 = 1; @} '+' exp @{ $$ = $2 + $4; @};
+exp: '1' @{ $1 = 1; @} '+' exp @{ $$ = $2 + $4; @};
 @end example
 
 These warnings are not enabled by default since they sometimes prove to
@@ -9286,55 +9589,98 @@ define a @code{position}, a single point in a file, and a @code{location}, a
 range composed of a pair of @code{position}s (possibly spanning several
 files).
 
-@deftypemethod {position} {std::string*} file
+@tindex uint
+In this section @code{uint} is an abbreviation for @code{unsigned int}: in
+genuine code only the latter is used.
+
+@menu
+* C++ position::         One point in the source file
+* C++ location::         Two points in the source file
+@end menu
+
+@node C++ position
+@subsubsection C++ @code{position}
+
+@deftypeop {Constructor} {position} {} position (std::string* @var{file} = 0, uint @var{line} = 1, uint @var{col} = 1)
+Create a @code{position} denoting a given point.  Note that @code{file} is
+not reclaimed when the @code{position} is destroyed: memory managed must be
+handled elsewhere.
+@end deftypeop
+
+@deftypemethod {position} {void} initialize (std::string* @var{file} = 0, uint @var{line} = 1, uint @var{col} = 1)
+Reset the position to the given values.
+@end deftypemethod
+
+@deftypeivar {position} {std::string*} file
 The name of the file.  It will always be handled as a pointer, the
 parser will never duplicate nor deallocate it.  As an experimental
 feature you may change it to @samp{@var{type}*} using @samp{%define
 filename_type "@var{type}"}.
-@end deftypemethod
+@end deftypeivar
 
-@deftypemethod {position} {unsigned int} line
+@deftypeivar {position} {uint} line
 The line, starting at 1.
-@end deftypemethod
+@end deftypeivar
 
-@deftypemethod {position} {unsigned int} lines (int @var{height} = 1)
+@deftypemethod {position} {uint} lines (int @var{height} = 1)
 Advance by @var{height} lines, resetting the column number.
 @end deftypemethod
 
-@deftypemethod {position} {unsigned int} column
-The column, starting at 0.
-@end deftypemethod
+@deftypeivar {position} {uint} column
+The column, starting at 1.
+@end deftypeivar
 
-@deftypemethod {position} {unsigned int} columns (int @var{width} = 1)
+@deftypemethod {position} {uint} columns (int @var{width} = 1)
 Advance by @var{width} columns, without changing the line number.
 @end deftypemethod
 
-@deftypemethod {position} {position&} operator+= (position& @var{pos}, int @var{width})
-@deftypemethodx {position} {position} operator+ (const position& @var{pos}, int @var{width})
-@deftypemethodx {position} {position&} operator-= (const position& @var{pos}, int @var{width})
-@deftypemethodx {position} {position} operator- (position& @var{pos}, int @var{width})
+@deftypemethod {position} {position&} operator+= (int @var{width})
+@deftypemethodx {position} {position} operator+ (int @var{width})
+@deftypemethodx {position} {position&} operator-= (int @var{width})
+@deftypemethodx {position} {position} operator- (int @var{width})
 Various forms of syntactic sugar for @code{columns}.
 @end deftypemethod
 
-@deftypemethod {position} {position} operator<< (std::ostream @var{o}, const position& @var{p})
+@deftypemethod {position} {bool} operator== (const position& @var{that})
+@deftypemethodx {position} {bool} operator!= (const position& @var{that})
+Whether @code{*this} and @code{that} denote equal/different positions.
+@end deftypemethod
+
+@deftypefun {std::ostream&} operator<< (std::ostream& @var{o}, const position& @var{p})
 Report @var{p} on @var{o} like this:
 @samp{@var{file}:@var{line}.@var{column}}, or
 @samp{@var{line}.@var{column}} if @var{file} is null.
+@end deftypefun
+
+@node C++ location
+@subsubsection C++ @code{location}
+
+@deftypeop {Constructor} {location} {} location (const position& @var{begin}, const position& @var{end})
+Create a @code{Location} from the endpoints of the range.
+@end deftypeop
+
+@deftypeop {Constructor} {location} {} location (const position& @var{pos} = position())
+@deftypeopx {Constructor} {location} {} location (std::string* @var{file}, uint @var{line}, uint @var{col})
+Create a @code{Location} denoting an empty range located at a given point.
+@end deftypeop
+
+@deftypemethod {location} {void} initialize (std::string* @var{file} = 0, uint @var{line} = 1, uint @var{col} = 1)
+Reset the location to an empty range at the given values.
 @end deftypemethod
 
-@deftypemethod {location} {position} begin
-@deftypemethodx {location} {position} end
+@deftypeivar {location} {position} begin
+@deftypeivarx {location} {position} end
 The first, inclusive, position of the range, and the first beyond.
-@end deftypemethod
+@end deftypeivar
 
-@deftypemethod {location} {unsigned int} columns (int @var{width} = 1)
-@deftypemethodx {location} {unsigned int} lines (int @var{height} = 1)
+@deftypemethod {location} {uint} columns (int @var{width} = 1)
+@deftypemethodx {location} {uint} lines (int @var{height} = 1)
 Advance the @code{end} position.
 @end deftypemethod
 
-@deftypemethod {location} {location} operator+ (const location& @var{begin}, const location& @var{end})
-@deftypemethodx {location} {location} operator+ (const location& @var{begin}, int @var{width})
-@deftypemethodx {location} {location} operator+= (const location& @var{loc}, int @var{width})
+@deftypemethod {location} {location} operator+ (const location& @var{end})
+@deftypemethodx {location} {location} operator+ (int @var{width})
+@deftypemethodx {location} {location} operator+= (int @var{width})
 Various forms of syntactic sugar.
 @end deftypemethod
 
@@ -9342,6 +9688,16 @@ Various forms of syntactic sugar.
 Move @code{begin} onto @code{end}.
 @end deftypemethod
 
+@deftypemethod {location} {bool} operator== (const location& @var{that})
+@deftypemethodx {location} {bool} operator!= (const location& @var{that})
+Whether @code{*this} and @code{that} denote equal/different ranges of
+positions.
+@end deftypemethod
+
+@deftypefun {std::ostream&} operator<< (std::ostream& @var{o}, const location& @var{p})
+Report @var{p} on @var{o}, taking care of special cases such as: no
+@code{filename} defined, or equal filename/line or column.
+@end deftypefun
 
 @node C++ Parser Interface
 @subsection C++ Parser Interface
@@ -9750,7 +10106,7 @@ the grammar for.
 
 @comment file: calc++-parser.yy
 @example
-%skeleton "lalr1.cc"                          /*  -*- C++ -*- */
+%skeleton "lalr1.cc" /* -*- C++ -*- */
 %require "@value{VERSION}"
 %defines
 %define parser_class_name "calcxx_parser"
@@ -9885,7 +10241,7 @@ regular destructors.  All the values are printed using their
 @c FIXME: Document %printer, and mention that it takes a braced-code operand.
 @comment file: calc++-parser.yy
 @example
-%printer @{ debug_stream () << $$; @} <*>;
+%printer @{ yyoutput << $$; @} <*>;
 @end example
 
 @noindent
@@ -9899,8 +10255,8 @@ Location Tracking Calculator: @code{ltcalc}}).
 unit: assignments exp  @{ driver.result = $2; @};
 
 assignments:
-  assignments assignment @{@}
-| /* Nothing.  */        @{@};
+  /* Nothing.  */        @{@}
+| assignments assignment @{@};
 
 assignment:
   "identifier" ":=" exp @{ driver.variables[$1] = $3; @};
@@ -9940,7 +10296,7 @@ parser's to get the set of defined tokens.
 
 @comment file: calc++-scanner.ll
 @example
-%@{                                            /* -*- C++ -*- */
+%@{ /* -*- C++ -*- */
 # include <cerrno>
 # include <climits>
 # include <cstdlib>
@@ -10048,7 +10404,7 @@ void
 calcxx_driver::scan_begin ()
 @{
   yy_flex_debug = trace_scanning;
-  if (file == "-")
+  if (file.empty () || file == "-")
     yyin = stdin;
   else if (!(yyin = fopen (file.c_str (), "r")))
     @{
@@ -10083,12 +10439,12 @@ main (int argc, char *argv[])
 @{
   int res = 0;
   calcxx_driver driver;
-  for (++argv; argv[0]; ++argv)
-    if (*argv == std::string ("-p"))
+  for (int i = 1; i < argc; ++i)
+    if (argv[i] == std::string ("-p"))
       driver.trace_parsing = true;
-    else if (*argv == std::string ("-s"))
+    else if (argv[i] == std::string ("-s"))
       driver.trace_scanning = true;
-    else if (!driver.parse (*argv))
+    else if (!driver.parse (argv[i]))
       std::cout << driver.result << std::endl;
     else
       res = 1;
@@ -10313,7 +10669,7 @@ created with the correct @code{%param}s and/or @code{%lex-param}s.
 
 Use @code{%code init} for code added to the start of the constructor
 body. This is especially useful to initialize superclasses. Use
-@samp{%define init_throws} to specify any uncatch exceptions.
+@samp{%define init_throws} to specify any uncaught exceptions.
 @end deftypeop
 
 @deftypemethod {YYParser} {boolean} parse ()
@@ -10468,20 +10824,20 @@ The location information of the grouping made by the current rule.
 @xref{Java Location Values}.
 @end defvar
 
-@deffn {Statement} {return YYABORT;}
+@deftypefn {Statement} return YYABORT @code{;}
 Return immediately from the parser, indicating failure.
 @xref{Java Parser Interface}.
-@end deffn
+@end deftypefn
 
-@deffn {Statement} {return YYACCEPT;}
+@deftypefn {Statement} return YYACCEPT @code{;}
 Return immediately from the parser, indicating success.
 @xref{Java Parser Interface}.
-@end deffn
+@end deftypefn
 
-@deffn {Statement} {return YYERROR;}
-Start error recovery without printing an error message.
+@deftypefn {Statement} {return} YYERROR @code{;}
+Start error recovery (without printing an error message).
 @xref{Error Recovery}.
-@end deffn
+@end deftypefn
 
 @deftypefn {Function} {boolean} recovering ()
 Return whether error recovery is being done. In this state, the parser
@@ -10514,7 +10870,7 @@ macros.  Instead, they should be preceded by @code{return} when they
 appear in an action.  The actual definition of these symbols is
 opaque to the Bison grammar, and it might change in the future.  The
 only meaningful operation that you can do, is to return them.
-See @pxref{Java Action Features}.
+@xref{Java Action Features}.
 
 Note that of these three symbols, only @code{YYACCEPT} and
 @code{YYABORT} will cause a return from the @code{yyparse}
@@ -10530,8 +10886,8 @@ values have a common base type: @code{Object} or as specified by
 an union.  The type of @code{$$}, even with angle brackets, is the base
 type since Java casts are not allow on the left-hand side of assignments.
 Also, @code{$@var{n}} and @code{@@@var{n}} are not allowed on the
-left-hand side of assignments. See @pxref{Java Semantic Values} and
-@pxref{Java Action Features}.
+left-hand side of assignments. @xref{Java Semantic Values} and
+@ref{Java Action Features}.
 
 @item
 The prologue declarations have a different meaning than in C/C++ code.
@@ -10547,7 +10903,7 @@ blocks are placed inside the parser class.
 @item @code{%code lexer}
 blocks, if specified, should include the implementation of the
 scanner.  If there is no such block, the scanner can be any class
-that implements the appropriate interface (see @pxref{Java Scanner
+that implements the appropriate interface (@pxref{Java Scanner
 Interface}).
 @end table
 
@@ -10970,8 +11326,9 @@ real start-symbol:
 @example
 %token START_FOO START_BAR;
 %start start;
-start: START_FOO foo
-     | START_BAR bar;
+start:
+  START_FOO foo
+| START_BAR bar;
 @end example
 
 These tokens prevents the introduction of new conflicts.  As far as the
@@ -11496,10 +11853,11 @@ after a syntax error.  @xref{Error Recovery}.
 @end deffn
 
 @deffn {Macro} YYERROR
-Macro to pretend that a syntax error has just been detected: call
-@code{yyerror} and then perform normal error recovery if possible
-(@pxref{Error Recovery}), or (if recovery is impossible) make
-@code{yyparse} return 1.  @xref{Error Recovery}.
+Cause an immediate syntax error.  This statement initiates error
+recovery just as if the parser itself had detected an error; however, it
+does not call @code{yyerror}, and does not print any message.  If you
+want to print an error message, call @code{yyerror} explicitly before
+the @samp{YYERROR;} statement.  @xref{Error Recovery}.
 
 For Java parsers, this functionality is invoked using @code{return YYERROR;}
 instead.
@@ -11519,6 +11877,11 @@ it.  Using @samp{%define parse.error verbose} is preferred
 (@pxref{Error Reporting, ,The Error Reporting Function @code{yyerror}}).
 @end deffn
 
+@deffn {Macro} YYFPRINTF
+Macro used to output run-time traces.
+@xref{Enabling Traces}.
+@end deffn
+
 @deffn {Macro} YYINITDEPTH
 Macro for specifying the initial size of the parser stack.
 @xref{Memory Management}.
@@ -11581,6 +11944,12 @@ The parser function produced by Bison; call this function to start
 parsing.  @xref{Parser Function, ,The Parser Function @code{yyparse}}.
 @end deffn
 
+@deffn {Macro} YYPRINT
+Macro used to output token semantic values.  For @file{yacc.c} only.
+Obsoleted by @code{%printer}.
+@xref{The YYPRINT Macro, , The @code{YYPRINT} Macro}.
+@end deffn
+
 @deffn {Function} yypstate_delete
 The function to delete a parser instance, produced by Bison in push mode;
 call this function to delete the memory associated with a parser.
@@ -11928,7 +12297,7 @@ London, Department of Computer Science, TR-00-12 (December 2000).
 @c LocalWords: NUM exp subsubsection kbd Ctrl ctype EOF getchar isdigit nonfree
 @c LocalWords: ungetc stdin scanf sc calc ulator ls lm cc NEG prec yyerrok rr
 @c LocalWords: longjmp fprintf stderr yylloc YYLTYPE cos ln Stallman Destructor
-@c LocalWords: smallexample symrec val tptr FNCT fnctptr func struct sym enum
+@c LocalWords: symrec val tptr FNCT fnctptr func struct sym enum IEC syntaxes
 @c LocalWords: fnct putsym getsym fname arith fncts atan ptr malloc sizeof Lex
 @c LocalWords: strlen strcpy fctn strcmp isalpha symbuf realloc isalnum DOTDOT
 @c LocalWords: ptypes itype YYPRINT trigraphs yytname expseq vindex dtype Unary
@@ -11938,35 +12307,36 @@ London, Department of Computer Science, TR-00-12 (December 2000).
 @c LocalWords: strncmp intval tindex lvalp locp llocp typealt YYBACKUP subrange
 @c LocalWords: YYEMPTY YYEOF YYRECOVERING yyclearin GE def UMINUS maybeword loc
 @c LocalWords: Johnstone Shamsa Sadaf Hussain Tomita TR uref YYMAXDEPTH inline
-@c LocalWords: YYINITDEPTH stmnts ref stmnt initdcl maybeasm notype Lookahead
+@c LocalWords: YYINITDEPTH stmts ref initdcl maybeasm notype Lookahead yyoutput
 @c LocalWords: hexflag STR exdent itemset asis DYYDEBUG YYFPRINTF args Autoconf
 @c LocalWords: infile ypp yxx outfile itemx tex leaderfill Troubleshouting sqrt
 @c LocalWords: hbox hss hfill tt ly yyin fopen fclose ofirst gcc ll lookahead
 @c LocalWords: nbar yytext fst snd osplit ntwo strdup AST Troublereporting th
 @c LocalWords: YYSTACK DVI fdl printindex IELR nondeterministic nonterminals ps
 @c LocalWords: subexpressions declarator nondeferred config libintl postfix LAC
-@c LocalWords: preprocessor nonpositive unary nonnumeric typedef extern rhs
-@c LocalWords: yytokentype destructor multicharacter nonnull EBCDIC
+@c LocalWords: preprocessor nonpositive unary nonnumeric typedef extern rhs sr
+@c LocalWords: yytokentype destructor multicharacter nonnull EBCDIC nterm LR's
 @c LocalWords: lvalue nonnegative XNUM CHR chr TAGLESS tagless stdout api TOK
-@c LocalWords: destructors Reentrancy nonreentrant subgrammar nonassociative
+@c LocalWords: destructors Reentrancy nonreentrant subgrammar nonassociative Ph
 @c LocalWords: deffnx namespace xml goto lalr ielr runtime lex yacc yyps env
 @c LocalWords: yystate variadic Unshift NLS gettext po UTF Automake LOCALEDIR
 @c LocalWords: YYENABLE bindtextdomain Makefile DEFS CPPFLAGS DBISON DeRemer
-@c LocalWords: autoreconf Pennello multisets nondeterminism Generalised baz
+@c LocalWords: autoreconf Pennello multisets nondeterminism Generalised baz ACM
 @c LocalWords: redeclare automata Dparse localedir datadir XSLT midrule Wno
-@c LocalWords: Graphviz multitable headitem hh basename Doxygen fno
+@c LocalWords: Graphviz multitable headitem hh basename Doxygen fno filename
 @c LocalWords: doxygen ival sval deftypemethod deallocate pos deftypemethodx
 @c LocalWords: Ctor defcv defcvx arg accessors arithmetics CPP ifndef CALCXX
 @c LocalWords: lexer's calcxx bool LPAREN RPAREN deallocation cerrno climits
 @c LocalWords: cstdlib Debian undef yywrap unput noyywrap nounput zA yyleng
-@c LocalWords: errno strtol ERANGE str strerror iostream argc argv Javadoc
+@c LocalWords: errno strtol ERANGE str strerror iostream argc argv Javadoc PSLR
 @c LocalWords: bytecode initializers superclass stype ASTNode autoboxing nls
 @c LocalWords: toString deftypeivar deftypeivarx deftypeop YYParser strictfp
 @c LocalWords: superclasses boolean getErrorVerbose setErrorVerbose deftypecv
 @c LocalWords: getDebugStream setDebugStream getDebugLevel setDebugLevel url
 @c LocalWords: bisonVersion deftypecvx bisonSkeleton getStartPos getEndPos
-@c LocalWords: getLVal defvar deftypefn deftypefnx gotos msgfmt Corbett
-@c LocalWords: subdirectory Solaris nonassociativity
+@c LocalWords: getLVal defvar deftypefn deftypefnx gotos msgfmt Corbett LALR's
+@c LocalWords: subdirectory Solaris nonassociativity perror schemas Malloy
+@c LocalWords: Scannerless ispell american
 
 @c Local Variables:
 @c ispell-dictionary: "american"