\unnumbchapentry {Introduction}{1} \unnumbchapentry {Conditions for Using Bison}{3} \unnumbchapentry {GNU GENERAL PUBLIC LICENSE}{5} \unnumbsecentry{Preamble}{5} \unnumbsecentry{TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION}{6} \unnumbsecentry{How to Apply These Terms to Your New Programs}{10} \chapentry {The Concepts of Bison}{1}{13} \secentry {Languages and Context-Free Grammars}{1}{1}{13} \secentry {From Formal Rules to Bison Input}{1}{2}{14} \secentry {Semantic Values}{1}{3}{15} \secentry {Semantic Actions}{1}{4}{15} \secentry {Bison Output: the Parser File}{1}{5}{16} \secentry {Stages in Using Bison}{1}{6}{17} \secentry {The Overall Layout of a Bison Grammar}{1}{7}{17} \chapentry {Examples}{2}{19} \secentry {Reverse Polish Notation Calculator}{2}{1}{19} \subsecentry {Declarations for \code {rpcalc}}{2}{1}{1}{19} \subsecentry {Grammar Rules for \code {rpcalc}}{2}{1}{2}{20} \subsubsecentry {Explanation of \code {input}} {2}{1}{2}{1} {20} \subsubsecentry {Explanation of \code {line}} {2}{1}{2}{2} {21} \subsubsecentry {Explanation of \code {expr}} {2}{1}{2}{3} {21} \subsecentry {The \code {rpcalc} Lexical Analyzer}{2}{1}{3}{22} \subsecentry {The Controlling Function}{2}{1}{4}{23} \subsecentry {The Error Reporting Routine}{2}{1}{5}{23} \subsecentry {Running Bison to Make the Parser}{2}{1}{6}{24} \subsecentry {Compiling the Parser File}{2}{1}{7}{24} \secentry {Infix Notation Calculator: \code {calc}}{2}{2}{25} \secentry {Simple Error Recovery}{2}{3}{26} \secentry {Multi-Function Calculator: \code {mfcalc}}{2}{4}{27} \subsecentry {Declarations for \code {mfcalc}}{2}{4}{1}{27} \subsecentry {Grammar Rules for \code {mfcalc}}{2}{4}{2}{28} \subsecentry {The \code {mfcalc} Symbol Table}{2}{4}{3}{29} \secentry {Exercises}{2}{5}{33} \chapentry {Bison Grammar Files}{3}{35} \secentry {Outline of a Bison Grammar}{3}{1}{35} \subsecentry {The C Declarations Section}{3}{1}{1}{35} \subsecentry {The Bison Declarations Section}{3}{1}{2}{35} \subsecentry {The Grammar Rules Section}{3}{1}{3}{35} \subsecentry {The Additional C Code Section}{3}{1}{4}{36} \secentry {Symbols, Terminal and Nonterminal}{3}{2}{36} \secentry {Syntax of Grammar Rules}{3}{3}{37} \secentry {Recursive Rules}{3}{4}{38} \secentry {Defining Language Semantics}{3}{5}{39} \subsecentry {Data Types of Semantic Values}{3}{5}{1}{39} \subsecentry {More Than One Value Type}{3}{5}{2}{39} \subsecentry {Actions}{3}{5}{3}{40} \subsecentry {Data Types of Values in Actions}{3}{5}{4}{41} \subsecentry {Actions in Mid-Rule}{3}{5}{5}{41} \secentry {Bison Declarations}{3}{6}{43} \subsecentry {Token Type Names}{3}{6}{1}{44} \subsecentry {Operator Precedence}{3}{6}{2}{44} \subsecentry {The Collection of Value Types}{3}{6}{3}{45} \subsecentry {Nonterminal Symbols}{3}{6}{4}{45} \subsecentry {Suppressing Conflict Warnings}{3}{6}{5}{46} \subsecentry {The Start-Symbol}{3}{6}{6}{46} \subsecentry {A Pure (Reentrant) Parser}{3}{6}{7}{46} \subsecentry {Bison Declaration Summary}{3}{6}{8}{47} \secentry {Multiple Parsers in the Same Program}{3}{7}{48} \chapentry {Parser C-Language Interface}{4}{49} \secentry {The Parser Function \code {yyparse}}{4}{1}{49} \secentry {The Lexical Analyzer Function \code {yylex}}{4}{2}{49} \subsecentry {Calling Convention for \code {yylex}}{4}{2}{1}{49} \subsecentry {Semantic Values of Tokens}{4}{2}{2}{50} \subsecentry {Textual Positions of Tokens}{4}{2}{3}{51} \subsecentry {Calling Conventions for Pure Parsers}{4}{2}{4}{51} \secentry {The Error Reporting Function \code {yyerror}}{4}{3}{53} \secentry {Special Features for Use in Actions}{4}{4}{53} \chapentry {The Bison Parser Algorithm}{5}{57} \secentry {Look-Ahead Tokens}{5}{1}{57} \secentry {Shift/Reduce Conflicts}{5}{2}{58} \secentry {Operator Precedence}{5}{3}{59} \subsecentry {When Precedence is Needed}{5}{3}{1}{59} \subsecentry {Specifying Operator Precedence}{5}{3}{2}{60} \subsecentry {Precedence Examples}{5}{3}{3}{60} \subsecentry {How Precedence Works}{5}{3}{4}{60} \secentry {Context-Dependent Precedence}{5}{4}{61} \secentry {Parser States}{5}{5}{62} \secentry {Reduce/Reduce Conflicts}{5}{6}{62} \secentry {Mysterious Reduce/Reduce Conflicts}{5}{7}{64} \secentry {Stack Overflow, and How to Avoid It}{5}{8}{65} \chapentry {Error Recovery}{6}{67} \chapentry {Handling Context Dependencies}{7}{69} \secentry {Semantic Info in Token Types}{7}{1}{69} \secentry {Lexical Tie-ins}{7}{2}{70} \secentry {Lexical Tie-ins and Error Recovery}{7}{3}{71} \chapentry {Debugging Your Parser}{8}{73} \chapentry {Invoking Bison}{9}{75} \secentry {Bison Options}{9}{1}{75} \secentry {Option Cross Key}{9}{2}{77} \secentry {Invoking Bison under VMS}{9}{3}{77} \chapentry {Bison Symbols}{Appendix{} \char65}{79} \chapentry {Glossary}{Appendix{} \char66}{83} \unnumbchapentry {Index}{87}