X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/2bfc2e2a7dc951d28669c61fd0deb19a5046dd4a..464c692789eba089bb21ebd3983ebeaa4a8d3312:/doc/bison.texinfo?ds=inline diff --git a/doc/bison.texinfo b/doc/bison.texinfo index 225bbaa7..8cabdb63 100644 --- a/doc/bison.texinfo +++ b/doc/bison.texinfo @@ -119,7 +119,8 @@ Reference sections: * Copying This Manual:: License for copying this manual. * Index:: Cross-references to the text. -@detailmenu --- The Detailed Node Listing --- +@detailmenu + --- The Detailed Node Listing --- The Concepts of Bison @@ -130,6 +131,8 @@ The Concepts of Bison a semantic value (the value of an integer, the name of an identifier, etc.). * Semantic Actions:: Each rule can have an action containing C code. +* GLR Parsers:: Writing parsers for general context-free languages +* Locations Overview:: Tracking Locations. * Bison Parser:: What are Bison's input and output, how is the output used? * Stages:: Stages in writing and running Bison grammars. @@ -143,8 +146,8 @@ Examples Operator precedence is introduced. * Simple Error Recovery:: Continuing after syntax errors. * Location Tracking Calc:: Demonstrating the use of @@@var{n} and @@$. -* Multi-function Calc:: Calculator with memory and trig functions. - It uses multiple data-types for semantic values. +* Multi-function Calc:: Calculator with memory and trig functions. + It uses multiple data-types for semantic values. * Exercises:: Ideas for improving the multi-function calculator. Reverse Polish Notation Calculator @@ -182,15 +185,16 @@ Bison Grammar Files * Rules:: How to write grammar rules. * Recursion:: Writing recursive rules. * Semantics:: Semantic values and actions. +* Locations:: Locations and actions. * Declarations:: All kinds of Bison declarations are described here. * Multiple Parsers:: Putting more than one Bison parser in one program. Outline of a Bison Grammar -* Prologue:: Syntax and usage of the prologue (declarations section). +* Prologue:: Syntax and usage of the prologue. * Bison Declarations:: Syntax and usage of the Bison declarations section. * Grammar Rules:: Syntax and usage of the grammar rules section. -* Epilogue:: Syntax and usage of the epilogue (additional code section). +* Epilogue:: Syntax and usage of the epilogue. Defining Language Semantics @@ -202,12 +206,19 @@ Defining Language Semantics This says when, why and how to use the exceptional action in the middle of a rule. +Tracking Locations + +* Location Type:: Specifying a data type for locations. +* Actions and Locations:: Using locations in actions. +* Location Default Action:: Defining a general way to compute locations. + Bison Declarations * Token Decl:: Declaring terminal symbols. * Precedence Decl:: Declaring terminals with precedence and associativity. * Union Decl:: Declaring the set of all semantic value types. * Type Decl:: Declaring the choice of type for a nonterminal symbol. +* Destructor Decl:: Declaring how symbols are freed. * Expect Decl:: Suppressing warnings about shift/reduce conflicts. * Start Decl:: Specifying the start symbol. * Pure Decl:: Requesting a reentrant parser. @@ -228,7 +239,7 @@ The Lexical Analyzer Function @code{yylex} of the token it has read. * Token Positions:: How @code{yylex} must return the text position (line number, etc.) of the token, if the - actions want that. + actions want that. * Pure Calling:: How the calling convention differs in a pure parser (@pxref{Pure Decl, ,A Pure (Reentrant) Parser}). @@ -258,7 +269,7 @@ Handling Context Dependencies * Tie-in Recovery:: Lexical tie-ins have implications for how error recovery rules must be written. -Understanding or Debugging Your Parser +Debugging Your Parser * Understanding:: Understanding the structure of your parser. * Tracing:: Tracing the execution of your parser. @@ -268,7 +279,7 @@ Invoking Bison * Bison Options:: All the options described in detail, in alphabetical order by short options. * Option Cross Key:: Alphabetical list of long options. -* VMS Invocation:: Bison command syntax on @acronym{VMS}. +* Yacc Library:: Yacc-compatible @code{yylex} and @code{main}. Frequently Asked Questions @@ -412,42 +423,41 @@ more information on this. @cindex generalized @acronym{LR} (@acronym{GLR}) parsing @cindex ambiguous grammars @cindex non-deterministic parsing -Parsers for @acronym{LALR}(1) grammars are @dfn{deterministic}, -meaning roughly that -the next grammar rule to apply at any point in the input is uniquely -determined by the preceding input and a fixed, finite portion (called -a @dfn{look-ahead}) of the remaining input. -A context-free grammar can be @dfn{ambiguous}, meaning that -there are multiple ways to apply the grammar rules to get the some inputs. -Even unambiguous grammars can be @dfn{non-deterministic}, meaning that no -fixed look-ahead always suffices to determine the next grammar rule to apply. -With the proper declarations, Bison is also able to parse these more general -context-free grammars, using a technique known as @acronym{GLR} parsing (for -Generalized @acronym{LR}). Bison's @acronym{GLR} parsers are able to -handle any context-free -grammar for which the number of possible parses of any given string -is finite. + +Parsers for @acronym{LALR}(1) grammars are @dfn{deterministic}, meaning +roughly that the next grammar rule to apply at any point in the input is +uniquely determined by the preceding input and a fixed, finite portion +(called a @dfn{look-ahead}) of the remaining input. A context-free +grammar can be @dfn{ambiguous}, meaning that there are multiple ways to +apply the grammar rules to get the some inputs. Even unambiguous +grammars can be @dfn{non-deterministic}, meaning that no fixed +look-ahead always suffices to determine the next grammar rule to apply. +With the proper declarations, Bison is also able to parse these more +general context-free grammars, using a technique known as @acronym{GLR} +parsing (for Generalized @acronym{LR}). Bison's @acronym{GLR} parsers +are able to handle any context-free grammar for which the number of +possible parses of any given string is finite. @cindex symbols (abstract) @cindex token @cindex syntactic grouping @cindex grouping, syntactic -In the formal grammatical rules for a language, each kind of syntactic unit -or grouping is named by a @dfn{symbol}. Those which are built by grouping -smaller constructs according to grammatical rules are called +In the formal grammatical rules for a language, each kind of syntactic +unit or grouping is named by a @dfn{symbol}. Those which are built by +grouping smaller constructs according to grammatical rules are called @dfn{nonterminal symbols}; those which can't be subdivided are called @dfn{terminal symbols} or @dfn{token types}. We call a piece of input corresponding to a single terminal symbol a @dfn{token}, and a piece corresponding to a single nonterminal symbol a @dfn{grouping}. We can use the C language as an example of what symbols, terminal and -nonterminal, mean. The tokens of C are identifiers, constants (numeric and -string), and the various keywords, arithmetic operators and punctuation -marks. So the terminal symbols of a grammar for C include `identifier', -`number', `string', plus one symbol for each keyword, operator or -punctuation mark: `if', `return', `const', `static', `int', `char', -`plus-sign', `open-brace', `close-brace', `comma' and many more. (These -tokens can be subdivided into characters, but that is a matter of +nonterminal, mean. The tokens of C are identifiers, constants (numeric +and string), and the various keywords, arithmetic operators and +punctuation marks. So the terminal symbols of a grammar for C include +`identifier', `number', `string', plus one symbol for each keyword, +operator or punctuation mark: `if', `return', `const', `static', `int', +`char', `plus-sign', `open-brace', `close-brace', `comma' and many more. +(These tokens can be subdivided into characters, but that is a matter of lexicography, not grammar.) Here is a simple C function subdivided into tokens: @@ -642,28 +652,28 @@ from the values of the two subexpressions. @cindex conflicts @cindex shift/reduce conflicts -In some grammars, there will be cases where Bison's standard @acronym{LALR}(1) -parsing algorithm cannot decide whether to apply a certain grammar rule -at a given point. That is, it may not be able to decide (on the basis -of the input read so far) which of two possible reductions (applications -of a grammar rule) applies, or whether to apply a reduction or read more -of the input and apply a reduction later in the input. These are known -respectively as @dfn{reduce/reduce} conflicts (@pxref{Reduce/Reduce}), -and @dfn{shift/reduce} conflicts (@pxref{Shift/Reduce}). - -To use a grammar that is not easily modified to be @acronym{LALR}(1), a more -general parsing algorithm is sometimes necessary. If you include +In some grammars, there will be cases where Bison's standard +@acronym{LALR}(1) parsing algorithm cannot decide whether to apply a +certain grammar rule at a given point. That is, it may not be able to +decide (on the basis of the input read so far) which of two possible +reductions (applications of a grammar rule) applies, or whether to apply +a reduction or read more of the input and apply a reduction later in the +input. These are known respectively as @dfn{reduce/reduce} conflicts +(@pxref{Reduce/Reduce}), and @dfn{shift/reduce} conflicts +(@pxref{Shift/Reduce}). + +To use a grammar that is not easily modified to be @acronym{LALR}(1), a +more general parsing algorithm is sometimes necessary. If you include @code{%glr-parser} among the Bison declarations in your file -(@pxref{Grammar Outline}), the result will be a Generalized -@acronym{LR} (@acronym{GLR}) -parser. These parsers handle Bison grammars that contain no unresolved -conflicts (i.e., after applying precedence declarations) identically to -@acronym{LALR}(1) parsers. However, when faced with unresolved -shift/reduce and reduce/reduce conflicts, @acronym{GLR} parsers use -the simple expedient of doing -both, effectively cloning the parser to follow both possibilities. Each -of the resulting parsers can again split, so that at any given time, -there can be any number of possible parses being explored. The parsers +(@pxref{Grammar Outline}), the result will be a Generalized @acronym{LR} +(@acronym{GLR}) parser. These parsers handle Bison grammars that +contain no unresolved conflicts (i.e., after applying precedence +declarations) identically to @acronym{LALR}(1) parsers. However, when +faced with unresolved shift/reduce and reduce/reduce conflicts, +@acronym{GLR} parsers use the simple expedient of doing both, +effectively cloning the parser to follow both possibilities. Each of +the resulting parsers can again split, so that at any given time, there +can be any number of possible parses being explored. The parsers proceed in lockstep; that is, all of them consume (shift) a given input symbol before any of them proceed to the next. Each of the cloned parsers eventually meets one of two possible fates: either it runs into @@ -682,11 +692,14 @@ involved, or by performing both actions, and then calling a designated user-defined function on the resulting values to produce an arbitrary merged result. -Let's consider an example, vastly simplified from C++. +Let's consider an example, vastly simplified from a C++ grammar. @example %@{ - #define YYSTYPE const char* + #include + #define YYSTYPE char const * + int yylex (void); + void yyerror (char const *); %@} %token TYPENAME ID @@ -706,20 +719,20 @@ stmt : expr ';' %dprec 1 | decl %dprec 2 ; -expr : ID @{ printf ("%s ", $$); @} +expr : ID @{ printf ("%s ", $$); @} | TYPENAME '(' expr ')' - @{ printf ("%s ", $1); @} - | expr '+' expr @{ printf ("+ "); @} - | expr '=' expr @{ printf ("= "); @} + @{ printf ("%s ", $1); @} + | expr '+' expr @{ printf ("+ "); @} + | expr '=' expr @{ printf ("= "); @} ; decl : TYPENAME declarator ';' - @{ printf ("%s ", $1); @} + @{ printf ("%s ", $1); @} | TYPENAME declarator '=' expr ';' - @{ printf ("%s ", $1); @} + @{ printf ("%s ", $1); @} ; -declarator : ID @{ printf ("\"%s\" ", $1); @} +declarator : ID @{ printf ("\"%s\" ", $1); @} | '(' declarator ')' ; @end example @@ -784,7 +797,8 @@ stmt : expr ';' %merge and define the @code{stmtMerge} function as: @example -static YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1) +static YYSTYPE +stmtMerge (YYSTYPE x0, YYSTYPE x1) @{ printf (" "); return ""; @@ -797,7 +811,7 @@ in the C declarations at the beginning of the file: @example %@{ - #define YYSTYPE const char* + #define YYSTYPE char const * static YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1); %@} @end example @@ -810,6 +824,33 @@ as both an @code{expr} and a @code{decl}, and print "x" y z + T x T y z + = @end example +@sp 1 + +@cindex @code{incline} +@cindex @acronym{GLR} parsers and @code{inline} +The @acronym{GLR} parsers require a compiler for @acronym{ISO} C89 or +later. In addition, they use the @code{inline} keyword, which is not +C89, but is C99 and is a common extension in pre-C99 compilers. It is +up to the user of these parsers to handle +portability issues. For instance, if using Autoconf and the Autoconf +macro @code{AC_C_INLINE}, a mere + +@example +%@{ + #include +%@} +@end example + +@noindent +will suffice. Otherwise, we suggest + +@example +%@{ + #if __STDC_VERSION__ < 199901 && ! defined __GNUC__ && ! defined inline + #define inline + #endif +%@} +@end example @node Locations Overview @section Locations @@ -967,6 +1008,9 @@ in every Bison grammar file to separate the sections. The prologue may define types and variables used in the actions. You can also use preprocessor commands to define macros used there, and use @code{#include} to include header files that do any of these things. +You need to declare the lexical analyzer @code{yylex} and the error +printer @code{yyerror} here, along with any other global identifiers +used by the actions in the grammar rules. The Bison declarations declare the names of the terminal and nonterminal symbols, and may also describe operator precedence and the data types of @@ -975,10 +1019,9 @@ semantic values of various symbols. The grammar rules define how to construct each nonterminal symbol from its parts. -The epilogue can contain any code you want to use. Often the definition of -the lexical analyzer @code{yylex} goes here, plus subroutines called by the -actions in the grammar rules. In a simple program, all the rest of the -program can go here. +The epilogue can contain any code you want to use. Often the +definitions of functions declared in the prologue go here. In a +simple program, all the rest of the program can go here. @node Examples @chapter Examples @@ -1045,8 +1088,10 @@ calculator. As in C, comments are placed between @samp{/*@dots{}*/}. /* Reverse polish notation calculator. */ %@{ -#define YYSTYPE double -#include + #define YYSTYPE double + #include + int yylex (void); + void yyerror (char const *); %@} %token NUM @@ -1055,7 +1100,7 @@ calculator. As in C, comments are placed between @samp{/*@dots{}*/}. @end example The declarations section (@pxref{Prologue, , The prologue}) contains two -preprocessor directives. +preprocessor directives and two forward declarations. The @code{#define} directive defines the macro @code{YYSTYPE}, thus specifying the C data type for semantic values of both tokens and @@ -1068,6 +1113,12 @@ which is a floating point number. The @code{#include} directive is used to declare the exponentiation function @code{pow}. +The forward declarations for @code{yylex} and @code{yyerror} are +needed because the C language requires that functions be declared +before they are used. These functions will be defined in the +epilogue, but the parser calls them so they must be declared in the +prologue. + The second section, Bison declarations, provides information to Bison about the token types (@pxref{Bison Declarations, ,The Bison Declarations Section}). Each terminal symbol that is not a @@ -1088,18 +1139,18 @@ input: /* empty */ ; line: '\n' - | exp '\n' @{ printf ("\t%.10g\n", $1); @} + | exp '\n' @{ printf ("\t%.10g\n", $1); @} ; -exp: NUM @{ $$ = $1; @} - | exp exp '+' @{ $$ = $1 + $2; @} - | exp exp '-' @{ $$ = $1 - $2; @} - | exp exp '*' @{ $$ = $1 * $2; @} - | exp exp '/' @{ $$ = $1 / $2; @} - /* Exponentiation */ - | exp exp '^' @{ $$ = pow ($1, $2); @} - /* Unary minus */ - | exp 'n' @{ $$ = -$1; @} +exp: NUM @{ $$ = $1; @} + | exp exp '+' @{ $$ = $1 + $2; @} + | exp exp '-' @{ $$ = $1 - $2; @} + | exp exp '*' @{ $$ = $1 * $2; @} + | exp exp '/' @{ $$ = $1 / $2; @} + /* Exponentiation */ + | exp exp '^' @{ $$ = pow ($1, $2); @} + /* Unary minus */ + | exp 'n' @{ $$ = -$1; @} ; %% @end example @@ -1348,7 +1399,7 @@ main (void) When @code{yyparse} detects a syntax error, it calls the error reporting function @code{yyerror} to print an error message (usually but not -always @code{"parse error"}). It is up to the programmer to supply +always @code{"syntax error"}). It is up to the programmer to supply @code{yyerror} (@pxref{Interface, ,Parser C-Language Interface}), so here is the definition we will use: @@ -1356,8 +1407,9 @@ here is the definition we will use: @group #include +/* Called by yyparse on error. */ void -yyerror (const char *s) /* called by yyparse on error */ +yyerror (char const *s) @{ printf ("%s\n", s); @} @@ -1457,23 +1509,25 @@ parentheses nested to arbitrary depth. Here is the Bison code for @file{calc.y}, an infix desk-top calculator. @example -/* Infix notation calculator--calc */ +/* Infix notation calculator. */ %@{ -#define YYSTYPE double -#include + #define YYSTYPE double + #include + #include + int yylex (void); + void yyerror (char const *); %@} -/* Bison Declarations */ +/* Bison declarations. */ %token NUM %left '-' '+' %left '*' '/' %left NEG /* negation--unary minus */ -%right '^' /* exponentiation */ +%right '^' /* exponentiation */ -/* Grammar follows */ -%% -input: /* empty string */ +%% /* The grammar follows. */ +input: /* empty */ | input line ; @@ -1558,7 +1612,7 @@ line: '\n' @end example This addition to the grammar allows for simple error recovery in the -event of a parse error. If an expression that cannot be evaluated is +event of a syntax error. If an expression that cannot be evaluated is read, the error will be recognized by the third rule for @code{line}, and parsing will continue. (The @code{yyerror} function is still called upon to print its message as well.) The action executes the statement @@ -1603,8 +1657,10 @@ the same as the declarations for the infix notation calculator. /* Location tracking calculator. */ %@{ -#define YYSTYPE int -#include + #define YYSTYPE int + #include + int yylex (void); + void yyerror (char const *); %@} /* Bison declarations. */ @@ -1615,7 +1671,7 @@ the same as the declarations for the infix notation calculator. %left NEG %right '^' -%% /* Grammar follows */ +%% /* The grammar follows. */ @end example @noindent @@ -1706,11 +1762,15 @@ int yylex (void) @{ int c; +@end group +@group /* Skip white space. */ while ((c = getchar ()) == ' ' || c == '\t') ++yylloc.last_column; +@end group +@group /* Step. */ yylloc.first_line = yylloc.last_line; yylloc.first_column = yylloc.last_column; @@ -1832,28 +1892,32 @@ Note that multiple assignment and nested function calls are permitted. Here are the C and Bison declarations for the multi-function calculator. @smallexample +@group %@{ -#include /* For math functions, cos(), sin(), etc. */ -#include "calc.h" /* Contains definition of `symrec' */ + #include /* For math functions, cos(), sin(), etc. */ + #include "calc.h" /* Contains definition of `symrec'. */ + int yylex (void); + void yyerror (char const *); %@} +@end group +@group %union @{ -double val; /* For returning numbers. */ -symrec *tptr; /* For returning symbol-table pointers */ + double val; /* For returning numbers. */ + symrec *tptr; /* For returning symbol-table pointers. */ @} - -%token NUM /* Simple double precision number */ -%token VAR FNCT /* Variable and Function */ +@end group +%token NUM /* Simple double precision number. */ +%token VAR FNCT /* Variable and Function. */ %type exp +@group %right '=' %left '-' '+' %left '*' '/' -%left NEG /* Negation--unary minus */ -%right '^' /* Exponentiation */ - -/* Grammar follows */ - -%% +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ +@end group +%% /* The grammar follows. */ @end smallexample The above grammar introduces only two new features of the Bison language. @@ -1886,16 +1950,21 @@ Most of them are copied directly from @code{calc}; three rules, those which mention @code{VAR} or @code{FNCT}, are new. @smallexample +@group input: /* empty */ | input line ; +@end group +@group line: '\n' | exp '\n' @{ printf ("\t%.10g\n", $1); @} | error '\n' @{ yyerrok; @} ; +@end group +@group exp: NUM @{ $$ = $1; @} | VAR @{ $$ = $1->value.var; @} | VAR '=' exp @{ $$ = $3; $1->value.var = $3; @} @@ -1908,7 +1977,8 @@ exp: NUM @{ $$ = $1; @} | exp '^' exp @{ $$ = pow ($1, $3); @} | '(' exp ')' @{ $$ = $2; @} ; -/* End of grammar */ +@end group +/* End of grammar. */ %% @end smallexample @@ -1927,31 +1997,33 @@ provides for either functions or variables to be placed in the table. @smallexample @group -/* Function type. */ +/* Function type. */ typedef double (*func_t) (double); +@end group -/* Data type for links in the chain of symbols. */ +@group +/* Data type for links in the chain of symbols. */ struct symrec @{ - char *name; /* name of symbol */ + char *name; /* name of symbol */ int type; /* type of symbol: either VAR or FNCT */ union @{ - double var; /* value of a VAR */ - func_t fnctptr; /* value of a FNCT */ + double var; /* value of a VAR */ + func_t fnctptr; /* value of a FNCT */ @} value; - struct symrec *next; /* link field */ + struct symrec *next; /* link field */ @}; @end group @group typedef struct symrec symrec; -/* The symbol table: a chain of `struct symrec'. */ +/* The symbol table: a chain of `struct symrec'. */ extern symrec *sym_table; -symrec *putsym (const char *, func_t); -symrec *getsym (const char *); +symrec *putsym (char const *, func_t); +symrec *getsym (char const *); @end group @end smallexample @@ -1960,33 +2032,27 @@ function that initializes the symbol table. Here it is, and @code{init_table} as well: @smallexample -@group #include -int -main (void) -@{ - init_table (); - return yyparse (); -@} -@end group - @group +/* Called by yyparse on error. */ void -yyerror (const char *s) /* Called by yyparse on error */ +yyerror (char const *s) @{ printf ("%s\n", s); @} +@end group +@group struct init @{ - char *fname; - double (*fnct)(double); + char const *fname; + double (*fnct) (double); @}; @end group @group -struct init arith_fncts[] = +struct init const arith_fncts[] = @{ "sin", sin, "cos", cos, @@ -1996,9 +2062,11 @@ struct init arith_fncts[] = "sqrt", sqrt, 0, 0 @}; +@end group +@group /* The symbol table: a chain of `struct symrec'. */ -symrec *sym_table = (symrec *) 0; +symrec *sym_table; @end group @group @@ -2015,6 +2083,15 @@ init_table (void) @} @} @end group + +@group +int +main (void) +@{ + init_table (); + return yyparse (); +@} +@end group @end smallexample By simply editing the initialization list and adding the necessary include @@ -2029,7 +2106,7 @@ found, a pointer to that symbol is returned; otherwise zero is returned. @smallexample symrec * -putsym (char *sym_name, int sym_type) +putsym (char const *sym_name, int sym_type) @{ symrec *ptr; ptr = (symrec *) malloc (sizeof (symrec)); @@ -2043,7 +2120,7 @@ putsym (char *sym_name, int sym_type) @} symrec * -getsym (const char *sym_name) +getsym (char const *sym_name) @{ symrec *ptr; for (ptr = sym_table; ptr != (symrec *) 0; @@ -2072,7 +2149,9 @@ operators in @code{yylex}. @smallexample @group #include +@end group +@group int yylex (void) @{ @@ -2120,7 +2199,7 @@ yylex (void) if (i == length) @{ length *= 2; - symbuf = (char *)realloc (symbuf, length + 1); + symbuf = (char *) realloc (symbuf, length + 1); @} /* Add this character to the buffer. */ symbuf[i++] = c; @@ -2199,7 +2278,7 @@ appropriate delimiters: @example %@{ -@var{Prologue} + @var{Prologue} %@} @var{Bison declarations} @@ -2222,7 +2301,7 @@ continues until end of line. * Epilogue:: Syntax and usage of the epilogue. @end menu -@node Prologue, Bison Declarations, , Grammar Outline +@node Prologue @subsection The prologue @cindex declarations section @cindex Prologue @@ -2246,8 +2325,8 @@ can be done with two @var{Prologue} blocks, one before and one after the @smallexample %@{ -#include -#include "ptypes.h" + #include + #include "ptypes.h" %@} %union @{ @@ -2256,8 +2335,8 @@ can be done with two @var{Prologue} blocks, one before and one after the @} %@{ -static void yyprint(FILE *, int, YYSTYPE); -#define YYPRINT(F, N, L) yyprint(F, N, L) + static void print_token_value (FILE *, int, YYSTYPE); + #define YYPRINT(F, N, L) print_token_value (F, N, L) %@} @dots{} @@ -2285,7 +2364,7 @@ There must always be at least one grammar rule, and the first @samp{%%} (which precedes the grammar rules) may never be omitted even if it is the first thing in the file. -@node Epilogue, , Grammar Rules, Grammar Outline +@node Epilogue @subsection The epilogue @cindex additional C code section @cindex epilogue @@ -2295,14 +2374,17 @@ The @var{Epilogue} is copied verbatim to the end of the parser file, just as the @var{Prologue} is copied to the beginning. This is the most convenient place to put anything that you want to have in the parser file but which need not come before the definition of @code{yyparse}. For example, the -definitions of @code{yylex} and @code{yyerror} often go here. +definitions of @code{yylex} and @code{yyerror} often go here. Because +C requires functions to be declared before being used, you often need +to declare functions like @code{yylex} and @code{yyerror} in the Prologue, +even if you define them int he Epilogue. @xref{Interface, ,Parser C-Language Interface}. If the last section is empty, you may omit the @samp{%%} that separates it from the grammar rules. -The Bison parser itself contains many static variables whose names start -with @samp{yy} and many macros whose names start with @samp{YY}. It is a +The Bison parser itself contains many macros and identifiers whose +names start with @samp{yy} or @samp{YY}, so it is a good idea to avoid using any such names (except those documented in this manual) in the epilogue of the grammar file. @@ -2749,11 +2831,11 @@ a-or-b: 'a'|'b' @{ a_or_b_found = 1; @}; @cindex default action If you don't specify an action for a rule, Bison supplies a default: -@w{@code{$$ = $1}.} Thus, the value of the first symbol in the rule becomes -the value of the whole rule. Of course, the default rule is valid only -if the two data types match. There is no meaningful default action for -an empty rule; every empty rule must have an explicit action unless the -rule's value does not matter. +@w{@code{$$ = $1}.} Thus, the value of the first symbol in the rule +becomes the value of the whole rule. Of course, the default action is +valid only if the two data types match. There is no meaningful default +action for an empty rule; every empty rule must have an explicit action +unless the rule's value does not matter. @code{$@var{n}} with @var{n} zero or negative is allowed for reference to tokens and groupings on the stack @emph{before} those that match the @@ -3020,13 +3102,13 @@ When @code{YYLTYPE} is not defined, Bison uses a default structure type with four members: @example -struct +typedef struct YYLTYPE @{ int first_line; int first_column; int last_line; int last_column; -@} +@} YYLTYPE; @end example @node Actions and Locations @@ -3104,17 +3186,23 @@ Actually, actions are not the best place to compute locations. Since locations are much more general than semantic values, there is room in the output parser to redefine the default action to take for each rule. The @code{YYLLOC_DEFAULT} macro is invoked each time a rule is -matched, before the associated action is run. +matched, before the associated action is run. It is also invoked +while processing a syntax error, to compute the error's location. Most of the time, this macro is general enough to suppress location dedicated code from semantic actions. The @code{YYLLOC_DEFAULT} macro takes three parameters. The first one is -the location of the grouping (the result of the computation). The second one -is an array holding locations of all right hand side elements of the rule -being matched. The last one is the size of the right hand side rule. +the location of the grouping (the result of the computation). When a +rule is matched, the second parameter is an array holding locations of +all right hand side elements of the rule being matched, and the third +parameter is the size of the rule's right hand side. When processing +a syntax error, the second parameter is an array holding locations of +the symbols that were discarded during error processing, and the third +parameter is the number of discarded symbols. -By default, it is defined this way for simple @acronym{LALR}(1) parsers: +By default, @code{YYLLOC_DEFAULT} is defined this way for simple +@acronym{LALR}(1) parsers: @example @group @@ -3175,6 +3263,7 @@ Grammars}). * Precedence Decl:: Declaring terminals with precedence and associativity. * Union Decl:: Declaring the set of all semantic value types. * Type Decl:: Declaring the choice of type for a nonterminal symbol. +* Destructor Decl:: Declaring how symbols are freed. * Expect Decl:: Suppressing warnings about shift/reduce conflicts. * Start Decl:: Specifying the start symbol. * Pure Decl:: Requesting a reentrant parser. @@ -3334,7 +3423,23 @@ This says that the two alternative types are @code{double} and @code{symrec in the @code{%token} and @code{%type} declarations to pick one of the types for a terminal or nonterminal symbol (@pxref{Type Decl, ,Nonterminal Symbols}). -Note that, unlike making a @code{union} declaration in C, you do not write +As an extension to @acronym{POSIX}, a tag is allowed after the +@code{union}. For example: + +@example +@group +%union value @{ + double val; + symrec *tptr; +@} +@end group +@end example + +specifies the union tag @code{value}, so the corresponding C type is +@code{union value}. If you do not specify a tag, it defaults to +@code{YYSTYPE}. + +Note that, unlike making a @code{union} declaration in C, you need not write a semicolon after the closing brace. @node Type Decl @@ -3365,6 +3470,71 @@ use the same @code{<@var{type}>} construction in a declaration for the terminal symbol. All kinds of token declarations allow @code{<@var{type}>}. +@node Destructor Decl +@subsection Freeing Discarded Symbols +@cindex freeing discarded symbols +@findex %destructor + +Some symbols can be discarded by the parser, typically during error +recovery (@pxref{Error Recovery}). Basically, during error recovery, +embarrassing symbols already pushed on the stack, and embarrassing +tokens coming from the rest of the file are thrown away until the parser +falls on its feet. If these symbols convey heap based information, this +memory is lost. While this behavior is tolerable for batch parsers, +such as in compilers, it is unacceptable for parsers that can +possibility ``never end'' such as shells, or implementations of +communication protocols. + +The @code{%destructor} directive allows for the definition of code that +is called when a symbol is thrown away. + +@deffn {Directive} %destructor @{ @var{code} @} @var{symbols} +@findex %destructor +Declare that the @var{code} must be invoked for each of the +@var{symbols} that will be discarded by the parser. The @var{code} +should use @code{$$} to designate the semantic value associated to the +@var{symbols}. The additional parser parameters are also avaible +(@pxref{Parser Function, , The Parser Function @code{yyparse}}). + +@strong{Warning:} as of Bison 1.875, this feature is still considered as +experimental, as there was not enough user feedback. In particular, +the syntax might still change. +@end deffn + +For instance: + +@smallexample +%union +@{ + char *string; +@} +%token STRING +%type string +%destructor @{ free ($$); @} STRING string +@end smallexample + +@noindent +guarantees that when a @code{STRING} or a @code{string} will be discarded, +its associated memory will be freed. + +Note that in the future, Bison might also consider that right hand side +members that are not mentioned in the action can be destroyed. For +instance, in: + +@smallexample +comment: "/*" STRING "*/"; +@end smallexample + +@noindent +the parser is entitled to destroy the semantic value of the +@code{string}. Of course, this will not apply to the default action; +compare: + +@smallexample +typeless: string; // $$ = $1 does not apply; $1 is destroyed. +typefull: string; // $$ = $1 applies, $1 is not destroyed. +@end smallexample + @node Expect Decl @subsection Suppressing Conflict Warnings @cindex suppressing conflict warnings @@ -3477,53 +3647,60 @@ valid grammar. Here is a summary of the declarations used to define a grammar: -@table @code -@item %union +@deffn {Directive} %union Declare the collection of data types that semantic values may have (@pxref{Union Decl, ,The Collection of Value Types}). +@end deffn -@item %token +@deffn {Directive} %token Declare a terminal symbol (token type name) with no precedence or associativity specified (@pxref{Token Decl, ,Token Type Names}). +@end deffn -@item %right +@deffn {Directive} %right Declare a terminal symbol (token type name) that is right-associative (@pxref{Precedence Decl, ,Operator Precedence}). +@end deffn -@item %left +@deffn {Directive} %left Declare a terminal symbol (token type name) that is left-associative (@pxref{Precedence Decl, ,Operator Precedence}). +@end deffn -@item %nonassoc +@deffn {Directive} %nonassoc Declare a terminal symbol (token type name) that is nonassociative (using it in a way that would be associative is a syntax error) +@end deffn (@pxref{Precedence Decl, ,Operator Precedence}). -@item %type +@deffn {Directive} %type Declare the type of semantic values for a nonterminal symbol (@pxref{Type Decl, ,Nonterminal Symbols}). +@end deffn -@item %start +@deffn {Directive} %start Specify the grammar's start symbol (@pxref{Start Decl, ,The Start-Symbol}). +@end deffn -@item %expect +@deffn {Directive} %expect Declare the expected number of shift-reduce conflicts (@pxref{Expect Decl, ,Suppressing Conflict Warnings}). -@end table +@end deffn + @sp 1 @noindent In order to change the behavior of @command{bison}, use the following directives: -@table @code -@item %debug +@deffn {Directive} %debug In the parser file, define the macro @code{YYDEBUG} to 1 if it is not already defined, so that the debugging facilities are compiled. +@end deffn @xref{Tracing, ,Tracing Your Parser}. -@item %defines +@deffn {Directive} %defines Write an extra output file containing macro definitions for the token type names defined in the grammar and the semantic value type @code{YYSTYPE}, as well as a few @code{extern} variable declarations. @@ -3535,36 +3712,38 @@ This output file is essential if you wish to put the definition of @code{yylex} in a separate source file, because @code{yylex} needs to be able to refer to token type codes and the variable @code{yylval}. @xref{Token Values, ,Semantic Values of Tokens}. +@end deffn -@item %file-prefix="@var{prefix}" +@deffn {Directive} %destructor +Specifying how the parser should reclaim the memory associated to +discarded symbols. @xref{Destructor Decl, , Freeing Discarded Symbols}. +@end deffn + +@deffn {Directive} %file-prefix="@var{prefix}" Specify a prefix to use for all Bison output file names. The names are chosen as if the input file were named @file{@var{prefix}.y}. +@end deffn -@c @item %header-extension -@c Specify the extension of the parser header file generated when -@c @code{%define} or @samp{-d} are used. -@c -@c For example, a grammar file named @file{foo.ypp} and containing a -@c @code{%header-extension .hh} directive will produce a header file -@c named @file{foo.tab.hh} - -@item %locations +@deffn {Directive} %locations Generate the code processing the locations (@pxref{Action Features, ,Special Features for Use in Actions}). This mode is enabled as soon as the grammar uses the special @samp{@@@var{n}} tokens, but if your grammar does not use it, using @samp{%locations} allows for more -accurate parse error messages. +accurate syntax error messages. +@end deffn -@item %name-prefix="@var{prefix}" +@deffn {Directive} %name-prefix="@var{prefix}" Rename the external symbols used in the parser so that they start with @var{prefix} instead of @samp{yy}. The precise list of symbols renamed is @code{yyparse}, @code{yylex}, @code{yyerror}, @code{yynerrs}, -@code{yylval}, @code{yychar}, @code{yydebug}, and possible -@code{yylloc}. For example, if you use @samp{%name-prefix="c_"}, the -names become @code{c_parse}, @code{c_lex}, and so on. @xref{Multiple -Parsers, ,Multiple Parsers in the Same Program}. - -@item %no-parser +@code{yylval}, @code{yylloc}, @code{yychar}, @code{yydebug}, and +possible @code{yylloc}. For example, if you use +@samp{%name-prefix="c_"}, the names become @code{c_parse}, @code{c_lex}, +and so on. @xref{Multiple Parsers, ,Multiple Parsers in the Same +Program}. +@end deffn + +@deffn {Directive} %no-parser Do not include any C code in the parser file; generate tables only. The parser file contains just @code{#define} directives and static variable declarations. @@ -3572,34 +3751,32 @@ declarations. This option also tells Bison to write the C code for the grammar actions into a file named @file{@var{filename}.act}, in the form of a brace-surrounded body fit for a @code{switch} statement. +@end deffn -@item %no-lines +@deffn {Directive} %no-lines Don't generate any @code{#line} preprocessor commands in the parser file. Ordinarily Bison writes these commands in the parser file so that the C compiler and debuggers will associate errors and object code with your source file (the grammar file). This directive causes them to associate errors with the parser file, treating it an independent source file in its own right. +@end deffn -@item %output="@var{filename}" +@deffn {Directive} %output="@var{filename}" Specify the @var{filename} for the parser file. +@end deffn -@item %pure-parser +@deffn {Directive} %pure-parser Request a pure (reentrant) parser program (@pxref{Pure Decl, ,A Pure (Reentrant) Parser}). +@end deffn -@c @item %source-extension -@c Specify the extension of the parser output file. -@c -@c For example, a grammar file named @file{foo.yy} and containing a -@c @code{%source-extension .cpp} directive will produce a parser file -@c named @file{foo.tab.cpp} - -@item %token-table +@deffn {Directive} %token-table Generate an array of token names in the parser file. The name of the array is @code{yytname}; @code{yytname[@var{i}]} is the name of the token whose internal Bison token code number is @var{i}. The first -three elements of @code{yytname} are always @code{"$end"}, +three elements of @code{yytname} correspond to the predefined tokens +@code{"$end"}, @code{"error"}, and @code{"$undefined"}; after these come the symbols defined in the grammar file. @@ -3627,21 +3804,19 @@ The number of grammar rules, @item YYNSTATES The number of parser states (@pxref{Parser States}). @end table +@end deffn -@item %verbose +@deffn {Directive} %verbose Write an extra output file containing verbose descriptions of the parser states and what is done for each type of look-ahead token in that state. @xref{Understanding, , Understanding Your Parser}, for more information. +@end deffn - - -@item %yacc +@deffn {Directive} %yacc Pretend the option @option{--yacc} was given, i.e., imitate Yacc, including its naming conventions. @xref{Bison Options}, for more. -@end table - - +@end deffn @node Multiple Parsers @@ -3659,9 +3834,9 @@ instead of @samp{yy}. You can use this to give each parser distinct names that do not conflict. The precise list of symbols renamed is @code{yyparse}, @code{yylex}, -@code{yyerror}, @code{yynerrs}, @code{yylval}, @code{yychar} and -@code{yydebug}. For example, if you use @samp{-p c}, the names become -@code{cparse}, @code{clex}, and so on. +@code{yyerror}, @code{yynerrs}, @code{yylval}, @code{yylloc}, +@code{yychar} and @code{yydebug}. For example, if you use @samp{-p c}, +the names become @code{cparse}, @code{clex}, and so on. @strong{All the other variables and macros associated with Bison are not renamed.} These others are not global; there is no conflict if the same @@ -3706,23 +3881,73 @@ encounters end-of-input or an unrecoverable syntax error. You can also write an action which directs @code{yyparse} to return immediately without reading further. + +@deftypefun int yyparse (void) The value returned by @code{yyparse} is 0 if parsing was successful (return is due to end-of-input). The value is 1 if parsing failed (return is due to a syntax error). +@end deftypefun In an action, you can cause immediate return from @code{yyparse} by using these macros: -@table @code -@item YYACCEPT +@defmac YYACCEPT @findex YYACCEPT Return immediately with value 0 (to report success). +@end defmac -@item YYABORT +@defmac YYABORT @findex YYABORT Return immediately with value 1 (to report failure). -@end table +@end defmac + +@c For now, do not document %lex-param and %parse-param, since it's +@c not clear that the current behavior is stable enough. For example, +@c we may need to add %error-param. +@clear documentparam + +@ifset documentparam +If you use a reentrant parser, you can optionally pass additional +parameter information to it in a reentrant way. To do so, use the +declaration @code{%parse-param}: + +@deffn {Directive} %parse-param @{@var{argument-declaration}@} +@findex %parse-param +Declare that an argument declared by @code{argument-declaration} is an +additional @code{yyparse} argument. +The @var{argument-declaration} is used when declaring +functions or prototypes. The last identifier in +@var{argument-declaration} must be the argument name. +@end deffn + +Here's an example. Write this in the parser: + +@example +%parse-param @{int *nastiness@} +%parse-param @{int *randomness@} +@end example + +@noindent +Then call the parser like this: + +@example +@{ + int nastiness, randomness; + @dots{} /* @r{Store proper data in @code{nastiness} and @code{randomness}.} */ + value = yyparse (&nastiness, &randomness); + @dots{} +@} +@end example + +@noindent +In the grammar actions, use expressions like this to refer to the data: + +@example +exp: @dots{} @{ @dots{}; *randomness += 1; @dots{} @} +@end example +@end ifset + @node Lexical @section The Lexical Analyzer Function @code{yylex} @@ -3927,85 +4152,49 @@ textual positions, then the type @code{YYLTYPE} will not be defined. In this case, omit the second argument; @code{yylex} will be called with only one argument. -@vindex YYPARSE_PARAM -If you use a reentrant parser, you can optionally pass additional -parameter information to it in a reentrant way. To do so, define the -macro @code{YYPARSE_PARAM} as a variable name. This modifies the -@code{yyparse} function to accept one argument, of type @code{void *}, -with that name. - -When you call @code{yyparse}, pass the address of an object, casting the -address to @code{void *}. The grammar actions can refer to the contents -of the object by casting the pointer value back to its proper type and -then dereferencing it. Here's an example. Write this in the parser: -@example -%@{ -struct parser_control -@{ - int nastiness; - int randomness; -@}; +@ifset documentparam +If you wish to pass the additional parameter data to @code{yylex}, use +@code{%lex-param} just like @code{%parse-param} (@pxref{Parser +Function}). -#define YYPARSE_PARAM parm -%@} -@end example +@deffn {Directive} lex-param @{@var{argument-declaration}@} +@findex %lex-param +Declare that @code{argument-declaration} is an additional @code{yylex} +argument declaration. +@end deffn -@noindent -Then call the parser like this: +For instance: @example -struct parser_control -@{ - int nastiness; - int randomness; -@}; - -@dots{} - -@{ - struct parser_control foo; - @dots{} /* @r{Store proper data in @code{foo}.} */ - value = yyparse ((void *) &foo); - @dots{} -@} +%parse-param @{int *nastiness@} +%lex-param @{int *nastiness@} +%parse-param @{int *randomness@} @end example @noindent -In the grammar actions, use expressions like this to refer to the data: +results in the following signature: @example -((struct parser_control *) parm)->randomness +int yylex (int *nastiness); +int yyparse (int *nastiness, int *randomness); @end example -@vindex YYLEX_PARAM -If you wish to pass the additional parameter data to @code{yylex}, -define the macro @code{YYLEX_PARAM} just like @code{YYPARSE_PARAM}, as -shown here: +If @code{%pure-parser} is added: @example -%@{ -struct parser_control -@{ - int nastiness; - int randomness; -@}; - -#define YYPARSE_PARAM parm -#define YYLEX_PARAM parm -%@} +int yylex (YYSTYPE *lvalp, int *nastiness); +int yyparse (int *nastiness, int *randomness); @end example -You should then define @code{yylex} to accept one additional -argument---the value of @code{parm}. (This makes either two or three -arguments in total, depending on whether an argument of type -@code{YYLTYPE} is passed.) You can declare the argument as a pointer to -the proper object type, or you can declare it as @code{void *} and -access the contents as shown above. +@noindent +and finally, if both @code{%pure-parser} and @code{%locations} are used: -You can use @samp{%pure-parser} to request a reentrant parser without -also using @code{YYPARSE_PARAM}. Then you should call @code{yyparse} -with no arguments, as usual. +@example +int yylex (YYSTYPE *lvalp, YYLTYPE *llocp, int *nastiness); +int yyparse (int *nastiness, int *randomness); +@end example +@end ifset @node Error Reporting @section The Error Reporting Function @code{yyerror} @@ -4014,7 +4203,7 @@ with no arguments, as usual. @cindex parse error @cindex syntax error -The Bison parser detects a @dfn{parse error} or @dfn{syntax error} +The Bison parser detects a @dfn{syntax error} or @dfn{parse error} whenever it reads a token which cannot satisfy any syntax rule. An action in the grammar can also explicitly proclaim an error, using the macro @code{YYERROR} (@pxref{Action Features, ,Special Features for Use @@ -4023,16 +4212,14 @@ in Actions}). The Bison parser expects to report the error by calling an error reporting function named @code{yyerror}, which you must supply. It is called by @code{yyparse} whenever a syntax error is found, and it -receives one argument. For a parse error, the string is normally -@w{@code{"parse error"}}. +receives one argument. For a syntax error, the string is normally +@w{@code{"syntax error"}}. -@findex YYERROR_VERBOSE -If you define the macro @code{YYERROR_VERBOSE} in the Bison declarations -section (@pxref{Bison Declarations, ,The Bison Declarations Section}), -then Bison provides a more verbose and specific error message string -instead of just plain @w{@code{"parse error"}}. It doesn't matter what -definition you use for @code{YYERROR_VERBOSE}, just whether you define -it. +@findex %error-verbose +If you invoke the directive @code{%error-verbose} in the Bison +declarations section (@pxref{Bison Declarations, ,The Bison Declarations +Section}), then Bison provides a more verbose and specific error message +string instead of just plain @w{@code{"syntax error"}}. The parser can detect one other kind of error: stack overflow. This happens when the input contains constructions that are very deeply @@ -4047,7 +4234,7 @@ The following definition suffices in simple programs: @example @group void -yyerror (char *s) +yyerror (char const *s) @{ @end group @group @@ -4061,6 +4248,65 @@ error recovery if you have written suitable error recovery grammar rules (@pxref{Error Recovery}). If recovery is impossible, @code{yyparse} will immediately return 1. +Obviously, in location tracking pure parsers, @code{yyerror} should have +an access to the current location. This is indeed the case for the GLR +parsers, but not for the Yacc parser, for historical reasons. I.e., if +@samp{%locations %pure-parser} is passed then the prototypes for +@code{yyerror} are: + +@example +void yyerror (char const *msg); /* Yacc parsers. */ +void yyerror (YYLTYPE *locp, char const *msg); /* GLR parsers. */ +@end example + +@ifset documentparam +If @samp{%parse-param @{int *nastiness@}} is used, then: + +@example +void yyerror (int *nastiness, char const *msg); /* Yacc parsers. */ +void yyerror (int *nastiness, char const *msg); /* GLR parsers. */ +@end example + +Finally, GLR and Yacc parsers share the same @code{yyerror} calling +convention for absolutely pure parsers, i.e., when the calling +convention of @code{yylex} @emph{and} the calling convention of +@code{%pure-parser} are pure. I.e.: + +@example +/* Location tracking. */ +%locations +/* Pure yylex. */ +%pure-parser +%lex-param @{int *nastiness@} +/* Pure yyparse. */ +%parse-param @{int *nastiness@} +%parse-param @{int *randomness@} +@end example + +@noindent +results in the following signatures for all the parser kinds: + +@example +int yylex (YYSTYPE *lvalp, YYLTYPE *llocp, int *nastiness); +int yyparse (int *nastiness, int *randomness); +void yyerror (YYLTYPE *locp, + int *nastiness, int *randomness, + char const *msg); +@end example +@end ifset + +@noindent +The prototypes are only indications of how the code produced by Bison +uses @code{yyerror}. Bison-generated code always ignores the returned +value, so @code{yyerror} can return any type, including @code{void}. +Also, @code{yyerror} can be a variadic function; that is why the +message is always passed last. + +Traditionally @code{yyerror} returns an @code{int} that is always +ignored, but this is purely for historical reasons, and @code{void} is +preferable since it more accurately describes the return type for +@code{yyerror}. + @vindex yynerrs The variable @code{yynerrs} contains the number of syntax errors encountered so far. Normally this variable is global; but if you @@ -4075,34 +4321,39 @@ then it is a local variable which only the actions can access. Here is a table of Bison constructs, variables and macros that are useful in actions. -@table @samp -@item $$ +@deffn {Variable} $$ Acts like a variable that contains the semantic value for the grouping made by the current rule. @xref{Actions}. +@end deffn -@item $@var{n} +@deffn {Variable} $@var{n} Acts like a variable that contains the semantic value for the @var{n}th component of the current rule. @xref{Actions}. +@end deffn -@item $<@var{typealt}>$ +@deffn {Variable} $<@var{typealt}>$ Like @code{$$} but specifies alternative @var{typealt} in the union specified by the @code{%union} declaration. @xref{Action Types, ,Data Types of Values in Actions}. +@end deffn -@item $<@var{typealt}>@var{n} +@deffn {Variable} $<@var{typealt}>@var{n} Like @code{$@var{n}} but specifies alternative @var{typealt} in the union specified by the @code{%union} declaration. @xref{Action Types, ,Data Types of Values in Actions}. +@end deffn -@item YYABORT; +@deffn {Macro} YYABORT; Return immediately from @code{yyparse}, indicating failure. @xref{Parser Function, ,The Parser Function @code{yyparse}}. +@end deffn -@item YYACCEPT; +@deffn {Macro} YYACCEPT; Return immediately from @code{yyparse}, indicating success. @xref{Parser Function, ,The Parser Function @code{yyparse}}. +@end deffn -@item YYBACKUP (@var{token}, @var{value}); +@deffn {Macro} YYBACKUP (@var{token}, @var{value}); @findex YYBACKUP Unshift a token. This macro is allowed only for rules that reduce a single value, and only when there is no look-ahead token. @@ -4117,40 +4368,47 @@ a message @samp{cannot back up} and performs ordinary error recovery. In either case, the rest of the action is not executed. +@end deffn -@item YYEMPTY +@deffn {Macro} YYEMPTY @vindex YYEMPTY Value stored in @code{yychar} when there is no look-ahead token. +@end deffn -@item YYERROR; +@deffn {Macro} YYERROR; @findex YYERROR 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}. +@end deffn -@item YYRECOVERING +@deffn {Macro} YYRECOVERING This macro stands for an expression that has the value 1 when the parser is recovering from a syntax error, and 0 the rest of the time. @xref{Error Recovery}. +@end deffn -@item yychar +@deffn {Variable} yychar Variable containing the current look-ahead token. (In a pure parser, this is actually a local variable within @code{yyparse}.) When there is no look-ahead token, the value @code{YYEMPTY} is stored in the variable. @xref{Look-Ahead, ,Look-Ahead Tokens}. +@end deffn -@item yyclearin; +@deffn {Macro} yyclearin; Discard the current look-ahead token. This is useful primarily in error rules. @xref{Error Recovery}. +@end deffn -@item yyerrok; +@deffn {Macro} yyerrok; Resume generating error messages immediately for subsequent syntax errors. This is useful primarily in error rules. @xref{Error Recovery}. +@end deffn -@item @@$ +@deffn {Value} @@$ @findex @@$ Acts like a structure variable containing information on the textual position of the grouping made by the current rule. @xref{Locations, , @@ -4174,14 +4432,15 @@ Tracking Locations}. @c those members. @c The use of this feature makes the parser noticeably slower. +@end deffn -@item @@@var{n} +@deffn {Value} @@@var{n} @findex @@@var{n} Acts like a structure variable containing information on the textual position of the @var{n}th component of the current rule. @xref{Locations, , Tracking Locations}. +@end deffn -@end table @node Algorithm @chapter The Bison Parser Algorithm @@ -4974,7 +5233,7 @@ provided which addresses this issue. @cindex error recovery @cindex recovery from errors -It is not usually acceptable to have a program terminate on a parse +It is not usually acceptable to have a program terminate on a syntax error. For example, a compiler should recover sufficiently to parse the rest of the input file and check it for errors; a calculator should accept another expression. @@ -5016,15 +5275,17 @@ will be tokens to read before the next newline. So the rule is not applicable in the ordinary way. 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 +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}.) At -this point the @code{error} token can be shifted. Then, if the old +already parsed are discarded, back to the last complete @code{stmnts}.) +At this point the @code{error} token can be shifted. Then, if the old look-ahead token is not acceptable to be shifted next, the parser reads tokens and discards them until it finds a token which is acceptable. In -this example, Bison reads and discards input until the next newline -so that the fourth rule can apply. +this example, Bison reads and discards input until the next newline so +that the fourth rule can apply. Note that discarded symbols are +possible sources of memory leaks, see @ref{Destructor Decl, , Freeing +Discarded Symbols}, for a means to reclaim this memory. The choice of error rules in the grammar is a choice of strategies for error recovery. A simple and useful strategy is simply to skip the rest of @@ -5075,7 +5336,7 @@ this is unacceptable, then the macro @code{yyclearin} may be used to clear this token. Write the statement @samp{yyclearin;} in the error rule's action. -For example, suppose that on a parse error, an error handling routine is +For example, suppose that on a syntax error, an error handling routine is called that advances the input stream to some point where parsing should once again commence. The next symbol returned by the lexical scanner is probably correct. The previous look-ahead token ought to be discarded @@ -5198,7 +5459,9 @@ as an identifier if it appears in that context. Here is how you can do it: @example @group %@{ -int hexflag; + int hexflag; + int yylex (void); + void yyerror (char const *); %@} %% @dots{} @@ -5346,8 +5609,8 @@ useless: STR; @example calc.y: warning: 1 useless nonterminal and 1 useless rule calc.y:11.1-7: warning: useless nonterminal: useless -calc.y:11.8-12: warning: useless rule: useless: STR -calc.y contains 7 shift/reduce conflicts. +calc.y:11.10-12: warning: useless rule: useless: STR +calc.y: conflicts: 7 shift/reduce @end example When given @option{--report=state}, in addition to @file{calc.tab.c}, it @@ -5369,10 +5632,10 @@ Conflict in state 8 between rule 2 and token '*' resolved as shift. The next section lists states that still have conflicts. @example -State 8 contains 1 shift/reduce conflict. -State 9 contains 1 shift/reduce conflict. -State 10 contains 1 shift/reduce conflict. -State 11 contains 4 shift/reduce conflicts. +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 @@ -5450,9 +5713,9 @@ state 0 $accept -> . exp $ (rule 0) - 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 @@ -5462,7 +5725,7 @@ after having reduced a rule that produced an @code{exp}, the control flow jumps to state 2. If there is no such transition on a nonterminal symbol, and the lookahead is a @code{NUM}, then this token is shifted on the parse stack, and the control flow jumps to state 1. Any other -lookahead triggers a parse error.'' +lookahead triggers a syntax error.'' @cindex core, item set @cindex item set core @@ -5499,7 +5762,7 @@ state 1 exp -> NUM . (rule 5) - $default reduce using rule 5 (exp) + $default reduce using rule 5 (exp) @end example @noindent @@ -5517,11 +5780,11 @@ state 2 exp -> exp . '*' exp (rule 3) exp -> exp . '/' exp (rule 4) - $ 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 + $ 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 @@ -5530,7 +5793,7 @@ because of the item @samp{exp -> exp . '+' exp}, if the lookahead if @samp{+}, it will be shifted on the parse stack, and the automaton control will jump to state 4, corresponding to the item @samp{exp -> exp '+' . exp}. Since there is no default action, any other token than -those listed above will trigger a parse error. +those listed above will trigger a syntax error. The state 3 is named the @dfn{final state}, or the @dfn{accepting state}: @@ -5540,7 +5803,7 @@ state 3 $accept -> exp $ . (rule 0) - $default accept + $default accept @end example @noindent @@ -5555,37 +5818,37 @@ state 4 exp -> exp '+' . exp (rule 1) - 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) - 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) - 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) - 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 contains 1 -shift/reduce conflict}: +As was announced in beginning of the report, @samp{State 8 conflicts: +1 shift/reduce}: @example state 8 @@ -5596,11 +5859,11 @@ state 8 exp -> exp . '*' exp (rule 3) exp -> exp . '/' exp (rule 4) - '*' 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{/}: @@ -5657,11 +5920,11 @@ state 9 exp -> exp . '*' exp (rule 3) exp -> exp . '/' exp (rule 4) - '*' 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) state 10 @@ -5671,10 +5934,10 @@ state 10 exp -> exp '*' exp . (rule 3) exp -> exp . '/' exp (rule 4) - '/' 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) state 11 @@ -5684,16 +5947,16 @@ state 11 exp -> exp . '/' exp (rule 4) exp -> exp '/' exp . (rule 4) - '+' 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 example @noindent @@ -5796,15 +6059,20 @@ Here is an example of @code{YYPRINT} suitable for the multi-function calculator (@pxref{Mfcalc Decl, ,Declarations for @code{mfcalc}}): @smallexample -#define YYPRINT(file, type, value) yyprint (file, type, value) +%@{ + static void print_token_value (FILE *, int, YYSTYPE); + #define YYPRINT(file, type, value) print_token_value (file, type, value) +%@} + +@dots{} %% @dots{} %% @dots{} static void -yyprint (FILE *file, int type, YYSTYPE value) +print_token_value (FILE *file, int type, YYSTYPE value) @{ if (type == VAR) - fprintf (file, " %s", value.tptr->name); + fprintf (file, "%s", value.tptr->name); else if (type == NUM) - fprintf (file, " %d", value.val); + fprintf (file, "%d", value.val); @} @end smallexample @@ -5848,11 +6116,15 @@ bison -d -o @var{output.c++} @var{infile.y} @noindent will produce @file{output.c++} and @file{outfile.h++}. +For compatibility with @acronym{POSIX}, the standard Bison +distribution also contains a shell script called @command{yacc} that +invokes Bison with the @option{-y} option. + @menu * Bison Options:: All the options described in detail, in alphabetical order by short options. * Option Cross Key:: Alphabetical list of long options. -* VMS Invocation:: Bison command syntax on @acronym{VMS}. +* Yacc Library:: Yacc-compatible @code{yylex} and @code{main}. @end menu @node Bison Options @@ -5888,10 +6160,12 @@ Equivalent to @samp{-o y.tab.c}; the parser output file is called @file{y.tab.c}, and the other outputs are called @file{y.output} and @file{y.tab.h}. The purpose of this option is to imitate Yacc's output file name conventions. Thus, the following shell script can substitute -for Yacc: +for Yacc, and the Bison distribution contains such a script for +compatibility with @acronym{POSIX}: @example -bison -y $* +#! /bin/sh +bison -y "$@" @end example @end table @@ -6044,34 +6318,32 @@ the corresponding short option. @end example @end ifinfo -@node VMS Invocation -@section Invoking Bison under @acronym{VMS} -@cindex invoking Bison under @acronym{VMS} -@cindex @acronym{VMS} +@node Yacc Library +@section Yacc Library -The command line syntax for Bison on @acronym{VMS} is a variant of the usual -Bison command syntax---adapted to fit @acronym{VMS} conventions. +The Yacc library contains default implementations of the +@code{yyerror} and @code{main} functions. These default +implementations are normally not useful, but @acronym{POSIX} requires +them. To use the Yacc library, link your program with the +@option{-ly} option. Note that Bison's implementation of the Yacc +library is distributed under the terms of the @acronym{GNU} General +Public License (@pxref{Copying}). -To find the @acronym{VMS} equivalent for any Bison option, start with the long -option, and substitute a @samp{/} for the leading @samp{--}, and -substitute a @samp{_} for each @samp{-} in the name of the long option. -For example, the following invocation under @acronym{VMS}: +If you use the Yacc library's @code{yyerror} function, you should +declare @code{yyerror} as follows: @example -bison /debug/name_prefix=bar foo.y +int yyerror (char const *); @end example -@noindent -is equivalent to the following command under @acronym{POSIX}. +Bison ignores the @code{int} value returned by this @code{yyerror}. +If you use the Yacc library's @code{main} function, your +@code{yyparse} function should have the following type signature: @example -bison --debug --name-prefix=bar foo.y +int yyparse (void); @end example -The @acronym{VMS} file system does not permit filenames such as -@file{foo.tab.c}. In the above example, the output file -would instead be named @file{foo_tab.c}. - @c ================================================= Invoking Bison @node FAQ @@ -6104,284 +6376,357 @@ This question is already addressed elsewhere, @xref{Recursion, @cindex Bison symbols, table of @cindex symbols in Bison, table of -@table @code -@item @@$ +@deffn {Variable} @@$ In an action, the location of the left-hand side of the rule. @xref{Locations, , Locations Overview}. +@end deffn -@item @@@var{n} +@deffn {Variable} @@@var{n} In an action, the location of the @var{n}-th symbol of the right-hand side of the rule. @xref{Locations, , Locations Overview}. +@end deffn -@item $$ +@deffn {Variable} $$ In an action, the semantic value of the left-hand side of the rule. @xref{Actions}. +@end deffn -@item $@var{n} +@deffn {Variable} $@var{n} In an action, the semantic value of the @var{n}-th symbol of the right-hand side of the rule. @xref{Actions}. +@end deffn -@item $accept +@deffn {Symbol} $accept The predefined nonterminal whose only rule is @samp{$accept: @var{start} $end}, where @var{start} is the start symbol. @xref{Start Decl, , The Start-Symbol}. It cannot be used in the grammar. +@end deffn -@item $end +@deffn {Symbol} $end The predefined token marking the end of the token stream. It cannot be used in the grammar. +@end deffn -@item $undefined +@deffn {Symbol} $undefined The predefined token onto which all undefined values returned by @code{yylex} are mapped. It cannot be used in the grammar, rather, use @code{error}. +@end deffn -@item error +@deffn {Symbol} error A token name reserved for error recovery. This token may be used in grammar rules so as to allow the Bison parser to recognize an error in the grammar without halting the process. In effect, a sentence -containing an error may be recognized as valid. On a parse error, the +containing an error may be recognized as valid. On a syntax error, the token @code{error} becomes the current look-ahead token. Actions corresponding to @code{error} are then executed, and the look-ahead token is reset to the token that originally caused the violation. @xref{Error Recovery}. +@end deffn -@item YYABORT +@deffn {Macro} YYABORT Macro to pretend that an unrecoverable syntax error has occurred, by making @code{yyparse} return 1 immediately. The error reporting function @code{yyerror} is not called. @xref{Parser Function, ,The Parser Function @code{yyparse}}. +@end deffn -@item YYACCEPT +@deffn {Macro} YYACCEPT Macro to pretend that a complete utterance of the language has been read, by making @code{yyparse} return 0 immediately. @xref{Parser Function, ,The Parser Function @code{yyparse}}. +@end deffn -@item YYBACKUP +@deffn {Macro} YYBACKUP Macro to discard a value from the parser stack and fake a look-ahead token. @xref{Action Features, ,Special Features for Use in Actions}. +@end deffn -@item YYDEBUG +@deffn {Macro} YYDEBUG Macro to define to equip the parser with tracing code. @xref{Tracing, ,Tracing Your Parser}. +@end deffn -@item YYERROR +@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}. +@end deffn -@item YYERROR_VERBOSE -Macro that you define with @code{#define} in the Bison declarations -section to request verbose, specific error message strings when -@code{yyerror} is called. +@deffn {Macro} YYERROR_VERBOSE +An obsolete macro that you define with @code{#define} in the prologue +to request verbose, specific error message strings +when @code{yyerror} is called. It doesn't matter what definition you +use for @code{YYERROR_VERBOSE}, just whether you define it. Using +@code{%error-verbose} is preferred. +@end deffn -@item YYINITDEPTH +@deffn {Macro} YYINITDEPTH Macro for specifying the initial size of the parser stack. @xref{Stack Overflow}. +@end deffn -@item YYLEX_PARAM -Macro for specifying an extra argument (or list of extra arguments) for -@code{yyparse} to pass to @code{yylex}. @xref{Pure Calling,, Calling -Conventions for Pure Parsers}. +@deffn {Macro} YYLEX_PARAM +An obsolete macro for specifying an extra argument (or list of extra +arguments) for @code{yyparse} to pass to @code{yylex}. he use of this +macro is deprecated, and is supported only for Yacc like parsers. +@xref{Pure Calling,, Calling Conventions for Pure Parsers}. +@end deffn -@item YYLTYPE -Macro for the data type of @code{yylloc}; a structure with four +@deffn {Type} YYLTYPE +Data type of @code{yylloc}; by default, a structure with four members. @xref{Location Type, , Data Types of Locations}. +@end deffn -@item yyltype -Default value for YYLTYPE. +@deffn {Macro} YYMAXDEPTH +Macro for specifying the maximum size of the parser stack. @xref{Stack +Overflow}. +@end deffn -@item YYMAXDEPTH -Macro for specifying the maximum size of the parser stack. -@xref{Stack Overflow}. - -@item YYPARSE_PARAM -Macro for specifying the name of a parameter that @code{yyparse} should -accept. @xref{Pure Calling,, Calling Conventions for Pure Parsers}. +@deffn {Macro} YYPARSE_PARAM +An obsolete macro for specifying the name of a parameter that +@code{yyparse} should accept. The use of this macro is deprecated, and +is supported only for Yacc like parsers. @xref{Pure Calling,, Calling +Conventions for Pure Parsers}. +@end deffn -@item YYRECOVERING +@deffn {Macro} YYRECOVERING Macro whose value indicates whether the parser is recovering from a syntax error. @xref{Action Features, ,Special Features for Use in Actions}. +@end deffn -@item YYSTACK_USE_ALLOCA +@deffn {Macro} YYSTACK_USE_ALLOCA Macro used to control the use of @code{alloca}. If defined to @samp{0}, the parser will not use @code{alloca} but @code{malloc} when trying to grow its internal stacks. Do @emph{not} define @code{YYSTACK_USE_ALLOCA} to anything else. +@end deffn -@item YYSTYPE -Macro for the data type of semantic values; @code{int} by default. +@deffn {Type} YYSTYPE +Data type of semantic values; @code{int} by default. @xref{Value Type, ,Data Types of Semantic Values}. +@end deffn -@item yychar +@deffn {Variable} yychar External integer variable that contains the integer value of the current look-ahead token. (In a pure parser, it is a local variable within @code{yyparse}.) Error-recovery rule actions may examine this variable. @xref{Action Features, ,Special Features for Use in Actions}. +@end deffn -@item yyclearin +@deffn {Variable} yyclearin Macro used in error-recovery rule actions. It clears the previous look-ahead token. @xref{Error Recovery}. +@end deffn -@item yydebug +@deffn {Variable} yydebug External integer variable set to zero by default. If @code{yydebug} is given a nonzero value, the parser will output information on input symbols and parser action. @xref{Tracing, ,Tracing Your Parser}. +@end deffn -@item yyerrok +@deffn {Macro} yyerrok Macro to cause parser to recover immediately to its normal mode -after a parse error. @xref{Error Recovery}. +after a syntax error. @xref{Error Recovery}. +@end deffn -@item yyerror -User-supplied function to be called by @code{yyparse} on error. The -function receives one argument, a pointer to a character string -containing an error message. @xref{Error Reporting, ,The Error +@deffn {Function} yyerror +User-supplied function to be called by @code{yyparse} on error. +@xref{Error Reporting, ,The Error Reporting Function @code{yyerror}}. +@end deffn -@item yylex +@deffn {Function} yylex User-supplied lexical analyzer function, called with no arguments to get the next token. @xref{Lexical, ,The Lexical Analyzer Function @code{yylex}}. +@end deffn -@item yylval +@deffn {Variable} yylval External variable in which @code{yylex} should place the semantic value associated with a token. (In a pure parser, it is a local variable within @code{yyparse}, and its address is passed to @code{yylex}.) @xref{Token Values, ,Semantic Values of Tokens}. +@end deffn -@item yylloc +@deffn {Variable} yylloc External variable in which @code{yylex} should place the line and column numbers associated with a token. (In a pure parser, it is a local variable within @code{yyparse}, and its address is passed to @code{yylex}.) You can ignore this variable if you don't use the @samp{@@} feature in the grammar actions. @xref{Token Positions, ,Textual Positions of Tokens}. +@end deffn -@item yynerrs -Global variable which Bison increments each time there is a parse error. +@deffn {Variable} yynerrs +Global variable which Bison increments each time there is a syntax error. (In a pure parser, it is a local variable within @code{yyparse}.) @xref{Error Reporting, ,The Error Reporting Function @code{yyerror}}. +@end deffn -@item yyparse +@deffn {Function} yyparse The parser function produced by Bison; call this function to start parsing. @xref{Parser Function, ,The Parser Function @code{yyparse}}. +@end deffn -@item %debug +@deffn {Directive} %debug Equip the parser for debugging. @xref{Decl Summary}. +@end deffn -@item %defines +@deffn {Directive} %defines Bison declaration to create a header file meant for the scanner. @xref{Decl Summary}. +@end deffn -@item %dprec +@deffn {Directive} %destructor +Specifying how the parser should reclaim the memory associated to +discarded symbols. @xref{Destructor Decl, , Freeing Discarded Symbols}. +@end deffn + +@deffn {Directive} %dprec Bison declaration to assign a precedence to a rule that is used at parse time to resolve reduce/reduce conflicts. @xref{GLR Parsers, ,Writing @acronym{GLR} Parsers}. +@end deffn + +@deffn {Directive} %error-verbose +Bison declaration to request verbose, specific error message strings +when @code{yyerror} is called. +@end deffn -@item %file-prefix="@var{prefix}" +@deffn {Directive} %file-prefix="@var{prefix}" Bison declaration to set the prefix of the output files. @xref{Decl Summary}. +@end deffn -@item %glr-parser +@deffn {Directive} %glr-parser Bison declaration to produce a @acronym{GLR} parser. @xref{GLR Parsers, ,Writing @acronym{GLR} Parsers}. +@end deffn -@c @item %source-extension -@c Bison declaration to specify the generated parser output file extension. -@c @xref{Decl Summary}. -@c -@c @item %header-extension -@c Bison declaration to specify the generated parser header file extension -@c if required. @xref{Decl Summary}. - -@item %left +@deffn {Directive} %left Bison declaration to assign left associativity to token(s). @xref{Precedence Decl, ,Operator Precedence}. +@end deffn + +@ifset documentparam +@deffn {Directive} %lex-param @{@var{argument-declaration}@} +Bison declaration to specifying an additional parameter that +@code{yylex} should accept. @xref{Pure Calling,, Calling Conventions +for Pure Parsers}. +@end deffn +@end ifset -@item %merge +@deffn {Directive} %merge Bison declaration to assign a merging function to a rule. If there is a reduce/reduce conflict with a rule having the same merging function, the function is applied to the two semantic values to get a single result. @xref{GLR Parsers, ,Writing @acronym{GLR} Parsers}. +@end deffn -@item %name-prefix="@var{prefix}" +@deffn {Directive} %name-prefix="@var{prefix}" Bison declaration to rename the external symbols. @xref{Decl Summary}. +@end deffn -@item %no-lines +@deffn {Directive} %no-lines Bison declaration to avoid generating @code{#line} directives in the parser file. @xref{Decl Summary}. +@end deffn -@item %nonassoc +@deffn {Directive} %nonassoc Bison declaration to assign non-associativity to token(s). @xref{Precedence Decl, ,Operator Precedence}. +@end deffn -@item %output="@var{filename}" +@deffn {Directive} %output="@var{filename}" Bison declaration to set the name of the parser file. @xref{Decl Summary}. +@end deffn + +@ifset documentparam +@deffn {Directive} %parse-param @{@var{argument-declaration}@} +Bison declaration to specifying an additional parameter that +@code{yyparse} should accept. @xref{Parser Function,, The Parser +Function @code{yyparse}}. +@end deffn +@end ifset -@item %prec +@deffn {Directive} %prec Bison declaration to assign a precedence to a specific rule. @xref{Contextual Precedence, ,Context-Dependent Precedence}. +@end deffn -@item %pure-parser +@deffn {Directive} %pure-parser Bison declaration to request a pure (reentrant) parser. @xref{Pure Decl, ,A Pure (Reentrant) Parser}. +@end deffn -@item %right +@deffn {Directive} %right Bison declaration to assign right associativity to token(s). @xref{Precedence Decl, ,Operator Precedence}. +@end deffn -@item %start +@deffn {Directive} %start Bison declaration to specify the start symbol. @xref{Start Decl, ,The Start-Symbol}. +@end deffn -@item %token +@deffn {Directive} %token Bison declaration to declare token(s) without specifying precedence. @xref{Token Decl, ,Token Type Names}. +@end deffn -@item %token-table +@deffn {Directive} %token-table Bison declaration to include a token name table in the parser file. @xref{Decl Summary}. +@end deffn -@item %type +@deffn {Directive} %type Bison declaration to declare nonterminals. @xref{Type Decl, ,Nonterminal Symbols}. +@end deffn -@item %union +@deffn {Directive} %union Bison declaration to specify several possible data types for semantic values. @xref{Union Decl, ,The Collection of Value Types}. -@end table +@end deffn @sp 1 These are the punctuation and delimiters used in Bison input: -@table @samp -@item %% +@deffn {Delimiter} %% Delimiter used to separate the grammar rule section from the Bison declarations section or the epilogue. @xref{Grammar Layout, ,The Overall Layout of a Bison Grammar}. +@end deffn -@item %@{ %@} +@c Don't insert spaces, or check the DVI output. +@deffn {Delimiter} %@{@var{code}%@} All code listed between @samp{%@{} and @samp{%@}} is copied directly to the output file uninterpreted. Such code forms the prologue of the input file. @xref{Grammar Outline, ,Outline of a Bison Grammar}. +@end deffn -@item /*@dots{}*/ +@deffn {Construct} /*@dots{}*/ Comment delimiters, as in C. +@end deffn -@item : +@deffn {Delimiter} : Separates a rule's result from its components. @xref{Rules, ,Syntax of Grammar Rules}. +@end deffn -@item ; +@deffn {Delimiter} ; Terminates a rule. @xref{Rules, ,Syntax of Grammar Rules}. +@end deffn -@item | +@deffn {Delimiter} | Separates alternate rules for the same result nonterminal. @xref{Rules, ,Syntax of Grammar Rules}. -@end table +@end deffn @node Glossary @appendix Glossary @@ -6486,10 +6831,6 @@ A grammar symbol standing for a grammatical construct that can be expressed through rules in terms of smaller constructs; in other words, a construct that is not a token. @xref{Symbols}. -@item Parse error -An error encountered during parsing of an input stream due to invalid -syntax. @xref{Error Recovery}. - @item Parser A function that recognizes valid sentences of a language by analyzing the syntax structure of a set of tokens passed to it from a lexical @@ -6542,6 +6883,10 @@ A data structure where symbol names and associated data are stored during parsing to allow for recognition and use of existing information in repeated uses of a symbol. @xref{Multi-function Calc}. +@item Syntax error +An error encountered during parsing of an input stream due to invalid +syntax. @xref{Error Recovery}. + @item Token A basic, grammatically indivisible unit of a language. The symbol that describes a token in the grammar is a terminal symbol.