1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project\input texinfo @c -*-texinfo-*-
2cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@comment %**start of header
3cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@setfilename bison.info
4cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@include version.texi
5cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@settitle Bison @value{VERSION}
6cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@setchapternewpage odd
7cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@finalout
9cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
10cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c SMALL BOOK version
11cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c This edition has been formatted so that you can format and print it in
12cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c the smallbook format.
13cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c @smallbook
14cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
15cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c Set following if you want to document %default-prec and %no-default-prec.
16cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c This feature is experimental and may change in future Bison versions.
17cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c @set defaultprec
18cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
19cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@ifnotinfo
20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@syncodeindex fn cp
21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@syncodeindex vr cp
22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@syncodeindex tp cp
23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end ifnotinfo
24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@ifinfo
25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@synindex fn cp
26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@synindex vr cp
27cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@synindex tp cp
28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end ifinfo
29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@comment %**end of header
30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@copying
32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis manual is for @acronym{GNU} Bison (version @value{VERSION},
34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@value{UPDATED}), the @acronym{GNU} parser generator.
35cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectCopyright @copyright{} 1988, 1989, 1990, 1991, 1992, 1993, 1995, 1998,
37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
39cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@quotation
40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectPermission is granted to copy, distribute and/or modify this document
41cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectunder the terms of the @acronym{GNU} Free Documentation License,
42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectVersion 1.2 or any later version published by the Free Software
43cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFoundation; with no Invariant Sections, with the Front-Cover texts
44cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbeing ``A @acronym{GNU} Manual,'' and with the Back-Cover Texts as in
45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(a) below.  A copy of the license is included in the section entitled
46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project``@acronym{GNU} Free Documentation License.''
47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
48cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(a) The @acronym{FSF}'s Back-Cover Text is: ``You have freedom to copy
49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand modify this @acronym{GNU} Manual, like @acronym{GNU} software.
50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectCopies published by the Free Software Foundation raise funds for
51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@acronym{GNU} development.''
52cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end quotation
53cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end copying
54cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
55cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@dircategory Software development
56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@direntry
57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* bison: (bison).       @acronym{GNU} parser generator (Yacc replacement).
58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end direntry
59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@titlepage
61cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@title Bison
62cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subtitle The Yacc-compatible Parser Generator
63cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subtitle @value{UPDATED}, Bison Version @value{VERSION}
64cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
65cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@author by Charles Donnelly and Richard Stallman
66cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
67cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@page
68cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@vskip 0pt plus 1filll
69cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@insertcopying
70cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@sp 2
71cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectPublished by the Free Software Foundation @*
72cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project51 Franklin Street, Fifth Floor @*
73cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBoston, MA  02110-1301  USA @*
74cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectPrinted copies are available from the Free Software Foundation.@*
75cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@acronym{ISBN} 1-882114-44-2
76cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@sp 2
77cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectCover art by Etienne Suvasa.
78cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end titlepage
79cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
80cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@contents
81cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
82cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@ifnottex
83cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Top
84cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@top Bison
85cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@insertcopying
86cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end ifnottex
87cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
88cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@menu
89cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Introduction::
90cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Conditions::
91cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Copying::           The @acronym{GNU} General Public License says
92cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                        how you can copy and share Bison
93cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
94cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTutorial sections:
95cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Concepts::          Basic concepts for understanding Bison.
96cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Examples::          Three simple explained examples of using Bison.
97cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
98cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectReference sections:
99cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Grammar File::      Writing Bison declarations and rules.
100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Interface::         C-language interface to the parser function @code{yyparse}.
101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Algorithm::         How the Bison parser works at run-time.
102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Error Recovery::    Writing rules for error recovery.
103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Context Dependency::  What to do if your language syntax is too
104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                        messy for Bison to handle straightforwardly.
105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Debugging::         Understanding or debugging Bison parsers.
106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Invocation::        How to run Bison (to produce the parser source file).
107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* C++ Language Interface::  Creating C++ parser objects.
108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* FAQ::               Frequently Asked Questions
109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Table of Symbols::  All the keywords of the Bison language are explained.
110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Glossary::          Basic concepts are explained.
111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Copying This Manual::  License for copying this manual.
112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Index::             Cross-references to the text.
113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@detailmenu
115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project --- The Detailed Node Listing ---
116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe Concepts of Bison
118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Language and Grammar::  Languages and context-free grammars,
120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                            as mathematical ideas.
121cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Grammar in Bison::  How we represent grammars for Bison's sake.
122cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Semantic Values::   Each token or syntactic grouping can have
123cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                        a semantic value (the value of an integer,
124cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                        the name of an identifier, etc.).
125cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Semantic Actions::  Each rule can have an action containing C code.
126cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* GLR Parsers::       Writing parsers for general context-free languages.
127cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Locations Overview::    Tracking Locations.
128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Bison Parser::      What are Bison's input and output,
129cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                        how is the output used?
130cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Stages::            Stages in writing and running Bison grammars.
131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Grammar Layout::    Overall structure of a Bison grammar file.
132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
133cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWriting @acronym{GLR} Parsers
134cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Simple GLR Parsers::      Using @acronym{GLR} parsers on unambiguous grammars.
136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Merging GLR Parses::      Using @acronym{GLR} parsers to resolve ambiguities.
137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* GLR Semantic Actions::    Deferred semantic actions have special concerns.
138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Compiler Requirements::   @acronym{GLR} parsers require a modern C compiler.
139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
140cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectExamples
141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* RPN Calc::          Reverse polish notation calculator;
143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                        a first example with no operator precedence.
144cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Infix Calc::        Infix (algebraic) notation calculator.
145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                        Operator precedence is introduced.
146cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Simple Error Recovery::  Continuing after syntax errors.
147cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Location Tracking Calc:: Demonstrating the use of @@@var{n} and @@$.
148cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Multi-function Calc::  Calculator with memory and trig functions.
149cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                           It uses multiple data-types for semantic values.
150cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Exercises::         Ideas for improving the multi-function calculator.
151cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectReverse Polish Notation Calculator
153cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Decls: Rpcalc Decls.  Prologue (declarations) for rpcalc.
155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Rules: Rpcalc Rules.  Grammar Rules for rpcalc, with explanation.
156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Lexer: Rpcalc Lexer.  The lexical analyzer.
157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Main: Rpcalc Main.    The controlling function.
158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Error: Rpcalc Error.  The error reporting function.
159cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Gen: Rpcalc Gen.      Running Bison on the grammar file.
160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Comp: Rpcalc Compile. Run the C compiler on the output code.
161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
162cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectGrammar Rules for @code{rpcalc}
163cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Rpcalc Input::
165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Rpcalc Line::
166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Rpcalc Expr::
167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
168cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectLocation Tracking Calculator: @code{ltcalc}
169cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
170cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Decls: Ltcalc Decls.  Bison and C declarations for ltcalc.
171cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Rules: Ltcalc Rules.  Grammar rules for ltcalc, with explanations.
172cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Lexer: Ltcalc Lexer.  The lexical analyzer.
173cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
174cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectMulti-Function Calculator: @code{mfcalc}
175cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
176cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Decl: Mfcalc Decl.      Bison declarations for multi-function calculator.
177cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Rules: Mfcalc Rules.    Grammar rules for the calculator.
178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Symtab: Mfcalc Symtab.  Symbol table management subroutines.
179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
180cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison Grammar Files
181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
182cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Grammar Outline::   Overall layout of the grammar file.
183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Symbols::           Terminal and nonterminal symbols.
184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Rules::             How to write grammar rules.
185cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Recursion::         Writing recursive rules.
186cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Semantics::         Semantic values and actions.
187cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Locations::         Locations and actions.
188cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Declarations::      All kinds of Bison declarations are described here.
189cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Multiple Parsers::  Putting more than one Bison parser in one program.
190cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
191cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectOutline of a Bison Grammar
192cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
193cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Prologue::          Syntax and usage of the prologue.
194cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Bison Declarations::  Syntax and usage of the Bison declarations section.
195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Grammar Rules::     Syntax and usage of the grammar rules section.
196cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Epilogue::          Syntax and usage of the epilogue.
197cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
198cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDefining Language Semantics
199cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
200cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Value Type::        Specifying one data type for all semantic values.
201cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Multiple Types::    Specifying several alternative data types.
202cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Actions::           An action is the semantic definition of a grammar rule.
203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Action Types::      Specifying data types for actions to operate on.
204cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Mid-Rule Actions::  Most actions go at the end of a rule.
205cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                      This says when, why and how to use the exceptional
206cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                        action in the middle of a rule.
207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
208cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTracking Locations
209cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
210cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Location Type::               Specifying a data type for locations.
211cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Actions and Locations::       Using locations in actions.
212cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Location Default Action::     Defining a general way to compute locations.
213cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
214cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison Declarations
215cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
216cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Require Decl::      Requiring a Bison version.
217cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Token Decl::        Declaring terminal symbols.
218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Precedence Decl::   Declaring terminals with precedence and associativity.
219cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Union Decl::        Declaring the set of all semantic value types.
220cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Type Decl::         Declaring the choice of type for a nonterminal symbol.
221cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Initial Action Decl::  Code run before parsing starts.
222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Destructor Decl::   Declaring how symbols are freed.
223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Expect Decl::       Suppressing warnings about parsing conflicts.
224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Start Decl::        Specifying the start symbol.
225cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Pure Decl::         Requesting a reentrant parser.
226cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Decl Summary::      Table of all Bison declarations.
227cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
228cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectParser C-Language Interface
229cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
230cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Parser Function::   How to call @code{yyparse} and what it returns.
231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Lexical::           You must supply a function @code{yylex}
232cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                        which reads tokens.
233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Error Reporting::   You must supply a function @code{yyerror}.
234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Action Features::   Special features for use in actions.
235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Internationalization::  How to let the parser speak in the user's
236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                        native language.
237cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe Lexical Analyzer Function @code{yylex}
239cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Calling Convention::  How @code{yyparse} calls @code{yylex}.
241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Token Values::      How @code{yylex} must return the semantic value
242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                        of the token it has read.
243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Token Locations::   How @code{yylex} must return the text location
244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                        (line number, etc.) of the token, if the
245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                        actions want that.
246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Pure Calling::      How the calling convention differs
247cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                        in a pure parser (@pxref{Pure Decl, ,A Pure (Reentrant) Parser}).
248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
249cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe Bison Parser Algorithm
250cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
251cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Look-Ahead::        Parser looks one token ahead when deciding what to do.
252cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Shift/Reduce::      Conflicts: when either shifting or reduction is valid.
253cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Precedence::        Operator precedence works by resolving conflicts.
254cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Contextual Precedence::  When an operator's precedence depends on context.
255cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Parser States::     The parser is a finite-state-machine with stack.
256cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Reduce/Reduce::     When two rules are applicable in the same situation.
257cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Mystery Conflicts::  Reduce/reduce conflicts that look unjustified.
258cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Generalized LR Parsing::  Parsing arbitrary context-free grammars.
259cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Memory Management:: What happens when memory is exhausted.  How to avoid it.
260cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
261cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectOperator Precedence
262cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
263cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Why Precedence::    An example showing why precedence is needed.
264cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Using Precedence::  How to specify precedence in Bison grammars.
265cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Precedence Examples::  How these features are used in the previous example.
266cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* How Precedence::    How they work.
267cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
268cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHandling Context Dependencies
269cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
270cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Semantic Tokens::   Token parsing can depend on the semantic context.
271cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Lexical Tie-ins::   Token parsing can depend on the syntactic context.
272cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Tie-in Recovery::   Lexical tie-ins have implications for how
273cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                        error recovery rules must be written.
274cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
275cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDebugging Your Parser
276cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
277cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Understanding::     Understanding the structure of your parser.
278cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Tracing::           Tracing the execution of your parser.
279cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
280cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectInvoking Bison
281cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
282cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Bison Options::     All the options described in detail,
283cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                        in alphabetical order by short options.
284cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Option Cross Key::  Alphabetical list of long options.
285cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Yacc Library::      Yacc-compatible @code{yylex} and @code{main}.
286cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
287cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectC++ Language Interface
288cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
289cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* C++ Parsers::                 The interface to generate C++ parser classes
290cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* A Complete C++ Example::      Demonstrating their use
291cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
292cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectC++ Parsers
293cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
294cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* C++ Bison Interface::         Asking for C++ parser generation
295cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* C++ Semantic Values::         %union vs. C++
296cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* C++ Location Values::         The position and location classes
297cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* C++ Parser Interface::        Instantiating and running the parser
298cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* C++ Scanner Interface::       Exchanges between yylex and parse
299cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
300cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA Complete C++ Example
301cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
302cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Calc++ --- C++ Calculator::   The specifications
303cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Calc++ Parsing Driver::       An active parsing context
304cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Calc++ Parser::               A parser class
305cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Calc++ Scanner::              A pure C++ Flex scanner
306cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Calc++ Top Level::            Conducting the band
307cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
308cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFrequently Asked Questions
309cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
310cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Memory Exhausted::           Breaking the Stack Limits
311cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* How Can I Reset the Parser:: @code{yyparse} Keeps some State
312cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Strings are Destroyed::      @code{yylval} Loses Track of Strings
313cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Implementing Gotos/Loops::   Control Flow in the Calculator
314cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Multiple start-symbols::     Factoring closely related grammars
315cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Secure?  Conform?::          Is Bison @acronym{POSIX} safe?
316cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* I can't build Bison::        Troubleshooting
317cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Where can I find help?::     Troubleshouting
318cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Bug Reports::                Troublereporting
319cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Other Languages::            Parsers in Java and others
320cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Beta Testing::               Experimenting development versions
321cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Mailing Lists::              Meeting other Bison users
322cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
323cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectCopying This Manual
324cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
325cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* GNU Free Documentation License::  License for copying this manual.
326cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
327cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end detailmenu
328cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end menu
329cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
330cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Introduction
331cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@unnumbered Introduction
332cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex introduction
333cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
334cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@dfn{Bison} is a general-purpose parser generator that converts an
335cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectannotated context-free grammar into an @acronym{LALR}(1) or
336cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@acronym{GLR} parser for that grammar.  Once you are proficient with
337cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison, you can use it to develop a wide range of language parsers, from those
338cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectused in simple desk calculators to complex programming languages.
339cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
340cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison is upward compatible with Yacc: all properly-written Yacc grammars
341cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectought to work with Bison with no change.  Anyone familiar with Yacc
342cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectshould be able to use Bison with little trouble.  You need to be fluent in
343cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectC or C++ programming in order to use Bison or to understand this manual.
344cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
345cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWe begin with tutorial chapters that explain the basic concepts of using
346cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison and show three explained examples, each building on the last.  If you
347cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdon't know Bison or Yacc, start by reading these chapters.  Reference
348cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectchapters follow which describe specific aspects of Bison in detail.
349cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
350cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison was written primarily by Robert Corbett; Richard Stallman made it
351cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectYacc-compatible.  Wilfred Hansen of Carnegie Mellon University added
352cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmulti-character string literals and other features.
353cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
354cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis edition corresponds to version @value{VERSION} of Bison.
355cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
356cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Conditions
357cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@unnumbered Conditions for Using Bison
358cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
359cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe distribution terms for Bison-generated parsers permit using the
360cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparsers in nonfree programs.  Before Bison version 2.2, these extra
361cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectpermissions applied only when Bison was generating @acronym{LALR}(1)
362cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparsers in C@.  And before Bison version 1.24, Bison-generated
363cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparsers could be used only in programs that were free software.
364cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
365cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe other @acronym{GNU} programming tools, such as the @acronym{GNU} C
366cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcompiler, have never
367cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthad such a requirement.  They could always be used for nonfree
368cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsoftware.  The reason Bison was different was not due to a special
369cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectpolicy decision; it resulted from applying the usual General Public
370cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectLicense to all of the Bison source code.
371cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
372cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe output of the Bison utility---the Bison parser file---contains a
373cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectverbatim copy of a sizable piece of Bison, which is the code for the
374cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparser's implementation.  (The actions from your grammar are inserted
375cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinto this implementation at one point, but most of the rest of the
376cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectimplementation is not changed.)  When we applied the @acronym{GPL}
377cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectterms to the skeleton code for the parser's implementation,
378cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe effect was to restrict the use of Bison output to free software.
379cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
380cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWe didn't change the terms because of sympathy for people who want to
381cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmake software proprietary.  @strong{Software should be free.}  But we
382cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectconcluded that limiting Bison's use to free software was doing little to
383cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectencourage people to make other software free.  So we decided to make the
384cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectpractical conditions for using Bison match the practical conditions for
385cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectusing the other @acronym{GNU} tools.
386cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
387cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis exception applies when Bison is generating code for a parser.
388cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectYou can tell whether the exception applies to a Bison output file by
389cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinspecting the file for text beginning with ``As a special
390cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexception@dots{}''.  The text spells out the exact terms of the
391cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexception.
392cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
393cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@include gpl.texi
394cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
395cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Concepts
396cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@chapter The Concepts of Bison
397cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
398cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis chapter introduces many of the basic concepts without which the
399cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdetails of Bison will not make sense.  If you do not already know how to
400cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectuse Bison or Yacc, we suggest you start by reading this chapter carefully.
401cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
402cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@menu
403cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Language and Grammar::  Languages and context-free grammars,
404cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                            as mathematical ideas.
405cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Grammar in Bison::  How we represent grammars for Bison's sake.
406cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Semantic Values::   Each token or syntactic grouping can have
407cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                        a semantic value (the value of an integer,
408cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                        the name of an identifier, etc.).
409cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Semantic Actions::  Each rule can have an action containing C code.
410cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* GLR Parsers::       Writing parsers for general context-free languages.
411cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Locations Overview::    Tracking Locations.
412cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Bison Parser::      What are Bison's input and output,
413cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                        how is the output used?
414cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Stages::            Stages in writing and running Bison grammars.
415cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Grammar Layout::    Overall structure of a Bison grammar file.
416cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end menu
417cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
418cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Language and Grammar
419cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Languages and Context-Free Grammars
420cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
421cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex context-free grammar
422cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex grammar, context-free
423cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn order for Bison to parse a language, it must be described by a
424cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@dfn{context-free grammar}.  This means that you specify one or more
425cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@dfn{syntactic groupings} and give rules for constructing them from their
426cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparts.  For example, in the C language, one kind of grouping is called an
427cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`expression'.  One rule for making an expression might be, ``An expression
428cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcan be made of a minus sign and another expression''.  Another would be,
429cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project``An expression can be an integer''.  As you can see, rules are often
430cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrecursive, but there must be at least one rule which leads out of the
431cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrecursion.
432cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
433cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex @acronym{BNF}
434cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex Backus-Naur form
435cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe most common formal system for presenting such rules for humans to read
436cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectis @dfn{Backus-Naur Form} or ``@acronym{BNF}'', which was developed in
437cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectorder to specify the language Algol 60.  Any grammar expressed in
438cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@acronym{BNF} is a context-free grammar.  The input to Bison is
439cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectessentially machine-readable @acronym{BNF}.
440cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
441cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex @acronym{LALR}(1) grammars
442cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex @acronym{LR}(1) grammars
443cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThere are various important subclasses of context-free grammar.  Although it
444cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcan handle almost all context-free grammars, Bison is optimized for what
445cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectare called @acronym{LALR}(1) grammars.
446cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn brief, in these grammars, it must be possible to
447cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttell how to parse any portion of an input string with just a single
448cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttoken of look-ahead.  Strictly speaking, that is a description of an
449cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@acronym{LR}(1) grammar, and @acronym{LALR}(1) involves additional
450cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrestrictions that are
451cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthard to explain simply; but it is rare in actual practice to find an
452cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@acronym{LR}(1) grammar that fails to be @acronym{LALR}(1).
453cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Mystery Conflicts, ,Mysterious Reduce/Reduce Conflicts}, for
454cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmore information on this.
455cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
456cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex @acronym{GLR} parsing
457cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex generalized @acronym{LR} (@acronym{GLR}) parsing
458cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex ambiguous grammars
459cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex nondeterministic parsing
460cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
461cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectParsers for @acronym{LALR}(1) grammars are @dfn{deterministic}, meaning
462cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectroughly that the next grammar rule to apply at any point in the input is
463cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectuniquely determined by the preceding input and a fixed, finite portion
464cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(called a @dfn{look-ahead}) of the remaining input.  A context-free
465cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgrammar can be @dfn{ambiguous}, meaning that there are multiple ways to
466cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectapply the grammar rules to get the same inputs.  Even unambiguous
467cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgrammars can be @dfn{nondeterministic}, meaning that no fixed
468cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlook-ahead always suffices to determine the next grammar rule to apply.
469cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWith the proper declarations, Bison is also able to parse these more
470cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgeneral context-free grammars, using a technique known as @acronym{GLR}
471cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparsing (for Generalized @acronym{LR}).  Bison's @acronym{GLR} parsers
472cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectare able to handle any context-free grammar for which the number of
473cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectpossible parses of any given string is finite.
474cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
475cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex symbols (abstract)
476cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex token
477cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex syntactic grouping
478cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex grouping, syntactic
479cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn the formal grammatical rules for a language, each kind of syntactic
480cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectunit or grouping is named by a @dfn{symbol}.  Those which are built by
481cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgrouping smaller constructs according to grammatical rules are called
482cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@dfn{nonterminal symbols}; those which can't be subdivided are called
483cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@dfn{terminal symbols} or @dfn{token types}.  We call a piece of input
484cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcorresponding to a single terminal symbol a @dfn{token}, and a piece
485cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcorresponding to a single nonterminal symbol a @dfn{grouping}.
486cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
487cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWe can use the C language as an example of what symbols, terminal and
488cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnonterminal, mean.  The tokens of C are identifiers, constants (numeric
489cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand string), and the various keywords, arithmetic operators and
490cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectpunctuation marks.  So the terminal symbols of a grammar for C include
491cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`identifier', `number', `string', plus one symbol for each keyword,
492cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectoperator or punctuation mark: `if', `return', `const', `static', `int',
493cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`char', `plus-sign', `open-brace', `close-brace', `comma' and many more.
494cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(These tokens can be subdivided into characters, but that is a matter of
495cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlexicography, not grammar.)
496cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
497cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHere is a simple C function subdivided into tokens:
498cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
499cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@ifinfo
500cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
501cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint             /* @r{keyword `int'} */
502cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsquare (int x)  /* @r{identifier, open-paren, keyword `int',}
503cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                   @r{identifier, close-paren} */
504cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{               /* @r{open-brace} */
505cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return x * x; /* @r{keyword `return', identifier, asterisk,}
506cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                   @r{identifier, semicolon} */
507cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}               /* @r{close-brace} */
508cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
509cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end ifinfo
510cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@ifnotinfo
511cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
512cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint             /* @r{keyword `int'} */
513cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsquare (int x)  /* @r{identifier, open-paren, keyword `int', identifier, close-paren} */
514cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{               /* @r{open-brace} */
515cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return x * x; /* @r{keyword `return', identifier, asterisk, identifier, semicolon} */
516cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}               /* @r{close-brace} */
517cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
518cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end ifnotinfo
519cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
520cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe syntactic groupings of C include the expression, the statement, the
521cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeclaration, and the function definition.  These are represented in the
522cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgrammar of C by nonterminal symbols `expression', `statement',
523cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`declaration' and `function definition'.  The full grammar uses dozens of
524cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectadditional language constructs, each with its own nonterminal symbol, in
525cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectorder to express the meanings of these four.  The example above is a
526cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfunction definition; it contains one declaration, and one statement.  In
527cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe statement, each @samp{x} is an expression and so is @samp{x * x}.
528cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
529cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectEach nonterminal symbol must have grammatical rules showing how it is made
530cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectout of simpler constructs.  For example, one kind of C statement is the
531cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{return} statement; this would be described with a grammar rule which
532cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectreads informally as follows:
533cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
534cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@quotation
535cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA `statement' can be made of a `return' keyword, an `expression' and a
536cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`semicolon'.
537cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end quotation
538cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
539cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
540cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThere would be many other rules for `statement', one for each kind of
541cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatement in C.
542cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
543cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex start symbol
544cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectOne nonterminal symbol must be distinguished as the special one which
545cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdefines a complete utterance in the language.  It is called the @dfn{start
546cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsymbol}.  In a compiler, this means a complete input program.  In the C
547cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlanguage, the nonterminal symbol `sequence of definitions and declarations'
548cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectplays this role.
549cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
550cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFor example, @samp{1 + 2} is a valid C expression---a valid part of a C
551cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprogram---but it is not valid as an @emph{entire} C program.  In the
552cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcontext-free grammar of C, this follows from the fact that `expression' is
553cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnot the start symbol.
554cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
555cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe Bison parser reads a sequence of tokens as its input, and groups the
556cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttokens using the grammar rules.  If the input is valid, the end result is
557cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthat the entire token sequence reduces to a single grouping whose symbol is
558cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe grammar's start symbol.  If we use a grammar for C, the entire input
559cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmust be a `sequence of definitions and declarations'.  If not, the parser
560cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectreports a syntax error.
561cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
562cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Grammar in Bison
563cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section From Formal Rules to Bison Input
564cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex Bison grammar
565cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex grammar, Bison
566cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex formal grammar
567cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
568cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA formal grammar is a mathematical construct.  To define the language
569cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfor Bison, you must write a file expressing the grammar in Bison syntax:
570cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecta @dfn{Bison grammar} file.  @xref{Grammar File, ,Bison Grammar Files}.
571cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
572cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA nonterminal symbol in the formal grammar is represented in Bison input
573cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectas an identifier, like an identifier in C@.  By convention, it should be
574cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectin lower case, such as @code{expr}, @code{stmt} or @code{declaration}.
575cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
576cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe Bison representation for a terminal symbol is also called a @dfn{token
577cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttype}.  Token types as well can be represented as C-like identifiers.  By
578cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectconvention, these identifiers should be upper case to distinguish them from
579cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnonterminals: for example, @code{INTEGER}, @code{IDENTIFIER}, @code{IF} or
580cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{RETURN}.  A terminal symbol that stands for a particular keyword in
581cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe language should be named after that keyword converted to upper case.
582cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe terminal symbol @code{error} is reserved for error recovery.
583cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Symbols}.
584cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
585cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA terminal symbol can also be represented as a character literal, just like
586cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecta C character constant.  You should do this whenever a token is just a
587cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsingle character (parenthesis, plus-sign, etc.): use that same character in
588cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecta literal as the terminal symbol for that token.
589cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
590cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA third way to represent a terminal symbol is with a C string constant
591cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcontaining several characters.  @xref{Symbols}, for more information.
592cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
593cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe grammar rules also have an expression in Bison syntax.  For example,
594cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthere is the Bison rule for a C @code{return} statement.  The semicolon in
595cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectquotes is a literal character token, representing part of the C syntax for
596cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe statement; the naked semicolon, and the colon, are Bison punctuation
597cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectused in every rule.
598cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
599cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
600cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstmt:   RETURN expr ';'
601cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
602cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
603cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
604cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
605cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Rules, ,Syntax of Grammar Rules}.
606cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
607cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Semantic Values
608cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Semantic Values
609cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex semantic value
610cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex value, semantic
611cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
612cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA formal grammar selects tokens only by their classifications: for example,
613cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectif a rule mentions the terminal symbol `integer constant', it means that
614cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@emph{any} integer constant is grammatically valid in that position.  The
615cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprecise value of the constant is irrelevant to how to parse the input: if
616cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{x+4} is grammatical then @samp{x+1} or @samp{x+3989} is equally
617cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgrammatical.
618cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
619cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBut the precise value is very important for what the input means once it is
620cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparsed.  A compiler is useless if it fails to distinguish between 4, 1 and
621cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project3989 as constants in the program!  Therefore, each token in a Bison grammar
622cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthas both a token type and a @dfn{semantic value}.  @xref{Semantics,
623cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project,Defining Language Semantics},
624cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfor details.
625cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
626cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe token type is a terminal symbol defined in the grammar, such as
627cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{INTEGER}, @code{IDENTIFIER} or @code{','}.  It tells everything
628cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectyou need to know to decide where the token may validly appear and how to
629cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgroup it with other tokens.  The grammar rules know nothing about tokens
630cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexcept their types.
631cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
632cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe semantic value has all the rest of the information about the
633cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmeaning of the token, such as the value of an integer, or the name of an
634cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectidentifier.  (A token such as @code{','} which is just punctuation doesn't
635cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectneed to have any semantic value.)
636cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
637cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFor example, an input token might be classified as token type
638cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{INTEGER} and have the semantic value 4.  Another input token might
639cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthave the same token type @code{INTEGER} but value 3989.  When a grammar
640cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrule says that @code{INTEGER} is allowed, either of these tokens is
641cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectacceptable because each is an @code{INTEGER}.  When the parser accepts the
642cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttoken, it keeps track of the token's semantic value.
643cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
644cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectEach grouping can also have a semantic value as well as its nonterminal
645cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsymbol.  For example, in a calculator, an expression typically has a
646cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsemantic value that is a number.  In a compiler for a programming
647cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlanguage, an expression typically has a semantic value that is a tree
648cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstructure describing the meaning of the expression.
649cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
650cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Semantic Actions
651cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Semantic Actions
652cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex semantic actions
653cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex actions, semantic
654cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
655cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn order to be useful, a program must do more than parse input; it must
656cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectalso produce some output based on the input.  In a Bison grammar, a grammar
657cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrule can have an @dfn{action} made up of C statements.  Each time the
658cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparser recognizes a match for that rule, the action is executed.
659cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Actions}.
660cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
661cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectMost of the time, the purpose of an action is to compute the semantic value
662cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectof the whole construct from the semantic values of its parts.  For example,
663cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsuppose we have a rule which says an expression can be the sum of two
664cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexpressions.  When the parser recognizes such a sum, each of the
665cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsubexpressions has a semantic value which describes how it was built up.
666cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe action for this rule should create a similar sort of value for the
667cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnewly recognized larger expression.
668cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
669cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFor example, here is a rule that says an expression can be the sum of
670cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttwo subexpressions:
671cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
672cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
673cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexpr: expr '+' expr   @{ $$ = $1 + $3; @}
674cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
675cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
676cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
677cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
678cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe action says how to produce the semantic value of the sum expression
679cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfrom the values of the two subexpressions.
680cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
681cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node GLR Parsers
682cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Writing @acronym{GLR} Parsers
683cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex @acronym{GLR} parsing
684cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex generalized @acronym{LR} (@acronym{GLR}) parsing
685cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex %glr-parser
686cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex conflicts
687cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex shift/reduce conflicts
688cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex reduce/reduce conflicts
689cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
690cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn some grammars, Bison's standard
691cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@acronym{LALR}(1) parsing algorithm cannot decide whether to apply a
692cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcertain grammar rule at a given point.  That is, it may not be able to
693cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdecide (on the basis of the input read so far) which of two possible
694cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectreductions (applications of a grammar rule) applies, or whether to apply
695cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecta reduction or read more of the input and apply a reduction later in the
696cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinput.  These are known respectively as @dfn{reduce/reduce} conflicts
697cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(@pxref{Reduce/Reduce}), and @dfn{shift/reduce} conflicts
698cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(@pxref{Shift/Reduce}).
699cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
700cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTo use a grammar that is not easily modified to be @acronym{LALR}(1), a
701cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmore general parsing algorithm is sometimes necessary.  If you include
702cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{%glr-parser} among the Bison declarations in your file
703cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(@pxref{Grammar Outline}), the result is a Generalized @acronym{LR}
704cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(@acronym{GLR}) parser.  These parsers handle Bison grammars that
705cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcontain no unresolved conflicts (i.e., after applying precedence
706cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeclarations) identically to @acronym{LALR}(1) parsers.  However, when
707cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfaced with unresolved shift/reduce and reduce/reduce conflicts,
708cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@acronym{GLR} parsers use the simple expedient of doing both,
709cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecteffectively cloning the parser to follow both possibilities.  Each of
710cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe resulting parsers can again split, so that at any given time, there
711cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcan be any number of possible parses being explored.  The parsers
712cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectproceed in lockstep; that is, all of them consume (shift) a given input
713cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsymbol before any of them proceed to the next.  Each of the cloned
714cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparsers eventually meets one of two possible fates: either it runs into
715cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecta parsing error, in which case it simply vanishes, or it merges with
716cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectanother parser, because the two of them have reduced the input to an
717cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectidentical set of symbols.
718cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
719cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDuring the time that there are multiple parsers, semantic actions are
720cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrecorded, but not performed.  When a parser disappears, its recorded
721cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsemantic actions disappear as well, and are never performed.  When a
722cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectreduction makes two parsers identical, causing them to merge, Bison
723cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrecords both sets of semantic actions.  Whenever the last two parsers
724cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmerge, reverting to the single-parser case, Bison resolves all the
725cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectoutstanding actions either by precedences given to the grammar rules
726cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinvolved, or by performing both actions, and then calling a designated
727cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectuser-defined function on the resulting values to produce an arbitrary
728cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmerged result.
729cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
730cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@menu
731cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Simple GLR Parsers::      Using @acronym{GLR} parsers on unambiguous grammars.
732cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Merging GLR Parses::      Using @acronym{GLR} parsers to resolve ambiguities.
733cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* GLR Semantic Actions::    Deferred semantic actions have special concerns.
734cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Compiler Requirements::   @acronym{GLR} parsers require a modern C compiler.
735cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end menu
736cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
737cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Simple GLR Parsers
738cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Using @acronym{GLR} on Unambiguous Grammars
739cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex @acronym{GLR} parsing, unambiguous grammars
740cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex generalized @acronym{LR} (@acronym{GLR}) parsing, unambiguous grammars
741cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex %glr-parser
742cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex %expect-rr
743cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex conflicts
744cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex reduce/reduce conflicts
745cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex shift/reduce conflicts
746cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
747cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn the simplest cases, you can use the @acronym{GLR} algorithm
748cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectto parse grammars that are unambiguous, but fail to be @acronym{LALR}(1).
749cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSuch grammars typically require more than one symbol of look-ahead,
750cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projector (in rare cases) fall into the category of grammars in which the
751cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@acronym{LALR}(1) algorithm throws away too much information (they are in
752cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@acronym{LR}(1), but not @acronym{LALR}(1), @ref{Mystery Conflicts}).
753cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
754cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectConsider a problem that
755cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectarises in the declaration of enumerated and subrange types in the
756cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprogramming language Pascal.  Here are some examples:
757cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
758cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
759cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttype subrange = lo .. hi;
760cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttype enum = (a, b, c);
761cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
762cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
763cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
764cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe original language standard allows only numeric
765cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectliterals and constant identifiers for the subrange bounds (@samp{lo}
766cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand @samp{hi}), but Extended Pascal (@acronym{ISO}/@acronym{IEC}
767cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project10206) and many other
768cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectPascal implementations allow arbitrary expressions there.  This gives
769cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrise to the following situation, containing a superfluous pair of
770cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparentheses:
771cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
772cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
773cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttype subrange = (a) .. b;
774cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
775cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
776cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
777cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectCompare this to the following declaration of an enumerated
778cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttype with only one value:
779cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
780cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
781cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttype enum = (a);
782cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
783cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
784cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
785cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(These declarations are contrived, but they are syntactically
786cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvalid, and more-complicated cases can come up in practical programs.)
787cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
788cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThese two declarations look identical until the @samp{..} token.
789cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWith normal @acronym{LALR}(1) one-token look-ahead it is not
790cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectpossible to decide between the two forms when the identifier
791cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{a} is parsed.  It is, however, desirable
792cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfor a parser to decide this, since in the latter case
793cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{a} must become a new identifier to represent the enumeration
794cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvalue, while in the former case @samp{a} must be evaluated with its
795cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcurrent meaning, which may be a constant or even a function call.
796cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
797cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectYou could parse @samp{(a)} as an ``unspecified identifier in parentheses'',
798cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectto be resolved later, but this typically requires substantial
799cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcontortions in both semantic actions and large parts of the
800cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgrammar, where the parentheses are nested in the recursive rules for
801cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexpressions.
802cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
803cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectYou might think of using the lexer to distinguish between the two
804cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectforms by returning different tokens for currently defined and
805cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectundefined identifiers.  But if these declarations occur in a local
806cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectscope, and @samp{a} is defined in an outer scope, then both forms
807cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectare possible---either locally redefining @samp{a}, or using the
808cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvalue of @samp{a} from the outer scope.  So this approach cannot
809cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwork.
810cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
811cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA simple solution to this problem is to declare the parser to
812cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectuse the @acronym{GLR} algorithm.
813cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhen the @acronym{GLR} parser reaches the critical state, it
814cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmerely splits into two branches and pursues both syntax rules
815cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsimultaneously.  Sooner or later, one of them runs into a parsing
816cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecterror.  If there is a @samp{..} token before the next
817cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{;}, the rule for enumerated types fails since it cannot
818cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectaccept @samp{..} anywhere; otherwise, the subrange type rule
819cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfails since it requires a @samp{..} token.  So one of the branches
820cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfails silently, and the other one continues normally, performing
821cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectall the intermediate actions that were postponed during the split.
822cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
823cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf the input is syntactically incorrect, both branches fail and the parser
824cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectreports a syntax error as usual.
825cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
826cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe effect of all this is that the parser seems to ``guess'' the
827cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcorrect branch to take, or in other words, it seems to use more
828cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlook-ahead than the underlying @acronym{LALR}(1) algorithm actually allows
829cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfor.  In this example, @acronym{LALR}(2) would suffice, but also some cases
830cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthat are not @acronym{LALR}(@math{k}) for any @math{k} can be handled this way.
831cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
832cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn general, a @acronym{GLR} parser can take quadratic or cubic worst-case time,
833cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand the current Bison parser even takes exponential time and space
834cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfor some grammars.  In practice, this rarely happens, and for many
835cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgrammars it is possible to prove that it cannot happen.
836cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe present example contains only one conflict between two
837cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrules, and the type-declaration context containing the conflict
838cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcannot be nested.  So the number of
839cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbranches that can exist at any time is limited by the constant 2,
840cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand the parsing time is still linear.
841cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
842cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHere is a Bison grammar corresponding to the example above.  It
843cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparses a vastly simplified form of Pascal type declarations.
844cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
845cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
846cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%token TYPE DOTDOT ID
847cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
848cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
849cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%left '+' '-'
850cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%left '*' '/'
851cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
852cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
853cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%%
854cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
855cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
856cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttype_decl : TYPE ID '=' type ';'
857cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     ;
858cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
859cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
860cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
861cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttype : '(' id_list ')'
862cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     | expr DOTDOT expr
863cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     ;
864cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
865cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
866cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
867cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectid_list : ID
868cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     | id_list ',' ID
869cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     ;
870cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
871cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
872cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
873cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexpr : '(' expr ')'
874cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     | expr '+' expr
875cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     | expr '-' expr
876cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     | expr '*' expr
877cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     | expr '/' expr
878cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     | ID
879cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     ;
880cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
881cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
882cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
883cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhen used as a normal @acronym{LALR}(1) grammar, Bison correctly complains
884cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectabout one reduce/reduce conflict.  In the conflicting situation the
885cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparser chooses one of the alternatives, arbitrarily the one
886cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeclared first.  Therefore the following correct input is not
887cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrecognized:
888cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
889cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
890cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttype t = (a) .. b;
891cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
892cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
893cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe parser can be turned into a @acronym{GLR} parser, while also telling Bison
894cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectto be silent about the one known reduce/reduce conflict, by
895cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectadding these two declarations to the Bison input file (before the first
896cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{%%}):
897cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
898cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
899cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%glr-parser
900cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%expect-rr 1
901cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
902cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
903cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
904cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectNo change in the grammar itself is required.  Now the
905cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparser recognizes all valid declarations, according to the
906cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlimited syntax above, transparently.  In fact, the user does not even
907cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnotice when the parser splits.
908cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
909cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSo here we have a case where we can use the benefits of @acronym{GLR},
910cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectalmost without disadvantages.  Even in simple cases like this, however,
911cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthere are at least two potential problems to beware.  First, always
912cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectanalyze the conflicts reported by Bison to make sure that @acronym{GLR}
913cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsplitting is only done where it is intended.  A @acronym{GLR} parser
914cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsplitting inadvertently may cause problems less obvious than an
915cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@acronym{LALR} parser statically choosing the wrong alternative in a
916cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectconflict.  Second, consider interactions with the lexer (@pxref{Semantic
917cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTokens}) with great care.  Since a split parser consumes tokens without
918cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectperforming any actions during the split, the lexer cannot obtain
919cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinformation via parser actions.  Some cases of lexer interactions can be
920cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecteliminated by using @acronym{GLR} to shift the complications from the
921cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlexer to the parser.  You must check the remaining cases for
922cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcorrectness.
923cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
924cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn our example, it would be safe for the lexer to return tokens based on
925cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttheir current meanings in some symbol table, because no new symbols are
926cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdefined in the middle of a type declaration.  Though it is possible for
927cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecta parser to define the enumeration constants as they are parsed, before
928cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe type declaration is completed, it actually makes no difference since
929cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthey cannot be used within the same enumerated type declaration.
930cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
931cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Merging GLR Parses
932cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Using @acronym{GLR} to Resolve Ambiguities
933cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex @acronym{GLR} parsing, ambiguous grammars
934cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex generalized @acronym{LR} (@acronym{GLR}) parsing, ambiguous grammars
935cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex %dprec
936cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex %merge
937cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex conflicts
938cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex reduce/reduce conflicts
939cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
940cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectLet's consider an example, vastly simplified from a C++ grammar.
941cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
942cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
943cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@{
944cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  #include <stdio.h>
945cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  #define YYSTYPE char const *
946cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int yylex (void);
947cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  void yyerror (char const *);
948cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@}
949cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
950cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%token TYPENAME ID
951cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
952cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%right '='
953cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%left '+'
954cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
955cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%glr-parser
956cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
957cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%%
958cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
959cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprog :
960cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     | prog stmt   @{ printf ("\n"); @}
961cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     ;
962cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
963cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstmt : expr ';'  %dprec 1
964cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     | decl      %dprec 2
965cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     ;
966cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
967cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexpr : ID               @{ printf ("%s ", $$); @}
968cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     | TYPENAME '(' expr ')'
969cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                        @{ printf ("%s <cast> ", $1); @}
970cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     | expr '+' expr    @{ printf ("+ "); @}
971cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     | expr '=' expr    @{ printf ("= "); @}
972cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     ;
973cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
974cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdecl : TYPENAME declarator ';'
975cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                        @{ printf ("%s <declare> ", $1); @}
976cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     | TYPENAME declarator '=' expr ';'
977cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                        @{ printf ("%s <init-declare> ", $1); @}
978cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     ;
979cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
980cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeclarator : ID         @{ printf ("\"%s\" ", $1); @}
981cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     | '(' declarator ')'
982cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     ;
983cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
984cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
985cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
986cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis models a problematic part of the C++ grammar---the ambiguity between
987cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcertain declarations and statements.  For example,
988cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
989cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
990cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectT (x) = y+z;
991cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
992cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
993cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
994cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparses as either an @code{expr} or a @code{stmt}
995cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(assuming that @samp{T} is recognized as a @code{TYPENAME} and
996cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{x} as an @code{ID}).
997cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison detects this as a reduce/reduce conflict between the rules
998cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{expr : ID} and @code{declarator : ID}, which it cannot resolve at the
999cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttime it encounters @code{x} in the example above.  Since this is a
1000cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@acronym{GLR} parser, it therefore splits the problem into two parses, one for
1001cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecteach choice of resolving the reduce/reduce conflict.
1002cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectUnlike the example from the previous section (@pxref{Simple GLR Parsers}),
1003cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthowever, neither of these parses ``dies,'' because the grammar as it stands is
1004cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectambiguous.  One of the parsers eventually reduces @code{stmt : expr ';'} and
1005cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe other reduces @code{stmt : decl}, after which both parsers are in an
1006cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectidentical state: they've seen @samp{prog stmt} and have the same unprocessed
1007cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinput remaining.  We say that these parses have @dfn{merged.}
1008cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1009cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAt this point, the @acronym{GLR} parser requires a specification in the
1010cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgrammar of how to choose between the competing parses.
1011cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn the example above, the two @code{%dprec}
1012cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeclarations specify that Bison is to give precedence
1013cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectto the parse that interprets the example as a
1014cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{decl}, which implies that @code{x} is a declarator.
1015cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe parser therefore prints
1016cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1017cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
1018cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project"x" y z + T <init-declare>
1019cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
1020cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1021cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe @code{%dprec} declarations only come into play when more than one
1022cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparse survives.  Consider a different input string for this parser:
1023cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1024cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
1025cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectT (x) + y;
1026cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
1027cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1028cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
1029cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis is another example of using @acronym{GLR} to parse an unambiguous
1030cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectconstruct, as shown in the previous section (@pxref{Simple GLR Parsers}).
1031cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHere, there is no ambiguity (this cannot be parsed as a declaration).
1032cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHowever, at the time the Bison parser encounters @code{x}, it does not
1033cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthave enough information to resolve the reduce/reduce conflict (again,
1034cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbetween @code{x} as an @code{expr} or a @code{declarator}).  In this
1035cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcase, no precedence declaration is used.  Again, the parser splits
1036cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinto two, one assuming that @code{x} is an @code{expr}, and the other
1037cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectassuming @code{x} is a @code{declarator}.  The second of these parsers
1038cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthen vanishes when it sees @code{+}, and the parser prints
1039cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1040cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
1041cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectx T <cast> y +
1042cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
1043cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1044cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSuppose that instead of resolving the ambiguity, you wanted to see all
1045cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe possibilities.  For this purpose, you must merge the semantic
1046cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectactions of the two possible parsers, rather than choosing one over the
1047cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectother.  To do so, you could change the declaration of @code{stmt} as
1048cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfollows:
1049cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1050cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
1051cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstmt : expr ';'  %merge <stmtMerge>
1052cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     | decl      %merge <stmtMerge>
1053cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     ;
1054cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
1055cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1056cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
1057cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand define the @code{stmtMerge} function as:
1058cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1059cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
1060cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic YYSTYPE
1061cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectstmtMerge (YYSTYPE x0, YYSTYPE x1)
1062cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
1063cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  printf ("<OR> ");
1064cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return "";
1065cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
1066cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
1067cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1068cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
1069cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwith an accompanying forward declaration
1070cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectin the C declarations at the beginning of the file:
1071cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1072cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
1073cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@{
1074cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  #define YYSTYPE char const *
1075cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  static YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1);
1076cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@}
1077cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
1078cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1079cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
1080cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWith these declarations, the resulting parser parses the first example
1081cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectas both an @code{expr} and a @code{decl}, and prints
1082cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1083cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
1084cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project"x" y z + T <init-declare> x T <cast> y z + = <OR>
1085cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
1086cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1087cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison requires that all of the
1088cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectproductions that participate in any particular merge have identical
1089cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{%merge} clauses.  Otherwise, the ambiguity would be unresolvable,
1090cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand the parser will report an error during any parse that results in
1091cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe offending merge.
1092cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1093cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node GLR Semantic Actions
1094cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection GLR Semantic Actions
1095cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1096cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex deferred semantic actions
1097cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBy definition, a deferred semantic action is not performed at the same time as
1098cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe associated reduction.
1099cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis raises caveats for several Bison features you might use in a semantic
1100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectaction in a @acronym{GLR} parser.
1101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@vindex yychar
1103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex @acronym{GLR} parsers and @code{yychar}
1104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@vindex yylval
1105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex @acronym{GLR} parsers and @code{yylval}
1106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@vindex yylloc
1107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex @acronym{GLR} parsers and @code{yylloc}
1108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn any semantic action, you can examine @code{yychar} to determine the type of
1109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe look-ahead token present at the time of the associated reduction.
1110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAfter checking that @code{yychar} is not set to @code{YYEMPTY} or @code{YYEOF},
1111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectyou can then examine @code{yylval} and @code{yylloc} to determine the
1112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlook-ahead token's semantic value and location, if any.
1113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn a nondeferred semantic action, you can also modify any of these variables to
1114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinfluence syntax analysis.
1115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Look-Ahead, ,Look-Ahead Tokens}.
1116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex yyclearin
1118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex @acronym{GLR} parsers and @code{yyclearin}
1119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn a deferred semantic action, it's too late to influence syntax analysis.
1120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn this case, @code{yychar}, @code{yylval}, and @code{yylloc} are set to
1121cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectshallow copies of the values they had at the time of the associated reduction.
1122cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFor this reason alone, modifying them is dangerous.
1123cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectMoreover, the result of modifying them is undefined and subject to change with
1124cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfuture versions of Bison.
1125cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFor example, if a semantic action might be deferred, you should never write it
1126cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectto invoke @code{yyclearin} (@pxref{Action Features}) or to attempt to free
1127cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmemory referenced by @code{yylval}.
1128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1129cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex YYERROR
1130cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex @acronym{GLR} parsers and @code{YYERROR}
1131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAnother Bison feature requiring special consideration is @code{YYERROR}
1132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(@pxref{Action Features}), which you can invoke in a semantic action to
1133cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinitiate error recovery.
1134cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDuring deterministic @acronym{GLR} operation, the effect of @code{YYERROR} is
1135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe same as its effect in an @acronym{LALR}(1) parser.
1136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn a deferred semantic action, its effect is undefined.
1137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c The effect is probably a syntax error at the split point.
1138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAlso, see @ref{Location Default Action, ,Default Action for Locations}, which
1140cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdescribes a special usage of @code{YYLLOC_DEFAULT} in @acronym{GLR} parsers.
1141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Compiler Requirements
1143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Considerations when Compiling @acronym{GLR} Parsers
1144cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex @code{inline}
1145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex @acronym{GLR} parsers and @code{inline}
1146cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1147cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe @acronym{GLR} parsers require a compiler for @acronym{ISO} C89 or
1148cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlater.  In addition, they use the @code{inline} keyword, which is not
1149cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectC89, but is C99 and is a common extension in pre-C99 compilers.  It is
1150cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectup to the user of these parsers to handle
1151cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectportability issues.  For instance, if using Autoconf and the Autoconf
1152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmacro @code{AC_C_INLINE}, a mere
1153cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
1155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@{
1156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  #include <config.h>
1157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@}
1158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
1159cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
1161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwill suffice.  Otherwise, we suggest
1162cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1163cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
1164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@{
1165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  #if __STDC_VERSION__ < 199901 && ! defined __GNUC__ && ! defined inline
1166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   #define inline
1167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  #endif
1168cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@}
1169cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
1170cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1171cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Locations Overview
1172cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Locations
1173cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex location
1174cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex textual location
1175cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex location, textual
1176cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1177cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectMany applications, like interpreters or compilers, have to produce verbose
1178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand useful error messages.  To achieve this, one must be able to keep track of
1179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe @dfn{textual location}, or @dfn{location}, of each syntactic construct.
1180cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison provides a mechanism for handling these locations.
1181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1182cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectEach token has a semantic value.  In a similar fashion, each token has an
1183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectassociated location, but the type of locations is the same for all tokens and
1184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgroupings.  Moreover, the output parser is equipped with a default data
1185cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstructure for storing locations (@pxref{Locations}, for more details).
1186cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1187cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectLike semantic values, locations can be reached in actions using a dedicated
1188cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectset of constructs.  In the example above, the location of the whole grouping
1189cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectis @code{@@$}, while the locations of the subexpressions are @code{@@1} and
1190cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{@@3}.
1191cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1192cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhen a rule is matched, a default action is used to compute the semantic value
1193cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectof its left hand side (@pxref{Actions}).  In the same way, another default
1194cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectaction is used for locations.  However, the action for locations is general
1195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectenough for most cases, meaning there is usually no need to describe for each
1196cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrule how @code{@@$} should be formed.  When building a new location for a given
1197cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgrouping, the default behavior of the output parser is to take the beginning
1198cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectof the first symbol, and the end of the last symbol.
1199cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1200cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Bison Parser
1201cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Bison Output: the Parser File
1202cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex Bison parser
1203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex Bison utility
1204cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex lexical analyzer, purpose
1205cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex parser
1206cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhen you run Bison, you give it a Bison grammar file as input.  The output
1208cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectis a C source file that parses the language described by the grammar.
1209cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis file is called a @dfn{Bison parser}.  Keep in mind that the Bison
1210cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectutility and the Bison parser are two distinct programs: the Bison utility
1211cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectis a program whose output is the Bison parser that becomes part of your
1212cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprogram.
1213cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1214cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe job of the Bison parser is to group tokens into groupings according to
1215cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe grammar rules---for example, to build identifiers and operators into
1216cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexpressions.  As it does this, it runs the actions for the grammar rules it
1217cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectuses.
1218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1219cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe tokens come from a function called the @dfn{lexical analyzer} that
1220cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectyou must supply in some fashion (such as by writing it in C).  The Bison
1221cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparser calls the lexical analyzer each time it wants a new token.  It
1222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdoesn't know what is ``inside'' the tokens (though their semantic values
1223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmay reflect this).  Typically the lexical analyzer makes the tokens by
1224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparsing characters of text, but Bison does not depend on this.
1225cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Lexical, ,The Lexical Analyzer Function @code{yylex}}.
1226cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1227cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe Bison parser file is C code which defines a function named
1228cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yyparse} which implements that grammar.  This function does not make
1229cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecta complete C program: you must supply some additional functions.  One is
1230cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe lexical analyzer.  Another is an error-reporting function which the
1231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparser calls to report an error.  In addition, a complete C program must
1232cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstart with a function called @code{main}; you have to provide this, and
1233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectarrange for it to call @code{yyparse} or the parser will never run.
1234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Interface, ,Parser C-Language Interface}.
1235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAside from the token type names and the symbols in the actions you
1237cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwrite, all symbols defined in the Bison parser file itself
1238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbegin with @samp{yy} or @samp{YY}.  This includes interface functions
1239cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsuch as the lexical analyzer function @code{yylex}, the error reporting
1240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfunction @code{yyerror} and the parser function @code{yyparse} itself.
1241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis also includes numerous identifiers used for internal purposes.
1242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTherefore, you should avoid using C identifiers starting with @samp{yy}
1243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projector @samp{YY} in the Bison grammar file except for the ones defined in
1244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthis manual.  Also, you should avoid using the C identifiers
1245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{malloc} and @samp{free} for anything other than their usual
1246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmeanings.
1247cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn some cases the Bison parser file includes system headers, and in
1249cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthose cases your code should respect the identifiers reserved by those
1250cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectheaders.  On some non-@acronym{GNU} hosts, @code{<alloca.h>}, @code{<malloc.h>},
1251cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{<stddef.h>}, and @code{<stdlib.h>} are included as needed to
1252cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeclare memory allocators and related types.  @code{<libintl.h>} is
1253cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectincluded if message translation is in use
1254cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(@pxref{Internationalization}).  Other system headers may
1255cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbe included if you define @code{YYDEBUG} to a nonzero value
1256cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(@pxref{Tracing, ,Tracing Your Parser}).
1257cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1258cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Stages
1259cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Stages in Using Bison
1260cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex stages in using Bison
1261cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex using Bison
1262cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1263cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe actual language-design process using Bison, from grammar specification
1264cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectto a working compiler or interpreter, has these parts:
1265cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1266cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@enumerate
1267cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
1268cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFormally specify the grammar in a form recognized by Bison
1269cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(@pxref{Grammar File, ,Bison Grammar Files}).  For each grammatical rule
1270cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectin the language, describe the action that is to be taken when an
1271cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinstance of that rule is recognized.  The action is described by a
1272cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsequence of C statements.
1273cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1274cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
1275cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWrite a lexical analyzer to process input and pass tokens to the parser.
1276cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe lexical analyzer may be written by hand in C (@pxref{Lexical, ,The
1277cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectLexical Analyzer Function @code{yylex}}).  It could also be produced
1278cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectusing Lex, but the use of Lex is not discussed in this manual.
1279cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1280cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
1281cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWrite a controlling function that calls the Bison-produced parser.
1282cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1283cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
1284cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWrite error-reporting routines.
1285cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end enumerate
1286cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1287cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTo turn this source code as written into a runnable program, you
1288cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmust follow these steps:
1289cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1290cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@enumerate
1291cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
1292cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectRun Bison on the grammar to produce the parser.
1293cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1294cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
1295cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectCompile the code output by Bison, as well as any other source files.
1296cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1297cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
1298cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectLink the object files to produce the finished product.
1299cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end enumerate
1300cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1301cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Grammar Layout
1302cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section The Overall Layout of a Bison Grammar
1303cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex grammar file
1304cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex file format
1305cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex format of grammar file
1306cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex layout of Bison grammar
1307cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1308cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe input file for the Bison utility is a @dfn{Bison grammar file}.  The
1309cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgeneral form of a Bison grammar file is as follows:
1310cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1311cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
1312cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@{
1313cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@var{Prologue}
1314cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@}
1315cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1316cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@var{Bison declarations}
1317cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1318cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%%
1319cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@var{Grammar rules}
1320cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%%
1321cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@var{Epilogue}
1322cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
1323cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1324cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
1325cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe @samp{%%}, @samp{%@{} and @samp{%@}} are punctuation that appears
1326cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectin every Bison grammar file to separate the sections.
1327cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1328cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe prologue may define types and variables used in the actions.  You can
1329cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectalso use preprocessor commands to define macros used there, and use
1330cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{#include} to include header files that do any of these things.
1331cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectYou need to declare the lexical analyzer @code{yylex} and the error
1332cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprinter @code{yyerror} here, along with any other global identifiers
1333cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectused by the actions in the grammar rules.
1334cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1335cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe Bison declarations declare the names of the terminal and nonterminal
1336cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsymbols, and may also describe operator precedence and the data types of
1337cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsemantic values of various symbols.
1338cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1339cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe grammar rules define how to construct each nonterminal symbol from its
1340cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparts.
1341cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1342cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe epilogue can contain any code you want to use.  Often the
1343cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdefinitions of functions declared in the prologue go here.  In a
1344cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsimple program, all the rest of the program can go here.
1345cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1346cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Examples
1347cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@chapter Examples
1348cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex simple examples
1349cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex examples, simple
1350cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1351cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectNow we show and explain three sample programs written using Bison: a
1352cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectreverse polish notation calculator, an algebraic (infix) notation
1353cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcalculator, and a multi-function calculator.  All three have been tested
1354cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectunder BSD Unix 4.3; each produces a usable, though limited, interactive
1355cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdesk-top calculator.
1356cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1357cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThese examples are simple, but Bison grammars for real programming
1358cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlanguages are written the same way.  You can copy these examples into a
1359cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsource file to try them.
1360cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1361cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@menu
1362cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* RPN Calc::          Reverse polish notation calculator;
1363cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                        a first example with no operator precedence.
1364cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Infix Calc::        Infix (algebraic) notation calculator.
1365cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                        Operator precedence is introduced.
1366cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Simple Error Recovery::  Continuing after syntax errors.
1367cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Location Tracking Calc:: Demonstrating the use of @@@var{n} and @@$.
1368cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Multi-function Calc::  Calculator with memory and trig functions.
1369cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                           It uses multiple data-types for semantic values.
1370cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Exercises::         Ideas for improving the multi-function calculator.
1371cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end menu
1372cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1373cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node RPN Calc
1374cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Reverse Polish Notation Calculator
1375cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex reverse polish notation
1376cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex polish notation calculator
1377cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex @code{rpcalc}
1378cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex calculator, simple
1379cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1380cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe first example is that of a simple double-precision @dfn{reverse polish
1381cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnotation} calculator (a calculator using postfix operators).  This example
1382cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprovides a good starting point, since operator precedence is not an issue.
1383cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe second example will illustrate how operator precedence is handled.
1384cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1385cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe source code for this calculator is named @file{rpcalc.y}.  The
1386cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{.y} extension is a convention used for Bison input files.
1387cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1388cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@menu
1389cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Decls: Rpcalc Decls.  Prologue (declarations) for rpcalc.
1390cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Rules: Rpcalc Rules.  Grammar Rules for rpcalc, with explanation.
1391cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Lexer: Rpcalc Lexer.  The lexical analyzer.
1392cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Main: Rpcalc Main.    The controlling function.
1393cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Error: Rpcalc Error.  The error reporting function.
1394cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Gen: Rpcalc Gen.      Running Bison on the grammar file.
1395cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Comp: Rpcalc Compile. Run the C compiler on the output code.
1396cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end menu
1397cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1398cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Rpcalc Decls
1399cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Declarations for @code{rpcalc}
1400cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1401cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHere are the C and Bison declarations for the reverse polish notation
1402cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcalculator.  As in C, comments are placed between @samp{/*@dots{}*/}.
1403cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1404cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
1405cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Reverse polish notation calculator.  */
1406cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1407cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@{
1408cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  #define YYSTYPE double
1409cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  #include <math.h>
1410cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int yylex (void);
1411cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  void yyerror (char const *);
1412cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@}
1413cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1414cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%token NUM
1415cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1416cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%% /* Grammar rules and actions follow.  */
1417cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
1418cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1419cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe declarations section (@pxref{Prologue, , The prologue}) contains two
1420cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectpreprocessor directives and two forward declarations.
1421cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1422cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe @code{#define} directive defines the macro @code{YYSTYPE}, thus
1423cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectspecifying the C data type for semantic values of both tokens and
1424cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgroupings (@pxref{Value Type, ,Data Types of Semantic Values}).  The
1425cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison parser will use whatever type @code{YYSTYPE} is defined as; if you
1426cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdon't define it, @code{int} is the default.  Because we specify
1427cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{double}, each token and each expression has an associated value,
1428cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwhich is a floating point number.
1429cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1430cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe @code{#include} directive is used to declare the exponentiation
1431cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfunction @code{pow}.
1432cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1433cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe forward declarations for @code{yylex} and @code{yyerror} are
1434cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectneeded because the C language requires that functions be declared
1435cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbefore they are used.  These functions will be defined in the
1436cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectepilogue, but the parser calls them so they must be declared in the
1437cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprologue.
1438cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1439cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe second section, Bison declarations, provides information to Bison
1440cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectabout the token types (@pxref{Bison Declarations, ,The Bison
1441cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDeclarations Section}).  Each terminal symbol that is not a
1442cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsingle-character literal must be declared here.  (Single-character
1443cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectliterals normally don't need to be declared.)  In this example, all the
1444cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectarithmetic operators are designated by single-character literals, so the
1445cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectonly terminal symbol that needs to be declared is @code{NUM}, the token
1446cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttype for numeric constants.
1447cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1448cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Rpcalc Rules
1449cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Grammar Rules for @code{rpcalc}
1450cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1451cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHere are the grammar rules for the reverse polish notation calculator.
1452cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1453cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
1454cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinput:    /* empty */
1455cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | input line
1456cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project;
1457cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1458cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectline:     '\n'
1459cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp '\n'      @{ printf ("\t%.10g\n", $1); @}
1460cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project;
1461cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1462cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexp:      NUM           @{ $$ = $1;           @}
1463cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp exp '+'   @{ $$ = $1 + $2;      @}
1464cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp exp '-'   @{ $$ = $1 - $2;      @}
1465cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp exp '*'   @{ $$ = $1 * $2;      @}
1466cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp exp '/'   @{ $$ = $1 / $2;      @}
1467cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project         /* Exponentiation */
1468cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp exp '^'   @{ $$ = pow ($1, $2); @}
1469cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project         /* Unary minus    */
1470cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp 'n'       @{ $$ = -$1;          @}
1471cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project;
1472cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%%
1473cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
1474cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1475cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe groupings of the rpcalc ``language'' defined here are the expression
1476cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(given the name @code{exp}), the line of input (@code{line}), and the
1477cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcomplete input transcript (@code{input}).  Each of these nonterminal
1478cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsymbols has several alternate rules, joined by the vertical bar @samp{|}
1479cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwhich is read as ``or''.  The following sections explain what these rules
1480cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmean.
1481cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1482cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe semantics of the language is determined by the actions taken when a
1483cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgrouping is recognized.  The actions are the C code that appears inside
1484cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbraces.  @xref{Actions}.
1485cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1486cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectYou must specify these actions in C, but Bison provides the means for
1487cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectpassing semantic values between the rules.  In each action, the
1488cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectpseudo-variable @code{$$} stands for the semantic value for the grouping
1489cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthat the rule is going to construct.  Assigning a value to @code{$$} is the
1490cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmain job of most actions.  The semantic values of the components of the
1491cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrule are referred to as @code{$1}, @code{$2}, and so on.
1492cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1493cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@menu
1494cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Rpcalc Input::
1495cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Rpcalc Line::
1496cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Rpcalc Expr::
1497cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end menu
1498cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1499cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Rpcalc Input
1500cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsubsection Explanation of @code{input}
1501cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1502cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectConsider the definition of @code{input}:
1503cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1504cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
1505cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinput:    /* empty */
1506cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | input line
1507cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project;
1508cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
1509cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1510cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis definition reads as follows: ``A complete input is either an empty
1511cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstring, or a complete input followed by an input line''.  Notice that
1512cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project``complete input'' is defined in terms of itself.  This definition is said
1513cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectto be @dfn{left recursive} since @code{input} appears always as the
1514cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectleftmost symbol in the sequence.  @xref{Recursion, ,Recursive Rules}.
1515cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1516cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe first alternative is empty because there are no symbols between the
1517cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcolon and the first @samp{|}; this means that @code{input} can match an
1518cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectempty string of input (no tokens).  We write the rules this way because it
1519cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectis legitimate to type @kbd{Ctrl-d} right after you start the calculator.
1520cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIt's conventional to put an empty alternative first and write the comment
1521cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{/* empty */} in it.
1522cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1523cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe second alternate rule (@code{input line}) handles all nontrivial input.
1524cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIt means, ``After reading any number of lines, read one more line if
1525cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectpossible.''  The left recursion makes this rule into a loop.  Since the
1526cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfirst alternative matches empty input, the loop can be executed zero or
1527cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmore times.
1528cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1529cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe parser function @code{yyparse} continues to process input until a
1530cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgrammatical error is seen or the lexical analyzer says there are no more
1531cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinput tokens; we will arrange for the latter to happen at end-of-input.
1532cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1533cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Rpcalc Line
1534cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsubsection Explanation of @code{line}
1535cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1536cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectNow consider the definition of @code{line}:
1537cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1538cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
1539cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectline:     '\n'
1540cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp '\n'  @{ printf ("\t%.10g\n", $1); @}
1541cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project;
1542cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
1543cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1544cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe first alternative is a token which is a newline character; this means
1545cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthat rpcalc accepts a blank line (and ignores it, since there is no
1546cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectaction).  The second alternative is an expression followed by a newline.
1547cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis is the alternative that makes rpcalc useful.  The semantic value of
1548cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe @code{exp} grouping is the value of @code{$1} because the @code{exp} in
1549cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectquestion is the first symbol in the alternative.  The action prints this
1550cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvalue, which is the result of the computation the user asked for.
1551cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1552cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis action is unusual because it does not assign a value to @code{$$}.  As
1553cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecta consequence, the semantic value associated with the @code{line} is
1554cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectuninitialized (its value will be unpredictable).  This would be a bug if
1555cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthat value were ever used, but we don't use it: once rpcalc has printed the
1556cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvalue of the user's input line, that value is no longer needed.
1557cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1558cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Rpcalc Expr
1559cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsubsection Explanation of @code{expr}
1560cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1561cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe @code{exp} grouping has several rules, one for each kind of expression.
1562cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe first rule handles the simplest expressions: those that are just numbers.
1563cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe second handles an addition-expression, which looks like two expressions
1564cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfollowed by a plus-sign.  The third handles subtraction, and so on.
1565cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1566cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
1567cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexp:      NUM
1568cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp exp '+'     @{ $$ = $1 + $2;    @}
1569cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp exp '-'     @{ $$ = $1 - $2;    @}
1570cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        @dots{}
1571cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
1572cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
1573cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1574cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWe have used @samp{|} to join all the rules for @code{exp}, but we could
1575cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectequally well have written them separately:
1576cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1577cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
1578cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexp:      NUM ;
1579cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexp:      exp exp '+'     @{ $$ = $1 + $2;    @} ;
1580cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexp:      exp exp '-'     @{ $$ = $1 - $2;    @} ;
1581cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        @dots{}
1582cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
1583cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1584cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectMost of the rules have actions that compute the value of the expression in
1585cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectterms of the value of its parts.  For example, in the rule for addition,
1586cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{$1} refers to the first component @code{exp} and @code{$2} refers to
1587cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe second one.  The third component, @code{'+'}, has no meaningful
1588cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectassociated semantic value, but if it had one you could refer to it as
1589cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{$3}.  When @code{yyparse} recognizes a sum expression using this
1590cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrule, the sum of the two subexpressions' values is produced as the value of
1591cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe entire expression.  @xref{Actions}.
1592cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1593cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectYou don't have to give an action for every rule.  When a rule has no
1594cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectaction, Bison by default copies the value of @code{$1} into @code{$$}.
1595cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis is what happens in the first rule (the one that uses @code{NUM}).
1596cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1597cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe formatting shown here is the recommended convention, but Bison does
1598cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnot require it.  You can add or change white space as much as you wish.
1599cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFor example, this:
1600cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1601cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
1602cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexp   : NUM | exp exp '+' @{$$ = $1 + $2; @} | @dots{} ;
1603cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
1604cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1605cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
1606cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmeans the same thing as this:
1607cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1608cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
1609cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexp:      NUM
1610cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp exp '+'    @{ $$ = $1 + $2; @}
1611cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | @dots{}
1612cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project;
1613cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
1614cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1615cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
1616cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe latter, however, is much more readable.
1617cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1618cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Rpcalc Lexer
1619cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection The @code{rpcalc} Lexical Analyzer
1620cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex writing a lexical analyzer
1621cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex lexical analyzer, writing
1622cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1623cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe lexical analyzer's job is low-level parsing: converting characters
1624cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projector sequences of characters into tokens.  The Bison parser gets its
1625cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttokens by calling the lexical analyzer.  @xref{Lexical, ,The Lexical
1626cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAnalyzer Function @code{yylex}}.
1627cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1628cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectOnly a simple lexical analyzer is needed for the @acronym{RPN}
1629cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcalculator.  This
1630cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlexical analyzer skips blanks and tabs, then reads in numbers as
1631cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{double} and returns them as @code{NUM} tokens.  Any other character
1632cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthat isn't part of a number is a separate token.  Note that the token-code
1633cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfor such a single-character token is the character itself.
1634cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1635cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe return value of the lexical analyzer function is a numeric code which
1636cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrepresents a token type.  The same text used in Bison rules to stand for
1637cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthis token type is also a C expression for the numeric code for the type.
1638cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis works in two ways.  If the token type is a character literal, then its
1639cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnumeric code is that of the character; you can use the same
1640cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcharacter literal in the lexical analyzer to express the number.  If the
1641cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttoken type is an identifier, that identifier is defined by Bison as a C
1642cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmacro whose definition is the appropriate number.  In this example,
1643cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttherefore, @code{NUM} becomes a macro for @code{yylex} to use.
1644cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1645cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe semantic value of the token (if it has one) is stored into the
1646cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectglobal variable @code{yylval}, which is where the Bison parser will look
1647cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfor it.  (The C data type of @code{yylval} is @code{YYSTYPE}, which was
1648cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdefined at the beginning of the grammar; @pxref{Rpcalc Decls,
1649cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project,Declarations for @code{rpcalc}}.)
1650cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1651cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA token type code of zero is returned if the end-of-input is encountered.
1652cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(Bison recognizes any nonpositive value as indicating end-of-input.)
1653cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1654cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHere is the code for the lexical analyzer:
1655cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1656cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
1657cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
1658cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* The lexical analyzer returns a double floating point
1659cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   number on the stack and the token NUM, or the numeric code
1660cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   of the character read if not a number.  It skips all blanks
1661cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   and tabs, and returns 0 for end-of-input.  */
1662cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1663cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <ctype.h>
1664cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
1665cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1666cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
1667cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint
1668cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectyylex (void)
1669cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
1670cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int c;
1671cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1672cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Skip white space.  */
1673cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  while ((c = getchar ()) == ' ' || c == '\t')
1674cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    ;
1675cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
1676cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
1677cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Process numbers.  */
1678cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (c == '.' || isdigit (c))
1679cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    @{
1680cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      ungetc (c, stdin);
1681cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      scanf ("%lf", &yylval);
1682cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      return NUM;
1683cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    @}
1684cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
1685cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
1686cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Return end-of-input.  */
1687cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (c == EOF)
1688cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return 0;
1689cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Return a single char.  */
1690cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return c;
1691cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
1692cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
1693cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
1694cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1695cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Rpcalc Main
1696cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection The Controlling Function
1697cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex controlling function
1698cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex main function in simple example
1699cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1700cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn keeping with the spirit of this example, the controlling function is
1701cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectkept to the bare minimum.  The only requirement is that it call
1702cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yyparse} to start the process of parsing.
1703cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1704cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
1705cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
1706cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint
1707cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmain (void)
1708cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
1709cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return yyparse ();
1710cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
1711cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
1712cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
1713cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1714cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Rpcalc Error
1715cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection The Error Reporting Routine
1716cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex error reporting routine
1717cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1718cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhen @code{yyparse} detects a syntax error, it calls the error reporting
1719cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfunction @code{yyerror} to print an error message (usually but not
1720cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectalways @code{"syntax error"}).  It is up to the programmer to supply
1721cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yyerror} (@pxref{Interface, ,Parser C-Language Interface}), so
1722cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthere is the definition we will use:
1723cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1724cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
1725cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
1726cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <stdio.h>
1727cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1728cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Called by yyparse on error.  */
1729cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
1730cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectyyerror (char const *s)
1731cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
1732cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fprintf (stderr, "%s\n", s);
1733cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
1734cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
1735cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
1736cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1737cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAfter @code{yyerror} returns, the Bison parser may recover from the error
1738cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand continue parsing if the grammar contains a suitable error rule
1739cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(@pxref{Error Recovery}).  Otherwise, @code{yyparse} returns nonzero.  We
1740cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthave not written any error rules in this example, so any invalid input will
1741cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcause the calculator program to exit.  This is not clean behavior for a
1742cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectreal calculator, but it is adequate for the first example.
1743cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1744cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Rpcalc Gen
1745cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Running Bison to Make the Parser
1746cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex running Bison (introduction)
1747cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1748cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBefore running Bison to produce a parser, we need to decide how to
1749cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectarrange all the source code in one or more source files.  For such a
1750cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsimple example, the easiest thing is to put everything in one file.  The
1751cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdefinitions of @code{yylex}, @code{yyerror} and @code{main} go at the
1752cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectend, in the epilogue of the file
1753cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(@pxref{Grammar Layout, ,The Overall Layout of a Bison Grammar}).
1754cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1755cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFor a large project, you would probably have several source files, and use
1756cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{make} to arrange to recompile them.
1757cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1758cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWith all the source in a single file, you use the following command to
1759cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectconvert it into a parser file:
1760cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1761cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
1762cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbison @var{file}.y
1763cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
1764cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1765cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
1766cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn this example the file was called @file{rpcalc.y} (for ``Reverse Polish
1767cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@sc{calc}ulator'').  Bison produces a file named @file{@var{file}.tab.c},
1768cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectremoving the @samp{.y} from the original file name.  The file output by
1769cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison contains the source code for @code{yyparse}.  The additional
1770cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfunctions in the input file (@code{yylex}, @code{yyerror} and @code{main})
1771cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectare copied verbatim to the output.
1772cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1773cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Rpcalc Compile
1774cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Compiling the Parser File
1775cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex compiling the parser
1776cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1777cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHere is how to compile and run the parser file:
1778cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1779cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
1780cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
1781cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# @r{List files in current directory.}
1782cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project$ @kbd{ls}
1783cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrpcalc.tab.c  rpcalc.y
1784cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
1785cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1786cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
1787cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# @r{Compile the Bison parser.}
1788cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# @r{@samp{-lm} tells compiler to search math library for @code{pow}.}
1789cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project$ @kbd{cc -lm -o rpcalc rpcalc.tab.c}
1790cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
1791cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1792cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
1793cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# @r{List files again.}
1794cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project$ @kbd{ls}
1795cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrpcalc  rpcalc.tab.c  rpcalc.y
1796cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
1797cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
1798cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1799cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe file @file{rpcalc} now contains the executable code.  Here is an
1800cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexample session using @code{rpcalc}.
1801cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1802cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
1803cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project$ @kbd{rpcalc}
1804cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@kbd{4 9 +}
1805cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project13
1806cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@kbd{3 7 + 3 4 5 *+-}
1807cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project-13
1808cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@kbd{3 7 + 3 4 5 * + - n}              @r{Note the unary minus, @samp{n}}
1809cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project13
1810cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@kbd{5 6 / 4 n +}
1811cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project-3.166666667
1812cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@kbd{3 4 ^}                            @r{Exponentiation}
1813cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project81
1814cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@kbd{^D}                               @r{End-of-file indicator}
1815cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project$
1816cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
1817cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1818cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Infix Calc
1819cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Infix Notation Calculator: @code{calc}
1820cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex infix notation calculator
1821cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex @code{calc}
1822cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex calculator, infix notation
1823cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1824cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWe now modify rpcalc to handle infix operators instead of postfix.  Infix
1825cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnotation involves the concept of operator precedence and the need for
1826cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparentheses nested to arbitrary depth.  Here is the Bison code for
1827cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@file{calc.y}, an infix desk-top calculator.
1828cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1829cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
1830cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Infix notation calculator.  */
1831cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1832cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@{
1833cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  #define YYSTYPE double
1834cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  #include <math.h>
1835cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  #include <stdio.h>
1836cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int yylex (void);
1837cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  void yyerror (char const *);
1838cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@}
1839cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1840cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Bison declarations.  */
1841cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%token NUM
1842cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%left '-' '+'
1843cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%left '*' '/'
1844cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%left NEG     /* negation--unary minus */
1845cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%right '^'    /* exponentiation */
1846cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1847cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%% /* The grammar follows.  */
1848cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinput:    /* empty */
1849cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | input line
1850cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project;
1851cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1852cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectline:     '\n'
1853cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp '\n'  @{ printf ("\t%.10g\n", $1); @}
1854cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project;
1855cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1856cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexp:      NUM                @{ $$ = $1;         @}
1857cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp '+' exp        @{ $$ = $1 + $3;    @}
1858cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp '-' exp        @{ $$ = $1 - $3;    @}
1859cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp '*' exp        @{ $$ = $1 * $3;    @}
1860cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp '/' exp        @{ $$ = $1 / $3;    @}
1861cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | '-' exp  %prec NEG @{ $$ = -$2;        @}
1862cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp '^' exp        @{ $$ = pow ($1, $3); @}
1863cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | '(' exp ')'        @{ $$ = $2;         @}
1864cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project;
1865cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%%
1866cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
1867cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1868cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
1869cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe functions @code{yylex}, @code{yyerror} and @code{main} can be the
1870cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsame as before.
1871cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1872cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThere are two important new features shown in this code.
1873cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1874cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn the second section (Bison declarations), @code{%left} declares token
1875cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttypes and says they are left-associative operators.  The declarations
1876cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{%left} and @code{%right} (right associativity) take the place of
1877cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{%token} which is used to declare a token type name without
1878cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectassociativity.  (These tokens are single-character literals, which
1879cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectordinarily don't need to be declared.  We declare them here to specify
1880cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe associativity.)
1881cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1882cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectOperator precedence is determined by the line ordering of the
1883cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeclarations; the higher the line number of the declaration (lower on
1884cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe page or screen), the higher the precedence.  Hence, exponentiation
1885cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthas the highest precedence, unary minus (@code{NEG}) is next, followed
1886cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectby @samp{*} and @samp{/}, and so on.  @xref{Precedence, ,Operator
1887cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectPrecedence}.
1888cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1889cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe other important new feature is the @code{%prec} in the grammar
1890cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsection for the unary minus operator.  The @code{%prec} simply instructs
1891cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison that the rule @samp{| '-' exp} has the same precedence as
1892cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{NEG}---in this case the next-to-highest.  @xref{Contextual
1893cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectPrecedence, ,Context-Dependent Precedence}.
1894cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1895cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHere is a sample run of @file{calc.y}:
1896cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1897cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@need 500
1898cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
1899cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project$ @kbd{calc}
1900cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@kbd{4 + 4.5 - (34/(8*3+-3))}
1901cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project6.880952381
1902cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@kbd{-56 + 2}
1903cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project-54
1904cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@kbd{3 ^ 2}
1905cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project9
1906cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
1907cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1908cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Simple Error Recovery
1909cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Simple Error Recovery
1910cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex error recovery, simple
1911cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1912cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectUp to this point, this manual has not addressed the issue of @dfn{error
1913cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrecovery}---how to continue parsing after the parser detects a syntax
1914cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecterror.  All we have handled is error reporting with @code{yyerror}.
1915cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectRecall that by default @code{yyparse} returns after calling
1916cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yyerror}.  This means that an erroneous input line causes the
1917cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcalculator program to exit.  Now we show how to rectify this deficiency.
1918cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1919cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe Bison language itself includes the reserved word @code{error}, which
1920cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmay be included in the grammar rules.  In the example below it has
1921cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbeen added to one of the alternatives for @code{line}:
1922cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1923cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
1924cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
1925cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectline:     '\n'
1926cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp '\n'   @{ printf ("\t%.10g\n", $1); @}
1927cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | error '\n' @{ yyerrok;                  @}
1928cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project;
1929cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
1930cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
1931cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1932cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis addition to the grammar allows for simple error recovery in the
1933cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectevent of a syntax error.  If an expression that cannot be evaluated is
1934cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectread, the error will be recognized by the third rule for @code{line},
1935cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand parsing will continue.  (The @code{yyerror} function is still called
1936cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectupon to print its message as well.)  The action executes the statement
1937cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yyerrok}, a macro defined automatically by Bison; its meaning is
1938cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthat error recovery is complete (@pxref{Error Recovery}).  Note the
1939cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdifference between @code{yyerrok} and @code{yyerror}; neither one is a
1940cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmisprint.
1941cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1942cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis form of error recovery deals with syntax errors.  There are other
1943cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectkinds of errors; for example, division by zero, which raises an exception
1944cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsignal that is normally fatal.  A real calculator program must handle this
1945cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsignal and use @code{longjmp} to return to @code{main} and resume parsing
1946cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinput lines; it would also have to discard the rest of the current line of
1947cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinput.  We won't discuss this issue further because it is not specific to
1948cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison programs.
1949cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1950cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Location Tracking Calc
1951cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Location Tracking Calculator: @code{ltcalc}
1952cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex location tracking calculator
1953cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex @code{ltcalc}
1954cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex calculator, location tracking
1955cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1956cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis example extends the infix notation calculator with location
1957cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttracking.  This feature will be used to improve the error messages.  For
1958cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe sake of clarity, this example is a simple integer calculator, since
1959cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmost of the work needed to use locations will be done in the lexical
1960cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectanalyzer.
1961cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1962cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@menu
1963cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Decls: Ltcalc Decls.  Bison and C declarations for ltcalc.
1964cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Rules: Ltcalc Rules.  Grammar rules for ltcalc, with explanations.
1965cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Lexer: Ltcalc Lexer.  The lexical analyzer.
1966cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end menu
1967cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1968cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Ltcalc Decls
1969cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Declarations for @code{ltcalc}
1970cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1971cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe C and Bison declarations for the location tracking calculator are
1972cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe same as the declarations for the infix notation calculator.
1973cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1974cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
1975cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Location tracking calculator.  */
1976cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1977cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@{
1978cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  #define YYSTYPE int
1979cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  #include <math.h>
1980cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int yylex (void);
1981cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  void yyerror (char const *);
1982cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@}
1983cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1984cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Bison declarations.  */
1985cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%token NUM
1986cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1987cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%left '-' '+'
1988cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%left '*' '/'
1989cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%left NEG
1990cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%right '^'
1991cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1992cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%% /* The grammar follows.  */
1993cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
1994cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1995cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
1996cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectNote there are no declarations specific to locations.  Defining a data
1997cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttype for storing locations is not needed: we will use the type provided
1998cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectby default (@pxref{Location Type, ,Data Types of Locations}), which is a
1999cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfour member structure with the following integer fields:
2000cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{first_line}, @code{first_column}, @code{last_line} and
2001cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{last_column}.
2002cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2003cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Ltcalc Rules
2004cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Grammar Rules for @code{ltcalc}
2005cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2006cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhether handling locations or not has no effect on the syntax of your
2007cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlanguage.  Therefore, grammar rules for this example will be very close
2008cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectto those of the previous example: we will only modify them to benefit
2009cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfrom the new information.
2010cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2011cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHere, we will use locations to report divisions by zero, and locate the
2012cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwrong expressions or subexpressions.
2013cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2014cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
2015cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2016cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinput   : /* empty */
2017cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | input line
2018cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project;
2019cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2020cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2021cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2022cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectline    : '\n'
2023cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp '\n' @{ printf ("%d\n", $1); @}
2024cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project;
2025cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2026cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2027cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2028cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexp     : NUM           @{ $$ = $1; @}
2029cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp '+' exp   @{ $$ = $1 + $3; @}
2030cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp '-' exp   @{ $$ = $1 - $3; @}
2031cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp '*' exp   @{ $$ = $1 * $3; @}
2032cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2033cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2034cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp '/' exp
2035cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project            @{
2036cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project              if ($3)
2037cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                $$ = $1 / $3;
2038cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project              else
2039cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                @{
2040cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                  $$ = 1;
2041cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                  fprintf (stderr, "%d.%d-%d.%d: division by zero",
2042cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                           @@3.first_line, @@3.first_column,
2043cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                           @@3.last_line, @@3.last_column);
2044cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                @}
2045cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project            @}
2046cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2047cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2048cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | '-' exp %preg NEG     @{ $$ = -$2; @}
2049cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp '^' exp           @{ $$ = pow ($1, $3); @}
2050cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | '(' exp ')'           @{ $$ = $2; @}
2051cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2052cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
2053cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2054cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis code shows how to reach locations inside of semantic actions, by
2055cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectusing the pseudo-variables @code{@@@var{n}} for rule components, and the
2056cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectpseudo-variable @code{@@$} for groupings.
2057cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2058cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWe don't need to assign a value to @code{@@$}: the output parser does it
2059cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectautomatically.  By default, before executing the C code of each action,
2060cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{@@$} is set to range from the beginning of @code{@@1} to the end
2061cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectof @code{@@@var{n}}, for a rule with @var{n} components.  This behavior
2062cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcan be redefined (@pxref{Location Default Action, , Default Action for
2063cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectLocations}), and for very specific rules, @code{@@$} can be computed by
2064cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthand.
2065cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2066cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Ltcalc Lexer
2067cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection The @code{ltcalc} Lexical Analyzer.
2068cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2069cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectUntil now, we relied on Bison's defaults to enable location
2070cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttracking.  The next step is to rewrite the lexical analyzer, and make it
2071cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectable to feed the parser with the token locations, as it already does for
2072cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsemantic values.
2073cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2074cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTo this end, we must take into account every single character of the
2075cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinput text, to avoid the computed locations of being fuzzy or wrong:
2076cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2077cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
2078cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2079cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint
2080cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectyylex (void)
2081cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
2082cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int c;
2083cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2084cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2085cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2086cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Skip white space.  */
2087cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  while ((c = getchar ()) == ' ' || c == '\t')
2088cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    ++yylloc.last_column;
2089cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2090cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2091cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2092cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Step.  */
2093cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  yylloc.first_line = yylloc.last_line;
2094cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  yylloc.first_column = yylloc.last_column;
2095cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2096cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2097cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2098cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Process numbers.  */
2099cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (isdigit (c))
2100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    @{
2101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      yylval = c - '0';
2102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      ++yylloc.last_column;
2103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      while (isdigit (c = getchar ()))
2104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        @{
2105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project          ++yylloc.last_column;
2106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project          yylval = yylval * 10 + c - '0';
2107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        @}
2108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      ungetc (c, stdin);
2109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      return NUM;
2110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    @}
2111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Return end-of-input.  */
2114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (c == EOF)
2115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return 0;
2116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Return a single char, and update location.  */
2118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (c == '\n')
2119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    @{
2120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      ++yylloc.last_line;
2121cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      yylloc.last_column = 0;
2122cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    @}
2123cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  else
2124cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    ++yylloc.last_column;
2125cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return c;
2126cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
2127cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
2128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2129cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBasically, the lexical analyzer performs the same processing as before:
2130cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectit skips blanks and tabs, and reads numbers or single-character tokens.
2131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn addition, it updates @code{yylloc}, the global variable (of type
2132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{YYLTYPE}) containing the token's location.
2133cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2134cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectNow, each time this function returns a token, the parser has its number
2135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectas well as its semantic value, and its location in the text.  The last
2136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectneeded change is to initialize @code{yylloc}, for example in the
2137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcontrolling function:
2138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
2140cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint
2142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmain (void)
2143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
2144cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  yylloc.first_line = yylloc.last_line = 1;
2145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  yylloc.first_column = yylloc.last_column = 0;
2146cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return yyparse ();
2147cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
2148cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2149cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
2150cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2151cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectRemember that computing locations is not a matter of syntax.  Every
2152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcharacter must be associated to a location update, whether it is in
2153cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvalid input, in comments, in literal strings, and so on.
2154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Multi-function Calc
2156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Multi-Function Calculator: @code{mfcalc}
2157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex multi-function calculator
2158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex @code{mfcalc}
2159cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex calculator, multi-function
2160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectNow that the basics of Bison have been discussed, it is time to move on to
2162cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecta more advanced problem.  The above calculators provided only five
2163cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfunctions, @samp{+}, @samp{-}, @samp{*}, @samp{/} and @samp{^}.  It would
2164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbe nice to have a calculator that provides other mathematical functions such
2165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectas @code{sin}, @code{cos}, etc.
2166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIt is easy to add new operators to the infix calculator as long as they are
2168cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectonly single-character literals.  The lexical analyzer @code{yylex} passes
2169cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectback all nonnumeric characters as tokens, so new grammar rules suffice for
2170cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectadding a new operator.  But we want something more flexible: built-in
2171cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfunctions whose syntax has this form:
2172cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2173cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
2174cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@var{function_name} (@var{argument})
2175cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
2176cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2177cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
2178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAt the same time, we will add memory to the calculator, by allowing you
2179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectto create named variables, store values in them, and use them later.
2180cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHere is a sample session with the multi-function calculator:
2181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2182cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
2183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project$ @kbd{mfcalc}
2184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@kbd{pi = 3.141592653589}
2185cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project3.1415926536
2186cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@kbd{sin(pi)}
2187cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project0.0000000000
2188cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@kbd{alpha = beta1 = 2.3}
2189cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project2.3000000000
2190cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@kbd{alpha}
2191cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project2.3000000000
2192cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@kbd{ln(alpha)}
2193cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project0.8329091229
2194cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@kbd{exp(ln(beta1))}
2195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project2.3000000000
2196cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project$
2197cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
2198cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2199cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectNote that multiple assignment and nested function calls are permitted.
2200cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2201cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@menu
2202cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Decl: Mfcalc Decl.      Bison declarations for multi-function calculator.
2203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Rules: Mfcalc Rules.    Grammar rules for the calculator.
2204cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Symtab: Mfcalc Symtab.  Symbol table management subroutines.
2205cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end menu
2206cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Mfcalc Decl
2208cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Declarations for @code{mfcalc}
2209cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2210cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHere are the C and Bison declarations for the multi-function calculator.
2211cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2212cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@smallexample
2213cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2214cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@{
2215cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  #include <math.h>  /* For math functions, cos(), sin(), etc.  */
2216cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  #include "calc.h"  /* Contains definition of `symrec'.  */
2217cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int yylex (void);
2218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  void yyerror (char const *);
2219cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@}
2220cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2221cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%union @{
2223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  double    val;   /* For returning numbers.  */
2224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  symrec  *tptr;   /* For returning symbol-table pointers.  */
2225cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
2226cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2227cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%token <val>  NUM        /* Simple double precision number.  */
2228cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%token <tptr> VAR FNCT   /* Variable and Function.  */
2229cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%type  <val>  exp
2230cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2232cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%right '='
2233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%left '-' '+'
2234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%left '*' '/'
2235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%left NEG     /* negation--unary minus */
2236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%right '^'    /* exponentiation */
2237cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%% /* The grammar follows.  */
2239cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end smallexample
2240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe above grammar introduces only two new features of the Bison language.
2242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThese features allow semantic values to have various data types
2243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(@pxref{Multiple Types, ,More Than One Value Type}).
2244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe @code{%union} declaration specifies the entire list of possible types;
2246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthis is instead of defining @code{YYSTYPE}.  The allowable types are now
2247cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdouble-floats (for @code{exp} and @code{NUM}) and pointers to entries in
2248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe symbol table.  @xref{Union Decl, ,The Collection of Value Types}.
2249cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2250cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSince values can now have various types, it is necessary to associate a
2251cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttype with each grammar symbol whose semantic value is used.  These symbols
2252cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectare @code{NUM}, @code{VAR}, @code{FNCT}, and @code{exp}.  Their
2253cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeclarations are augmented with information about their data type (placed
2254cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbetween angle brackets).
2255cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2256cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe Bison construct @code{%type} is used for declaring nonterminal
2257cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsymbols, just as @code{%token} is used for declaring token types.  We
2258cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthave not used @code{%type} before because nonterminal symbols are
2259cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnormally declared implicitly by the rules that define them.  But
2260cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{exp} must be declared explicitly so we can specify its value type.
2261cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Type Decl, ,Nonterminal Symbols}.
2262cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2263cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Mfcalc Rules
2264cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Grammar Rules for @code{mfcalc}
2265cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2266cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHere are the grammar rules for the multi-function calculator.
2267cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectMost of them are copied directly from @code{calc}; three rules,
2268cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthose which mention @code{VAR} or @code{FNCT}, are new.
2269cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2270cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@smallexample
2271cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2272cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinput:   /* empty */
2273cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | input line
2274cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project;
2275cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2276cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2277cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2278cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectline:
2279cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project          '\n'
2280cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp '\n'   @{ printf ("\t%.10g\n", $1); @}
2281cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | error '\n' @{ yyerrok;                  @}
2282cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project;
2283cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2284cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2285cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2286cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexp:      NUM                @{ $$ = $1;                         @}
2287cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | VAR                @{ $$ = $1->value.var;              @}
2288cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | VAR '=' exp        @{ $$ = $3; $1->value.var = $3;     @}
2289cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | FNCT '(' exp ')'   @{ $$ = (*($1->value.fnctptr))($3); @}
2290cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp '+' exp        @{ $$ = $1 + $3;                    @}
2291cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp '-' exp        @{ $$ = $1 - $3;                    @}
2292cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp '*' exp        @{ $$ = $1 * $3;                    @}
2293cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp '/' exp        @{ $$ = $1 / $3;                    @}
2294cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | '-' exp  %prec NEG @{ $$ = -$2;                        @}
2295cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp '^' exp        @{ $$ = pow ($1, $3);               @}
2296cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | '(' exp ')'        @{ $$ = $2;                         @}
2297cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project;
2298cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2299cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* End of grammar.  */
2300cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%%
2301cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end smallexample
2302cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2303cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Mfcalc Symtab
2304cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection The @code{mfcalc} Symbol Table
2305cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex symbol table example
2306cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2307cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe multi-function calculator requires a symbol table to keep track of the
2308cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnames and meanings of variables and functions.  This doesn't affect the
2309cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgrammar rules (except for the actions) or the Bison declarations, but it
2310cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrequires some additional C functions for support.
2311cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2312cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe symbol table itself consists of a linked list of records.  Its
2313cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdefinition, which is kept in the header @file{calc.h}, is as follows.  It
2314cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprovides for either functions or variables to be placed in the table.
2315cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2316cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@smallexample
2317cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2318cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Function type.  */
2319cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttypedef double (*func_t) (double);
2320cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2321cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2322cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2323cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Data type for links in the chain of symbols.  */
2324cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstruct symrec
2325cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
2326cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  char *name;  /* name of symbol */
2327cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int type;    /* type of symbol: either VAR or FNCT */
2328cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  union
2329cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  @{
2330cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    double var;      /* value of a VAR */
2331cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    func_t fnctptr;  /* value of a FNCT */
2332cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  @} value;
2333cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  struct symrec *next;  /* link field */
2334cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@};
2335cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2336cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2337cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2338cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttypedef struct symrec symrec;
2339cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2340cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* The symbol table: a chain of `struct symrec'.  */
2341cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern symrec *sym_table;
2342cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2343cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsymrec *putsym (char const *, int);
2344cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsymrec *getsym (char const *);
2345cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2346cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end smallexample
2347cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2348cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe new version of @code{main} includes a call to @code{init_table}, a
2349cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfunction that initializes the symbol table.  Here it is, and
2350cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{init_table} as well:
2351cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2352cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@smallexample
2353cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <stdio.h>
2354cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2355cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2356cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Called by yyparse on error.  */
2357cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
2358cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectyyerror (char const *s)
2359cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
2360cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  printf ("%s\n", s);
2361cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
2362cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2363cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2364cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2365cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstruct init
2366cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
2367cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  char const *fname;
2368cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  double (*fnct) (double);
2369cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@};
2370cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2371cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2372cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2373cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstruct init const arith_fncts[] =
2374cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
2375cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  "sin",  sin,
2376cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  "cos",  cos,
2377cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  "atan", atan,
2378cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  "ln",   log,
2379cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  "exp",  exp,
2380cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  "sqrt", sqrt,
2381cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  0, 0
2382cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@};
2383cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2384cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2385cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2386cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* The symbol table: a chain of `struct symrec'.  */
2387cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsymrec *sym_table;
2388cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2389cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2390cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2391cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Put arithmetic functions in table.  */
2392cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
2393cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinit_table (void)
2394cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
2395cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int i;
2396cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  symrec *ptr;
2397cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0; arith_fncts[i].fname != 0; i++)
2398cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    @{
2399cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      ptr = putsym (arith_fncts[i].fname, FNCT);
2400cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      ptr->value.fnctptr = arith_fncts[i].fnct;
2401cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    @}
2402cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
2403cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2404cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2405cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2406cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint
2407cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmain (void)
2408cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
2409cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  init_table ();
2410cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return yyparse ();
2411cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
2412cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2413cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end smallexample
2414cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2415cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBy simply editing the initialization list and adding the necessary include
2416cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfiles, you can add additional functions to the calculator.
2417cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2418cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTwo important functions allow look-up and installation of symbols in the
2419cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsymbol table.  The function @code{putsym} is passed a name and the type
2420cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(@code{VAR} or @code{FNCT}) of the object to be installed.  The object is
2421cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlinked to the front of the list, and a pointer to the object is returned.
2422cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe function @code{getsym} is passed the name of the symbol to look up.  If
2423cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfound, a pointer to that symbol is returned; otherwise zero is returned.
2424cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2425cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@smallexample
2426cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsymrec *
2427cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectputsym (char const *sym_name, int sym_type)
2428cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
2429cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  symrec *ptr;
2430cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  ptr = (symrec *) malloc (sizeof (symrec));
2431cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  ptr->name = (char *) malloc (strlen (sym_name) + 1);
2432cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  strcpy (ptr->name,sym_name);
2433cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  ptr->type = sym_type;
2434cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  ptr->value.var = 0; /* Set value to 0 even if fctn.  */
2435cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  ptr->next = (struct symrec *)sym_table;
2436cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  sym_table = ptr;
2437cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return ptr;
2438cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
2439cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2440cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsymrec *
2441cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgetsym (char const *sym_name)
2442cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
2443cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  symrec *ptr;
2444cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (ptr = sym_table; ptr != (symrec *) 0;
2445cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project       ptr = (symrec *)ptr->next)
2446cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    if (strcmp (ptr->name,sym_name) == 0)
2447cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      return ptr;
2448cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return 0;
2449cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
2450cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end smallexample
2451cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2452cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe function @code{yylex} must now recognize variables, numeric values, and
2453cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe single-character arithmetic operators.  Strings of alphanumeric
2454cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcharacters with a leading letter are recognized as either variables or
2455cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfunctions depending on what the symbol table says about them.
2456cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2457cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe string is passed to @code{getsym} for look up in the symbol table.  If
2458cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe name appears in the table, a pointer to its location and its type
2459cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(@code{VAR} or @code{FNCT}) is returned to @code{yyparse}.  If it is not
2460cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectalready in the table, then it is installed as a @code{VAR} using
2461cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{putsym}.  Again, a pointer and its type (which must be @code{VAR}) is
2462cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectreturned to @code{yyparse}.
2463cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2464cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectNo change is needed in the handling of numeric values and arithmetic
2465cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectoperators in @code{yylex}.
2466cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2467cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@smallexample
2468cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2469cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <ctype.h>
2470cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2471cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2472cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2473cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint
2474cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectyylex (void)
2475cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
2476cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int c;
2477cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2478cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Ignore white space, get first nonwhite character.  */
2479cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  while ((c = getchar ()) == ' ' || c == '\t');
2480cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2481cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (c == EOF)
2482cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return 0;
2483cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2484cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2485cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2486cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Char starts a number => parse the number.         */
2487cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (c == '.' || isdigit (c))
2488cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    @{
2489cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      ungetc (c, stdin);
2490cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      scanf ("%lf", &yylval.val);
2491cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      return NUM;
2492cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    @}
2493cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2494cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2495cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2496cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Char starts an identifier => read the name.       */
2497cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (isalpha (c))
2498cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    @{
2499cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      symrec *s;
2500cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      static char *symbuf = 0;
2501cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      static int length = 0;
2502cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      int i;
2503cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2504cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2505cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2506cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      /* Initially make the buffer long enough
2507cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project         for a 40-character symbol name.  */
2508cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (length == 0)
2509cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        length = 40, symbuf = (char *)malloc (length + 1);
2510cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2511cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      i = 0;
2512cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      do
2513cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2514cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2515cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        @{
2516cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project          /* If buffer is full, make it bigger.        */
2517cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project          if (i == length)
2518cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project            @{
2519cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project              length *= 2;
2520cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project              symbuf = (char *) realloc (symbuf, length + 1);
2521cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project            @}
2522cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project          /* Add this character to the buffer.         */
2523cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project          symbuf[i++] = c;
2524cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project          /* Get another character.                    */
2525cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project          c = getchar ();
2526cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        @}
2527cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2528cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2529cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      while (isalnum (c));
2530cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2531cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      ungetc (c, stdin);
2532cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      symbuf[i] = '\0';
2533cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2534cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2535cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2536cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      s = getsym (symbuf);
2537cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (s == 0)
2538cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        s = putsym (symbuf, VAR);
2539cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      yylval.tptr = s;
2540cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      return s->type;
2541cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    @}
2542cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2543cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Any other character is a token by itself.        */
2544cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return c;
2545cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
2546cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2547cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end smallexample
2548cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2549cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis program is both powerful and flexible.  You may easily add new
2550cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfunctions, and it is a simple job to modify this code to install
2551cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectpredefined variables such as @code{pi} or @code{e} as well.
2552cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2553cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Exercises
2554cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Exercises
2555cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex exercises
2556cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2557cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@enumerate
2558cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
2559cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAdd some new functions from @file{math.h} to the initialization list.
2560cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2561cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
2562cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAdd another array that contains constants and their values.  Then
2563cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmodify @code{init_table} to add these constants to the symbol table.
2564cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIt will be easiest to give the constants type @code{VAR}.
2565cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2566cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
2567cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectMake the program report an error if the user refers to an
2568cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectuninitialized variable in any way except to store a value in it.
2569cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end enumerate
2570cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2571cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Grammar File
2572cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@chapter Bison Grammar Files
2573cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2574cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison takes as input a context-free grammar specification and produces a
2575cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectC-language function that recognizes correct instances of the grammar.
2576cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2577cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe Bison grammar input file conventionally has a name ending in @samp{.y}.
2578cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Invocation, ,Invoking Bison}.
2579cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2580cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@menu
2581cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Grammar Outline::   Overall layout of the grammar file.
2582cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Symbols::           Terminal and nonterminal symbols.
2583cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Rules::             How to write grammar rules.
2584cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Recursion::         Writing recursive rules.
2585cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Semantics::         Semantic values and actions.
2586cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Locations::         Locations and actions.
2587cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Declarations::      All kinds of Bison declarations are described here.
2588cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Multiple Parsers::  Putting more than one Bison parser in one program.
2589cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end menu
2590cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2591cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Grammar Outline
2592cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Outline of a Bison Grammar
2593cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2594cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA Bison grammar file has four main sections, shown here with the
2595cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectappropriate delimiters:
2596cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2597cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
2598cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@{
2599cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  @var{Prologue}
2600cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@}
2601cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2602cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@var{Bison declarations}
2603cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2604cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%%
2605cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@var{Grammar rules}
2606cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%%
2607cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2608cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@var{Epilogue}
2609cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
2610cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2611cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectComments enclosed in @samp{/* @dots{} */} may appear in any of the sections.
2612cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAs a @acronym{GNU} extension, @samp{//} introduces a comment that
2613cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcontinues until end of line.
2614cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2615cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@menu
2616cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Prologue::          Syntax and usage of the prologue.
2617cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Bison Declarations::  Syntax and usage of the Bison declarations section.
2618cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Grammar Rules::     Syntax and usage of the grammar rules section.
2619cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Epilogue::          Syntax and usage of the epilogue.
2620cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end menu
2621cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2622cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Prologue
2623cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection The prologue
2624cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex declarations section
2625cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex Prologue
2626cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex declarations
2627cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2628cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe @var{Prologue} section contains macro definitions and declarations
2629cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectof functions and variables that are used in the actions in the grammar
2630cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrules.  These are copied to the beginning of the parser file so that
2631cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthey precede the definition of @code{yyparse}.  You can use
2632cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{#include} to get the declarations from a header file.  If you
2633cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdon't need any C declarations, you may omit the @samp{%@{} and
2634cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{%@}} delimiters that bracket this section.
2635cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2636cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe @var{Prologue} section is terminated by the the first occurrence
2637cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectof @samp{%@}} that is outside a comment, a string literal, or a
2638cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcharacter constant.
2639cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2640cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectYou may have more than one @var{Prologue} section, intermixed with the
2641cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@var{Bison declarations}.  This allows you to have C and Bison
2642cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeclarations that refer to each other.  For example, the @code{%union}
2643cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeclaration may use types defined in a header file, and you may wish to
2644cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprototype functions that take arguments of type @code{YYSTYPE}.  This
2645cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcan be done with two @var{Prologue} blocks, one before and one after the
2646cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{%union} declaration.
2647cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2648cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@smallexample
2649cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@{
2650cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  #include <stdio.h>
2651cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  #include "ptypes.h"
2652cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@}
2653cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2654cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%union @{
2655cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  long int n;
2656cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  tree t;  /* @r{@code{tree} is defined in @file{ptypes.h}.} */
2657cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
2658cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2659cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@{
2660cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  static void print_token_value (FILE *, int, YYSTYPE);
2661cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  #define YYPRINT(F, N, L) print_token_value (F, N, L)
2662cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@}
2663cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2664cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@dots{}
2665cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end smallexample
2666cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2667cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Bison Declarations
2668cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection The Bison Declarations Section
2669cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex Bison declarations (introduction)
2670cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex declarations, Bison (introduction)
2671cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2672cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe @var{Bison declarations} section contains declarations that define
2673cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectterminal and nonterminal symbols, specify precedence, and so on.
2674cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn some simple grammars you may not need any declarations.
2675cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Declarations, ,Bison Declarations}.
2676cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2677cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Grammar Rules
2678cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection The Grammar Rules Section
2679cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex grammar rules section
2680cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex rules section for grammar
2681cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2682cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe @dfn{grammar rules} section contains one or more Bison grammar
2683cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrules, and nothing else.  @xref{Rules, ,Syntax of Grammar Rules}.
2684cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2685cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThere must always be at least one grammar rule, and the first
2686cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{%%} (which precedes the grammar rules) may never be omitted even
2687cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectif it is the first thing in the file.
2688cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2689cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Epilogue
2690cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection The epilogue
2691cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex additional C code section
2692cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex epilogue
2693cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex C code, section for additional
2694cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2695cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe @var{Epilogue} is copied verbatim to the end of the parser file, just as
2696cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe @var{Prologue} is copied to the beginning.  This is the most convenient
2697cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectplace to put anything that you want to have in the parser file but which need
2698cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnot come before the definition of @code{yyparse}.  For example, the
2699cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdefinitions of @code{yylex} and @code{yyerror} often go here.  Because
2700cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectC requires functions to be declared before being used, you often need
2701cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectto declare functions like @code{yylex} and @code{yyerror} in the Prologue,
2702cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecteven if you define them in the Epilogue.
2703cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Interface, ,Parser C-Language Interface}.
2704cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2705cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf the last section is empty, you may omit the @samp{%%} that separates it
2706cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfrom the grammar rules.
2707cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2708cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe Bison parser itself contains many macros and identifiers whose names
2709cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstart with @samp{yy} or @samp{YY}, so it is a good idea to avoid using
2710cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectany such names (except those documented in this manual) in the epilogue
2711cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectof the grammar file.
2712cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2713cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Symbols
2714cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Symbols, Terminal and Nonterminal
2715cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex nonterminal symbol
2716cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex terminal symbol
2717cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex token type
2718cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex symbol
2719cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2720cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@dfn{Symbols} in Bison grammars represent the grammatical classifications
2721cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectof the language.
2722cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2723cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA @dfn{terminal symbol} (also known as a @dfn{token type}) represents a
2724cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectclass of syntactically equivalent tokens.  You use the symbol in grammar
2725cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrules to mean that a token in that class is allowed.  The symbol is
2726cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrepresented in the Bison parser by a numeric code, and the @code{yylex}
2727cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfunction returns a token type code to indicate what kind of token has
2728cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbeen read.  You don't need to know what the code value is; you can use
2729cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe symbol to stand for it.
2730cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2731cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA @dfn{nonterminal symbol} stands for a class of syntactically
2732cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectequivalent groupings.  The symbol name is used in writing grammar rules.
2733cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBy convention, it should be all lower case.
2734cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2735cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSymbol names can contain letters, digits (not at the beginning),
2736cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectunderscores and periods.  Periods make sense only in nonterminals.
2737cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2738cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThere are three ways of writing terminal symbols in the grammar:
2739cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2740cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@itemize @bullet
2741cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
2742cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA @dfn{named token type} is written with an identifier, like an
2743cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectidentifier in C@.  By convention, it should be all upper case.  Each
2744cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsuch name must be defined with a Bison declaration such as
2745cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{%token}.  @xref{Token Decl, ,Token Type Names}.
2746cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2747cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
2748cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex character token
2749cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex literal token
2750cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex single-character literal
2751cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA @dfn{character token type} (or @dfn{literal character token}) is
2752cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwritten in the grammar using the same syntax used in C for character
2753cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectconstants; for example, @code{'+'} is a character token type.  A
2754cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcharacter token type doesn't need to be declared unless you need to
2755cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectspecify its semantic value data type (@pxref{Value Type, ,Data Types of
2756cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSemantic Values}), associativity, or precedence (@pxref{Precedence,
2757cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project,Operator Precedence}).
2758cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2759cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBy convention, a character token type is used only to represent a
2760cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttoken that consists of that particular character.  Thus, the token
2761cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttype @code{'+'} is used to represent the character @samp{+} as a
2762cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttoken.  Nothing enforces this convention, but if you depart from it,
2763cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectyour program will confuse other readers.
2764cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2765cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAll the usual escape sequences used in character literals in C can be
2766cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectused in Bison as well, but you must not use the null character as a
2767cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcharacter literal because its numeric code, zero, signifies
2768cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectend-of-input (@pxref{Calling Convention, ,Calling Convention
2769cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfor @code{yylex}}).  Also, unlike standard C, trigraphs have no
2770cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectspecial meaning in Bison character literals, nor is backslash-newline
2771cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectallowed.
2772cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2773cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
2774cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex string token
2775cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex literal string token
2776cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex multicharacter literal
2777cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA @dfn{literal string token} is written like a C string constant; for
2778cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexample, @code{"<="} is a literal string token.  A literal string token
2779cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdoesn't need to be declared unless you need to specify its semantic
2780cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvalue data type (@pxref{Value Type}), associativity, or precedence
2781cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(@pxref{Precedence}).
2782cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2783cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectYou can associate the literal string token with a symbolic name as an
2784cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectalias, using the @code{%token} declaration (@pxref{Token Decl, ,Token
2785cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDeclarations}).  If you don't do that, the lexical analyzer has to
2786cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectretrieve the token number for the literal string token from the
2787cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yytname} table (@pxref{Calling Convention}).
2788cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2789cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@strong{Warning}: literal string tokens do not work in Yacc.
2790cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2791cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBy convention, a literal string token is used only to represent a token
2792cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthat consists of that particular string.  Thus, you should use the token
2793cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttype @code{"<="} to represent the string @samp{<=} as a token.  Bison
2794cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdoes not enforce this convention, but if you depart from it, people who
2795cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectread your program will be confused.
2796cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2797cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAll the escape sequences used in string literals in C can be used in
2798cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison as well, except that you must not use a null character within a
2799cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstring literal.  Also, unlike Standard C, trigraphs have no special
2800cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmeaning in Bison string literals, nor is backslash-newline allowed.  A
2801cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectliteral string token must contain two or more characters; for a token
2802cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcontaining just one character, use a character token (see above).
2803cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end itemize
2804cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2805cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHow you choose to write a terminal symbol has no effect on its
2806cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgrammatical meaning.  That depends only on where it appears in rules and
2807cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecton when the parser function returns that symbol.
2808cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2809cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe value returned by @code{yylex} is always one of the terminal
2810cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsymbols, except that a zero or negative value signifies end-of-input.
2811cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhichever way you write the token type in the grammar rules, you write
2812cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectit the same way in the definition of @code{yylex}.  The numeric code
2813cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfor a character token type is simply the positive numeric code of the
2814cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcharacter, so @code{yylex} can use the identical value to generate the
2815cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrequisite code, though you may need to convert it to @code{unsigned
2816cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectchar} to avoid sign-extension on hosts where @code{char} is signed.
2817cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectEach named token type becomes a C macro in
2818cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe parser file, so @code{yylex} can use the name to stand for the code.
2819cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(This is why periods don't make sense in terminal symbols.)
2820cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Calling Convention, ,Calling Convention for @code{yylex}}.
2821cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2822cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf @code{yylex} is defined in a separate file, you need to arrange for the
2823cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttoken-type macro definitions to be available there.  Use the @samp{-d}
2824cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectoption when you run Bison, so that it will write these macro definitions
2825cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinto a separate header file @file{@var{name}.tab.h} which you can include
2826cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectin the other source files that need it.  @xref{Invocation, ,Invoking Bison}.
2827cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2828cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf you want to write a grammar that is portable to any Standard C
2829cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthost, you must use only nonnull character tokens taken from the basic
2830cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexecution character set of Standard C@.  This set consists of the ten
2831cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdigits, the 52 lower- and upper-case English letters, and the
2832cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcharacters in the following C-language string:
2833cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2834cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
2835cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project"\a\b\t\n\v\f\r !\"#%&'()*+,-./:;<=>?[\\]^_@{|@}~"
2836cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
2837cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2838cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe @code{yylex} function and Bison must use a consistent character set
2839cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand encoding for character tokens.  For example, if you run Bison in an
2840cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@acronym{ASCII} environment, but then compile and run the resulting
2841cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprogram in an environment that uses an incompatible character set like
2842cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@acronym{EBCDIC}, the resulting program may not work because the tables
2843cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgenerated by Bison will assume @acronym{ASCII} numeric values for
2844cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcharacter tokens.  It is standard practice for software distributions to
2845cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcontain C source files that were generated by Bison in an
2846cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@acronym{ASCII} environment, so installers on platforms that are
2847cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectincompatible with @acronym{ASCII} must rebuild those files before
2848cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcompiling them.
2849cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2850cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe symbol @code{error} is a terminal symbol reserved for error recovery
2851cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(@pxref{Error Recovery}); you shouldn't use it for any other purpose.
2852cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn particular, @code{yylex} should never return this value.  The default
2853cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvalue of the error token is 256, unless you explicitly assigned 256 to
2854cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectone of your tokens with a @code{%token} declaration.
2855cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2856cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Rules
2857cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Syntax of Grammar Rules
2858cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex rule syntax
2859cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex grammar rule syntax
2860cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex syntax of grammar rules
2861cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2862cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA Bison grammar rule has the following general form:
2863cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2864cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
2865cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2866cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@var{result}: @var{components}@dots{}
2867cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
2868cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2869cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
2870cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2871cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
2872cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwhere @var{result} is the nonterminal symbol that this rule describes,
2873cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand @var{components} are various terminal and nonterminal symbols that
2874cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectare put together by this rule (@pxref{Symbols}).
2875cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2876cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFor example,
2877cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2878cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
2879cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2880cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexp:      exp '+' exp
2881cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
2882cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2883cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
2884cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2885cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
2886cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsays that two groupings of type @code{exp}, with a @samp{+} token in between,
2887cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcan be combined into a larger grouping of type @code{exp}.
2888cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2889cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhite space in rules is significant only to separate symbols.  You can add
2890cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextra white space as you wish.
2891cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2892cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectScattered among the components can be @var{actions} that determine
2893cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe semantics of the rule.  An action looks like this:
2894cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2895cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
2896cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{@var{C statements}@}
2897cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
2898cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2899cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
2900cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex braced code
2901cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis is an example of @dfn{braced code}, that is, C code surrounded by
2902cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbraces, much like a compound statement in C@.  Braced code can contain
2903cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectany sequence of C tokens, so long as its braces are balanced.  Bison
2904cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdoes not check the braced code for correctness directly; it merely
2905cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcopies the code to the output file, where the C compiler can check it.
2906cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2907cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWithin braced code, the balanced-brace count is not affected by braces
2908cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwithin comments, string literals, or character constants, but it is
2909cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectaffected by the C digraphs @samp{<%} and @samp{%>} that represent
2910cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbraces.  At the top level braced code must be terminated by @samp{@}}
2911cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand not by a digraph.  Bison does not look for trigraphs, so if braced
2912cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcode uses trigraphs you should ensure that they do not affect the
2913cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnesting of braces or the boundaries of comments, string literals, or
2914cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcharacter constants.
2915cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2916cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectUsually there is only one action and it follows the components.
2917cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Actions}.
2918cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2919cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex |
2920cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectMultiple rules for the same @var{result} can be written separately or can
2921cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbe joined with the vertical-bar character @samp{|} as follows:
2922cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2923cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
2924cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2925cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@var{result}:    @var{rule1-components}@dots{}
2926cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | @var{rule2-components}@dots{}
2927cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        @dots{}
2928cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
2929cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2930cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
2931cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2932cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
2933cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThey are still considered distinct rules even when joined in this way.
2934cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2935cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf @var{components} in a rule is empty, it means that @var{result} can
2936cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmatch the empty string.  For example, here is how to define a
2937cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcomma-separated sequence of zero or more @code{exp} groupings:
2938cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2939cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
2940cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2941cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexpseq:   /* empty */
2942cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | expseq1
2943cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
2944cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2945cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2946cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2947cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexpseq1:  exp
2948cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | expseq1 ',' exp
2949cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
2950cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2951cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
2952cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2953cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
2954cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIt is customary to write a comment @samp{/* empty */} in each rule
2955cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwith no components.
2956cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2957cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Recursion
2958cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Recursive Rules
2959cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex recursive rule
2960cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2961cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA rule is called @dfn{recursive} when its @var{result} nonterminal
2962cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectappears also on its right hand side.  Nearly all Bison grammars need to
2963cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectuse recursion, because that is the only way to define a sequence of any
2964cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnumber of a particular thing.  Consider this recursive definition of a
2965cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcomma-separated sequence of one or more expressions:
2966cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2967cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
2968cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2969cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexpseq1:  exp
2970cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | expseq1 ',' exp
2971cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
2972cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2973cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
2974cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2975cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex left recursion
2976cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex right recursion
2977cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
2978cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSince the recursive use of @code{expseq1} is the leftmost symbol in the
2979cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectright hand side, we call this @dfn{left recursion}.  By contrast, here
2980cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe same construct is defined using @dfn{right recursion}:
2981cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2982cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
2983cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
2984cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexpseq1:  exp
2985cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp ',' expseq1
2986cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
2987cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
2988cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
2989cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2990cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
2991cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAny kind of sequence can be defined using either left recursion or right
2992cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrecursion, but you should always use left recursion, because it can
2993cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparse a sequence of any number of elements with bounded stack space.
2994cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectRight recursion uses up space on the Bison stack in proportion to the
2995cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnumber of elements in the sequence, because all the elements must be
2996cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectshifted onto the stack before the rule can be applied even once.
2997cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Algorithm, ,The Bison Parser Algorithm}, for further explanation
2998cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectof this.
2999cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3000cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex mutual recursion
3001cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@dfn{Indirect} or @dfn{mutual} recursion occurs when the result of the
3002cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrule does not appear directly on its right hand side, but does appear
3003cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectin rules for other nonterminals which do appear on its right hand
3004cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectside.
3005cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3006cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFor example:
3007cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3008cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
3009cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
3010cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexpr:     primary
3011cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | primary '+' primary
3012cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
3013cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
3014cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3015cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
3016cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprimary:  constant
3017cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | '(' expr ')'
3018cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
3019cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
3020cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
3021cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3022cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
3023cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdefines two mutually-recursive nonterminals, since each refers to the
3024cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectother.
3025cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3026cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Semantics
3027cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Defining Language Semantics
3028cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex defining language semantics
3029cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex language semantics, defining
3030cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3031cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe grammar rules for a language determine only the syntax.  The semantics
3032cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectare determined by the semantic values associated with various tokens and
3033cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgroupings, and by the actions taken when various groupings are recognized.
3034cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3035cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFor example, the calculator calculates properly because the value
3036cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectassociated with each expression is the proper number; it adds properly
3037cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbecause the action for the grouping @w{@samp{@var{x} + @var{y}}} is to add
3038cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe numbers associated with @var{x} and @var{y}.
3039cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3040cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@menu
3041cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Value Type::        Specifying one data type for all semantic values.
3042cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Multiple Types::    Specifying several alternative data types.
3043cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Actions::           An action is the semantic definition of a grammar rule.
3044cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Action Types::      Specifying data types for actions to operate on.
3045cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Mid-Rule Actions::  Most actions go at the end of a rule.
3046cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                      This says when, why and how to use the exceptional
3047cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                        action in the middle of a rule.
3048cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end menu
3049cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3050cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Value Type
3051cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Data Types of Semantic Values
3052cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex semantic value type
3053cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex value type, semantic
3054cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex data types of semantic values
3055cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex default data type
3056cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3057cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn a simple program it may be sufficient to use the same data type for
3058cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe semantic values of all language constructs.  This was true in the
3059cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@acronym{RPN} and infix calculator examples (@pxref{RPN Calc, ,Reverse Polish
3060cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectNotation Calculator}).
3061cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3062cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison's default is to use type @code{int} for all semantic values.  To
3063cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectspecify some other type, define @code{YYSTYPE} as a macro, like this:
3064cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3065cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
3066cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define YYSTYPE double
3067cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
3068cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3069cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
3070cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{YYSTYPE}'s replacement list should be a type name
3071cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthat does not contain parentheses or square brackets.
3072cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis macro definition must go in the prologue of the grammar file
3073cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(@pxref{Grammar Outline, ,Outline of a Bison Grammar}).
3074cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3075cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Multiple Types
3076cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection More Than One Value Type
3077cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3078cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn most programs, you will need different data types for different kinds
3079cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectof tokens and groupings.  For example, a numeric constant may need type
3080cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{int} or @code{long int}, while a string constant needs type
3081cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{char *}, and an identifier might need a pointer to an entry in the
3082cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsymbol table.
3083cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3084cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTo use more than one data type for semantic values in one parser, Bison
3085cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrequires you to do two things:
3086cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3087cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@itemize @bullet
3088cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
3089cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSpecify the entire collection of possible data types, with the
3090cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{%union} Bison declaration (@pxref{Union Decl, ,The Collection of
3091cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectValue Types}).
3092cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3093cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
3094cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectChoose one of those types for each symbol (terminal or nonterminal) for
3095cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwhich semantic values are used.  This is done for tokens with the
3096cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{%token} Bison declaration (@pxref{Token Decl, ,Token Type Names})
3097cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand for groupings with the @code{%type} Bison declaration (@pxref{Type
3098cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDecl, ,Nonterminal Symbols}).
3099cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end itemize
3100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Actions
3102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Actions
3103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex action
3104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@vindex $$
3105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@vindex $@var{n}
3106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAn action accompanies a syntactic rule and contains C code to be executed
3108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecteach time an instance of that rule is recognized.  The task of most actions
3109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectis to compute a semantic value for the grouping built by the rule from the
3110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsemantic values associated with tokens or smaller groupings.
3111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAn action consists of braced code containing C statements, and can be
3113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectplaced at any position in the rule;
3114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectit is executed at that position.  Most rules have just one action at the
3115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectend of the rule, following all the components.  Actions in the middle of
3116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecta rule are tricky and used only for special purposes (@pxref{Mid-Rule
3117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectActions, ,Actions in Mid-Rule}).
3118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe C code in an action can refer to the semantic values of the components
3120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmatched by the rule with the construct @code{$@var{n}}, which stands for
3121cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe value of the @var{n}th component.  The semantic value for the grouping
3122cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbeing constructed is @code{$$}.  Bison translates both of these
3123cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectconstructs into expressions of the appropriate type when it copies the
3124cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectactions into the parser file.  @code{$$} is translated to a modifiable
3125cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlvalue, so it can be assigned to.
3126cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3127cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHere is a typical example:
3128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3129cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
3130cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
3131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexp:    @dots{}
3132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp '+' exp
3133cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project            @{ $$ = $1 + $3; @}
3134cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
3135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
3136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
3138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis rule constructs an @code{exp} from two smaller @code{exp} groupings
3139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectconnected by a plus-sign token.  In the action, @code{$1} and @code{$3}
3140cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrefer to the semantic values of the two component @code{exp} groupings,
3141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwhich are the first and third symbols on the right hand side of the rule.
3142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe sum is stored into @code{$$} so that it becomes the semantic value of
3143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe addition-expression just recognized by the rule.  If there were a
3144cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectuseful semantic value associated with the @samp{+} token, it could be
3145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectreferred to as @code{$2}.
3146cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3147cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectNote that the vertical-bar character @samp{|} is really a rule
3148cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectseparator, and actions are attached to a single rule.  This is a
3149cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdifference with tools like Flex, for which @samp{|} stands for either
3150cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project``or'', or ``the same action as that of the next rule''.  In the
3151cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfollowing example, the action is triggered only when @samp{b} is found:
3152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3153cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
3154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
3155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecta-or-b: 'a'|'b'   @{ a_or_b_found = 1; @};
3156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
3157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
3158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3159cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex default action
3160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf you don't specify an action for a rule, Bison supplies a default:
3161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@w{@code{$$ = $1}.}  Thus, the value of the first symbol in the rule
3162cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbecomes the value of the whole rule.  Of course, the default action is
3163cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvalid only if the two data types match.  There is no meaningful default
3164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectaction for an empty rule; every empty rule must have an explicit action
3165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectunless the rule's value does not matter.
3166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{$@var{n}} with @var{n} zero or negative is allowed for reference
3168cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectto tokens and groupings on the stack @emph{before} those that match the
3169cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcurrent rule.  This is a very risky practice, and to use it reliably
3170cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectyou must be certain of the context in which the rule is applied.  Here
3171cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectis a case in which you can use this reliably:
3172cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3173cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
3174cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
3175cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfoo:      expr bar '+' expr  @{ @dots{} @}
3176cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | expr bar '-' expr  @{ @dots{} @}
3177cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
3178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
3179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3180cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
3181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbar:      /* empty */
3182cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        @{ previous_expr = $0; @}
3183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
3184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
3185cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
3186cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3187cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAs long as @code{bar} is used only in the fashion shown here, @code{$0}
3188cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectalways refers to the @code{expr} which precedes @code{bar} in the
3189cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdefinition of @code{foo}.
3190cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3191cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@vindex yylval
3192cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIt is also possible to access the semantic value of the look-ahead token, if
3193cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectany, from a semantic action.
3194cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis semantic value is stored in @code{yylval}.
3195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Action Features, ,Special Features for Use in Actions}.
3196cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3197cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Action Types
3198cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Data Types of Values in Actions
3199cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex action data types
3200cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex data types in actions
3201cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3202cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf you have chosen a single data type for semantic values, the @code{$$}
3203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand @code{$@var{n}} constructs always have that data type.
3204cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3205cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf you have used @code{%union} to specify a variety of data types, then you
3206cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmust declare a choice among these types for each terminal or nonterminal
3207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsymbol that can have a semantic value.  Then each time you use @code{$$} or
3208cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{$@var{n}}, its data type is determined by which symbol it refers to
3209cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectin the rule.  In this example,
3210cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3211cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
3212cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
3213cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexp:    @dots{}
3214cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp '+' exp
3215cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project            @{ $$ = $1 + $3; @}
3216cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
3217cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
3218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3219cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
3220cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{$1} and @code{$3} refer to instances of @code{exp}, so they all
3221cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthave the data type declared for the nonterminal symbol @code{exp}.  If
3222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{$2} were used, it would have the data type declared for the
3223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectterminal symbol @code{'+'}, whatever that might be.
3224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3225cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAlternatively, you can specify the data type when you refer to the value,
3226cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectby inserting @samp{<@var{type}>} after the @samp{$} at the beginning of the
3227cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectreference.  For example, if you have defined types as shown here:
3228cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3229cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
3230cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
3231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%union @{
3232cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int itype;
3233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  double dtype;
3234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
3235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
3236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
3237cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
3239cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthen you can write @code{$<itype>1} to refer to the first subunit of the
3240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrule as an integer, or @code{$<dtype>1} to refer to it as a double.
3241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Mid-Rule Actions
3243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Actions in Mid-Rule
3244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex actions in mid-rule
3245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex mid-rule actions
3246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3247cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectOccasionally it is useful to put an action in the middle of a rule.
3248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThese actions are written just like usual end-of-rule actions, but they
3249cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectare executed before the parser even recognizes the following components.
3250cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3251cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA mid-rule action may refer to the components preceding it using
3252cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{$@var{n}}, but it may not refer to subsequent components because
3253cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectit is run before they are parsed.
3254cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3255cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe mid-rule action itself counts as one of the components of the rule.
3256cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis makes a difference when there is another action later in the same rule
3257cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(and usually there is another at the end): you have to count the actions
3258cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectalong with the symbols when working out which number @var{n} to use in
3259cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{$@var{n}}.
3260cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3261cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe mid-rule action can also have a semantic value.  The action can set
3262cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectits value with an assignment to @code{$$}, and actions later in the rule
3263cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcan refer to the value using @code{$@var{n}}.  Since there is no symbol
3264cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectto name the action, there is no way to declare a data type for the value
3265cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectin advance, so you must use the @samp{$<@dots{}>@var{n}} construct to
3266cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectspecify a data type each time you refer to this value.
3267cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3268cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThere is no way to set the value of the entire rule with a mid-rule
3269cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectaction, because assignments to @code{$$} do not have that effect.  The
3270cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectonly way to set the value for the entire rule is with an ordinary action
3271cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectat the end of the rule.
3272cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3273cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHere is an example from a hypothetical compiler, handling a @code{let}
3274cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatement that looks like @samp{let (@var{variable}) @var{statement}} and
3275cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectserves to create a variable named @var{variable} temporarily for the
3276cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectduration of @var{statement}.  To parse this construct, we must put
3277cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@var{variable} into the symbol table while @var{statement} is parsed, then
3278cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectremove it afterward.  Here is how it is done:
3279cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3280cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
3281cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
3282cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstmt:   LET '(' var ')'
3283cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                @{ $<context>$ = push_context ();
3284cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                  declare_variable ($3); @}
3285cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        stmt    @{ $$ = $6;
3286cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                  pop_context ($<context>5); @}
3287cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
3288cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
3289cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3290cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
3291cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAs soon as @samp{let (@var{variable})} has been recognized, the first
3292cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectaction is run.  It saves a copy of the current semantic context (the
3293cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlist of accessible variables) as its semantic value, using alternative
3294cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{context} in the data-type union.  Then it calls
3295cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{declare_variable} to add the new variable to that list.  Once the
3296cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfirst action is finished, the embedded statement @code{stmt} can be
3297cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparsed.  Note that the mid-rule action is component number 5, so the
3298cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{stmt} is component number 6.
3299cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3300cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAfter the embedded statement is parsed, its semantic value becomes the
3301cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvalue of the entire @code{let}-statement.  Then the semantic value from the
3302cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectearlier action is used to restore the prior list of variables.  This
3303cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectremoves the temporary @code{let}-variable from the list so that it won't
3304cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectappear to exist while the rest of the program is parsed.
3305cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3306cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex %destructor
3307cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex discarded symbols, mid-rule actions
3308cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex error recovery, mid-rule actions
3309cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn the above example, if the parser initiates error recovery (@pxref{Error
3310cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectRecovery}) while parsing the tokens in the embedded statement @code{stmt},
3311cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectit might discard the previous semantic context @code{$<context>5} without
3312cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrestoring it.
3313cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThus, @code{$<context>5} needs a destructor (@pxref{Destructor Decl, , Freeing
3314cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDiscarded Symbols}).
3315cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHowever, Bison currently provides no means to declare a destructor for a
3316cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmid-rule action's semantic value.
3317cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3318cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectOne solution is to bury the mid-rule action inside a nonterminal symbol and to
3319cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeclare a destructor for that symbol:
3320cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3321cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
3322cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
3323cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%type <context> let
3324cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%destructor @{ pop_context ($$); @} let
3325cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3326cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%%
3327cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3328cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstmt:  let stmt
3329cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project               @{ $$ = $2;
3330cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                 pop_context ($1); @}
3331cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project       ;
3332cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3333cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlet:   LET '(' var ')'
3334cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project               @{ $$ = push_context ();
3335cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                 declare_variable ($3); @}
3336cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project       ;
3337cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3338cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
3339cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
3340cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3341cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
3342cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectNote that the action is now at the end of its rule.
3343cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAny mid-rule action can be converted to an end-of-rule action in this way, and
3344cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthis is what Bison actually does to implement mid-rule actions.
3345cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3346cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTaking action before a rule is completely recognized often leads to
3347cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectconflicts since the parser must commit to a parse in order to execute the
3348cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectaction.  For example, the following two rules, without mid-rule actions,
3349cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcan coexist in a working parser because the parser can shift the open-brace
3350cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttoken and look at what follows before deciding whether there is a
3351cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeclaration or not:
3352cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3353cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
3354cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
3355cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcompound: '@{' declarations statements '@}'
3356cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | '@{' statements '@}'
3357cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
3358cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
3359cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
3360cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3361cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
3362cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBut when we add a mid-rule action as follows, the rules become nonfunctional:
3363cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3364cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
3365cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
3366cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcompound: @{ prepare_for_local_variables (); @}
3367cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project          '@{' declarations statements '@}'
3368cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
3369cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
3370cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | '@{' statements '@}'
3371cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
3372cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
3373cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
3374cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3375cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
3376cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectNow the parser is forced to decide whether to run the mid-rule action
3377cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwhen it has read no farther than the open-brace.  In other words, it
3378cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmust commit to using one rule or the other, without sufficient
3379cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinformation to do it correctly.  (The open-brace token is what is called
3380cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe @dfn{look-ahead} token at this time, since the parser is still
3381cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeciding what to do about it.  @xref{Look-Ahead, ,Look-Ahead Tokens}.)
3382cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3383cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectYou might think that you could correct the problem by putting identical
3384cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectactions into the two rules, like this:
3385cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3386cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
3387cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
3388cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcompound: @{ prepare_for_local_variables (); @}
3389cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project          '@{' declarations statements '@}'
3390cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | @{ prepare_for_local_variables (); @}
3391cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project          '@{' statements '@}'
3392cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
3393cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
3394cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
3395cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3396cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
3397cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBut this does not help, because Bison does not realize that the two actions
3398cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectare identical.  (Bison never tries to understand the C code in an action.)
3399cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3400cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf the grammar is such that a declaration can be distinguished from a
3401cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatement by the first token (which is true in C), then one solution which
3402cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdoes work is to put the action after the open-brace, like this:
3403cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3404cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
3405cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
3406cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcompound: '@{' @{ prepare_for_local_variables (); @}
3407cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project          declarations statements '@}'
3408cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | '@{' statements '@}'
3409cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
3410cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
3411cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
3412cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3413cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
3414cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectNow the first token of the following declaration or statement,
3415cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwhich would in any case tell Bison which rule to use, can still do so.
3416cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3417cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAnother solution is to bury the action inside a nonterminal symbol which
3418cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectserves as a subroutine:
3419cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3420cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
3421cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
3422cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsubroutine: /* empty */
3423cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project          @{ prepare_for_local_variables (); @}
3424cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
3425cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3426cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
3427cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3428cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
3429cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcompound: subroutine
3430cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project          '@{' declarations statements '@}'
3431cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | subroutine
3432cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project          '@{' statements '@}'
3433cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
3434cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
3435cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
3436cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3437cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
3438cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectNow Bison can execute the action in the rule for @code{subroutine} without
3439cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeciding which rule for @code{compound} it will eventually use.
3440cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3441cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Locations
3442cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Tracking Locations
3443cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex location
3444cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex textual location
3445cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex location, textual
3446cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3447cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThough grammar rules and semantic actions are enough to write a fully
3448cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfunctional parser, it can be useful to process some additional information,
3449cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectespecially symbol locations.
3450cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3451cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe way locations are handled is defined by providing a data type, and
3452cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectactions to take when rules are matched.
3453cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3454cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@menu
3455cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Location Type::               Specifying a data type for locations.
3456cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Actions and Locations::       Using locations in actions.
3457cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Location Default Action::     Defining a general way to compute locations.
3458cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end menu
3459cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3460cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Location Type
3461cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Data Type of Locations
3462cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex data type of locations
3463cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex default location type
3464cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3465cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDefining a data type for locations is much simpler than for semantic values,
3466cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsince all tokens and groupings always use the same type.
3467cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3468cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectYou can specify the type of locations by defining a macro called
3469cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{YYLTYPE}, just as you can specify the semantic value type by
3470cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdefining @code{YYSTYPE} (@pxref{Value Type}).
3471cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhen @code{YYLTYPE} is not defined, Bison uses a default structure type with
3472cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfour members:
3473cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3474cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
3475cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttypedef struct YYLTYPE
3476cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
3477cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int first_line;
3478cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int first_column;
3479cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int last_line;
3480cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int last_column;
3481cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@} YYLTYPE;
3482cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
3483cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3484cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Actions and Locations
3485cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Actions and Locations
3486cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex location actions
3487cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex actions, location
3488cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@vindex @@$
3489cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@vindex @@@var{n}
3490cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3491cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectActions are not only useful for defining language semantics, but also for
3492cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdescribing the behavior of the output parser with locations.
3493cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3494cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe most obvious way for building locations of syntactic groupings is very
3495cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsimilar to the way semantic values are computed.  In a given rule, several
3496cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectconstructs can be used to access the locations of the elements being matched.
3497cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe location of the @var{n}th component of the right hand side is
3498cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{@@@var{n}}, while the location of the left hand side grouping is
3499cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{@@$}.
3500cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3501cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHere is a basic example using the default data type for locations:
3502cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3503cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
3504cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
3505cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexp:    @dots{}
3506cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp '/' exp
3507cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project            @{
3508cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project              @@$.first_column = @@1.first_column;
3509cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project              @@$.first_line = @@1.first_line;
3510cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project              @@$.last_column = @@3.last_column;
3511cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project              @@$.last_line = @@3.last_line;
3512cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project              if ($3)
3513cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                $$ = $1 / $3;
3514cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project              else
3515cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                @{
3516cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                  $$ = 1;
3517cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                  fprintf (stderr,
3518cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                           "Division by zero, l%d,c%d-l%d,c%d",
3519cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                           @@3.first_line, @@3.first_column,
3520cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                           @@3.last_line, @@3.last_column);
3521cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                @}
3522cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project            @}
3523cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
3524cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
3525cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3526cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAs for semantic values, there is a default action for locations that is
3527cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrun each time a rule is matched.  It sets the beginning of @code{@@$} to the
3528cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbeginning of the first symbol, and the end of @code{@@$} to the end of the
3529cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlast symbol.
3530cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3531cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWith this default action, the location tracking can be fully automatic.  The
3532cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexample above simply rewrites this way:
3533cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3534cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
3535cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
3536cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexp:    @dots{}
3537cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp '/' exp
3538cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project            @{
3539cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project              if ($3)
3540cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                $$ = $1 / $3;
3541cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project              else
3542cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                @{
3543cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                  $$ = 1;
3544cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                  fprintf (stderr,
3545cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                           "Division by zero, l%d,c%d-l%d,c%d",
3546cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                           @@3.first_line, @@3.first_column,
3547cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                           @@3.last_line, @@3.last_column);
3548cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                @}
3549cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project            @}
3550cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
3551cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
3552cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3553cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@vindex yylloc
3554cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIt is also possible to access the location of the look-ahead token, if any,
3555cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfrom a semantic action.
3556cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis location is stored in @code{yylloc}.
3557cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Action Features, ,Special Features for Use in Actions}.
3558cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3559cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Location Default Action
3560cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Default Action for Locations
3561cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@vindex YYLLOC_DEFAULT
3562cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex @acronym{GLR} parsers and @code{YYLLOC_DEFAULT}
3563cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3564cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectActually, actions are not the best place to compute locations.  Since
3565cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlocations are much more general than semantic values, there is room in
3566cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe output parser to redefine the default action to take for each
3567cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrule.  The @code{YYLLOC_DEFAULT} macro is invoked each time a rule is
3568cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmatched, before the associated action is run.  It is also invoked
3569cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwhile processing a syntax error, to compute the error's location.
3570cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBefore reporting an unresolvable syntactic ambiguity, a @acronym{GLR}
3571cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparser invokes @code{YYLLOC_DEFAULT} recursively to compute the location
3572cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectof that ambiguity.
3573cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3574cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectMost of the time, this macro is general enough to suppress location
3575cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdedicated code from semantic actions.
3576cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3577cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe @code{YYLLOC_DEFAULT} macro takes three parameters.  The first one is
3578cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe location of the grouping (the result of the computation).  When a
3579cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrule is matched, the second parameter identifies locations of
3580cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectall right hand side elements of the rule being matched, and the third
3581cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparameter is the size of the rule's right hand side.
3582cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhen a @acronym{GLR} parser reports an ambiguity, which of multiple candidate
3583cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectright hand sides it passes to @code{YYLLOC_DEFAULT} is undefined.
3584cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhen processing a syntax error, the second parameter identifies locations
3585cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectof the symbols that were discarded during error processing, and the third
3586cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparameter is the number of discarded symbols.
3587cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3588cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBy default, @code{YYLLOC_DEFAULT} is defined this way:
3589cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3590cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@smallexample
3591cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
3592cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define YYLLOC_DEFAULT(Current, Rhs, N)                                \
3593cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    do                                                                  \
3594cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (N)                                                            \
3595cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        @{                                                               \
3596cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project          (Current).first_line   = YYRHSLOC(Rhs, 1).first_line;         \
3597cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project          (Current).first_column = YYRHSLOC(Rhs, 1).first_column;       \
3598cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project          (Current).last_line    = YYRHSLOC(Rhs, N).last_line;          \
3599cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project          (Current).last_column  = YYRHSLOC(Rhs, N).last_column;        \
3600cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        @}                                                               \
3601cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      else                                                              \
3602cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        @{                                                               \
3603cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project          (Current).first_line   = (Current).last_line   =              \
3604cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project            YYRHSLOC(Rhs, 0).last_line;                                 \
3605cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project          (Current).first_column = (Current).last_column =              \
3606cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project            YYRHSLOC(Rhs, 0).last_column;                               \
3607cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        @}                                                               \
3608cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    while (0)
3609cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
3610cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end smallexample
3611cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3612cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwhere @code{YYRHSLOC (rhs, k)} is the location of the @var{k}th symbol
3613cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectin @var{rhs} when @var{k} is positive, and the location of the symbol
3614cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectjust before the reduction when @var{k} and @var{n} are both zero.
3615cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3616cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhen defining @code{YYLLOC_DEFAULT}, you should consider that:
3617cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3618cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@itemize @bullet
3619cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
3620cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAll arguments are free of side-effects.  However, only the first one (the
3621cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectresult) should be modified by @code{YYLLOC_DEFAULT}.
3622cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3623cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
3624cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFor consistency with semantic actions, valid indexes within the
3625cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectright hand side range from 1 to @var{n}.  When @var{n} is zero, only 0 is a
3626cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvalid index, and it refers to the symbol just before the reduction.
3627cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDuring error processing @var{n} is always positive.
3628cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3629cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
3630cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectYour macro should parenthesize its arguments, if need be, since the
3631cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectactual arguments may not be surrounded by parentheses.  Also, your
3632cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmacro should expand to something that can be used as a single
3633cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatement when it is followed by a semicolon.
3634cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end itemize
3635cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3636cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Declarations
3637cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Bison Declarations
3638cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex declarations, Bison
3639cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex Bison declarations
3640cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3641cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe @dfn{Bison declarations} section of a Bison grammar defines the symbols
3642cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectused in formulating the grammar and the data types of semantic values.
3643cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Symbols}.
3644cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3645cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAll token type names (but not single-character literal tokens such as
3646cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{'+'} and @code{'*'}) must be declared.  Nonterminal symbols must be
3647cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeclared if you need to specify which data type to use for the semantic
3648cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvalue (@pxref{Multiple Types, ,More Than One Value Type}).
3649cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3650cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe first rule in the file also specifies the start symbol, by default.
3651cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf you want some other symbol to be the start symbol, you must declare
3652cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectit explicitly (@pxref{Language and Grammar, ,Languages and Context-Free
3653cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectGrammars}).
3654cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3655cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@menu
3656cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Require Decl::      Requiring a Bison version.
3657cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Token Decl::        Declaring terminal symbols.
3658cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Precedence Decl::   Declaring terminals with precedence and associativity.
3659cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Union Decl::        Declaring the set of all semantic value types.
3660cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Type Decl::         Declaring the choice of type for a nonterminal symbol.
3661cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Initial Action Decl::  Code run before parsing starts.
3662cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Destructor Decl::   Declaring how symbols are freed.
3663cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Expect Decl::       Suppressing warnings about parsing conflicts.
3664cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Start Decl::        Specifying the start symbol.
3665cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Pure Decl::         Requesting a reentrant parser.
3666cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Decl Summary::      Table of all Bison declarations.
3667cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end menu
3668cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3669cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Require Decl
3670cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Require a Version of Bison
3671cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex version requirement
3672cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex requiring a version of Bison
3673cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex %require
3674cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3675cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectYou may require the minimum version of Bison to process the grammar.  If
3676cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe requirement is not met, @command{bison} exits with an error (exit
3677cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatus 63).
3678cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3679cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
3680cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%require "@var{version}"
3681cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
3682cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3683cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Token Decl
3684cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Token Type Names
3685cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex declaring token type names
3686cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex token type names, declaring
3687cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex declaring literal string tokens
3688cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex %token
3689cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3690cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe basic way to declare a token type name (terminal symbol) is as follows:
3691cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3692cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
3693cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%token @var{name}
3694cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
3695cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3696cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison will convert this into a @code{#define} directive in
3697cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe parser, so that the function @code{yylex} (if it is in this file)
3698cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcan use the name @var{name} to stand for this token type's code.
3699cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3700cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAlternatively, you can use @code{%left}, @code{%right}, or
3701cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{%nonassoc} instead of @code{%token}, if you wish to specify
3702cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectassociativity and precedence.  @xref{Precedence Decl, ,Operator
3703cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectPrecedence}.
3704cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3705cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectYou can explicitly specify the numeric code for a token type by appending
3706cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecta decimal or hexadecimal integer value in the field immediately
3707cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfollowing the token name:
3708cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3709cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
3710cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%token NUM 300
3711cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%token XNUM 0x12d // a GNU extension
3712cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
3713cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3714cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
3715cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIt is generally best, however, to let Bison choose the numeric codes for
3716cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectall token types.  Bison will automatically select codes that don't conflict
3717cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwith each other or with normal characters.
3718cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3719cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn the event that the stack type is a union, you must augment the
3720cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{%token} or other token declaration to include the data type
3721cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectalternative delimited by angle-brackets (@pxref{Multiple Types, ,More
3722cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThan One Value Type}).
3723cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3724cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFor example:
3725cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3726cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
3727cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
3728cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%union @{              /* define stack type */
3729cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  double val;
3730cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  symrec *tptr;
3731cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
3732cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%token <val> NUM      /* define token NUM and its type */
3733cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
3734cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
3735cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3736cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectYou can associate a literal string token with a token type name by
3737cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwriting the literal string at the end of a @code{%token}
3738cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeclaration which declares the name.  For example:
3739cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3740cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
3741cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%token arrow "=>"
3742cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
3743cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3744cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
3745cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFor example, a grammar for the C language might specify these names with
3746cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectequivalent literal string tokens:
3747cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3748cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
3749cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%token  <operator>  OR      "||"
3750cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%token  <operator>  LE 134  "<="
3751cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%left  OR  "<="
3752cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
3753cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3754cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
3755cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectOnce you equate the literal string and the token name, you can use them
3756cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinterchangeably in further declarations or the grammar rules.  The
3757cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yylex} function can use the token name or the literal string to
3758cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectobtain the token type code number (@pxref{Calling Convention}).
3759cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3760cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Precedence Decl
3761cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Operator Precedence
3762cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex precedence declarations
3763cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex declaring operator precedence
3764cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex operator precedence, declaring
3765cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3766cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectUse the @code{%left}, @code{%right} or @code{%nonassoc} declaration to
3767cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeclare a token and specify its precedence and associativity, all at
3768cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectonce.  These are called @dfn{precedence declarations}.
3769cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Precedence, ,Operator Precedence}, for general information on
3770cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectoperator precedence.
3771cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3772cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe syntax of a precedence declaration is the same as that of
3773cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{%token}: either
3774cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3775cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
3776cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%left @var{symbols}@dots{}
3777cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
3778cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3779cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
3780cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projector
3781cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3782cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
3783cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%left <@var{type}> @var{symbols}@dots{}
3784cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
3785cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3786cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAnd indeed any of these declarations serves the purposes of @code{%token}.
3787cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBut in addition, they specify the associativity and relative precedence for
3788cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectall the @var{symbols}:
3789cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3790cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@itemize @bullet
3791cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
3792cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe associativity of an operator @var{op} determines how repeated uses
3793cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectof the operator nest: whether @samp{@var{x} @var{op} @var{y} @var{op}
3794cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@var{z}} is parsed by grouping @var{x} with @var{y} first or by
3795cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgrouping @var{y} with @var{z} first.  @code{%left} specifies
3796cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectleft-associativity (grouping @var{x} with @var{y} first) and
3797cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{%right} specifies right-associativity (grouping @var{y} with
3798cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@var{z} first).  @code{%nonassoc} specifies no associativity, which
3799cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmeans that @samp{@var{x} @var{op} @var{y} @var{op} @var{z}} is
3800cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectconsidered a syntax error.
3801cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3802cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
3803cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe precedence of an operator determines how it nests with other operators.
3804cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAll the tokens declared in a single precedence declaration have equal
3805cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprecedence and nest together according to their associativity.
3806cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhen two tokens declared in different precedence declarations associate,
3807cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe one declared later has the higher precedence and is grouped first.
3808cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end itemize
3809cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3810cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Union Decl
3811cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection The Collection of Value Types
3812cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex declaring value types
3813cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex value types, declaring
3814cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex %union
3815cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3816cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe @code{%union} declaration specifies the entire collection of
3817cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectpossible data types for semantic values.  The keyword @code{%union} is
3818cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfollowed by braced code containing the same thing that goes inside a
3819cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{union} in C@.
3820cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3821cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFor example:
3822cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3823cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
3824cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
3825cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%union @{
3826cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  double val;
3827cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  symrec *tptr;
3828cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
3829cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
3830cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
3831cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3832cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
3833cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis says that the two alternative types are @code{double} and @code{symrec
3834cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project*}.  They are given names @code{val} and @code{tptr}; these names are used
3835cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectin the @code{%token} and @code{%type} declarations to pick one of the types
3836cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfor a terminal or nonterminal symbol (@pxref{Type Decl, ,Nonterminal Symbols}).
3837cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3838cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAs an extension to @acronym{POSIX}, a tag is allowed after the
3839cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{union}.  For example:
3840cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3841cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
3842cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
3843cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%union value @{
3844cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  double val;
3845cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  symrec *tptr;
3846cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
3847cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
3848cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
3849cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3850cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
3851cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectspecifies the union tag @code{value}, so the corresponding C type is
3852cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{union value}.  If you do not specify a tag, it defaults to
3853cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{YYSTYPE}.
3854cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3855cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAs another extension to @acronym{POSIX}, you may specify multiple
3856cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{%union} declarations; their contents are concatenated.  However,
3857cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectonly the first @code{%union} declaration can specify a tag.
3858cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3859cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectNote that, unlike making a @code{union} declaration in C, you need not write
3860cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecta semicolon after the closing brace.
3861cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3862cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Type Decl
3863cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Nonterminal Symbols
3864cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex declaring value types, nonterminals
3865cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex value types, nonterminals, declaring
3866cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex %type
3867cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3868cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
3869cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhen you use @code{%union} to specify multiple value types, you must
3870cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeclare the value type of each nonterminal symbol for which values are
3871cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectused.  This is done with a @code{%type} declaration, like this:
3872cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3873cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
3874cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%type <@var{type}> @var{nonterminal}@dots{}
3875cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
3876cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3877cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
3878cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHere @var{nonterminal} is the name of a nonterminal symbol, and
3879cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@var{type} is the name given in the @code{%union} to the alternative
3880cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthat you want (@pxref{Union Decl, ,The Collection of Value Types}).  You
3881cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcan give any number of nonterminal symbols in the same @code{%type}
3882cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeclaration, if they have the same value type.  Use spaces to separate
3883cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe symbol names.
3884cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3885cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectYou can also declare the value type of a terminal symbol.  To do this,
3886cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectuse the same @code{<@var{type}>} construction in a declaration for the
3887cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectterminal symbol.  All kinds of token declarations allow
3888cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{<@var{type}>}.
3889cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3890cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Initial Action Decl
3891cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Performing Actions before Parsing
3892cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex %initial-action
3893cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3894cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSometimes your parser needs to perform some initializations before
3895cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparsing.  The @code{%initial-action} directive allows for such arbitrary
3896cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcode.
3897cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3898cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %initial-action @{ @var{code} @}
3899cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex %initial-action
3900cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDeclare that the braced @var{code} must be invoked before parsing each time
3901cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yyparse} is called.  The @var{code} may use @code{$$} and
3902cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{@@$} --- initial value and location of the look-ahead --- and the
3903cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{%parse-param}.
3904cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
3905cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3906cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFor instance, if your locations use a file name, you may use
3907cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3908cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
3909cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%parse-param @{ char const *file_name @};
3910cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%initial-action
3911cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
3912cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  @@$.initialize (file_name);
3913cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@};
3914cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
3915cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3916cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3917cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Destructor Decl
3918cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Freeing Discarded Symbols
3919cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex freeing discarded symbols
3920cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex %destructor
3921cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3922cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDuring error recovery (@pxref{Error Recovery}), symbols already pushed
3923cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecton the stack and tokens coming from the rest of the file are discarded
3924cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectuntil the parser falls on its feet.  If the parser runs out of memory,
3925cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projector if it returns via @code{YYABORT} or @code{YYACCEPT}, all the
3926cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsymbols on the stack must be discarded.  Even if the parser succeeds, it
3927cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmust discard the start symbol.
3928cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3929cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhen discarded symbols convey heap based information, this memory is
3930cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlost.  While this behavior can be tolerable for batch parsers, such as
3931cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectin traditional compilers, it is unacceptable for programs like shells or
3932cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprotocol implementations that may parse and execute indefinitely.
3933cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3934cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe @code{%destructor} directive defines code that is called when a
3935cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsymbol is automatically discarded.
3936cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3937cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %destructor @{ @var{code} @} @var{symbols}
3938cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex %destructor
3939cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectInvoke the braced @var{code} whenever the parser discards one of the
3940cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@var{symbols}.
3941cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWithin @var{code}, @code{$$} designates the semantic value associated
3942cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwith the discarded symbol.  The additional parser parameters are also
3943cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectavailable (@pxref{Parser Function, , The Parser Function
3944cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yyparse}}).
3945cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
3946cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3947cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFor instance:
3948cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3949cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@smallexample
3950cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%union
3951cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
3952cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  char *string;
3953cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
3954cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%token <string> STRING
3955cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%type  <string> string
3956cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%destructor @{ free ($$); @} STRING string
3957cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end smallexample
3958cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3959cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
3960cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectguarantees that when a @code{STRING} or a @code{string} is discarded,
3961cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectits associated memory will be freed.
3962cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3963cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@sp 1
3964cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3965cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex discarded symbols
3966cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@dfn{Discarded symbols} are the following:
3967cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3968cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@itemize
3969cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
3970cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstacked symbols popped during the first phase of error recovery,
3971cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
3972cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectincoming terminals during the second phase of error recovery,
3973cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
3974cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe current look-ahead and the entire stack (except the current
3975cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectright-hand side symbols) when the parser returns immediately, and
3976cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
3977cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe start symbol, when the parser succeeds.
3978cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end itemize
3979cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3980cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe parser can @dfn{return immediately} because of an explicit call to
3981cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{YYABORT} or @code{YYACCEPT}, or failed error recovery, or memory
3982cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexhaustion.
3983cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3984cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectRight-hand size symbols of a rule that explicitly triggers a syntax
3985cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecterror via @code{YYERROR} are not discarded automatically.  As a rule
3986cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectof thumb, destructors are invoked only when user actions cannot manage
3987cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe memory.
3988cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3989cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Expect Decl
3990cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Suppressing Conflict Warnings
3991cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex suppressing conflict warnings
3992cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex preventing warnings about conflicts
3993cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex warnings, preventing
3994cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex conflicts, suppressing warnings of
3995cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex %expect
3996cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex %expect-rr
3997cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3998cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison normally warns if there are any conflicts in the grammar
3999cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(@pxref{Shift/Reduce, ,Shift/Reduce Conflicts}), but most real grammars
4000cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthave harmless shift/reduce conflicts which are resolved in a predictable
4001cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectway and would be difficult to eliminate.  It is desirable to suppress
4002cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe warning about these conflicts unless the number of conflicts
4003cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectchanges.  You can do this with the @code{%expect} declaration.
4004cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4005cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe declaration looks like this:
4006cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4007cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
4008cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%expect @var{n}
4009cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
4010cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4011cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHere @var{n} is a decimal integer.  The declaration says there should
4012cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbe @var{n} shift/reduce conflicts and no reduce/reduce conflicts.
4013cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison reports an error if the number of shift/reduce conflicts differs
4014cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfrom @var{n}, or if there are any reduce/reduce conflicts.
4015cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4016cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFor normal @acronym{LALR}(1) parsers, reduce/reduce conflicts are more
4017cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectserious, and should be eliminated entirely.  Bison will always report
4018cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectreduce/reduce conflicts for these parsers.  With @acronym{GLR}
4019cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparsers, however, both kinds of conflicts are routine; otherwise,
4020cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthere would be no need to use @acronym{GLR} parsing.  Therefore, it is
4021cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectalso possible to specify an expected number of reduce/reduce conflicts
4022cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectin @acronym{GLR} parsers, using the declaration:
4023cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4024cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
4025cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%expect-rr @var{n}
4026cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
4027cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4028cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn general, using @code{%expect} involves these steps:
4029cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4030cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@itemize @bullet
4031cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
4032cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectCompile your grammar without @code{%expect}.  Use the @samp{-v} option
4033cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectto get a verbose list of where the conflicts occur.  Bison will also
4034cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprint the number of conflicts.
4035cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4036cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
4037cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectCheck each of the conflicts to make sure that Bison's default
4038cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectresolution is what you really want.  If not, rewrite the grammar and
4039cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgo back to the beginning.
4040cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4041cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
4042cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAdd an @code{%expect} declaration, copying the number @var{n} from the
4043cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnumber which Bison printed.  With @acronym{GLR} parsers, add an
4044cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{%expect-rr} declaration as well.
4045cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end itemize
4046cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4047cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectNow Bison will warn you if you introduce an unexpected conflict, but
4048cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwill keep silent otherwise.
4049cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4050cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Start Decl
4051cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection The Start-Symbol
4052cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex declaring the start symbol
4053cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex start symbol, declaring
4054cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex default start symbol
4055cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex %start
4056cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4057cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison assumes by default that the start symbol for the grammar is the first
4058cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnonterminal specified in the grammar specification section.  The programmer
4059cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmay override this restriction with the @code{%start} declaration as follows:
4060cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4061cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
4062cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%start @var{symbol}
4063cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
4064cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4065cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Pure Decl
4066cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection A Pure (Reentrant) Parser
4067cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex reentrant parser
4068cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex pure parser
4069cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex %pure-parser
4070cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4071cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA @dfn{reentrant} program is one which does not alter in the course of
4072cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexecution; in other words, it consists entirely of @dfn{pure} (read-only)
4073cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcode.  Reentrancy is important whenever asynchronous execution is possible;
4074cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfor example, a nonreentrant program may not be safe to call from a signal
4075cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthandler.  In systems with multiple threads of control, a nonreentrant
4076cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprogram must be called only within interlocks.
4077cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4078cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectNormally, Bison generates a parser which is not reentrant.  This is
4079cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsuitable for most uses, and it permits compatibility with Yacc.  (The
4080cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstandard Yacc interfaces are inherently nonreentrant, because they use
4081cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatically allocated variables for communication with @code{yylex},
4082cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectincluding @code{yylval} and @code{yylloc}.)
4083cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4084cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAlternatively, you can generate a pure, reentrant parser.  The Bison
4085cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeclaration @code{%pure-parser} says that you want the parser to be
4086cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectreentrant.  It looks like this:
4087cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4088cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
4089cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%pure-parser
4090cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
4091cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4092cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe result is that the communication variables @code{yylval} and
4093cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yylloc} become local variables in @code{yyparse}, and a different
4094cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcalling convention is used for the lexical analyzer function
4095cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yylex}.  @xref{Pure Calling, ,Calling Conventions for Pure
4096cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectParsers}, for the details of this.  The variable @code{yynerrs} also
4097cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbecomes local in @code{yyparse} (@pxref{Error Reporting, ,The Error
4098cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectReporting Function @code{yyerror}}).  The convention for calling
4099cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yyparse} itself is unchanged.
4100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhether the parser is pure has nothing to do with the grammar rules.
4102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectYou can generate either a pure parser or a nonreentrant parser from any
4103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvalid grammar.
4104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Decl Summary
4106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Bison Declaration Summary
4107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex Bison declaration summary
4108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex declaration summary
4109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex summary, Bison declaration
4110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHere is a summary of the declarations used to define a grammar:
4112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %union
4114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDeclare the collection of data types that semantic values may have
4115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(@pxref{Union Decl, ,The Collection of Value Types}).
4116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %token
4119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDeclare a terminal symbol (token type name) with no precedence
4120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projector associativity specified (@pxref{Token Decl, ,Token Type Names}).
4121cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4122cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4123cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %right
4124cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDeclare a terminal symbol (token type name) that is right-associative
4125cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(@pxref{Precedence Decl, ,Operator Precedence}).
4126cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4127cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %left
4129cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDeclare a terminal symbol (token type name) that is left-associative
4130cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(@pxref{Precedence Decl, ,Operator Precedence}).
4131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4133cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %nonassoc
4134cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDeclare a terminal symbol (token type name) that is nonassociative
4135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(@pxref{Precedence Decl, ,Operator Precedence}).
4136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectUsing it in a way that would be associative is a syntax error.
4137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@ifset defaultprec
4140cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %default-prec
4141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAssign a precedence to rules lacking an explicit @code{%prec} modifier
4142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(@pxref{Contextual Precedence, ,Context-Dependent Precedence}).
4143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4144cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end ifset
4145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4146cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %type
4147cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDeclare the type of semantic values for a nonterminal symbol
4148cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(@pxref{Type Decl, ,Nonterminal Symbols}).
4149cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4150cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4151cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %start
4152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSpecify the grammar's start symbol (@pxref{Start Decl, ,The
4153cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectStart-Symbol}).
4154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %expect
4157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDeclare the expected number of shift-reduce conflicts
4158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(@pxref{Expect Decl, ,Suppressing Conflict Warnings}).
4159cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4162cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@sp 1
4163cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
4164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn order to change the behavior of @command{bison}, use the following
4165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdirectives:
4166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %debug
4168cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn the parser file, define the macro @code{YYDEBUG} to 1 if it is not
4169cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectalready defined, so that the debugging facilities are compiled.
4170cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4171cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Tracing, ,Tracing Your Parser}.
4172cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4173cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %defines
4174cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWrite a header file containing macro definitions for the token type
4175cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnames defined in the grammar as well as a few other declarations.
4176cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf the parser output file is named @file{@var{name}.c} then this file
4177cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectis named @file{@var{name}.h}.
4178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectUnless @code{YYSTYPE} is already defined as a macro, the output header
4180cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeclares @code{YYSTYPE}.  Therefore, if you are using a @code{%union}
4181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(@pxref{Multiple Types, ,More Than One Value Type}) with components that
4182cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrequire other definitions, or if you have defined a @code{YYSTYPE} macro
4183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(@pxref{Value Type, ,Data Types of Semantic Values}), you need to
4184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectarrange for these definitions to be propagated to all modules, e.g., by
4185cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectputting them in a prerequisite header that is included both by your
4186cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparser and by any other module that needs @code{YYSTYPE}.
4187cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4188cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectUnless your parser is pure, the output header declares @code{yylval}
4189cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectas an external variable.  @xref{Pure Decl, ,A Pure (Reentrant)
4190cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectParser}.
4191cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4192cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf you have also used locations, the output header declares
4193cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{YYLTYPE} and @code{yylloc} using a protocol similar to that of
4194cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{YYSTYPE} and @code{yylval}.  @xref{Locations, ,Tracking
4195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectLocations}.
4196cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4197cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis output file is normally essential if you wish to put the definition
4198cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectof @code{yylex} in a separate source file, because @code{yylex}
4199cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttypically needs to be able to refer to the above-mentioned declarations
4200cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand to the token type codes.  @xref{Token Values, ,Semantic Values of
4201cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTokens}.
4202cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4204cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %destructor
4205cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSpecify how the parser should reclaim the memory associated to
4206cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdiscarded symbols.  @xref{Destructor Decl, , Freeing Discarded Symbols}.
4207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4208cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4209cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %file-prefix="@var{prefix}"
4210cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSpecify a prefix to use for all Bison output file names.  The names are
4211cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectchosen as if the input file were named @file{@var{prefix}.y}.
4212cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4213cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4214cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %locations
4215cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectGenerate the code processing the locations (@pxref{Action Features,
4216cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project,Special Features for Use in Actions}).  This mode is enabled as soon as
4217cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe grammar uses the special @samp{@@@var{n}} tokens, but if your
4218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgrammar does not use it, using @samp{%locations} allows for more
4219cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectaccurate syntax error messages.
4220cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4221cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %name-prefix="@var{prefix}"
4223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectRename the external symbols used in the parser so that they start with
4224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@var{prefix} instead of @samp{yy}.  The precise list of symbols renamed
4225cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectin C parsers
4226cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectis @code{yyparse}, @code{yylex}, @code{yyerror}, @code{yynerrs},
4227cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yylval}, @code{yychar}, @code{yydebug}, and
4228cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(if locations are used) @code{yylloc}.  For example, if you use
4229cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{%name-prefix="c_"}, the names become @code{c_parse}, @code{c_lex},
4230cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand so on.  In C++ parsers, it is only the surrounding namespace which is
4231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnamed @var{prefix} instead of @samp{yy}.
4232cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Multiple Parsers, ,Multiple Parsers in the Same Program}.
4233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@ifset defaultprec
4236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %no-default-prec
4237cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDo not assign a precedence to rules lacking an explicit @code{%prec}
4238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmodifier (@pxref{Contextual Precedence, ,Context-Dependent
4239cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectPrecedence}).
4240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end ifset
4242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %no-parser
4244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDo not include any C code in the parser file; generate tables only.  The
4245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparser file contains just @code{#define} directives and static variable
4246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeclarations.
4247cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis option also tells Bison to write the C code for the grammar actions
4249cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinto a file named @file{@var{file}.act}, in the form of a
4250cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbrace-surrounded body fit for a @code{switch} statement.
4251cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4252cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4253cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %no-lines
4254cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDon't generate any @code{#line} preprocessor commands in the parser
4255cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfile.  Ordinarily Bison writes these commands in the parser file so that
4256cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe C compiler and debuggers will associate errors and object code with
4257cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectyour source file (the grammar file).  This directive causes them to
4258cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectassociate errors with the parser file, treating it an independent source
4259cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfile in its own right.
4260cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4261cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4262cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %output="@var{file}"
4263cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSpecify @var{file} for the parser file.
4264cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4265cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4266cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %pure-parser
4267cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectRequest a pure (reentrant) parser program (@pxref{Pure Decl, ,A Pure
4268cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(Reentrant) Parser}).
4269cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4270cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4271cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %require "@var{version}"
4272cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectRequire version @var{version} or higher of Bison.  @xref{Require Decl, ,
4273cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectRequire a Version of Bison}.
4274cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4275cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4276cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %token-table
4277cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectGenerate an array of token names in the parser file.  The name of the
4278cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectarray is @code{yytname}; @code{yytname[@var{i}]} is the name of the
4279cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttoken whose internal Bison token code number is @var{i}.  The first
4280cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthree elements of @code{yytname} correspond to the predefined tokens
4281cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{"$end"},
4282cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{"error"}, and @code{"$undefined"}; after these come the symbols
4283cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdefined in the grammar file.
4284cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4285cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe name in the table includes all the characters needed to represent
4286cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe token in Bison.  For single-character literals and literal
4287cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstrings, this includes the surrounding quoting characters and any
4288cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectescape sequences.  For example, the Bison single-character literal
4289cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{'+'} corresponds to a three-character name, represented in C as
4290cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{"'+'"}; and the Bison two-character literal string @code{"\\/"}
4291cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcorresponds to a five-character name, represented in C as
4292cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{"\"\\\\/\""}.
4293cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4294cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhen you specify @code{%token-table}, Bison also generates macro
4295cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdefinitions for macros @code{YYNTOKENS}, @code{YYNNTS}, and
4296cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{YYNRULES}, and @code{YYNSTATES}:
4297cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4298cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@table @code
4299cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item YYNTOKENS
4300cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe highest token number, plus one.
4301cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item YYNNTS
4302cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe number of nonterminal symbols.
4303cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item YYNRULES
4304cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe number of grammar rules,
4305cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item YYNSTATES
4306cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe number of parser states (@pxref{Parser States}).
4307cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end table
4308cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4309cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4310cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %verbose
4311cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWrite an extra output file containing verbose descriptions of the
4312cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparser states and what is done for each type of look-ahead token in
4313cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthat state.  @xref{Understanding, , Understanding Your Parser}, for more
4314cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinformation.
4315cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4316cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4317cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %yacc
4318cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectPretend the option @option{--yacc} was given, i.e., imitate Yacc,
4319cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectincluding its naming conventions.  @xref{Bison Options}, for more.
4320cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4321cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4322cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4323cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Multiple Parsers
4324cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Multiple Parsers in the Same Program
4325cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4326cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectMost programs that use Bison parse only one language and therefore contain
4327cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectonly one Bison parser.  But what if you want to parse more than one
4328cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlanguage with the same program?  Then you need to avoid a name conflict
4329cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbetween different definitions of @code{yyparse}, @code{yylval}, and so on.
4330cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4331cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe easy way to do this is to use the option @samp{-p @var{prefix}}
4332cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(@pxref{Invocation, ,Invoking Bison}).  This renames the interface
4333cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfunctions and variables of the Bison parser to start with @var{prefix}
4334cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinstead of @samp{yy}.  You can use this to give each parser distinct
4335cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnames that do not conflict.
4336cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4337cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe precise list of symbols renamed is @code{yyparse}, @code{yylex},
4338cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yyerror}, @code{yynerrs}, @code{yylval}, @code{yylloc},
4339cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yychar} and @code{yydebug}.  For example, if you use @samp{-p c},
4340cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe names become @code{cparse}, @code{clex}, and so on.
4341cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4342cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@strong{All the other variables and macros associated with Bison are not
4343cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrenamed.} These others are not global; there is no conflict if the same
4344cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectname is used in different parsers.  For example, @code{YYSTYPE} is not
4345cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrenamed, but defining this in different ways in different parsers causes
4346cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectno trouble (@pxref{Value Type, ,Data Types of Semantic Values}).
4347cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4348cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe @samp{-p} option works by adding macro definitions to the beginning
4349cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectof the parser source file, defining @code{yyparse} as
4350cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{@var{prefix}parse}, and so on.  This effectively substitutes one
4351cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectname for the other in the entire parser file.
4352cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4353cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Interface
4354cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@chapter Parser C-Language Interface
4355cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex C-language interface
4356cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex interface
4357cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4358cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe Bison parser is actually a C function named @code{yyparse}.  Here we
4359cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdescribe the interface conventions of @code{yyparse} and the other
4360cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfunctions that it needs to use.
4361cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4362cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectKeep in mind that the parser uses many C identifiers starting with
4363cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{yy} and @samp{YY} for internal purposes.  If you use such an
4364cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectidentifier (aside from those in this manual) in an action or in epilogue
4365cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectin the grammar file, you are likely to run into trouble.
4366cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4367cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@menu
4368cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Parser Function::   How to call @code{yyparse} and what it returns.
4369cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Lexical::           You must supply a function @code{yylex}
4370cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                        which reads tokens.
4371cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Error Reporting::   You must supply a function @code{yyerror}.
4372cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Action Features::   Special features for use in actions.
4373cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Internationalization::  How to let the parser speak in the user's
4374cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                        native language.
4375cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end menu
4376cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4377cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Parser Function
4378cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section The Parser Function @code{yyparse}
4379cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex yyparse
4380cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4381cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectYou call the function @code{yyparse} to cause parsing to occur.  This
4382cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfunction reads tokens, executes actions, and ultimately returns when it
4383cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectencounters end-of-input or an unrecoverable syntax error.  You can also
4384cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwrite an action which directs @code{yyparse} to return immediately
4385cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwithout reading further.
4386cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4387cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4388cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deftypefun int yyparse (void)
4389cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe value returned by @code{yyparse} is 0 if parsing was successful (return
4390cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectis due to end-of-input).
4391cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4392cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe value is 1 if parsing failed because of invalid input, i.e., input
4393cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthat contains a syntax error or that causes @code{YYABORT} to be
4394cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinvoked.
4395cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4396cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe value is 2 if parsing failed due to memory exhaustion.
4397cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deftypefun
4398cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4399cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn an action, you can cause immediate return from @code{yyparse} by using
4400cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthese macros:
4401cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4402cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@defmac YYACCEPT
4403cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex YYACCEPT
4404cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectReturn immediately with value 0 (to report success).
4405cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end defmac
4406cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4407cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@defmac YYABORT
4408cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex YYABORT
4409cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectReturn immediately with value 1 (to report failure).
4410cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end defmac
4411cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4412cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf you use a reentrant parser, you can optionally pass additional
4413cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparameter information to it in a reentrant way.  To do so, use the
4414cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeclaration @code{%parse-param}:
4415cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4416cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %parse-param @{@var{argument-declaration}@}
4417cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex %parse-param
4418cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDeclare that an argument declared by the braced-code
4419cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@var{argument-declaration} is an additional @code{yyparse} argument.
4420cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe @var{argument-declaration} is used when declaring
4421cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfunctions or prototypes.  The last identifier in
4422cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@var{argument-declaration} must be the argument name.
4423cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4424cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4425cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHere's an example.  Write this in the parser:
4426cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4427cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
4428cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%parse-param @{int *nastiness@}
4429cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%parse-param @{int *randomness@}
4430cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
4431cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4432cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
4433cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThen call the parser like this:
4434cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4435cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
4436cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
4437cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int nastiness, randomness;
4438cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  @dots{}  /* @r{Store proper data in @code{nastiness} and @code{randomness}.}  */
4439cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  value = yyparse (&nastiness, &randomness);
4440cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  @dots{}
4441cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
4442cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
4443cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4444cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
4445cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn the grammar actions, use expressions like this to refer to the data:
4446cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4447cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
4448cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexp: @dots{}    @{ @dots{}; *randomness += 1; @dots{} @}
4449cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
4450cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4451cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4452cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Lexical
4453cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section The Lexical Analyzer Function @code{yylex}
4454cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex yylex
4455cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex lexical analyzer
4456cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4457cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe @dfn{lexical analyzer} function, @code{yylex}, recognizes tokens from
4458cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe input stream and returns them to the parser.  Bison does not create
4459cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthis function automatically; you must write it so that @code{yyparse} can
4460cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcall it.  The function is sometimes referred to as a lexical scanner.
4461cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4462cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn simple programs, @code{yylex} is often defined at the end of the Bison
4463cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgrammar file.  If @code{yylex} is defined in a separate source file, you
4464cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectneed to arrange for the token-type macro definitions to be available there.
4465cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTo do this, use the @samp{-d} option when you run Bison, so that it will
4466cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwrite these macro definitions into a separate header file
4467cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@file{@var{name}.tab.h} which you can include in the other source files
4468cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthat need it.  @xref{Invocation, ,Invoking Bison}.
4469cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4470cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@menu
4471cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Calling Convention::  How @code{yyparse} calls @code{yylex}.
4472cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Token Values::      How @code{yylex} must return the semantic value
4473cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                        of the token it has read.
4474cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Token Locations::   How @code{yylex} must return the text location
4475cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                        (line number, etc.) of the token, if the
4476cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                        actions want that.
4477cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Pure Calling::      How the calling convention differs
4478cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                        in a pure parser (@pxref{Pure Decl, ,A Pure (Reentrant) Parser}).
4479cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end menu
4480cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4481cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Calling Convention
4482cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Calling Convention for @code{yylex}
4483cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4484cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe value that @code{yylex} returns must be the positive numeric code
4485cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfor the type of token it has just found; a zero or negative value
4486cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsignifies end-of-input.
4487cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4488cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhen a token is referred to in the grammar rules by a name, that name
4489cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectin the parser file becomes a C macro whose definition is the proper
4490cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnumeric code for that token type.  So @code{yylex} can use the name
4491cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectto indicate that type.  @xref{Symbols}.
4492cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4493cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhen a token is referred to in the grammar rules by a character literal,
4494cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe numeric code for that character is also the code for the token type.
4495cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSo @code{yylex} can simply return that character code, possibly converted
4496cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectto @code{unsigned char} to avoid sign-extension.  The null character
4497cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmust not be used this way, because its code is zero and that
4498cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsignifies end-of-input.
4499cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4500cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHere is an example showing these things:
4501cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4502cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
4503cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint
4504cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectyylex (void)
4505cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
4506cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  @dots{}
4507cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (c == EOF)    /* Detect end-of-input.  */
4508cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return 0;
4509cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  @dots{}
4510cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (c == '+' || c == '-')
4511cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return c;      /* Assume token type for `+' is '+'.  */
4512cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  @dots{}
4513cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return INT;      /* Return the type of the token.  */
4514cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  @dots{}
4515cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
4516cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
4517cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4518cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
4519cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis interface has been designed so that the output from the @code{lex}
4520cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectutility can be used without change as the definition of @code{yylex}.
4521cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4522cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf the grammar uses literal string tokens, there are two ways that
4523cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yylex} can determine the token type codes for them:
4524cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4525cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@itemize @bullet
4526cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
4527cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf the grammar defines symbolic token names as aliases for the
4528cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectliteral string tokens, @code{yylex} can use these symbolic names like
4529cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectall others.  In this case, the use of the literal string tokens in
4530cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe grammar file has no effect on @code{yylex}.
4531cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4532cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
4533cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yylex} can find the multicharacter token in the @code{yytname}
4534cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttable.  The index of the token in the table is the token type's code.
4535cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe name of a multicharacter token is recorded in @code{yytname} with a
4536cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdouble-quote, the token's characters, and another double-quote.  The
4537cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttoken's characters are escaped as necessary to be suitable as input
4538cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectto Bison.
4539cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4540cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHere's code for looking up a multicharacter token in @code{yytname},
4541cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectassuming that the characters of the token are stored in
4542cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{token_buffer}, and assuming that the token does not contain any
4543cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcharacters like @samp{"} that require escaping.
4544cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4545cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@smallexample
4546cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfor (i = 0; i < YYNTOKENS; i++)
4547cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  @{
4548cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    if (yytname[i] != 0
4549cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        && yytname[i][0] == '"'
4550cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        && ! strncmp (yytname[i] + 1, token_buffer,
4551cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                      strlen (token_buffer))
4552cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        && yytname[i][strlen (token_buffer) + 1] == '"'
4553cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        && yytname[i][strlen (token_buffer) + 2] == 0)
4554cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      break;
4555cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  @}
4556cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end smallexample
4557cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4558cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe @code{yytname} table is generated only if you use the
4559cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{%token-table} declaration.  @xref{Decl Summary}.
4560cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end itemize
4561cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4562cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Token Values
4563cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Semantic Values of Tokens
4564cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4565cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@vindex yylval
4566cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn an ordinary (nonreentrant) parser, the semantic value of the token must
4567cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbe stored into the global variable @code{yylval}.  When you are using
4568cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectjust one data type for semantic values, @code{yylval} has that type.
4569cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThus, if the type is @code{int} (the default), you might write this in
4570cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yylex}:
4571cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4572cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
4573cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
4574cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  @dots{}
4575cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  yylval = value;  /* Put value onto Bison stack.  */
4576cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return INT;      /* Return the type of the token.  */
4577cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  @dots{}
4578cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
4579cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
4580cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4581cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhen you are using multiple data types, @code{yylval}'s type is a union
4582cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmade from the @code{%union} declaration (@pxref{Union Decl, ,The
4583cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectCollection of Value Types}).  So when you store a token's value, you
4584cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmust use the proper member of the union.  If the @code{%union}
4585cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeclaration looks like this:
4586cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4587cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
4588cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
4589cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%union @{
4590cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int intval;
4591cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  double val;
4592cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  symrec *tptr;
4593cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
4594cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
4595cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
4596cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4597cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
4598cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthen the code in @code{yylex} might look like this:
4599cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4600cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
4601cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
4602cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  @dots{}
4603cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  yylval.intval = value; /* Put value onto Bison stack.  */
4604cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return INT;            /* Return the type of the token.  */
4605cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  @dots{}
4606cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
4607cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
4608cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4609cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Token Locations
4610cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Textual Locations of Tokens
4611cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4612cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@vindex yylloc
4613cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf you are using the @samp{@@@var{n}}-feature (@pxref{Locations, ,
4614cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTracking Locations}) in actions to keep track of the textual locations
4615cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectof tokens and groupings, then you must provide this information in
4616cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yylex}.  The function @code{yyparse} expects to find the textual
4617cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlocation of a token just parsed in the global variable @code{yylloc}.
4618cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSo @code{yylex} must store the proper data in that variable.
4619cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4620cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBy default, the value of @code{yylloc} is a structure and you need only
4621cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinitialize the members that are going to be used by the actions.  The
4622cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfour members are called @code{first_line}, @code{first_column},
4623cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{last_line} and @code{last_column}.  Note that the use of this
4624cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfeature makes the parser noticeably slower.
4625cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4626cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@tindex YYLTYPE
4627cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe data type of @code{yylloc} has the name @code{YYLTYPE}.
4628cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4629cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Pure Calling
4630cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Calling Conventions for Pure Parsers
4631cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4632cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhen you use the Bison declaration @code{%pure-parser} to request a
4633cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectpure, reentrant parser, the global communication variables @code{yylval}
4634cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand @code{yylloc} cannot be used.  (@xref{Pure Decl, ,A Pure (Reentrant)
4635cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectParser}.)  In such parsers the two global variables are replaced by
4636cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectpointers passed as arguments to @code{yylex}.  You must declare them as
4637cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectshown here, and pass the information back by storing it through those
4638cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectpointers.
4639cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4640cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
4641cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint
4642cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectyylex (YYSTYPE *lvalp, YYLTYPE *llocp)
4643cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
4644cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  @dots{}
4645cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  *lvalp = value;  /* Put value onto Bison stack.  */
4646cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return INT;      /* Return the type of the token.  */
4647cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  @dots{}
4648cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
4649cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
4650cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4651cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf the grammar file does not use the @samp{@@} constructs to refer to
4652cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttextual locations, then the type @code{YYLTYPE} will not be defined.  In
4653cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthis case, omit the second argument; @code{yylex} will be called with
4654cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectonly one argument.
4655cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4656cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4657cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf you wish to pass the additional parameter data to @code{yylex}, use
4658cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{%lex-param} just like @code{%parse-param} (@pxref{Parser
4659cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFunction}).
4660cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4661cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} lex-param @{@var{argument-declaration}@}
4662cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex %lex-param
4663cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDeclare that the braced-code @var{argument-declaration} is an
4664cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectadditional @code{yylex} argument declaration.
4665cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4666cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4667cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFor instance:
4668cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4669cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
4670cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%parse-param @{int *nastiness@}
4671cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%lex-param   @{int *nastiness@}
4672cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%parse-param @{int *randomness@}
4673cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
4674cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4675cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
4676cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectresults in the following signature:
4677cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4678cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
4679cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint yylex   (int *nastiness);
4680cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint yyparse (int *nastiness, int *randomness);
4681cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
4682cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4683cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf @code{%pure-parser} is added:
4684cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4685cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
4686cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint yylex   (YYSTYPE *lvalp, int *nastiness);
4687cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint yyparse (int *nastiness, int *randomness);
4688cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
4689cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4690cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
4691cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand finally, if both @code{%pure-parser} and @code{%locations} are used:
4692cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4693cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
4694cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint yylex   (YYSTYPE *lvalp, YYLTYPE *llocp, int *nastiness);
4695cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint yyparse (int *nastiness, int *randomness);
4696cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
4697cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4698cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Error Reporting
4699cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section The Error Reporting Function @code{yyerror}
4700cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex error reporting function
4701cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex yyerror
4702cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex parse error
4703cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex syntax error
4704cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4705cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe Bison parser detects a @dfn{syntax error} or @dfn{parse error}
4706cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwhenever it reads a token which cannot satisfy any syntax rule.  An
4707cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectaction in the grammar can also explicitly proclaim an error, using the
4708cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmacro @code{YYERROR} (@pxref{Action Features, ,Special Features for Use
4709cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectin Actions}).
4710cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4711cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe Bison parser expects to report the error by calling an error
4712cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectreporting function named @code{yyerror}, which you must supply.  It is
4713cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcalled by @code{yyparse} whenever a syntax error is found, and it
4714cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectreceives one argument.  For a syntax error, the string is normally
4715cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@w{@code{"syntax error"}}.
4716cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4717cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex %error-verbose
4718cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf you invoke the directive @code{%error-verbose} in the Bison
4719cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeclarations section (@pxref{Bison Declarations, ,The Bison Declarations
4720cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSection}), then Bison provides a more verbose and specific error message
4721cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstring instead of just plain @w{@code{"syntax error"}}.
4722cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4723cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe parser can detect one other kind of error: memory exhaustion.  This
4724cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcan happen when the input contains constructions that are very deeply
4725cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnested.  It isn't likely you will encounter this, since the Bison
4726cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparser normally extends its stack automatically up to a very large limit.  But
4727cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectif memory is exhausted, @code{yyparse} calls @code{yyerror} in the usual
4728cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfashion, except that the argument string is @w{@code{"memory exhausted"}}.
4729cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4730cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn some cases diagnostics like @w{@code{"syntax error"}} are
4731cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttranslated automatically from English to some other language before
4732cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthey are passed to @code{yyerror}.  @xref{Internationalization}.
4733cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4734cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe following definition suffices in simple programs:
4735cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4736cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
4737cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
4738cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
4739cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectyyerror (char const *s)
4740cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
4741cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
4742cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
4743cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fprintf (stderr, "%s\n", s);
4744cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
4745cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
4746cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
4747cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4748cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAfter @code{yyerror} returns to @code{yyparse}, the latter will attempt
4749cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecterror recovery if you have written suitable error recovery grammar rules
4750cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(@pxref{Error Recovery}).  If recovery is impossible, @code{yyparse} will
4751cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectimmediately return 1.
4752cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4753cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectObviously, in location tracking pure parsers, @code{yyerror} should have
4754cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectan access to the current location.
4755cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis is indeed the case for the @acronym{GLR}
4756cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparsers, but not for the Yacc parser, for historical reasons.  I.e., if
4757cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{%locations %pure-parser} is passed then the prototypes for
4758cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yyerror} are:
4759cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4760cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
4761cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid yyerror (char const *msg);                 /* Yacc parsers.  */
4762cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid yyerror (YYLTYPE *locp, char const *msg);  /* GLR parsers.   */
4763cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
4764cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4765cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf @samp{%parse-param @{int *nastiness@}} is used, then:
4766cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4767cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
4768cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid yyerror (int *nastiness, char const *msg);  /* Yacc parsers.  */
4769cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid yyerror (int *nastiness, char const *msg);  /* GLR parsers.   */
4770cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
4771cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4772cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFinally, @acronym{GLR} and Yacc parsers share the same @code{yyerror} calling
4773cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectconvention for absolutely pure parsers, i.e., when the calling
4774cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectconvention of @code{yylex} @emph{and} the calling convention of
4775cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{%pure-parser} are pure.  I.e.:
4776cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4777cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
4778cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Location tracking.  */
4779cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%locations
4780cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Pure yylex.  */
4781cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%pure-parser
4782cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%lex-param   @{int *nastiness@}
4783cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Pure yyparse.  */
4784cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%parse-param @{int *nastiness@}
4785cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%parse-param @{int *randomness@}
4786cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
4787cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4788cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
4789cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectresults in the following signatures for all the parser kinds:
4790cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4791cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
4792cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint yylex (YYSTYPE *lvalp, YYLTYPE *llocp, int *nastiness);
4793cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint yyparse (int *nastiness, int *randomness);
4794cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid yyerror (YYLTYPE *locp,
4795cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project              int *nastiness, int *randomness,
4796cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project              char const *msg);
4797cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
4798cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4799cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
4800cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe prototypes are only indications of how the code produced by Bison
4801cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectuses @code{yyerror}.  Bison-generated code always ignores the returned
4802cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvalue, so @code{yyerror} can return any type, including @code{void}.
4803cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAlso, @code{yyerror} can be a variadic function; that is why the
4804cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmessage is always passed last.
4805cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4806cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTraditionally @code{yyerror} returns an @code{int} that is always
4807cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectignored, but this is purely for historical reasons, and @code{void} is
4808cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectpreferable since it more accurately describes the return type for
4809cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yyerror}.
4810cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4811cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@vindex yynerrs
4812cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe variable @code{yynerrs} contains the number of syntax errors
4813cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectreported so far.  Normally this variable is global; but if you
4814cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrequest a pure parser (@pxref{Pure Decl, ,A Pure (Reentrant) Parser})
4815cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthen it is a local variable which only the actions can access.
4816cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4817cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Action Features
4818cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Special Features for Use in Actions
4819cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex summary, action features
4820cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex action features summary
4821cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4822cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHere is a table of Bison constructs, variables and macros that
4823cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectare useful in actions.
4824cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4825cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Variable} $$
4826cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectActs like a variable that contains the semantic value for the
4827cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgrouping made by the current rule.  @xref{Actions}.
4828cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4829cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4830cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Variable} $@var{n}
4831cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectActs like a variable that contains the semantic value for the
4832cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@var{n}th component of the current rule.  @xref{Actions}.
4833cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4834cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4835cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Variable} $<@var{typealt}>$
4836cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectLike @code{$$} but specifies alternative @var{typealt} in the union
4837cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectspecified by the @code{%union} declaration.  @xref{Action Types, ,Data
4838cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTypes of Values in Actions}.
4839cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4840cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4841cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Variable} $<@var{typealt}>@var{n}
4842cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectLike @code{$@var{n}} but specifies alternative @var{typealt} in the
4843cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectunion specified by the @code{%union} declaration.
4844cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Action Types, ,Data Types of Values in Actions}.
4845cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4846cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4847cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Macro} YYABORT;
4848cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectReturn immediately from @code{yyparse}, indicating failure.
4849cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Parser Function, ,The Parser Function @code{yyparse}}.
4850cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4851cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4852cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Macro} YYACCEPT;
4853cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectReturn immediately from @code{yyparse}, indicating success.
4854cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Parser Function, ,The Parser Function @code{yyparse}}.
4855cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4856cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4857cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Macro} YYBACKUP (@var{token}, @var{value});
4858cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex YYBACKUP
4859cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectUnshift a token.  This macro is allowed only for rules that reduce
4860cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecta single value, and only when there is no look-ahead token.
4861cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIt is also disallowed in @acronym{GLR} parsers.
4862cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIt installs a look-ahead token with token type @var{token} and
4863cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsemantic value @var{value}; then it discards the value that was
4864cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgoing to be reduced by this rule.
4865cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4866cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf the macro is used when it is not valid, such as when there is
4867cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecta look-ahead token already, then it reports a syntax error with
4868cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecta message @samp{cannot back up} and performs ordinary error
4869cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrecovery.
4870cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4871cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn either case, the rest of the action is not executed.
4872cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4873cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4874cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Macro} YYEMPTY
4875cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@vindex YYEMPTY
4876cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectValue stored in @code{yychar} when there is no look-ahead token.
4877cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4878cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4879cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Macro} YYEOF
4880cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@vindex YYEOF
4881cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectValue stored in @code{yychar} when the look-ahead is the end of the input
4882cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstream.
4883cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4884cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4885cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Macro} YYERROR;
4886cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex YYERROR
4887cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectCause an immediate syntax error.  This statement initiates error
4888cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrecovery just as if the parser itself had detected an error; however, it
4889cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdoes not call @code{yyerror}, and does not print any message.  If you
4890cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwant to print an error message, call @code{yyerror} explicitly before
4891cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe @samp{YYERROR;} statement.  @xref{Error Recovery}.
4892cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4893cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4894cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Macro} YYRECOVERING
4895cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex YYRECOVERING
4896cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe expression @code{YYRECOVERING ()} yields 1 when the parser
4897cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectis recovering from a syntax error, and 0 otherwise.
4898cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Error Recovery}.
4899cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4900cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4901cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Variable} yychar
4902cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectVariable containing either the look-ahead token, or @code{YYEOF} when the
4903cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlook-ahead is the end of the input stream, or @code{YYEMPTY} when no look-ahead
4904cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthas been performed so the next token is not yet known.
4905cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDo not modify @code{yychar} in a deferred semantic action (@pxref{GLR Semantic
4906cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectActions}).
4907cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Look-Ahead, ,Look-Ahead Tokens}.
4908cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4909cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4910cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Macro} yyclearin;
4911cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDiscard the current look-ahead token.  This is useful primarily in
4912cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecterror rules.
4913cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDo not invoke @code{yyclearin} in a deferred semantic action (@pxref{GLR
4914cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSemantic Actions}).
4915cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Error Recovery}.
4916cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4917cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4918cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Macro} yyerrok;
4919cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectResume generating error messages immediately for subsequent syntax
4920cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecterrors.  This is useful primarily in error rules.
4921cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Error Recovery}.
4922cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4923cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4924cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Variable} yylloc
4925cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectVariable containing the look-ahead token location when @code{yychar} is not set
4926cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectto @code{YYEMPTY} or @code{YYEOF}.
4927cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDo not modify @code{yylloc} in a deferred semantic action (@pxref{GLR Semantic
4928cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectActions}).
4929cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Actions and Locations, ,Actions and Locations}.
4930cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4931cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4932cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Variable} yylval
4933cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectVariable containing the look-ahead token semantic value when @code{yychar} is
4934cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnot set to @code{YYEMPTY} or @code{YYEOF}.
4935cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDo not modify @code{yylval} in a deferred semantic action (@pxref{GLR Semantic
4936cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectActions}).
4937cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Actions, ,Actions}.
4938cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4939cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4940cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Value} @@$
4941cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex @@$
4942cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectActs like a structure variable containing information on the textual location
4943cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectof the grouping made by the current rule.  @xref{Locations, ,
4944cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTracking Locations}.
4945cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4946cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c Check if those paragraphs are still useful or not.
4947cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4948cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c @example
4949cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c struct @{
4950cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c   int first_line, last_line;
4951cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c   int first_column, last_column;
4952cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c @};
4953cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c @end example
4954cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4955cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c Thus, to get the starting line number of the third component, you would
4956cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c use @samp{@@3.first_line}.
4957cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4958cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c In order for the members of this structure to contain valid information,
4959cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c you must make @code{yylex} supply this information about each token.
4960cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c If you need only certain members, then @code{yylex} need only fill in
4961cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c those members.
4962cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4963cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c The use of this feature makes the parser noticeably slower.
4964cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4965cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4966cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Value} @@@var{n}
4967cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex @@@var{n}
4968cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectActs like a structure variable containing information on the textual location
4969cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectof the @var{n}th component of the current rule.  @xref{Locations, ,
4970cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTracking Locations}.
4971cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
4972cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4973cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Internationalization
4974cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Parser Internationalization
4975cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex internationalization
4976cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex i18n
4977cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex NLS
4978cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex gettext
4979cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex bison-po
4980cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4981cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA Bison-generated parser can print diagnostics, including error and
4982cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttracing messages.  By default, they appear in English.  However, Bison
4983cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectalso supports outputting diagnostics in the user's native language.  To
4984cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmake this work, the user should set the usual environment variables.
4985cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Users, , The User's View, gettext, GNU @code{gettext} utilities}.
4986cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFor example, the shell command @samp{export LC_ALL=fr_CA.UTF-8} might
4987cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectset the user's locale to French Canadian using the @acronym{UTF}-8
4988cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectencoding.  The exact set of available locales depends on the user's
4989cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinstallation.
4990cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4991cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe maintainer of a package that uses a Bison-generated parser enables
4992cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe internationalization of the parser's output through the following
4993cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsteps.  Here we assume a package that uses @acronym{GNU} Autoconf and
4994cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@acronym{GNU} Automake.
4995cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4996cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@enumerate
4997cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
4998cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex bison-i18n.m4
4999cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectInto the directory containing the @acronym{GNU} Autoconf macros used
5000cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectby the package---often called @file{m4}---copy the
5001cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@file{bison-i18n.m4} file installed by Bison under
5002cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{share/aclocal/bison-i18n.m4} in Bison's installation directory.
5003cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFor example:
5004cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5005cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
5006cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcp /usr/local/share/aclocal/bison-i18n.m4 m4/bison-i18n.m4
5007cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
5008cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5009cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
5010cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex BISON_I18N
5011cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@vindex BISON_LOCALEDIR
5012cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@vindex YYENABLE_NLS
5013cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn the top-level @file{configure.ac}, after the @code{AM_GNU_GETTEXT}
5014cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinvocation, add an invocation of @code{BISON_I18N}.  This macro is
5015cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdefined in the file @file{bison-i18n.m4} that you copied earlier.  It
5016cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcauses @samp{configure} to find the value of the
5017cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{BISON_LOCALEDIR} variable, and it defines the source-language
5018cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsymbol @code{YYENABLE_NLS} to enable translations in the
5019cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison-generated parser.
5020cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5021cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
5022cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn the @code{main} function of your program, designate the directory
5023cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcontaining Bison's runtime message catalog, through a call to
5024cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{bindtextdomain} with domain name @samp{bison-runtime}.
5025cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFor example:
5026cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5027cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
5028cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbindtextdomain ("bison-runtime", BISON_LOCALEDIR);
5029cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
5030cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5031cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTypically this appears after any other call @code{bindtextdomain
5032cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(PACKAGE, LOCALEDIR)} that your package already has.  Here we rely on
5033cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{BISON_LOCALEDIR} to be defined as a string through the
5034cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@file{Makefile}.
5035cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5036cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
5037cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn the @file{Makefile.am} that controls the compilation of the @code{main}
5038cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfunction, make @samp{BISON_LOCALEDIR} available as a C preprocessor macro,
5039cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecteither in @samp{DEFS} or in @samp{AM_CPPFLAGS}.  For example:
5040cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5041cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
5042cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDEFS = @@DEFS@@ -DBISON_LOCALEDIR='"$(BISON_LOCALEDIR)"'
5043cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
5044cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5045cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projector:
5046cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5047cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
5048cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAM_CPPFLAGS = -DBISON_LOCALEDIR='"$(BISON_LOCALEDIR)"'
5049cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
5050cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5051cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
5052cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFinally, invoke the command @command{autoreconf} to generate the build
5053cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinfrastructure.
5054cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end enumerate
5055cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5056cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5057cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Algorithm
5058cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@chapter The Bison Parser Algorithm
5059cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex Bison parser algorithm
5060cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex algorithm of parser
5061cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex shifting
5062cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex reduction
5063cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex parser stack
5064cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex stack, parser
5065cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5066cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAs Bison reads tokens, it pushes them onto a stack along with their
5067cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsemantic values.  The stack is called the @dfn{parser stack}.  Pushing a
5068cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttoken is traditionally called @dfn{shifting}.
5069cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5070cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFor example, suppose the infix calculator has read @samp{1 + 5 *}, with a
5071cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{3} to come.  The stack will have four elements, one for each token
5072cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthat was shifted.
5073cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5074cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBut the stack does not always have an element for each token read.  When
5075cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe last @var{n} tokens and groupings shifted match the components of a
5076cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgrammar rule, they can be combined according to that rule.  This is called
5077cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@dfn{reduction}.  Those tokens and groupings are replaced on the stack by a
5078cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsingle grouping whose symbol is the result (left hand side) of that rule.
5079cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectRunning the rule's action is part of the process of reduction, because this
5080cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectis what computes the semantic value of the resulting grouping.
5081cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5082cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFor example, if the infix calculator's parser stack contains this:
5083cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5084cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
5085cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project1 + 5 * 3
5086cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
5087cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5088cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
5089cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand the next input token is a newline character, then the last three
5090cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectelements can be reduced to 15 via the rule:
5091cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5092cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
5093cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexpr: expr '*' expr;
5094cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
5095cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5096cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
5097cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThen the stack contains just these three elements:
5098cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5099cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
5100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project1 + 15
5101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
5102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
5104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAt this point, another reduction can be made, resulting in the single value
5105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project16.  Then the newline token can be shifted.
5106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe parser tries, by shifts and reductions, to reduce the entire input down
5108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectto a single grouping whose symbol is the grammar's start-symbol
5109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(@pxref{Language and Grammar, ,Languages and Context-Free Grammars}).
5110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis kind of parser is known in the literature as a bottom-up parser.
5112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@menu
5114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Look-Ahead::        Parser looks one token ahead when deciding what to do.
5115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Shift/Reduce::      Conflicts: when either shifting or reduction is valid.
5116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Precedence::        Operator precedence works by resolving conflicts.
5117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Contextual Precedence::  When an operator's precedence depends on context.
5118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Parser States::     The parser is a finite-state-machine with stack.
5119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Reduce/Reduce::     When two rules are applicable in the same situation.
5120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Mystery Conflicts::  Reduce/reduce conflicts that look unjustified.
5121cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Generalized LR Parsing::  Parsing arbitrary context-free grammars.
5122cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Memory Management:: What happens when memory is exhausted.  How to avoid it.
5123cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end menu
5124cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5125cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Look-Ahead
5126cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Look-Ahead Tokens
5127cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex look-ahead token
5128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5129cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe Bison parser does @emph{not} always reduce immediately as soon as the
5130cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlast @var{n} tokens and groupings match a rule.  This is because such a
5131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsimple strategy is inadequate to handle most languages.  Instead, when a
5132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectreduction is possible, the parser sometimes ``looks ahead'' at the next
5133cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttoken in order to decide what to do.
5134cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhen a token is read, it is not immediately shifted; first it becomes the
5136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@dfn{look-ahead token}, which is not on the stack.  Now the parser can
5137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectperform one or more reductions of tokens and groupings on the stack, while
5138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe look-ahead token remains off to the side.  When no more reductions
5139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectshould take place, the look-ahead token is shifted onto the stack.  This
5140cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdoes not mean that all possible reductions have been done; depending on the
5141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttoken type of the look-ahead token, some rules may choose to delay their
5142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectapplication.
5143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5144cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHere is a simple case where look-ahead is needed.  These three rules define
5145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexpressions which contain binary addition operators and postfix unary
5146cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfactorial operators (@samp{!}), and allow parentheses for grouping.
5147cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5148cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
5149cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
5150cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexpr:     term '+' expr
5151cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | term
5152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
5153cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
5154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
5156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectterm:     '(' expr ')'
5157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | term '!'
5158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | NUMBER
5159cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
5160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
5161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
5162cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5163cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSuppose that the tokens @w{@samp{1 + 2}} have been read and shifted; what
5164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectshould be done?  If the following token is @samp{)}, then the first three
5165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttokens must be reduced to form an @code{expr}.  This is the only valid
5166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcourse, because shifting the @samp{)} would produce a sequence of symbols
5167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@w{@code{term ')'}}, and no rule allows this.
5168cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5169cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf the following token is @samp{!}, then it must be shifted immediately so
5170cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthat @w{@samp{2 !}} can be reduced to make a @code{term}.  If instead the
5171cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparser were to reduce before shifting, @w{@samp{1 + 2}} would become an
5172cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{expr}.  It would then be impossible to shift the @samp{!} because
5173cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdoing so would produce on the stack the sequence of symbols @code{expr
5174cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project'!'}.  No rule allows that sequence.
5175cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5176cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@vindex yychar
5177cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@vindex yylval
5178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@vindex yylloc
5179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe look-ahead token is stored in the variable @code{yychar}.
5180cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIts semantic value and location, if any, are stored in the variables
5181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yylval} and @code{yylloc}.
5182cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Action Features, ,Special Features for Use in Actions}.
5183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Shift/Reduce
5185cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Shift/Reduce Conflicts
5186cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex conflicts
5187cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex shift/reduce conflicts
5188cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex dangling @code{else}
5189cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex @code{else}, dangling
5190cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5191cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSuppose we are parsing a language which has if-then and if-then-else
5192cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatements, with a pair of rules like this:
5193cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5194cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
5195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
5196cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectif_stmt:
5197cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project          IF expr THEN stmt
5198cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | IF expr THEN stmt ELSE stmt
5199cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
5200cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
5201cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
5202cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
5204cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHere we assume that @code{IF}, @code{THEN} and @code{ELSE} are
5205cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectterminal symbols for specific keyword tokens.
5206cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhen the @code{ELSE} token is read and becomes the look-ahead token, the
5208cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcontents of the stack (assuming the input is valid) are just right for
5209cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectreduction by the first rule.  But it is also legitimate to shift the
5210cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{ELSE}, because that would lead to eventual reduction by the second
5211cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrule.
5212cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5213cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis situation, where either a shift or a reduction would be valid, is
5214cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcalled a @dfn{shift/reduce conflict}.  Bison is designed to resolve
5215cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthese conflicts by choosing to shift, unless otherwise directed by
5216cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectoperator precedence declarations.  To see the reason for this, let's
5217cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcontrast it with the other alternative.
5218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5219cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSince the parser prefers to shift the @code{ELSE}, the result is to attach
5220cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe else-clause to the innermost if-statement, making these two inputs
5221cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectequivalent:
5222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
5224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectif x then if y then win (); else lose;
5225cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5226cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectif x then do; if y then win (); else lose; end;
5227cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
5228cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5229cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBut if the parser chose to reduce when possible rather than shift, the
5230cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectresult would be to attach the else-clause to the outermost if-statement,
5231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmaking these two inputs equivalent:
5232cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
5234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectif x then if y then win (); else lose;
5235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectif x then do; if y then win (); end; else lose;
5237cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
5238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5239cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe conflict exists because the grammar as written is ambiguous: either
5240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparsing of the simple nested if-statement is legitimate.  The established
5241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectconvention is that these ambiguities are resolved by attaching the
5242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectelse-clause to the innermost if-statement; this is what Bison accomplishes
5243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectby choosing to shift rather than reduce.  (It would ideally be cleaner to
5244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwrite an unambiguous grammar, but that is very hard to do in this case.)
5245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis particular ambiguity was first encountered in the specifications of
5246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAlgol 60 and is called the ``dangling @code{else}'' ambiguity.
5247cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTo avoid warnings from Bison about predictable, legitimate shift/reduce
5249cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectconflicts, use the @code{%expect @var{n}} declaration.  There will be no
5250cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwarning as long as the number of shift/reduce conflicts is exactly @var{n}.
5251cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Expect Decl, ,Suppressing Conflict Warnings}.
5252cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5253cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe definition of @code{if_stmt} above is solely to blame for the
5254cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectconflict, but the conflict does not actually appear without additional
5255cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrules.  Here is a complete Bison input file that actually manifests the
5256cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectconflict:
5257cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5258cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
5259cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
5260cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%token IF THEN ELSE variable
5261cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%%
5262cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
5263cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
5264cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstmt:     expr
5265cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | if_stmt
5266cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
5267cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
5268cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5269cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
5270cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectif_stmt:
5271cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project          IF expr THEN stmt
5272cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | IF expr THEN stmt ELSE stmt
5273cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
5274cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
5275cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5276cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexpr:     variable
5277cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
5278cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
5279cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5280cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Precedence
5281cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Operator Precedence
5282cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex operator precedence
5283cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex precedence of operators
5284cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5285cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAnother situation where shift/reduce conflicts appear is in arithmetic
5286cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexpressions.  Here shifting is not always the preferred resolution; the
5287cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison declarations for operator precedence allow you to specify when to
5288cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectshift and when to reduce.
5289cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5290cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@menu
5291cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Why Precedence::    An example showing why precedence is needed.
5292cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Using Precedence::  How to specify precedence in Bison grammars.
5293cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Precedence Examples::  How these features are used in the previous example.
5294cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* How Precedence::    How they work.
5295cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end menu
5296cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5297cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Why Precedence
5298cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection When Precedence is Needed
5299cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5300cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectConsider the following ambiguous grammar fragment (ambiguous because the
5301cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinput @w{@samp{1 - 2 * 3}} can be parsed in two different ways):
5302cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5303cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
5304cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
5305cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexpr:     expr '-' expr
5306cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | expr '*' expr
5307cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | expr '<' expr
5308cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | '(' expr ')'
5309cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        @dots{}
5310cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
5311cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
5312cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
5313cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5314cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
5315cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSuppose the parser has seen the tokens @samp{1}, @samp{-} and @samp{2};
5316cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectshould it reduce them via the rule for the subtraction operator?  It
5317cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdepends on the next token.  Of course, if the next token is @samp{)}, we
5318cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmust reduce; shifting is invalid because no single rule can reduce the
5319cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttoken sequence @w{@samp{- 2 )}} or anything starting with that.  But if
5320cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe next token is @samp{*} or @samp{<}, we have a choice: either
5321cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectshifting or reduction would allow the parse to complete, but with
5322cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdifferent results.
5323cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5324cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTo decide which one Bison should do, we must consider the results.  If
5325cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe next operator token @var{op} is shifted, then it must be reduced
5326cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfirst in order to permit another opportunity to reduce the difference.
5327cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe result is (in effect) @w{@samp{1 - (2 @var{op} 3)}}.  On the other
5328cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthand, if the subtraction is reduced before shifting @var{op}, the result
5329cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectis @w{@samp{(1 - 2) @var{op} 3}}.  Clearly, then, the choice of shift or
5330cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectreduce should depend on the relative precedence of the operators
5331cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{-} and @var{op}: @samp{*} should be shifted first, but not
5332cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{<}.
5333cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5334cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex associativity
5335cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhat about input such as @w{@samp{1 - 2 - 5}}; should this be
5336cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@w{@samp{(1 - 2) - 5}} or should it be @w{@samp{1 - (2 - 5)}}?  For most
5337cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectoperators we prefer the former, which is called @dfn{left association}.
5338cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe latter alternative, @dfn{right association}, is desirable for
5339cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectassignment operators.  The choice of left or right association is a
5340cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmatter of whether the parser chooses to shift or reduce when the stack
5341cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcontains @w{@samp{1 - 2}} and the look-ahead token is @samp{-}: shifting
5342cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmakes right-associativity.
5343cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5344cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Using Precedence
5345cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Specifying Operator Precedence
5346cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex %left
5347cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex %right
5348cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex %nonassoc
5349cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5350cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison allows you to specify these choices with the operator precedence
5351cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeclarations @code{%left} and @code{%right}.  Each such declaration
5352cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcontains a list of tokens, which are operators whose precedence and
5353cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectassociativity is being declared.  The @code{%left} declaration makes all
5354cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthose operators left-associative and the @code{%right} declaration makes
5355cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthem right-associative.  A third alternative is @code{%nonassoc}, which
5356cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeclares that it is a syntax error to find the same operator twice ``in a
5357cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrow''.
5358cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5359cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe relative precedence of different operators is controlled by the
5360cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectorder in which they are declared.  The first @code{%left} or
5361cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{%right} declaration in the file declares the operators whose
5362cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprecedence is lowest, the next such declaration declares the operators
5363cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwhose precedence is a little higher, and so on.
5364cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5365cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Precedence Examples
5366cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Precedence Examples
5367cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5368cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn our example, we would want the following declarations:
5369cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5370cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
5371cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%left '<'
5372cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%left '-'
5373cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%left '*'
5374cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
5375cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5376cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn a more complete example, which supports other operators as well, we
5377cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwould declare them in groups of equal precedence.  For example, @code{'+'} is
5378cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeclared with @code{'-'}:
5379cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5380cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
5381cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%left '<' '>' '=' NE LE GE
5382cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%left '+' '-'
5383cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%left '*' '/'
5384cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
5385cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5386cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
5387cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(Here @code{NE} and so on stand for the operators for ``not equal''
5388cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand so on.  We assume that these tokens are more than one character long
5389cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand therefore are represented by names, not character literals.)
5390cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5391cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node How Precedence
5392cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection How Precedence Works
5393cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5394cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe first effect of the precedence declarations is to assign precedence
5395cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlevels to the terminal symbols declared.  The second effect is to assign
5396cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprecedence levels to certain rules: each rule gets its precedence from
5397cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe last terminal symbol mentioned in the components.  (You can also
5398cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectspecify explicitly the precedence of a rule.  @xref{Contextual
5399cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectPrecedence, ,Context-Dependent Precedence}.)
5400cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5401cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFinally, the resolution of conflicts works by comparing the precedence
5402cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectof the rule being considered with that of the look-ahead token.  If the
5403cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttoken's precedence is higher, the choice is to shift.  If the rule's
5404cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprecedence is higher, the choice is to reduce.  If they have equal
5405cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprecedence, the choice is made based on the associativity of that
5406cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprecedence level.  The verbose output file made by @samp{-v}
5407cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(@pxref{Invocation, ,Invoking Bison}) says how each conflict was
5408cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectresolved.
5409cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5410cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectNot all rules and not all tokens have precedence.  If either the rule or
5411cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe look-ahead token has no precedence, then the default is to shift.
5412cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5413cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Contextual Precedence
5414cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Context-Dependent Precedence
5415cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex context-dependent precedence
5416cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex unary operator precedence
5417cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex precedence, context-dependent
5418cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex precedence, unary operator
5419cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex %prec
5420cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5421cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectOften the precedence of an operator depends on the context.  This sounds
5422cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectoutlandish at first, but it is really very common.  For example, a minus
5423cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsign typically has a very high precedence as a unary operator, and a
5424cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsomewhat lower precedence (lower than multiplication) as a binary operator.
5425cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5426cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe Bison precedence declarations, @code{%left}, @code{%right} and
5427cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{%nonassoc}, can only be used once for a given token; so a token has
5428cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectonly one precedence declared in this way.  For context-dependent
5429cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprecedence, you need to use an additional mechanism: the @code{%prec}
5430cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmodifier for rules.
5431cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5432cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe @code{%prec} modifier declares the precedence of a particular rule by
5433cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectspecifying a terminal symbol whose precedence should be used for that rule.
5434cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIt's not necessary for that symbol to appear otherwise in the rule.  The
5435cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmodifier's syntax is:
5436cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5437cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
5438cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%prec @var{terminal-symbol}
5439cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
5440cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5441cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
5442cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand it is written after the components of the rule.  Its effect is to
5443cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectassign the rule the precedence of @var{terminal-symbol}, overriding
5444cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe precedence that would be deduced for it in the ordinary way.  The
5445cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectaltered rule precedence then affects how conflicts involving that rule
5446cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectare resolved (@pxref{Precedence, ,Operator Precedence}).
5447cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5448cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHere is how @code{%prec} solves the problem of unary minus.  First, declare
5449cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecta precedence for a fictitious terminal symbol named @code{UMINUS}.  There
5450cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectare no tokens of this type, but the symbol serves to stand for its
5451cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprecedence:
5452cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5453cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
5454cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@dots{}
5455cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%left '+' '-'
5456cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%left '*'
5457cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%left UMINUS
5458cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
5459cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5460cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectNow the precedence of @code{UMINUS} can be used in specific rules:
5461cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5462cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
5463cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
5464cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexp:    @dots{}
5465cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | exp '-' exp
5466cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        @dots{}
5467cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | '-' exp %prec UMINUS
5468cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
5469cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
5470cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5471cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@ifset defaultprec
5472cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf you forget to append @code{%prec UMINUS} to the rule for unary
5473cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectminus, Bison silently assumes that minus has its usual precedence.
5474cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis kind of problem can be tricky to debug, since one typically
5475cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdiscovers the mistake only by testing the code.
5476cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5477cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe @code{%no-default-prec;} declaration makes it easier to discover
5478cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthis kind of problem systematically.  It causes rules that lack a
5479cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{%prec} modifier to have no precedence, even if the last terminal
5480cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsymbol mentioned in their components has a declared precedence.
5481cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5482cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf @code{%no-default-prec;} is in effect, you must specify @code{%prec}
5483cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfor all rules that participate in precedence conflict resolution.
5484cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThen you will see any shift/reduce conflict until you tell Bison how
5485cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectto resolve it, either by changing your grammar or by adding an
5486cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexplicit precedence.  This will probably add declarations to the
5487cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgrammar, but it helps to protect against incorrect rule precedences.
5488cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5489cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe effect of @code{%no-default-prec;} can be reversed by giving
5490cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{%default-prec;}, which is the default.
5491cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end ifset
5492cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5493cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Parser States
5494cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Parser States
5495cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex finite-state machine
5496cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex parser state
5497cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex state (of parser)
5498cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5499cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe function @code{yyparse} is implemented using a finite-state machine.
5500cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe values pushed on the parser stack are not simply token type codes; they
5501cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrepresent the entire sequence of terminal and nonterminal symbols at or
5502cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnear the top of the stack.  The current state collects all the information
5503cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectabout previous input which is relevant to deciding what to do next.
5504cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5505cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectEach time a look-ahead token is read, the current parser state together
5506cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwith the type of look-ahead token are looked up in a table.  This table
5507cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectentry can say, ``Shift the look-ahead token.''  In this case, it also
5508cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectspecifies the new parser state, which is pushed onto the top of the
5509cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparser stack.  Or it can say, ``Reduce using rule number @var{n}.''
5510cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis means that a certain number of tokens or groupings are taken off
5511cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe top of the stack, and replaced by one grouping.  In other words,
5512cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthat number of states are popped from the stack, and one new state is
5513cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectpushed.
5514cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5515cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThere is one other alternative: the table can say that the look-ahead token
5516cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectis erroneous in the current state.  This causes error processing to begin
5517cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(@pxref{Error Recovery}).
5518cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5519cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Reduce/Reduce
5520cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Reduce/Reduce Conflicts
5521cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex reduce/reduce conflict
5522cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex conflicts, reduce/reduce
5523cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5524cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA reduce/reduce conflict occurs if there are two or more rules that apply
5525cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectto the same sequence of input.  This usually indicates a serious error
5526cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectin the grammar.
5527cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5528cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFor example, here is an erroneous attempt to define a sequence
5529cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectof zero or more @code{word} groupings.
5530cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5531cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
5532cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsequence: /* empty */
5533cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                @{ printf ("empty sequence\n"); @}
5534cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | maybeword
5535cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | sequence word
5536cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                @{ printf ("added word %s\n", $2); @}
5537cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
5538cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5539cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmaybeword: /* empty */
5540cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                @{ printf ("empty maybeword\n"); @}
5541cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | word
5542cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                @{ printf ("single word %s\n", $1); @}
5543cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
5544cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
5545cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5546cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
5547cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe error is an ambiguity: there is more than one way to parse a single
5548cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{word} into a @code{sequence}.  It could be reduced to a
5549cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{maybeword} and then into a @code{sequence} via the second rule.
5550cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAlternatively, nothing-at-all could be reduced into a @code{sequence}
5551cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvia the first rule, and this could be combined with the @code{word}
5552cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectusing the third rule for @code{sequence}.
5553cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5554cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThere is also more than one way to reduce nothing-at-all into a
5555cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{sequence}.  This can be done directly via the first rule,
5556cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projector indirectly via @code{maybeword} and then the second rule.
5557cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5558cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectYou might think that this is a distinction without a difference, because it
5559cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdoes not change whether any particular input is valid or not.  But it does
5560cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectaffect which actions are run.  One parsing order runs the second rule's
5561cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectaction; the other runs the first rule's action and the third rule's action.
5562cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn this example, the output of the program changes.
5563cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5564cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison resolves a reduce/reduce conflict by choosing to use the rule that
5565cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectappears first in the grammar, but it is very risky to rely on this.  Every
5566cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectreduce/reduce conflict must be studied and usually eliminated.  Here is the
5567cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectproper way to define @code{sequence}:
5568cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5569cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
5570cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsequence: /* empty */
5571cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                @{ printf ("empty sequence\n"); @}
5572cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | sequence word
5573cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                @{ printf ("added word %s\n", $2); @}
5574cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
5575cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
5576cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5577cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHere is another common error that yields a reduce/reduce conflict:
5578cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5579cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
5580cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsequence: /* empty */
5581cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | sequence words
5582cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | sequence redirects
5583cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
5584cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5585cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwords:    /* empty */
5586cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | words word
5587cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
5588cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5589cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectredirects:/* empty */
5590cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | redirects redirect
5591cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
5592cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
5593cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5594cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
5595cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe intention here is to define a sequence which can contain either
5596cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{word} or @code{redirect} groupings.  The individual definitions of
5597cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{sequence}, @code{words} and @code{redirects} are error-free, but the
5598cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthree together make a subtle ambiguity: even an empty input can be parsed
5599cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectin infinitely many ways!
5600cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5601cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectConsider: nothing-at-all could be a @code{words}.  Or it could be two
5602cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{words} in a row, or three, or any number.  It could equally well be a
5603cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{redirects}, or two, or any number.  Or it could be a @code{words}
5604cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfollowed by three @code{redirects} and another @code{words}.  And so on.
5605cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5606cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHere are two ways to correct these rules.  First, to make it a single level
5607cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectof sequence:
5608cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5609cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
5610cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsequence: /* empty */
5611cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | sequence word
5612cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | sequence redirect
5613cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
5614cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
5615cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5616cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSecond, to prevent either a @code{words} or a @code{redirects}
5617cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfrom being empty:
5618cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5619cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
5620cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsequence: /* empty */
5621cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | sequence words
5622cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | sequence redirects
5623cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
5624cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5625cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwords:    word
5626cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | words word
5627cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
5628cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5629cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectredirects:redirect
5630cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | redirects redirect
5631cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
5632cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
5633cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5634cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Mystery Conflicts
5635cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Mysterious Reduce/Reduce Conflicts
5636cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5637cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSometimes reduce/reduce conflicts can occur that don't look warranted.
5638cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHere is an example:
5639cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5640cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
5641cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
5642cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%token ID
5643cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5644cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%%
5645cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdef:    param_spec return_spec ','
5646cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
5647cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparam_spec:
5648cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project             type
5649cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        |    name_list ':' type
5650cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
5651cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
5652cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
5653cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectreturn_spec:
5654cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project             type
5655cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        |    name ':' type
5656cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
5657cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
5658cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
5659cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttype:        ID
5660cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
5661cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
5662cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
5663cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectname:        ID
5664cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
5665cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectname_list:
5666cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project             name
5667cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        |    name ',' name_list
5668cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
5669cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
5670cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
5671cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5672cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIt would seem that this grammar can be parsed with only a single token
5673cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectof look-ahead: when a @code{param_spec} is being read, an @code{ID} is
5674cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecta @code{name} if a comma or colon follows, or a @code{type} if another
5675cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{ID} follows.  In other words, this grammar is @acronym{LR}(1).
5676cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5677cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex @acronym{LR}(1)
5678cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex @acronym{LALR}(1)
5679cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHowever, Bison, like most parser generators, cannot actually handle all
5680cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@acronym{LR}(1) grammars.  In this grammar, two contexts, that after
5681cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectan @code{ID}
5682cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectat the beginning of a @code{param_spec} and likewise at the beginning of
5683cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecta @code{return_spec}, are similar enough that Bison assumes they are the
5684cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsame.  They appear similar because the same set of rules would be
5685cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectactive---the rule for reducing to a @code{name} and that for reducing to
5686cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecta @code{type}.  Bison is unable to determine at that stage of processing
5687cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthat the rules would require different look-ahead tokens in the two
5688cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcontexts, so it makes a single parser state for them both.  Combining
5689cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe two contexts causes a conflict later.  In parser terminology, this
5690cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectoccurrence means that the grammar is not @acronym{LALR}(1).
5691cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5692cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn general, it is better to fix deficiencies than to document them.  But
5693cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthis particular deficiency is intrinsically hard to fix; parser
5694cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgenerators that can handle @acronym{LR}(1) grammars are hard to write
5695cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand tend to
5696cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectproduce parsers that are very large.  In practice, Bison is more useful
5697cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectas it is now.
5698cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5699cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhen the problem arises, you can often fix it by identifying the two
5700cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparser states that are being confused, and adding something to make them
5701cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlook distinct.  In the above example, adding one rule to
5702cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{return_spec} as follows makes the problem go away:
5703cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5704cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
5705cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
5706cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%token BOGUS
5707cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@dots{}
5708cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%%
5709cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@dots{}
5710cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectreturn_spec:
5711cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project             type
5712cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        |    name ':' type
5713cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        /* This rule is never used.  */
5714cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        |    ID BOGUS
5715cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
5716cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
5717cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
5718cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5719cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis corrects the problem because it introduces the possibility of an
5720cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectadditional active rule in the context after the @code{ID} at the beginning of
5721cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{return_spec}.  This rule is not active in the corresponding context
5722cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectin a @code{param_spec}, so the two contexts receive distinct parser states.
5723cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAs long as the token @code{BOGUS} is never generated by @code{yylex},
5724cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe added rule cannot alter the way actual input is parsed.
5725cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5726cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn this particular example, there is another way to solve the problem:
5727cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrewrite the rule for @code{return_spec} to use @code{ID} directly
5728cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinstead of via @code{name}.  This also causes the two confusing
5729cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcontexts to have different sets of active rules, because the one for
5730cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{return_spec} activates the altered rule for @code{return_spec}
5731cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrather than the one for @code{name}.
5732cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5733cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
5734cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparam_spec:
5735cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project             type
5736cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        |    name_list ':' type
5737cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
5738cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectreturn_spec:
5739cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project             type
5740cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        |    ID ':' type
5741cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
5742cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
5743cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5744cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFor a more detailed exposition of @acronym{LALR}(1) parsers and parser
5745cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgenerators, please see:
5746cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFrank DeRemer and Thomas Pennello, Efficient Computation of
5747cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@acronym{LALR}(1) Look-Ahead Sets, @cite{@acronym{ACM} Transactions on
5748cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectProgramming Languages and Systems}, Vol.@: 4, No.@: 4 (October 1982),
5749cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectpp.@: 615--649 @uref{http://doi.acm.org/10.1145/69622.357187}.
5750cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5751cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Generalized LR Parsing
5752cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Generalized @acronym{LR} (@acronym{GLR}) Parsing
5753cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex @acronym{GLR} parsing
5754cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex generalized @acronym{LR} (@acronym{GLR}) parsing
5755cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex ambiguous grammars
5756cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex nondeterministic parsing
5757cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5758cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison produces @emph{deterministic} parsers that choose uniquely
5759cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwhen to reduce and which reduction to apply
5760cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbased on a summary of the preceding input and on one extra token of look-ahead.
5761cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAs a result, normal Bison handles a proper subset of the family of
5762cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcontext-free languages.
5763cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAmbiguous grammars, since they have strings with more than one possible
5764cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsequence of reductions cannot have deterministic parsers in this sense.
5765cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe same is true of languages that require more than one symbol of
5766cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlook-ahead, since the parser lacks the information necessary to make a
5767cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdecision at the point it must be made in a shift-reduce parser.
5768cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFinally, as previously mentioned (@pxref{Mystery Conflicts}),
5769cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthere are languages where Bison's particular choice of how to
5770cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsummarize the input seen so far loses necessary information.
5771cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5772cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhen you use the @samp{%glr-parser} declaration in your grammar file,
5773cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison generates a parser that uses a different algorithm, called
5774cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectGeneralized @acronym{LR} (or @acronym{GLR}).  A Bison @acronym{GLR}
5775cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparser uses the same basic
5776cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectalgorithm for parsing as an ordinary Bison parser, but behaves
5777cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdifferently in cases where there is a shift-reduce conflict that has not
5778cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbeen resolved by precedence rules (@pxref{Precedence}) or a
5779cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectreduce-reduce conflict.  When a @acronym{GLR} parser encounters such a
5780cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsituation, it
5781cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecteffectively @emph{splits} into a several parsers, one for each possible
5782cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectshift or reduction.  These parsers then proceed as usual, consuming
5783cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttokens in lock-step.  Some of the stacks may encounter other conflicts
5784cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand split further, with the result that instead of a sequence of states,
5785cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecta Bison @acronym{GLR} parsing stack is what is in effect a tree of states.
5786cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5787cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn effect, each stack represents a guess as to what the proper parse
5788cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectis.  Additional input may indicate that a guess was wrong, in which case
5789cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe appropriate stack silently disappears.  Otherwise, the semantics
5790cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectactions generated in each stack are saved, rather than being executed
5791cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectimmediately.  When a stack disappears, its saved semantic actions never
5792cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectget executed.  When a reduction causes two stacks to become equivalent,
5793cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttheir sets of semantic actions are both saved with the state that
5794cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectresults from the reduction.  We say that two stacks are equivalent
5795cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwhen they both represent the same sequence of states,
5796cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand each pair of corresponding states represents a
5797cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgrammar symbol that produces the same segment of the input token
5798cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstream.
5799cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5800cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhenever the parser makes a transition from having multiple
5801cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstates to having one, it reverts to the normal @acronym{LALR}(1) parsing
5802cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectalgorithm, after resolving and executing the saved-up actions.
5803cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAt this transition, some of the states on the stack will have semantic
5804cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvalues that are sets (actually multisets) of possible actions.  The
5805cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparser tries to pick one of the actions by first finding one whose rule
5806cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthas the highest dynamic precedence, as set by the @samp{%dprec}
5807cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeclaration.  Otherwise, if the alternative actions are not ordered by
5808cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprecedence, but there the same merging function is declared for both
5809cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrules by the @samp{%merge} declaration,
5810cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison resolves and evaluates both and then calls the merge function on
5811cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe result.  Otherwise, it reports an ambiguity.
5812cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5813cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIt is possible to use a data structure for the @acronym{GLR} parsing tree that
5814cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectpermits the processing of any @acronym{LALR}(1) grammar in linear time (in the
5815cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsize of the input), any unambiguous (not necessarily
5816cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@acronym{LALR}(1)) grammar in
5817cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectquadratic worst-case time, and any general (possibly ambiguous)
5818cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcontext-free grammar in cubic worst-case time.  However, Bison currently
5819cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectuses a simpler data structure that requires time proportional to the
5820cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlength of the input times the maximum number of stacks required for any
5821cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprefix of the input.  Thus, really ambiguous or nondeterministic
5822cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgrammars can require exponential time and space to process.  Such badly
5823cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbehaving examples, however, are not generally of practical interest.
5824cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectUsually, nondeterminism in a grammar is local---the parser is ``in
5825cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdoubt'' only for a few tokens at a time.  Therefore, the current data
5826cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstructure should generally be adequate.  On @acronym{LALR}(1) portions of a
5827cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgrammar, in particular, it is only slightly slower than with the default
5828cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison parser.
5829cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5830cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFor a more detailed exposition of @acronym{GLR} parsers, please see: Elizabeth
5831cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectScott, Adrian Johnstone and Shamsa Sadaf Hussain, Tomita-Style
5832cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectGeneralised @acronym{LR} Parsers, Royal Holloway, University of
5833cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectLondon, Department of Computer Science, TR-00-12,
5834cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@uref{http://www.cs.rhul.ac.uk/research/languages/publications/tomita_style_1.ps},
5835cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(2000-12-24).
5836cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5837cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Memory Management
5838cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Memory Management, and How to Avoid Memory Exhaustion
5839cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex memory exhaustion
5840cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex memory management
5841cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex stack overflow
5842cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex parser stack overflow
5843cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex overflow of parser stack
5844cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5845cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe Bison parser stack can run out of memory if too many tokens are shifted and
5846cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnot reduced.  When this happens, the parser function @code{yyparse}
5847cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcalls @code{yyerror} and then returns 2.
5848cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5849cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBecause Bison parsers have growing stacks, hitting the upper limit
5850cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectusually results from using a right recursion instead of a left
5851cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrecursion, @xref{Recursion, ,Recursive Rules}.
5852cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5853cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@vindex YYMAXDEPTH
5854cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBy defining the macro @code{YYMAXDEPTH}, you can control how deep the
5855cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparser stack can become before memory is exhausted.  Define the
5856cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmacro with a value that is an integer.  This value is the maximum number
5857cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectof tokens that can be shifted (and not reduced) before overflow.
5858cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5859cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe stack space allowed is not necessarily allocated.  If you specify a
5860cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlarge value for @code{YYMAXDEPTH}, the parser normally allocates a small
5861cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstack at first, and then makes it bigger by stages as needed.  This
5862cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectincreasing allocation happens automatically and silently.  Therefore,
5863cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectyou do not need to make @code{YYMAXDEPTH} painfully small merely to save
5864cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectspace for ordinary inputs that do not need much stack.
5865cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5866cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHowever, do not allow @code{YYMAXDEPTH} to be a value so large that
5867cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectarithmetic overflow could occur when calculating the size of the stack
5868cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectspace.  Also, do not allow @code{YYMAXDEPTH} to be less than
5869cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{YYINITDEPTH}.
5870cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5871cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex default stack limit
5872cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe default value of @code{YYMAXDEPTH}, if you do not define it, is
5873cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project10000.
5874cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5875cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@vindex YYINITDEPTH
5876cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectYou can control how much stack is allocated initially by defining the
5877cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmacro @code{YYINITDEPTH} to a positive integer.  For the C
5878cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@acronym{LALR}(1) parser, this value must be a compile-time constant
5879cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectunless you are assuming C99 or some other target language or compiler
5880cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthat allows variable-length arrays.  The default is 200.
5881cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5882cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDo not allow @code{YYINITDEPTH} to be greater than @code{YYMAXDEPTH}.
5883cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5884cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c FIXME: C++ output.
5885cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBecause of semantical differences between C and C++, the
5886cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@acronym{LALR}(1) parsers in C produced by Bison cannot grow when compiled
5887cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectby C++ compilers.  In this precise case (compiling a C parser as C++) you are
5888cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsuggested to grow @code{YYINITDEPTH}.  The Bison maintainers hope to fix
5889cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthis deficiency in a future release.
5890cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5891cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Error Recovery
5892cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@chapter Error Recovery
5893cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex error recovery
5894cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex recovery from errors
5895cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5896cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIt is not usually acceptable to have a program terminate on a syntax
5897cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecterror.  For example, a compiler should recover sufficiently to parse the
5898cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrest of the input file and check it for errors; a calculator should accept
5899cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectanother expression.
5900cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5901cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn a simple interactive command parser where each input is one line, it may
5902cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbe sufficient to allow @code{yyparse} to return 1 on error and have the
5903cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcaller ignore the rest of the input line when that happens (and then call
5904cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yyparse} again).  But this is inadequate for a compiler, because it
5905cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectforgets all the syntactic context leading up to the error.  A syntax error
5906cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeep within a function in the compiler input should not cause the compiler
5907cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectto treat the following line like the beginning of a source file.
5908cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5909cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex error
5910cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectYou can define how to recover from a syntax error by writing rules to
5911cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrecognize the special token @code{error}.  This is a terminal symbol that
5912cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectis always defined (you need not declare it) and reserved for error
5913cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthandling.  The Bison parser generates an @code{error} token whenever a
5914cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsyntax error happens; if you have provided a rule to recognize this token
5915cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectin the current context, the parse can continue.
5916cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5917cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFor example:
5918cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5919cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
5920cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstmnts:  /* empty string */
5921cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | stmnts '\n'
5922cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | stmnts exp '\n'
5923cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | stmnts error '\n'
5924cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
5925cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5926cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe fourth rule in this example says that an error followed by a newline
5927cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmakes a valid addition to any @code{stmnts}.
5928cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5929cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhat happens if a syntax error occurs in the middle of an @code{exp}?  The
5930cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecterror recovery rule, interpreted strictly, applies to the precise sequence
5931cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectof a @code{stmnts}, an @code{error} and a newline.  If an error occurs in
5932cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe middle of an @code{exp}, there will probably be some additional tokens
5933cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand subexpressions on the stack after the last @code{stmnts}, and there
5934cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwill be tokens to read before the next newline.  So the rule is not
5935cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectapplicable in the ordinary way.
5936cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5937cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBut Bison can force the situation to fit the rule, by discarding part of
5938cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe semantic context and part of the input.  First it discards states
5939cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand objects from the stack until it gets back to a state in which the
5940cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{error} token is acceptable.  (This means that the subexpressions
5941cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectalready parsed are discarded, back to the last complete @code{stmnts}.)
5942cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAt this point the @code{error} token can be shifted.  Then, if the old
5943cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlook-ahead token is not acceptable to be shifted next, the parser reads
5944cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttokens and discards them until it finds a token which is acceptable.  In
5945cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthis example, Bison reads and discards input until the next newline so
5946cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthat the fourth rule can apply.  Note that discarded symbols are
5947cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectpossible sources of memory leaks, see @ref{Destructor Decl, , Freeing
5948cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDiscarded Symbols}, for a means to reclaim this memory.
5949cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5950cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe choice of error rules in the grammar is a choice of strategies for
5951cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecterror recovery.  A simple and useful strategy is simply to skip the rest of
5952cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe current input line or current statement if an error is detected:
5953cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5954cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
5955cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstmnt: error ';'  /* On error, skip until ';' is read.  */
5956cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
5957cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5958cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIt is also useful to recover to the matching close-delimiter of an
5959cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectopening-delimiter that has already been parsed.  Otherwise the
5960cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectclose-delimiter will probably appear to be unmatched, and generate another,
5961cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectspurious error message:
5962cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5963cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
5964cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprimary:  '(' expr ')'
5965cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | '(' error ')'
5966cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        @dots{}
5967cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
5968cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
5969cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5970cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectError recovery strategies are necessarily guesses.  When they guess wrong,
5971cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectone syntax error often leads to another.  In the above example, the error
5972cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrecovery rule guesses that an error is due to bad input within one
5973cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{stmnt}.  Suppose that instead a spurious semicolon is inserted in the
5974cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmiddle of a valid @code{stmnt}.  After the error recovery rule recovers
5975cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfrom the first error, another syntax error will be found straightaway,
5976cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsince the text following the spurious semicolon is also an invalid
5977cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{stmnt}.
5978cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5979cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTo prevent an outpouring of error messages, the parser will output no error
5980cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmessage for another syntax error that happens shortly after the first; only
5981cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectafter three consecutive input tokens have been successfully shifted will
5982cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecterror messages resume.
5983cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5984cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectNote that rules which accept the @code{error} token may have actions, just
5985cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectas any other rules can.
5986cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5987cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex yyerrok
5988cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectYou can make error messages resume immediately by using the macro
5989cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yyerrok} in an action.  If you do this in the error rule's action, no
5990cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecterror messages will be suppressed.  This macro requires no arguments;
5991cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{yyerrok;} is a valid C statement.
5992cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5993cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex yyclearin
5994cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe previous look-ahead token is reanalyzed immediately after an error.  If
5995cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthis is unacceptable, then the macro @code{yyclearin} may be used to clear
5996cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthis token.  Write the statement @samp{yyclearin;} in the error rule's
5997cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectaction.
5998cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Action Features, ,Special Features for Use in Actions}.
5999cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6000cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFor example, suppose that on a syntax error, an error handling routine is
6001cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcalled that advances the input stream to some point where parsing should
6002cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectonce again commence.  The next symbol returned by the lexical scanner is
6003cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprobably correct.  The previous look-ahead token ought to be discarded
6004cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwith @samp{yyclearin;}.
6005cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6006cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@vindex YYRECOVERING
6007cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe expression @code{YYRECOVERING ()} yields 1 when the parser
6008cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectis recovering from a syntax error, and 0 otherwise.
6009cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSyntax error diagnostics are suppressed while recovering from a syntax
6010cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecterror.
6011cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6012cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Context Dependency
6013cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@chapter Handling Context Dependencies
6014cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6015cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe Bison paradigm is to parse tokens first, then group them into larger
6016cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsyntactic units.  In many languages, the meaning of a token is affected by
6017cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectits context.  Although this violates the Bison paradigm, certain techniques
6018cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(known as @dfn{kludges}) may enable you to write Bison parsers for such
6019cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlanguages.
6020cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6021cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@menu
6022cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Semantic Tokens::   Token parsing can depend on the semantic context.
6023cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Lexical Tie-ins::   Token parsing can depend on the syntactic context.
6024cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Tie-in Recovery::   Lexical tie-ins have implications for how
6025cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                        error recovery rules must be written.
6026cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end menu
6027cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6028cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(Actually, ``kludge'' means any technique that gets its job done but is
6029cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectneither clean nor robust.)
6030cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6031cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Semantic Tokens
6032cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Semantic Info in Token Types
6033cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6034cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe C language has a context dependency: the way an identifier is used
6035cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdepends on what its current meaning is.  For example, consider this:
6036cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6037cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
6038cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfoo (x);
6039cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
6040cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6041cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis looks like a function call statement, but if @code{foo} is a typedef
6042cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectname, then this is actually a declaration of @code{x}.  How can a Bison
6043cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparser for C decide how to parse this input?
6044cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6045cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe method used in @acronym{GNU} C is to have two different token types,
6046cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{IDENTIFIER} and @code{TYPENAME}.  When @code{yylex} finds an
6047cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectidentifier, it looks up the current declaration of the identifier in order
6048cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectto decide which token type to return: @code{TYPENAME} if the identifier is
6049cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeclared as a typedef, @code{IDENTIFIER} otherwise.
6050cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6051cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe grammar rules can then express the context dependency by the choice of
6052cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttoken type to recognize.  @code{IDENTIFIER} is accepted as an expression,
6053cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbut @code{TYPENAME} is not.  @code{TYPENAME} can start a declaration, but
6054cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{IDENTIFIER} cannot.  In contexts where the meaning of the identifier
6055cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectis @emph{not} significant, such as in declarations that can shadow a
6056cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttypedef name, either @code{TYPENAME} or @code{IDENTIFIER} is
6057cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectaccepted---there is one rule for each of the two token types.
6058cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6059cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis technique is simple to use if the decision of which kinds of
6060cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectidentifiers to allow is made at a place close to where the identifier is
6061cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparsed.  But in C this is not always so: C allows a declaration to
6062cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectredeclare a typedef name provided an explicit type has been specified
6063cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectearlier:
6064cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6065cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
6066cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttypedef int foo, bar;
6067cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint baz (void)
6068cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
6069cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  static bar (bar);      /* @r{redeclare @code{bar} as static variable} */
6070cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  extern foo foo (foo);  /* @r{redeclare @code{foo} as function} */
6071cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return foo (bar);
6072cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
6073cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
6074cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6075cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectUnfortunately, the name being declared is separated from the declaration
6076cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectconstruct itself by a complicated syntactic structure---the ``declarator''.
6077cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6078cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAs a result, part of the Bison parser for C needs to be duplicated, with
6079cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectall the nonterminal names changed: once for parsing a declaration in
6080cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwhich a typedef name can be redefined, and once for parsing a
6081cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeclaration in which that can't be done.  Here is a part of the
6082cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectduplication, with actions omitted for brevity:
6083cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6084cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
6085cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinitdcl:
6086cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project          declarator maybeasm '='
6087cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project          init
6088cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | declarator maybeasm
6089cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
6090cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6091cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnotype_initdcl:
6092cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project          notype_declarator maybeasm '='
6093cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project          init
6094cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | notype_declarator maybeasm
6095cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
6096cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
6097cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6098cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
6099cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHere @code{initdcl} can redeclare a typedef name, but @code{notype_initdcl}
6100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcannot.  The distinction between @code{declarator} and
6101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{notype_declarator} is the same sort of thing.
6102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThere is some similarity between this technique and a lexical tie-in
6104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(described next), in that information which alters the lexical analysis is
6105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectchanged during parsing by other parts of the program.  The difference is
6106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthere the information is global, and is used for other purposes in the
6107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprogram.  A true lexical tie-in has a special-purpose flag controlled by
6108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe syntactic context.
6109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Lexical Tie-ins
6111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Lexical Tie-ins
6112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex lexical tie-in
6113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectOne way to handle context-dependency is the @dfn{lexical tie-in}: a flag
6115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwhich is set by Bison actions, whose purpose is to alter the way tokens are
6116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparsed.
6117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFor example, suppose we have a language vaguely like C, but with a special
6119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectconstruct @samp{hex (@var{hex-expr})}.  After the keyword @code{hex} comes
6120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectan expression in parentheses in which all integers are hexadecimal.  In
6121cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparticular, the token @samp{a1b} must be treated as an integer rather than
6122cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectas an identifier if it appears in that context.  Here is how you can do it:
6123cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6124cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
6125cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
6126cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@{
6127cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int hexflag;
6128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int yylex (void);
6129cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  void yyerror (char const *);
6130cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@}
6131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%%
6132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@dots{}
6133cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
6134cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
6135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexpr:   IDENTIFIER
6136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | constant
6137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | HEX '('
6138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                @{ hexflag = 1; @}
6139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project          expr ')'
6140cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                @{ hexflag = 0;
6141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                   $$ = $4; @}
6142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | expr '+' expr
6143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                @{ $$ = make_sum ($1, $3); @}
6144cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        @dots{}
6145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
6146cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
6147cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6148cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
6149cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectconstant:
6150cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project          INTEGER
6151cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | STRING
6152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
6153cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
6154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
6155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
6157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHere we assume that @code{yylex} looks at the value of @code{hexflag}; when
6158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectit is nonzero, all integers are parsed in hexadecimal, and tokens starting
6159cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwith letters are parsed as integers if possible.
6160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe declaration of @code{hexflag} shown in the prologue of the parser file
6162cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectis needed to make it accessible to the actions (@pxref{Prologue, ,The Prologue}).
6163cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectYou must also write the code in @code{yylex} to obey the flag.
6164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Tie-in Recovery
6166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Lexical Tie-ins and Error Recovery
6167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6168cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectLexical tie-ins make strict demands on any error recovery rules you have.
6169cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Error Recovery}.
6170cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6171cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe reason for this is that the purpose of an error recovery rule is to
6172cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectabort the parsing of one construct and resume in some larger construct.
6173cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFor example, in C-like languages, a typical error recovery rule is to skip
6174cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttokens until the next semicolon, and then start a new statement, like this:
6175cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6176cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
6177cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstmt:   expr ';'
6178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | IF '(' expr ')' stmt @{ @dots{} @}
6179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        @dots{}
6180cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        error ';'
6181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                @{ hexflag = 0; @}
6182cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        ;
6183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
6184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6185cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf there is a syntax error in the middle of a @samp{hex (@var{expr})}
6186cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectconstruct, this error rule will apply, and then the action for the
6187cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcompleted @samp{hex (@var{expr})} will never run.  So @code{hexflag} would
6188cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectremain set for the entire rest of the input, or until the next @code{hex}
6189cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectkeyword, causing identifiers to be misinterpreted as integers.
6190cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6191cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTo avoid this problem the error recovery rule itself clears @code{hexflag}.
6192cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6193cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThere may also be an error recovery rule that works within expressions.
6194cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFor example, there could be a rule which applies within parentheses
6195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand skips to the close-parenthesis:
6196cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6197cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
6198cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@group
6199cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexpr:   @dots{}
6200cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | '(' expr ')'
6201cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                @{ $$ = $2; @}
6202cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        | '(' error ')'
6203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project        @dots{}
6204cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end group
6205cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
6206cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf this rule acts within the @code{hex} construct, it is not going to abort
6208cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthat construct (since it applies to an inner level of parentheses within
6209cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe construct).  Therefore, it should not clear the flag: the rest of
6210cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe @code{hex} construct should be parsed with the flag still in effect.
6211cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6212cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhat if there is an error recovery rule which might abort out of the
6213cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{hex} construct or might not, depending on circumstances?  There is no
6214cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectway you can write the action to determine whether a @code{hex} construct is
6215cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbeing aborted or not.  So if you are using a lexical tie-in, you had better
6216cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmake sure your error recovery rules are not of this kind.  Each rule must
6217cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbe such that you can be sure that it always will, or always won't, have to
6218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectclear the flag.
6219cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6220cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c ================================================== Debugging Your Parser
6221cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Debugging
6223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@chapter Debugging Your Parser
6224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6225cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDeveloping a parser can be a challenge, especially if you don't
6226cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectunderstand the algorithm (@pxref{Algorithm, ,The Bison Parser
6227cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAlgorithm}).  Even so, sometimes a detailed description of the automaton
6228cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcan help (@pxref{Understanding, , Understanding Your Parser}), or
6229cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttracing the execution of the parser can give some insight on why it
6230cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbehaves improperly (@pxref{Tracing, , Tracing Your Parser}).
6231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6232cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@menu
6233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Understanding::     Understanding the structure of your parser.
6234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Tracing::           Tracing the execution of your parser.
6235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end menu
6236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6237cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Understanding
6238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Understanding Your Parser
6239cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAs documented elsewhere (@pxref{Algorithm, ,The Bison Parser Algorithm})
6241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison parsers are @dfn{shift/reduce automata}.  In some cases (much more
6242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfrequent than one would hope), looking at this automaton is required to
6243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttune or simply fix a parser.  Bison provides two different
6244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrepresentation of it, either textually or graphically (as a @acronym{VCG}
6245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfile).
6246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6247cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe textual file is generated when the options @option{--report} or
6248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@option{--verbose} are specified, see @xref{Invocation, , Invoking
6249cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison}.  Its name is made by removing @samp{.tab.c} or @samp{.c} from
6250cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe parser output file name, and adding @samp{.output} instead.
6251cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTherefore, if the input file is @file{foo.y}, then the parser file is
6252cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcalled @file{foo.tab.c} by default.  As a consequence, the verbose
6253cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectoutput file is called @file{foo.output}.
6254cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6255cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe following grammar file, @file{calc.y}, will be used in the sequel:
6256cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6257cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
6258cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%token NUM STR
6259cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%left '+' '-'
6260cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%left '*'
6261cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%%
6262cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexp: exp '+' exp
6263cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   | exp '-' exp
6264cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   | exp '*' exp
6265cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   | exp '/' exp
6266cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   | NUM
6267cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   ;
6268cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectuseless: STR;
6269cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%%
6270cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
6271cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6272cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@command{bison} reports:
6273cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6274cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
6275cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcalc.y: warning: 1 useless nonterminal and 1 useless rule
6276cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcalc.y:11.1-7: warning: useless nonterminal: useless
6277cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcalc.y:11.10-12: warning: useless rule: useless: STR
6278cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcalc.y: conflicts: 7 shift/reduce
6279cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
6280cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6281cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhen given @option{--report=state}, in addition to @file{calc.tab.c}, it
6282cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcreates a file @file{calc.output} with contents detailed below.  The
6283cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectorder of the output and the exact presentation might vary, but the
6284cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinterpretation is the same.
6285cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6286cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe first section includes details on conflicts that were solved thanks
6287cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectto precedence and/or associativity:
6288cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6289cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
6290cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectConflict in state 8 between rule 2 and token '+' resolved as reduce.
6291cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectConflict in state 8 between rule 2 and token '-' resolved as reduce.
6292cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectConflict in state 8 between rule 2 and token '*' resolved as shift.
6293cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@exdent @dots{}
6294cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
6295cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6296cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
6297cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe next section lists states that still have conflicts.
6298cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6299cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
6300cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectState 8 conflicts: 1 shift/reduce
6301cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectState 9 conflicts: 1 shift/reduce
6302cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectState 10 conflicts: 1 shift/reduce
6303cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectState 11 conflicts: 4 shift/reduce
6304cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
6305cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6306cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
6307cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex token, useless
6308cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex useless token
6309cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex nonterminal, useless
6310cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex useless nonterminal
6311cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex rule, useless
6312cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex useless rule
6313cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe next section reports useless tokens, nonterminal and rules.  Useless
6314cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnonterminals and rules are removed in order to produce a smaller parser,
6315cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbut useless tokens are preserved, since they might be used by the
6316cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectscanner (note the difference between ``useless'' and ``not used''
6317cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbelow):
6318cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6319cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
6320cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectUseless nonterminals:
6321cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   useless
6322cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6323cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTerminals which are not used:
6324cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   STR
6325cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6326cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectUseless rules:
6327cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#6     useless: STR;
6328cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
6329cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6330cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
6331cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe next section reproduces the exact grammar that Bison used:
6332cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6333cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
6334cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectGrammar
6335cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6336cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  Number, Line, Rule
6337cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    0   5 $accept -> exp $end
6338cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    1   5 exp -> exp '+' exp
6339cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    2   6 exp -> exp '-' exp
6340cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    3   7 exp -> exp '*' exp
6341cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    4   8 exp -> exp '/' exp
6342cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    5   9 exp -> NUM
6343cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
6344cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6345cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
6346cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand reports the uses of the symbols:
6347cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6348cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
6349cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTerminals, with rules where they appear
6350cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6351cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project$end (0) 0
6352cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project'*' (42) 3
6353cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project'+' (43) 1
6354cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project'-' (45) 2
6355cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project'/' (47) 4
6356cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecterror (256)
6357cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectNUM (258) 5
6358cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6359cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectNonterminals, with rules where they appear
6360cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6361cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project$accept (8)
6362cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    on left: 0
6363cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexp (9)
6364cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    on left: 1 2 3 4 5, on right: 0 1 2 3 4
6365cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
6366cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6367cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
6368cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex item
6369cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex pointed rule
6370cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex rule, pointed
6371cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison then proceeds onto the automaton itself, describing each state
6372cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwith it set of @dfn{items}, also known as @dfn{pointed rules}.  Each
6373cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectitem is a production rule together with a point (marked by @samp{.})
6374cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthat the input cursor.
6375cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6376cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
6377cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate 0
6378cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6379cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    $accept  ->  . exp $   (rule 0)
6380cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6381cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    NUM         shift, and go to state 1
6382cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6383cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp         go to state 2
6384cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
6385cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6386cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis reads as follows: ``state 0 corresponds to being at the very
6387cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbeginning of the parsing, in the initial rule, right before the start
6388cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsymbol (here, @code{exp}).  When the parser returns to this state right
6389cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectafter having reduced a rule that produced an @code{exp}, the control
6390cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectflow jumps to state 2.  If there is no such transition on a nonterminal
6391cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsymbol, and the look-ahead is a @code{NUM}, then this token is shifted on
6392cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe parse stack, and the control flow jumps to state 1.  Any other
6393cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlook-ahead triggers a syntax error.''
6394cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6395cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex core, item set
6396cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex item set core
6397cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex kernel, item set
6398cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex item set core
6399cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectEven though the only active rule in state 0 seems to be rule 0, the
6400cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectreport lists @code{NUM} as a look-ahead token because @code{NUM} can be
6401cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectat the beginning of any rule deriving an @code{exp}.  By default Bison
6402cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectreports the so-called @dfn{core} or @dfn{kernel} of the item set, but if
6403cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectyou want to see more detail you can invoke @command{bison} with
6404cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@option{--report=itemset} to list all the items, include those that can
6405cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbe derived:
6406cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6407cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
6408cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate 0
6409cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6410cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    $accept  ->  . exp $   (rule 0)
6411cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  . exp '+' exp   (rule 1)
6412cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  . exp '-' exp   (rule 2)
6413cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  . exp '*' exp   (rule 3)
6414cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  . exp '/' exp   (rule 4)
6415cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  . NUM   (rule 5)
6416cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6417cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    NUM         shift, and go to state 1
6418cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6419cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp         go to state 2
6420cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
6421cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6422cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
6423cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn the state 1...
6424cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6425cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
6426cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate 1
6427cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6428cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  NUM .   (rule 5)
6429cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6430cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    $default    reduce using rule 5 (exp)
6431cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
6432cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6433cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
6434cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe rule 5, @samp{exp: NUM;}, is completed.  Whatever the look-ahead token
6435cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(@samp{$default}), the parser will reduce it.  If it was coming from
6436cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate 0, then, after this reduction it will return to state 0, and will
6437cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectjump to state 2 (@samp{exp: go to state 2}).
6438cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6439cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
6440cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate 2
6441cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6442cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    $accept  ->  exp . $   (rule 0)
6443cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  exp . '+' exp   (rule 1)
6444cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  exp . '-' exp   (rule 2)
6445cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  exp . '*' exp   (rule 3)
6446cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  exp . '/' exp   (rule 4)
6447cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6448cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    $           shift, and go to state 3
6449cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    '+'         shift, and go to state 4
6450cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    '-'         shift, and go to state 5
6451cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    '*'         shift, and go to state 6
6452cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    '/'         shift, and go to state 7
6453cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
6454cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6455cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
6456cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn state 2, the automaton can only shift a symbol.  For instance,
6457cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbecause of the item @samp{exp -> exp . '+' exp}, if the look-ahead if
6458cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{+}, it will be shifted on the parse stack, and the automaton
6459cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcontrol will jump to state 4, corresponding to the item @samp{exp -> exp
6460cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project'+' . exp}.  Since there is no default action, any other token than
6461cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthose listed above will trigger a syntax error.
6462cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6463cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe state 3 is named the @dfn{final state}, or the @dfn{accepting
6464cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate}:
6465cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6466cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
6467cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate 3
6468cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6469cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    $accept  ->  exp $ .   (rule 0)
6470cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6471cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    $default    accept
6472cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
6473cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6474cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
6475cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe initial rule is completed (the start symbol and the end
6476cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectof input were read), the parsing exits successfully.
6477cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6478cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe interpretation of states 4 to 7 is straightforward, and is left to
6479cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe reader.
6480cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6481cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
6482cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate 4
6483cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6484cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  exp '+' . exp   (rule 1)
6485cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6486cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    NUM         shift, and go to state 1
6487cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6488cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp         go to state 8
6489cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6490cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate 5
6491cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6492cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  exp '-' . exp   (rule 2)
6493cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6494cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    NUM         shift, and go to state 1
6495cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6496cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp         go to state 9
6497cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6498cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate 6
6499cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6500cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  exp '*' . exp   (rule 3)
6501cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6502cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    NUM         shift, and go to state 1
6503cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6504cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp         go to state 10
6505cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6506cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate 7
6507cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6508cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  exp '/' . exp   (rule 4)
6509cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6510cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    NUM         shift, and go to state 1
6511cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6512cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp         go to state 11
6513cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
6514cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6515cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAs was announced in beginning of the report, @samp{State 8 conflicts:
6516cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project1 shift/reduce}:
6517cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6518cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
6519cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate 8
6520cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6521cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  exp . '+' exp   (rule 1)
6522cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  exp '+' exp .   (rule 1)
6523cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  exp . '-' exp   (rule 2)
6524cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  exp . '*' exp   (rule 3)
6525cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  exp . '/' exp   (rule 4)
6526cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6527cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    '*'         shift, and go to state 6
6528cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    '/'         shift, and go to state 7
6529cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6530cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    '/'         [reduce using rule 1 (exp)]
6531cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    $default    reduce using rule 1 (exp)
6532cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
6533cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6534cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIndeed, there are two actions associated to the look-ahead @samp{/}:
6535cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecteither shifting (and going to state 7), or reducing rule 1.  The
6536cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectconflict means that either the grammar is ambiguous, or the parser lacks
6537cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinformation to make the right decision.  Indeed the grammar is
6538cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectambiguous, as, since we did not specify the precedence of @samp{/}, the
6539cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsentence @samp{NUM + NUM / NUM} can be parsed as @samp{NUM + (NUM /
6540cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectNUM)}, which corresponds to shifting @samp{/}, or as @samp{(NUM + NUM) /
6541cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectNUM}, which corresponds to reducing rule 1.
6542cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6543cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBecause in @acronym{LALR}(1) parsing a single decision can be made, Bison
6544cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectarbitrarily chose to disable the reduction, see @ref{Shift/Reduce, ,
6545cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectShift/Reduce Conflicts}.  Discarded actions are reported in between
6546cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsquare brackets.
6547cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6548cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectNote that all the previous states had a single possible action: either
6549cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectshifting the next token and going to the corresponding state, or
6550cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectreducing a single rule.  In the other cases, i.e., when shifting
6551cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@emph{and} reducing is possible or when @emph{several} reductions are
6552cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectpossible, the look-ahead is required to select the action.  State 8 is
6553cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectone such state: if the look-ahead is @samp{*} or @samp{/} then the action
6554cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectis shifting, otherwise the action is reducing rule 1.  In other words,
6555cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe first two items, corresponding to rule 1, are not eligible when the
6556cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlook-ahead token is @samp{*}, since we specified that @samp{*} has higher
6557cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprecedence than @samp{+}.  More generally, some items are eligible only
6558cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwith some set of possible look-ahead tokens.  When run with
6559cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@option{--report=look-ahead}, Bison specifies these look-ahead tokens:
6560cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6561cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
6562cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate 8
6563cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6564cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  exp . '+' exp  [$, '+', '-', '/']   (rule 1)
6565cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  exp '+' exp .  [$, '+', '-', '/']   (rule 1)
6566cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  exp . '-' exp   (rule 2)
6567cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  exp . '*' exp   (rule 3)
6568cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  exp . '/' exp   (rule 4)
6569cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6570cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    '*'         shift, and go to state 6
6571cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    '/'         shift, and go to state 7
6572cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6573cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    '/'         [reduce using rule 1 (exp)]
6574cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    $default    reduce using rule 1 (exp)
6575cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
6576cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6577cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe remaining states are similar:
6578cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6579cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
6580cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate 9
6581cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6582cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  exp . '+' exp   (rule 1)
6583cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  exp . '-' exp   (rule 2)
6584cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  exp '-' exp .   (rule 2)
6585cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  exp . '*' exp   (rule 3)
6586cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  exp . '/' exp   (rule 4)
6587cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6588cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    '*'         shift, and go to state 6
6589cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    '/'         shift, and go to state 7
6590cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6591cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    '/'         [reduce using rule 2 (exp)]
6592cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    $default    reduce using rule 2 (exp)
6593cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6594cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate 10
6595cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6596cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  exp . '+' exp   (rule 1)
6597cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  exp . '-' exp   (rule 2)
6598cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  exp . '*' exp   (rule 3)
6599cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  exp '*' exp .   (rule 3)
6600cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  exp . '/' exp   (rule 4)
6601cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6602cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    '/'         shift, and go to state 7
6603cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6604cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    '/'         [reduce using rule 3 (exp)]
6605cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    $default    reduce using rule 3 (exp)
6606cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6607cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate 11
6608cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6609cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  exp . '+' exp   (rule 1)
6610cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  exp . '-' exp   (rule 2)
6611cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  exp . '*' exp   (rule 3)
6612cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  exp . '/' exp   (rule 4)
6613cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exp  ->  exp '/' exp .   (rule 4)
6614cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6615cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    '+'         shift, and go to state 4
6616cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    '-'         shift, and go to state 5
6617cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    '*'         shift, and go to state 6
6618cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    '/'         shift, and go to state 7
6619cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6620cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    '+'         [reduce using rule 4 (exp)]
6621cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    '-'         [reduce using rule 4 (exp)]
6622cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    '*'         [reduce using rule 4 (exp)]
6623cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    '/'         [reduce using rule 4 (exp)]
6624cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    $default    reduce using rule 4 (exp)
6625cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
6626cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6627cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
6628cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectObserve that state 11 contains conflicts not only due to the lack of
6629cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprecedence of @samp{/} with respect to @samp{+}, @samp{-}, and
6630cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{*}, but also because the
6631cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectassociativity of @samp{/} is not specified.
6632cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6633cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6634cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Tracing
6635cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Tracing Your Parser
6636cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex yydebug
6637cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex debugging
6638cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex tracing the parser
6639cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6640cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf a Bison grammar compiles properly but doesn't do what you want when it
6641cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectruns, the @code{yydebug} parser-trace feature can help you figure out why.
6642cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6643cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThere are several means to enable compilation of trace facilities:
6644cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6645cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@table @asis
6646cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item the macro @code{YYDEBUG}
6647cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex YYDEBUG
6648cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDefine the macro @code{YYDEBUG} to a nonzero value when you compile the
6649cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparser.  This is compliant with @acronym{POSIX} Yacc.  You could use
6650cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{-DYYDEBUG=1} as a compiler option or you could put @samp{#define
6651cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectYYDEBUG 1} in the prologue of the grammar file (@pxref{Prologue, , The
6652cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectPrologue}).
6653cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6654cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item the option @option{-t}, @option{--debug}
6655cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectUse the @samp{-t} option when you run Bison (@pxref{Invocation,
6656cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project,Invoking Bison}).  This is @acronym{POSIX} compliant too.
6657cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6658cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item the directive @samp{%debug}
6659cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex %debug
6660cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAdd the @code{%debug} directive (@pxref{Decl Summary, ,Bison
6661cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDeclaration Summary}).  This is a Bison extension, which will prove
6662cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectuseful when Bison will output parsers for languages that don't use a
6663cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectpreprocessor.  Unless @acronym{POSIX} and Yacc portability matter to
6664cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectyou, this is
6665cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe preferred solution.
6666cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end table
6667cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6668cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWe suggest that you always enable the debug option so that debugging is
6669cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectalways possible.
6670cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6671cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe trace facility outputs messages with macro calls of the form
6672cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{YYFPRINTF (stderr, @var{format}, @var{args})} where
6673cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@var{format} and @var{args} are the usual @code{printf} format and
6674cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectarguments.  If you define @code{YYDEBUG} to a nonzero value but do not
6675cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdefine @code{YYFPRINTF}, @code{<stdio.h>} is automatically included
6676cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand @code{YYPRINTF} is defined to @code{fprintf}.
6677cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6678cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectOnce you have compiled the program with trace facilities, the way to
6679cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrequest a trace is to store a nonzero value in the variable @code{yydebug}.
6680cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectYou can do this by making the C code do it (in @code{main}, perhaps), or
6681cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectyou can alter the value with a C debugger.
6682cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6683cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectEach step taken by the parser when @code{yydebug} is nonzero produces a
6684cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectline or two of trace information, written on @code{stderr}.  The trace
6685cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmessages tell you these things:
6686cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6687cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@itemize @bullet
6688cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
6689cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectEach time the parser calls @code{yylex}, what kind of token was read.
6690cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6691cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
6692cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectEach time a token is shifted, the depth and complete contents of the
6693cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate stack (@pxref{Parser States}).
6694cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6695cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
6696cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectEach time a rule is reduced, which rule it is, and the complete contents
6697cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectof the state stack afterward.
6698cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end itemize
6699cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6700cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTo make sense of this information, it helps to refer to the listing file
6701cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectproduced by the Bison @samp{-v} option (@pxref{Invocation, ,Invoking
6702cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison}).  This file shows the meaning of each state in terms of
6703cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectpositions in various rules, and also what each state will do with each
6704cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectpossible input token.  As you read the successive trace messages, you
6705cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcan see that the parser is functioning according to its specification in
6706cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe listing file.  Eventually you will arrive at the place where
6707cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsomething undesirable happens, and you will see which parts of the
6708cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgrammar are to blame.
6709cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6710cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe parser file is a C program and you can use C debuggers on it, but it's
6711cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnot easy to interpret what it is doing.  The parser function is a
6712cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfinite-state machine interpreter, and aside from the actions it executes
6713cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe same code over and over.  Only the values of variables show where in
6714cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe grammar it is working.
6715cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6716cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@findex YYPRINT
6717cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe debugging information normally gives the token type of each token
6718cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectread, but not its semantic value.  You can optionally define a macro
6719cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnamed @code{YYPRINT} to provide a way to print the value.  If you define
6720cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{YYPRINT}, it should take three arguments.  The parser will pass a
6721cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstandard I/O stream, the numeric code for the token type, and the token
6722cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvalue (from @code{yylval}).
6723cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6724cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHere is an example of @code{YYPRINT} suitable for the multi-function
6725cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcalculator (@pxref{Mfcalc Decl, ,Declarations for @code{mfcalc}}):
6726cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6727cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@smallexample
6728cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@{
6729cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  static void print_token_value (FILE *, int, YYSTYPE);
6730cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  #define YYPRINT(file, type, value) print_token_value (file, type, value)
6731cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@}
6732cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6733cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@dots{} %% @dots{} %% @dots{}
6734cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6735cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
6736cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprint_token_value (FILE *file, int type, YYSTYPE value)
6737cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
6738cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (type == VAR)
6739cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    fprintf (file, "%s", value.tptr->name);
6740cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  else if (type == NUM)
6741cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    fprintf (file, "%d", value.val);
6742cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
6743cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end smallexample
6744cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6745cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c ================================================= Invoking Bison
6746cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6747cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Invocation
6748cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@chapter Invoking Bison
6749cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex invoking Bison
6750cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex Bison invocation
6751cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex options for invoking Bison
6752cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6753cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe usual way to invoke Bison is as follows:
6754cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6755cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
6756cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbison @var{infile}
6757cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
6758cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6759cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHere @var{infile} is the grammar file name, which usually ends in
6760cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{.y}.  The parser file's name is made by replacing the @samp{.y}
6761cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwith @samp{.tab.c} and removing any leading directory.  Thus, the
6762cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{bison foo.y} file name yields
6763cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@file{foo.tab.c}, and the @samp{bison hack/foo.y} file name yields
6764cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@file{foo.tab.c}.  It's also possible, in case you are writing
6765cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectC++ code instead of C in your grammar file, to name it @file{foo.ypp}
6766cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projector @file{foo.y++}.  Then, the output files will take an extension like
6767cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe given one as input (respectively @file{foo.tab.cpp} and
6768cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@file{foo.tab.c++}).
6769cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis feature takes effect with all options that manipulate file names like
6770cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{-o} or @samp{-d}.
6771cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6772cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFor example :
6773cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6774cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
6775cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbison -d @var{infile.yxx}
6776cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
6777cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
6778cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwill produce @file{infile.tab.cxx} and @file{infile.tab.hxx}, and
6779cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6780cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
6781cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbison -d -o @var{output.c++} @var{infile.y}
6782cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
6783cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
6784cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwill produce @file{output.c++} and @file{outfile.h++}.
6785cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6786cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFor compatibility with @acronym{POSIX}, the standard Bison
6787cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdistribution also contains a shell script called @command{yacc} that
6788cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinvokes Bison with the @option{-y} option.
6789cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6790cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@menu
6791cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Bison Options::     All the options described in detail,
6792cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                        in alphabetical order by short options.
6793cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Option Cross Key::  Alphabetical list of long options.
6794cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Yacc Library::      Yacc-compatible @code{yylex} and @code{main}.
6795cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end menu
6796cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6797cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Bison Options
6798cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Bison Options
6799cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6800cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison supports both traditional single-letter options and mnemonic long
6801cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectoption names.  Long option names are indicated with @samp{--} instead of
6802cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{-}.  Abbreviations for option names are allowed as long as they
6803cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectare unique.  When a long option takes an argument, like
6804cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{--file-prefix}, connect the option name and the argument with
6805cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{=}.
6806cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6807cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHere is a list of options that can be used with Bison, alphabetized by
6808cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectshort option.  It is followed by a cross key alphabetized by long
6809cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectoption.
6810cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6811cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c Please, keep this ordered as in `bison --help'.
6812cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
6813cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectOperations modes:
6814cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@table @option
6815cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item -h
6816cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@itemx --help
6817cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectPrint a summary of the command-line options to Bison and exit.
6818cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6819cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item -V
6820cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@itemx --version
6821cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectPrint the version number of Bison and exit.
6822cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6823cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item --print-localedir
6824cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectPrint the name of the directory containing locale-dependent data.
6825cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6826cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item -y
6827cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@itemx --yacc
6828cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAct more like the traditional Yacc command.  This can cause
6829cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdifferent diagnostics to be generated, and may change behavior in
6830cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectother minor ways.  Most importantly, imitate Yacc's output
6831cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfile name conventions, so that the parser output file is called
6832cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@file{y.tab.c}, and the other outputs are called @file{y.output} and
6833cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@file{y.tab.h}.  Thus, the following shell script can substitute
6834cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfor Yacc, and the Bison distribution contains such a script for
6835cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcompatibility with @acronym{POSIX}:
6836cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6837cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
6838cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#! /bin/sh
6839cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbison -y "$@@"
6840cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
6841cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6842cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe @option{-y}/@option{--yacc} option is intended for use with
6843cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttraditional Yacc grammars.  If your grammar uses a Bison extension
6844cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlike @samp{%glr-parser}, Bison might not be Yacc-compatible even if
6845cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthis option is specified.
6846cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6847cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end table
6848cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6849cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
6850cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTuning the parser:
6851cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6852cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@table @option
6853cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item -S @var{file}
6854cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@itemx --skeleton=@var{file}
6855cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSpecify the skeleton to use.  You probably don't need this option unless
6856cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectyou are developing Bison.
6857cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6858cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item -t
6859cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@itemx --debug
6860cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn the parser file, define the macro @code{YYDEBUG} to 1 if it is not
6861cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectalready defined, so that the debugging facilities are compiled.
6862cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Tracing, ,Tracing Your Parser}.
6863cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6864cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item --locations
6865cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectPretend that @code{%locations} was specified.  @xref{Decl Summary}.
6866cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6867cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item -p @var{prefix}
6868cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@itemx --name-prefix=@var{prefix}
6869cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectPretend that @code{%name-prefix="@var{prefix}"} was specified.
6870cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Decl Summary}.
6871cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6872cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item -l
6873cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@itemx --no-lines
6874cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDon't put any @code{#line} preprocessor commands in the parser file.
6875cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectOrdinarily Bison puts them in the parser file so that the C compiler
6876cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand debuggers will associate errors with your source file, the
6877cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgrammar file.  This option causes them to associate errors with the
6878cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparser file, treating it as an independent source file in its own right.
6879cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6880cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item -n
6881cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@itemx --no-parser
6882cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectPretend that @code{%no-parser} was specified.  @xref{Decl Summary}.
6883cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6884cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item -k
6885cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@itemx --token-table
6886cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectPretend that @code{%token-table} was specified.  @xref{Decl Summary}.
6887cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end table
6888cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6889cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
6890cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAdjust the output:
6891cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6892cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@table @option
6893cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item -d
6894cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@itemx --defines
6895cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectPretend that @code{%defines} was specified, i.e., write an extra output
6896cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfile containing macro definitions for the token type names defined in
6897cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe grammar, as well as a few other declarations.  @xref{Decl Summary}.
6898cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6899cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item --defines=@var{defines-file}
6900cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSame as above, but save in the file @var{defines-file}.
6901cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6902cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item -b @var{file-prefix}
6903cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@itemx --file-prefix=@var{prefix}
6904cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectPretend that @code{%file-prefix} was specified, i.e, specify prefix to use
6905cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfor all Bison output file names.  @xref{Decl Summary}.
6906cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6907cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item -r @var{things}
6908cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@itemx --report=@var{things}
6909cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWrite an extra output file containing verbose description of the comma
6910cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectseparated list of @var{things} among:
6911cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6912cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@table @code
6913cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item state
6914cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDescription of the grammar, conflicts (resolved and unresolved), and
6915cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@acronym{LALR} automaton.
6916cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6917cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item look-ahead
6918cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectImplies @code{state} and augments the description of the automaton with
6919cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecteach rule's look-ahead set.
6920cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6921cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item itemset
6922cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectImplies @code{state} and augments the description of the automaton with
6923cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe full set of items for each state, instead of its core only.
6924cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end table
6925cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6926cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item -v
6927cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@itemx --verbose
6928cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectPretend that @code{%verbose} was specified, i.e, write an extra output
6929cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfile containing verbose descriptions of the grammar and
6930cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparser.  @xref{Decl Summary}.
6931cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6932cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item -o @var{file}
6933cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@itemx --output=@var{file}
6934cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSpecify the @var{file} for the parser file.
6935cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6936cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe other output files' names are constructed from @var{file} as
6937cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdescribed under the @samp{-v} and @samp{-d} options.
6938cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6939cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item -g
6940cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectOutput a @acronym{VCG} definition of the @acronym{LALR}(1) grammar
6941cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectautomaton computed by Bison.  If the grammar file is @file{foo.y}, the
6942cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@acronym{VCG} output file will
6943cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbe @file{foo.vcg}.
6944cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6945cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item --graph=@var{graph-file}
6946cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe behavior of @var{--graph} is the same than @samp{-g}.  The only
6947cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdifference is that it has an optional argument which is the name of
6948cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe output graph file.
6949cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end table
6950cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6951cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Option Cross Key
6952cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Option Cross Key
6953cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6954cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c FIXME: How about putting the directives too?
6955cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHere is a list of options, alphabetized by long option, to help you find
6956cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe corresponding short option.
6957cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6958cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@multitable {@option{--defines=@var{defines-file}}} {@option{-b @var{file-prefix}XXX}}
6959cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@headitem Long Option @tab Short Option
6960cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item @option{--debug}                      @tab @option{-t}
6961cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item @option{--defines=@var{defines-file}} @tab @option{-d}
6962cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item @option{--file-prefix=@var{prefix}}   @tab @option{-b @var{file-prefix}}
6963cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item @option{--graph=@var{graph-file}}     @tab @option{-d}
6964cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item @option{--help}                       @tab @option{-h}
6965cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item @option{--name-prefix=@var{prefix}}   @tab @option{-p @var{name-prefix}}
6966cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item @option{--no-lines}                   @tab @option{-l}
6967cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item @option{--no-parser}                  @tab @option{-n}
6968cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item @option{--output=@var{outfile}}       @tab @option{-o @var{outfile}}
6969cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item @option{--print-localedir}            @tab
6970cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item @option{--token-table}                @tab @option{-k}
6971cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item @option{--verbose}                    @tab @option{-v}
6972cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item @option{--version}                    @tab @option{-V}
6973cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item @option{--yacc}                       @tab @option{-y}
6974cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end multitable
6975cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6976cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Yacc Library
6977cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Yacc Library
6978cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6979cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe Yacc library contains default implementations of the
6980cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yyerror} and @code{main} functions.  These default
6981cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectimplementations are normally not useful, but @acronym{POSIX} requires
6982cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthem.  To use the Yacc library, link your program with the
6983cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@option{-ly} option.  Note that Bison's implementation of the Yacc
6984cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlibrary is distributed under the terms of the @acronym{GNU} General
6985cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectPublic License (@pxref{Copying}).
6986cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6987cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf you use the Yacc library's @code{yyerror} function, you should
6988cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeclare @code{yyerror} as follows:
6989cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6990cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
6991cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint yyerror (char const *);
6992cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
6993cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6994cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison ignores the @code{int} value returned by this @code{yyerror}.
6995cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf you use the Yacc library's @code{main} function, your
6996cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yyparse} function should have the following type signature:
6997cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6998cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
6999cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint yyparse (void);
7000cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
7001cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7002cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c ================================================= C++ Bison
7003cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7004cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node C++ Language Interface
7005cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@chapter C++ Language Interface
7006cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7007cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@menu
7008cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* C++ Parsers::                 The interface to generate C++ parser classes
7009cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* A Complete C++ Example::      Demonstrating their use
7010cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end menu
7011cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7012cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node C++ Parsers
7013cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section C++ Parsers
7014cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7015cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@menu
7016cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* C++ Bison Interface::         Asking for C++ parser generation
7017cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* C++ Semantic Values::         %union vs. C++
7018cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* C++ Location Values::         The position and location classes
7019cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* C++ Parser Interface::        Instantiating and running the parser
7020cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* C++ Scanner Interface::       Exchanges between yylex and parse
7021cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end menu
7022cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7023cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node C++ Bison Interface
7024cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection C++ Bison Interface
7025cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c - %skeleton "lalr1.cc"
7026cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c - Always pure
7027cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c - initial action
7028cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7029cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe C++ parser @acronym{LALR}(1) skeleton is named @file{lalr1.cc}.  To
7030cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectselect it, you may either pass the option @option{--skeleton=lalr1.cc}
7031cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectto Bison, or include the directive @samp{%skeleton "lalr1.cc"} in the
7032cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgrammar preamble.  When run, @command{bison} will create several
7033cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectentities in the @samp{yy} namespace.  Use the @samp{%name-prefix}
7034cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdirective to change the namespace name, see @ref{Decl Summary}.  The
7035cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvarious classes are generated in the following files:
7036cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7037cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@table @file
7038cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item position.hh
7039cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@itemx location.hh
7040cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe definition of the classes @code{position} and @code{location},
7041cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectused for location tracking.  @xref{C++ Location Values}.
7042cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7043cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item stack.hh
7044cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAn auxiliary class @code{stack} used by the parser.
7045cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7046cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item @var{file}.hh
7047cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@itemx @var{file}.cc
7048cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(Assuming the extension of the input file was @samp{.yy}.)  The
7049cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeclaration and implementation of the C++ parser class.  The basename
7050cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand extension of these two files follow the same rules as with regular C
7051cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparsers (@pxref{Invocation}).
7052cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7053cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe header is @emph{mandatory}; you must either pass
7054cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@option{-d}/@option{--defines} to @command{bison}, or use the
7055cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{%defines} directive.
7056cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end table
7057cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7058cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAll these files are documented using Doxygen; run @command{doxygen}
7059cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfor a complete and accurate documentation.
7060cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7061cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node C++ Semantic Values
7062cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection C++ Semantic Values
7063cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c - No objects in unions
7064cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c - YSTYPE
7065cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c - Printer and destructor
7066cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7067cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe @code{%union} directive works as for C, see @ref{Union Decl, ,The
7068cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectCollection of Value Types}.  In particular it produces a genuine
7069cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{union}@footnote{In the future techniques to allow complex types
7070cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwithin pseudo-unions (similar to Boost variants) might be implemented to
7071cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectalleviate these issues.}, which have a few specific features in C++.
7072cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@itemize @minus
7073cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
7074cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe type @code{YYSTYPE} is defined but its use is discouraged: rather
7075cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectyou should refer to the parser's encapsulated type
7076cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yy::parser::semantic_type}.
7077cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item
7078cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectNon POD (Plain Old Data) types cannot be used.  C++ forbids any
7079cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinstance of classes with constructors in unions: only @emph{pointers}
7080cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectto such objects are allowed.
7081cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end itemize
7082cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7083cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBecause objects have to be stored via pointers, memory is not
7084cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectreclaimed automatically: using the @code{%destructor} directive is the
7085cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectonly means to avoid leaks.  @xref{Destructor Decl, , Freeing Discarded
7086cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSymbols}.
7087cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7088cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7089cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node C++ Location Values
7090cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection C++ Location Values
7091cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c - %locations
7092cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c - class Position
7093cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c - class Location
7094cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c - %define "filename_type" "const symbol::Symbol"
7095cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7096cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhen the directive @code{%locations} is used, the C++ parser supports
7097cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlocation tracking, see @ref{Locations, , Locations Overview}.  Two
7098cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectauxiliary classes define a @code{position}, a single point in a file,
7099cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand a @code{location}, a range composed of a pair of
7100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{position}s (possibly spanning several files).
7101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deftypemethod {position} {std::string*} file
7103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe name of the file.  It will always be handled as a pointer, the
7104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparser will never duplicate nor deallocate it.  As an experimental
7105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfeature you may change it to @samp{@var{type}*} using @samp{%define
7106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project"filename_type" "@var{type}"}.
7107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deftypemethod
7108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deftypemethod {position} {unsigned int} line
7110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe line, starting at 1.
7111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deftypemethod
7112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deftypemethod {position} {unsigned int} lines (int @var{height} = 1)
7114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAdvance by @var{height} lines, resetting the column number.
7115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deftypemethod
7116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deftypemethod {position} {unsigned int} column
7118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe column, starting at 0.
7119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deftypemethod
7120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7121cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deftypemethod {position} {unsigned int} columns (int @var{width} = 1)
7122cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAdvance by @var{width} columns, without changing the line number.
7123cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deftypemethod
7124cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7125cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deftypemethod {position} {position&} operator+= (position& @var{pos}, int @var{width})
7126cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deftypemethodx {position} {position} operator+ (const position& @var{pos}, int @var{width})
7127cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deftypemethodx {position} {position&} operator-= (const position& @var{pos}, int @var{width})
7128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deftypemethodx {position} {position} operator- (position& @var{pos}, int @var{width})
7129cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectVarious forms of syntactic sugar for @code{columns}.
7130cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deftypemethod
7131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deftypemethod {position} {position} operator<< (std::ostream @var{o}, const position& @var{p})
7133cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectReport @var{p} on @var{o} like this:
7134cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{@var{file}:@var{line}.@var{column}}, or
7135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{@var{line}.@var{column}} if @var{file} is null.
7136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deftypemethod
7137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deftypemethod {location} {position} begin
7139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deftypemethodx {location} {position} end
7140cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe first, inclusive, position of the range, and the first beyond.
7141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deftypemethod
7142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deftypemethod {location} {unsigned int} columns (int @var{width} = 1)
7144cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deftypemethodx {location} {unsigned int} lines (int @var{height} = 1)
7145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAdvance the @code{end} position.
7146cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deftypemethod
7147cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7148cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deftypemethod {location} {location} operator+ (const location& @var{begin}, const location& @var{end})
7149cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deftypemethodx {location} {location} operator+ (const location& @var{begin}, int @var{width})
7150cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deftypemethodx {location} {location} operator+= (const location& @var{loc}, int @var{width})
7151cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectVarious forms of syntactic sugar.
7152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deftypemethod
7153cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deftypemethod {location} {void} step ()
7155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectMove @code{begin} onto @code{end}.
7156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deftypemethod
7157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7159cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node C++ Parser Interface
7160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection C++ Parser Interface
7161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c - define parser_class_name
7162cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c - Ctor
7163cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c - parse, error, set_debug_level, debug_level, set_debug_stream,
7164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c   debug_stream.
7165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c - Reporting errors
7166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe output files @file{@var{output}.hh} and @file{@var{output}.cc}
7168cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdeclare and define the parser class in the namespace @code{yy}.  The
7169cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectclass name defaults to @code{parser}, but may be changed using
7170cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{%define "parser_class_name" "@var{name}"}.  The interface of
7171cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthis class is detailed below.  It can be extended using the
7172cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{%parse-param} feature: its semantics is slightly changed since
7173cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectit describes an additional member of the parser class, and an
7174cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectadditional argument for its constructor.
7175cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7176cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@defcv {Type} {parser} {semantic_value_type}
7177cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@defcvx {Type} {parser} {location_value_type}
7178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe types for semantics value and locations.
7179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end defcv
7180cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deftypemethod {parser} {} parser (@var{type1} @var{arg1}, ...)
7182cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBuild a new parser object.  There are no arguments by default, unless
7183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{%parse-param @{@var{type1} @var{arg1}@}} was used.
7184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deftypemethod
7185cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7186cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deftypemethod {parser} {int} parse ()
7187cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectRun the syntactic analysis, and return 0 on success, 1 otherwise.
7188cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deftypemethod
7189cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7190cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deftypemethod {parser} {std::ostream&} debug_stream ()
7191cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deftypemethodx {parser} {void} set_debug_stream (std::ostream& @var{o})
7192cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectGet or set the stream used for tracing the parsing.  It defaults to
7193cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{std::cerr}.
7194cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deftypemethod
7195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7196cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deftypemethod {parser} {debug_level_type} debug_level ()
7197cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deftypemethodx {parser} {void} set_debug_level (debug_level @var{l})
7198cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectGet or set the tracing level.  Currently its value is either 0, no trace,
7199cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projector nonzero, full tracing.
7200cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deftypemethod
7201cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7202cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deftypemethod {parser} {void} error (const location_type& @var{l}, const std::string& @var{m})
7203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe definition for this member function must be supplied by the user:
7204cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe parser uses it to report a parser error occurring at @var{l},
7205cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdescribed by @var{m}.
7206cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deftypemethod
7207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7208cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7209cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node C++ Scanner Interface
7210cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection C++ Scanner Interface
7211cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c - prefix for yylex.
7212cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c - Pure interface to yylex
7213cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c - %lex-param
7214cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7215cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe parser invokes the scanner by calling @code{yylex}.  Contrary to C
7216cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparsers, C++ parsers are always pure: there is no point in using the
7217cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{%pure-parser} directive.  Therefore the interface is as follows.
7218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7219cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deftypemethod {parser} {int} yylex (semantic_value_type& @var{yylval}, location_type& @var{yylloc}, @var{type1} @var{arg1}, ...)
7220cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectReturn the next token.  Its type is the return value, its semantic
7221cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvalue and location being @var{yylval} and @var{yylloc}.  Invocations of
7222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{%lex-param @{@var{type1} @var{arg1}@}} yield additional arguments.
7223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deftypemethod
7224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7225cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7226cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node A Complete C++ Example
7227cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section A Complete C++ Example
7228cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7229cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis section demonstrates the use of a C++ parser with a simple but
7230cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcomplete example.  This example should be available on your system,
7231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectready to compile, in the directory @dfn{../bison/examples/calc++}.  It
7232cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfocuses on the use of Bison, therefore the design of the various C++
7233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectclasses is very naive: no accessors, no encapsulation of members etc.
7234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWe will use a Lex scanner, and more precisely, a Flex scanner, to
7235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdemonstrate the various interaction.  A hand written scanner is
7236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectactually easier to interface with.
7237cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@menu
7239cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Calc++ --- C++ Calculator::   The specifications
7240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Calc++ Parsing Driver::       An active parsing context
7241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Calc++ Parser::               A parser class
7242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Calc++ Scanner::              A pure C++ Flex scanner
7243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Calc++ Top Level::            Conducting the band
7244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end menu
7245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Calc++ --- C++ Calculator
7247cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Calc++ --- C++ Calculator
7248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7249cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectOf course the grammar is dedicated to arithmetics, a single
7250cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexpression, possibly preceded by variable assignments.  An
7251cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectenvironment containing possibly predefined variables such as
7252cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{one} and @code{two}, is exchanged with the parser.  An example
7253cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectof valid input follows.
7254cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7255cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
7256cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthree := 3
7257cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectseven := one + two * three
7258cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectseven * seven
7259cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
7260cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7261cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Calc++ Parsing Driver
7262cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Calc++ Parsing Driver
7263cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c - An env
7264cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c - A place to store error messages
7265cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c - A place for the result
7266cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7267cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTo support a pure interface with the parser (and the scanner) the
7268cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttechnique of the ``parsing context'' is convenient: a structure
7269cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcontaining all the data to exchange.  Since, in addition to simply
7270cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlaunch the parsing, there are several auxiliary tasks to execute (open
7271cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe file for parsing, instantiate the parser etc.), we recommend
7272cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttransforming the simple parsing context structure into a fully blown
7273cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@dfn{parsing driver} class.
7274cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7275cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe declaration of this driver class, @file{calc++-driver.hh}, is as
7276cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfollows.  The first part includes the CPP guard and imports the
7277cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrequired standard library components, and the declaration of the parser
7278cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectclass.
7279cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7280cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@comment file: calc++-driver.hh
7281cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
7282cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifndef CALCXX_DRIVER_HH
7283cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define CALCXX_DRIVER_HH
7284cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <string>
7285cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <map>
7286cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include "calc++-parser.hh"
7287cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
7288cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7289cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7290cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
7291cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThen comes the declaration of the scanning function.  Flex expects
7292cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe signature of @code{yylex} to be defined in the macro
7293cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{YY_DECL}, and the C++ parser expects it to be declared.  We can
7294cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfactor both as follows.
7295cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7296cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@comment file: calc++-driver.hh
7297cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
7298cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project// Announce to Flex the prototype we want for lexing function, ...
7299cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define YY_DECL					\
7300cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  yy::calcxx_parser::token_type                         \
7301cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  yylex (yy::calcxx_parser::semantic_type* yylval,      \
7302cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project         yy::calcxx_parser::location_type* yylloc,      \
7303cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project         calcxx_driver& driver)
7304cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project// ... and declare it for the parser's sake.
7305cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectYY_DECL;
7306cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
7307cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7308cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
7309cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe @code{calcxx_driver} class is then declared with its most obvious
7310cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmembers.
7311cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7312cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@comment file: calc++-driver.hh
7313cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
7314cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project// Conducting the whole scanning and parsing of Calc++.
7315cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectclass calcxx_driver
7316cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
7317cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectpublic:
7318cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  calcxx_driver ();
7319cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  virtual ~calcxx_driver ();
7320cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7321cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  std::map<std::string, int> variables;
7322cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7323cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int result;
7324cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
7325cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7326cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
7327cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTo encapsulate the coordination with the Flex scanner, it is useful to
7328cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthave two members function to open and close the scanning phase.
7329cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmembers.
7330cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7331cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@comment file: calc++-driver.hh
7332cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
7333cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  // Handling the scanner.
7334cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  void scan_begin ();
7335cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  void scan_end ();
7336cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bool trace_scanning;
7337cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
7338cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7339cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
7340cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSimilarly for the parser itself.
7341cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7342cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@comment file: calc++-driver.hh
7343cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
7344cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  // Handling the parser.
7345cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  void parse (const std::string& f);
7346cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  std::string file;
7347cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bool trace_parsing;
7348cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
7349cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7350cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
7351cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTo demonstrate pure handling of parse errors, instead of simply
7352cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdumping them on the standard error output, we will pass them to the
7353cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcompiler driver using the following two member functions.  Finally, we
7354cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectclose the class declaration and CPP guard.
7355cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7356cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@comment file: calc++-driver.hh
7357cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
7358cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  // Error handling.
7359cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  void error (const yy::location& l, const std::string& m);
7360cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  void error (const std::string& m);
7361cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@};
7362cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif // ! CALCXX_DRIVER_HH
7363cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
7364cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7365cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe implementation of the driver is straightforward.  The @code{parse}
7366cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmember function deserves some attention.  The @code{error} functions
7367cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectare simple stubs, they should actually register the located error
7368cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmessages and set error state.
7369cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7370cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@comment file: calc++-driver.cc
7371cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
7372cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "calc++-driver.hh"
7373cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "calc++-parser.hh"
7374cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7375cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcalcxx_driver::calcxx_driver ()
7376cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  : trace_scanning (false), trace_parsing (false)
7377cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
7378cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  variables["one"] = 1;
7379cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  variables["two"] = 2;
7380cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
7381cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7382cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcalcxx_driver::~calcxx_driver ()
7383cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
7384cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
7385cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7386cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
7387cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcalcxx_driver::parse (const std::string &f)
7388cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
7389cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  file = f;
7390cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  scan_begin ();
7391cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  yy::calcxx_parser parser (*this);
7392cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  parser.set_debug_level (trace_parsing);
7393cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  parser.parse ();
7394cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  scan_end ();
7395cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
7396cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7397cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
7398cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcalcxx_driver::error (const yy::location& l, const std::string& m)
7399cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
7400cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  std::cerr << l << ": " << m << std::endl;
7401cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
7402cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7403cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
7404cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcalcxx_driver::error (const std::string& m)
7405cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
7406cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  std::cerr << m << std::endl;
7407cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
7408cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
7409cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7410cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Calc++ Parser
7411cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Calc++ Parser
7412cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7413cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe parser definition file @file{calc++-parser.yy} starts by asking for
7414cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe C++ LALR(1) skeleton, the creation of the parser header file, and
7415cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectspecifies the name of the parser class.  Because the C++ skeleton
7416cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectchanged several times, it is safer to require the version you designed
7417cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe grammar for.
7418cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7419cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@comment file: calc++-parser.yy
7420cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
7421cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%skeleton "lalr1.cc"                          /*  -*- C++ -*- */
7422cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%require "2.1a"
7423cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%defines
7424cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%define "parser_class_name" "calcxx_parser"
7425cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
7426cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7427cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
7428cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThen come the declarations/inclusions needed to define the
7429cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{%union}.  Because the parser uses the parsing driver and
7430cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectreciprocally, both cannot include the header of the other.  Because the
7431cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdriver's header needs detailed knowledge about the parser class (in
7432cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparticular its inner types), it is the parser's header which will simply
7433cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectuse a forward declaration of the driver.
7434cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7435cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@comment file: calc++-parser.yy
7436cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
7437cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@{
7438cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <string>
7439cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectclass calcxx_driver;
7440cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@}
7441cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
7442cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7443cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
7444cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe driver is passed by reference to the parser and to the scanner.
7445cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis provides a simple but effective pure interface, not relying on
7446cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectglobal variables.
7447cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7448cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@comment file: calc++-parser.yy
7449cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
7450cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project// The parsing context.
7451cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%parse-param @{ calcxx_driver& driver @}
7452cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%lex-param   @{ calcxx_driver& driver @}
7453cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
7454cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7455cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
7456cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThen we request the location tracking feature, and initialize the
7457cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfirst location's file name.  Afterwards new locations are computed
7458cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrelatively to the previous locations: the file name will be
7459cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectautomatically propagated.
7460cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7461cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@comment file: calc++-parser.yy
7462cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
7463cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%locations
7464cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%initial-action
7465cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
7466cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  // Initialize the initial location.
7467cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  @@$.begin.filename = @@$.end.filename = &driver.file;
7468cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@};
7469cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
7470cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7471cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
7472cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectUse the two following directives to enable parser tracing and verbose
7473cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecterror messages.
7474cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7475cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@comment file: calc++-parser.yy
7476cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
7477cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%debug
7478cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%error-verbose
7479cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
7480cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7481cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
7482cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSemantic values cannot use ``real'' objects, but only pointers to
7483cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthem.
7484cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7485cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@comment file: calc++-parser.yy
7486cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
7487cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project// Symbols.
7488cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%union
7489cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
7490cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int          ival;
7491cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  std::string *sval;
7492cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@};
7493cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
7494cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7495cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
7496cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe code between @samp{%@{} and @samp{%@}} after the introduction of the
7497cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{%union} is output in the @file{*.cc} file; it needs detailed
7498cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectknowledge about the driver.
7499cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7500cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@comment file: calc++-parser.yy
7501cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
7502cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@{
7503cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include "calc++-driver.hh"
7504cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@}
7505cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
7506cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7507cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7508cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
7509cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe token numbered as 0 corresponds to end of file; the following line
7510cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectallows for nicer error messages referring to ``end of file'' instead
7511cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectof ``$end''.  Similarly user friendly named are provided for each
7512cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsymbol.  Note that the tokens names are prefixed by @code{TOKEN_} to
7513cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectavoid name clashes.
7514cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7515cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@comment file: calc++-parser.yy
7516cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
7517cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%token        END      0 "end of file"
7518cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%token        ASSIGN     ":="
7519cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%token <sval> IDENTIFIER "identifier"
7520cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%token <ival> NUMBER     "number"
7521cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%type  <ival> exp        "expression"
7522cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
7523cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7524cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
7525cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTo enable memory deallocation during error recovery, use
7526cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{%destructor}.
7527cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7528cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c FIXME: Document %printer, and mention that it takes a braced-code operand.
7529cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@comment file: calc++-parser.yy
7530cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
7531cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%printer    @{ debug_stream () << *$$; @} "identifier"
7532cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%destructor @{ delete $$; @} "identifier"
7533cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7534cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%printer    @{ debug_stream () << $$; @} "number" "expression"
7535cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
7536cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7537cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
7538cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe grammar itself is straightforward.
7539cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7540cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@comment file: calc++-parser.yy
7541cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
7542cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%%
7543cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%start unit;
7544cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectunit: assignments exp  @{ driver.result = $2; @};
7545cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7546cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectassignments: assignments assignment @{@}
7547cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project           | /* Nothing.  */        @{@};
7548cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7549cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectassignment: "identifier" ":=" exp @{ driver.variables[*$1] = $3; @};
7550cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7551cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%left '+' '-';
7552cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%left '*' '/';
7553cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexp: exp '+' exp   @{ $$ = $1 + $3; @}
7554cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   | exp '-' exp   @{ $$ = $1 - $3; @}
7555cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   | exp '*' exp   @{ $$ = $1 * $3; @}
7556cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   | exp '/' exp   @{ $$ = $1 / $3; @}
7557cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   | "identifier"  @{ $$ = driver.variables[*$1]; @}
7558cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   | "number"      @{ $$ = $1; @};
7559cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%%
7560cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
7561cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7562cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
7563cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFinally the @code{error} member function registers the errors to the
7564cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdriver.
7565cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7566cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@comment file: calc++-parser.yy
7567cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
7568cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
7569cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectyy::calcxx_parser::error (const yy::calcxx_parser::location_type& l,
7570cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project                          const std::string& m)
7571cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
7572cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  driver.error (l, m);
7573cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
7574cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
7575cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7576cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Calc++ Scanner
7577cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Calc++ Scanner
7578cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7579cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe Flex scanner first includes the driver declaration, then the
7580cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparser's to get the set of defined tokens.
7581cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7582cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@comment file: calc++-scanner.ll
7583cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
7584cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@{                                            /* -*- C++ -*- */
7585cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <cstdlib>
7586cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <errno.h>
7587cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <limits.h>
7588cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <string>
7589cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include "calc++-driver.hh"
7590cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include "calc++-parser.hh"
7591cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7592cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Work around an incompatibility in flex (at least versions
7593cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   2.5.31 through 2.5.33): it generates code that does
7594cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   not conform to C89.  See Debian bug 333231
7595cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>.  */
7596cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# undef yywrap
7597cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define yywrap() 1
7598cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7599cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* By default yylex returns int, we use token_type.
7600cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Unfortunately yyterminate by default returns 0, which is
7601cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   not of token_type.  */
7602cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define yyterminate() return token::END
7603cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@}
7604cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
7605cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7606cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
7607cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBecause there is no @code{#include}-like feature we don't need
7608cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yywrap}, we don't need @code{unput} either, and we parse an
7609cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectactual file, this is not an interactive session with the user.
7610cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFinally we enable the scanner tracing features.
7611cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7612cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@comment file: calc++-scanner.ll
7613cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
7614cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%option noyywrap nounput batch debug
7615cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
7616cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7617cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
7618cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAbbreviations allow for more readable rules.
7619cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7620cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@comment file: calc++-scanner.ll
7621cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
7622cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectid    [a-zA-Z][a-zA-Z_0-9]*
7623cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint   [0-9]+
7624cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectblank [ \t]
7625cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
7626cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7627cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
7628cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe following paragraph suffices to track locations accurately.  Each
7629cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttime @code{yylex} is invoked, the begin position is moved onto the end
7630cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectposition.  Then when a pattern is matched, the end position is
7631cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectadvanced of its width.  In case it matched ends of lines, the end
7632cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcursor is adjusted, and each time blanks are matched, the begin cursor
7633cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectis moved onto the end cursor to effectively ignore the blanks
7634cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectpreceding tokens.  Comments would be treated equally.
7635cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7636cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@comment file: calc++-scanner.ll
7637cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
7638cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@{
7639cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define YY_USER_ACTION  yylloc->columns (yyleng);
7640cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@}
7641cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%%
7642cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@{
7643cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  yylloc->step ();
7644cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@}
7645cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{blank@}+   yylloc->step ();
7646cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[\n]+      yylloc->lines (yyleng); yylloc->step ();
7647cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
7648cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7649cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
7650cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe rules are simple, just note the use of the driver to report errors.
7651cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIt is convenient to use a typedef to shorten
7652cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yy::calcxx_parser::token::identifier} into
7653cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{token::identifier} for instance.
7654cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7655cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@comment file: calc++-scanner.ll
7656cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
7657cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@{
7658cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  typedef yy::calcxx_parser::token token;
7659cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@}
7660cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project           /* Convert ints to the actual type of tokens.  */
7661cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project[-+*/]     return yy::calcxx_parser::token_type (yytext[0]);
7662cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project":="       return token::ASSIGN;
7663cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{int@}      @{
7664cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  errno = 0;
7665cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  long n = strtol (yytext, NULL, 10);
7666cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (! (INT_MIN <= n && n <= INT_MAX && errno != ERANGE))
7667cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    driver.error (*yylloc, "integer is out of range");
7668cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  yylval->ival = n;
7669cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return token::NUMBER;
7670cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
7671cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{id@}       yylval->sval = new std::string (yytext); return token::IDENTIFIER;
7672cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project.          driver.error (*yylloc, "invalid character");
7673cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%%
7674cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
7675cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7676cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
7677cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFinally, because the scanner related driver's member function depend
7678cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecton the scanner's data, it is simpler to implement them in this file.
7679cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7680cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@comment file: calc++-scanner.ll
7681cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
7682cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
7683cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcalcxx_driver::scan_begin ()
7684cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
7685cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  yy_flex_debug = trace_scanning;
7686cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (!(yyin = fopen (file.c_str (), "r")))
7687cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    error (std::string ("cannot open ") + file);
7688cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
7689cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7690cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
7691cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcalcxx_driver::scan_end ()
7692cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
7693cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fclose (yyin);
7694cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
7695cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
7696cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7697cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Calc++ Top Level
7698cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@subsection Calc++ Top Level
7699cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7700cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe top level file, @file{calc++.cc}, poses no problem.
7701cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7702cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@comment file: calc++.cc
7703cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
7704cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <iostream>
7705cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "calc++-driver.hh"
7706cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7707cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint
7708cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmain (int argc, char *argv[])
7709cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@{
7710cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  calcxx_driver driver;
7711cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (++argv; argv[0]; ++argv)
7712cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    if (*argv == std::string ("-p"))
7713cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      driver.trace_parsing = true;
7714cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    else if (*argv == std::string ("-s"))
7715cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      driver.trace_scanning = true;
7716cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    else
7717cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      @{
7718cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	driver.parse (*argv);
7719cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	std::cout << driver.result << std::endl;
7720cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      @}
7721cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@}
7722cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
7723cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7724cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c ================================================= FAQ
7725cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7726cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node FAQ
7727cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@chapter Frequently Asked Questions
7728cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex frequently asked questions
7729cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex questions
7730cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7731cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSeveral questions about Bison come up occasionally.  Here some of them
7732cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectare addressed.
7733cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7734cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@menu
7735cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Memory Exhausted::            Breaking the Stack Limits
7736cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* How Can I Reset the Parser::  @code{yyparse} Keeps some State
7737cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Strings are Destroyed::       @code{yylval} Loses Track of Strings
7738cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Implementing Gotos/Loops::    Control Flow in the Calculator
7739cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Multiple start-symbols::      Factoring closely related grammars
7740cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Secure?  Conform?::           Is Bison @acronym{POSIX} safe?
7741cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* I can't build Bison::         Troubleshooting
7742cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Where can I find help?::      Troubleshouting
7743cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Bug Reports::                 Troublereporting
7744cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Other Languages::             Parsers in Java and others
7745cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Beta Testing::                Experimenting development versions
7746cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* Mailing Lists::               Meeting other Bison users
7747cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end menu
7748cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7749cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Memory Exhausted
7750cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Memory Exhausted
7751cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7752cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@display
7753cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectMy parser returns with error with a @samp{memory exhausted}
7754cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmessage.  What can I do?
7755cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end display
7756cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7757cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis question is already addressed elsewhere, @xref{Recursion,
7758cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project,Recursive Rules}.
7759cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7760cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node How Can I Reset the Parser
7761cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section How Can I Reset the Parser
7762cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7763cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe following phenomenon has several symptoms, resulting in the
7764cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfollowing typical questions:
7765cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7766cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@display
7767cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectI invoke @code{yyparse} several times, and on correct input it works
7768cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectproperly; but when a parse error is found, all the other calls fail
7769cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttoo.  How can I reset the error flag of @code{yyparse}?
7770cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end display
7771cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7772cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
7773cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projector
7774cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7775cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@display
7776cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectMy parser includes support for an @samp{#include}-like feature, in
7777cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwhich case I run @code{yyparse} from @code{yyparse}.  This fails
7778cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectalthough I did specify I needed a @code{%pure-parser}.
7779cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end display
7780cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7781cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThese problems typically come not from Bison itself, but from
7782cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectLex-generated scanners.  Because these scanners use large buffers for
7783cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectspeed, they might not notice a change of input file.  As a
7784cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdemonstration, consider the following source file,
7785cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@file{first-line.l}:
7786cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7787cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@verbatim
7788cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%{
7789cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <stdio.h>
7790cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <stdlib.h>
7791cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%}
7792cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%%
7793cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project.*\n    ECHO; return 1;
7794cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%%
7795cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint
7796cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectyyparse (char const *file)
7797cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
7798cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  yyin = fopen (file, "r");
7799cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (!yyin)
7800cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exit (2);
7801cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* One token only.  */
7802cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  yylex ();
7803cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (fclose (yyin) != 0)
7804cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exit (3);
7805cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return 0;
7806cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
7807cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7808cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint
7809cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmain (void)
7810cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
7811cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  yyparse ("input");
7812cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  yyparse ("input");
7813cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return 0;
7814cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
7815cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end verbatim
7816cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7817cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
7818cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf the file @file{input} contains
7819cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7820cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@verbatim
7821cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinput:1: Hello,
7822cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinput:2: World!
7823cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end verbatim
7824cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7825cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
7826cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthen instead of getting the first line twice, you get:
7827cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7828cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
7829cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project$ @kbd{flex -ofirst-line.c first-line.l}
7830cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project$ @kbd{gcc  -ofirst-line   first-line.c -ll}
7831cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project$ @kbd{./first-line}
7832cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinput:1: Hello,
7833cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinput:2: World!
7834cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
7835cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7836cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTherefore, whenever you change @code{yyin}, you must tell the
7837cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectLex-generated scanner to discard its current buffer and switch to the
7838cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnew one.  This depends upon your implementation of Lex; see its
7839cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdocumentation for more.  For Flex, it suffices to call
7840cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{YY_FLUSH_BUFFER} after each change to @code{yyin}.  If your
7841cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFlex-generated scanner needs to read from several input streams to
7842cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthandle features like include files, you might consider using Flex
7843cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfunctions like @samp{yy_switch_to_buffer} that manipulate multiple
7844cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinput buffers.
7845cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7846cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf your Flex-generated scanner uses start conditions (@pxref{Start
7847cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectconditions, , Start conditions, flex, The Flex Manual}), you might
7848cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectalso want to reset the scanner's state, i.e., go back to the initial
7849cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstart condition, through a call to @samp{BEGIN (0)}.
7850cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7851cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Strings are Destroyed
7852cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Strings are Destroyed
7853cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7854cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@display
7855cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectMy parser seems to destroy old strings, or maybe it loses track of
7856cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthem.  Instead of reporting @samp{"foo", "bar"}, it reports
7857cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{"bar", "bar"}, or even @samp{"foo\nbar", "bar"}.
7858cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end display
7859cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7860cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis error is probably the single most frequent ``bug report'' sent to
7861cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison lists, but is only concerned with a misunderstanding of the role
7862cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectof the scanner.  Consider the following Lex code:
7863cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7864cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@verbatim
7865cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%{
7866cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <stdio.h>
7867cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectchar *yylval = NULL;
7868cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%}
7869cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%%
7870cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project.*    yylval = yytext; return 1;
7871cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project\n    /* IGNORE */
7872cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%%
7873cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint
7874cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmain ()
7875cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
7876cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Similar to using $1, $2 in a Bison action.  */
7877cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  char *fst = (yylex (), yylval);
7878cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  char *snd = (yylex (), yylval);
7879cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  printf ("\"%s\", \"%s\"\n", fst, snd);
7880cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return 0;
7881cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
7882cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end verbatim
7883cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7884cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf you compile and run this code, you get:
7885cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7886cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
7887cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project$ @kbd{flex -osplit-lines.c split-lines.l}
7888cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project$ @kbd{gcc  -osplit-lines   split-lines.c -ll}
7889cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project$ @kbd{printf 'one\ntwo\n' | ./split-lines}
7890cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project"one
7891cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttwo", "two"
7892cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
7893cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7894cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@noindent
7895cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthis is because @code{yytext} is a buffer provided for @emph{reading}
7896cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectin the action, but if you want to keep it, you have to duplicate it
7897cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(e.g., using @code{strdup}).  Note that the output may depend on how
7898cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectyour implementation of Lex handles @code{yytext}.  For instance, when
7899cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgiven the Lex compatibility option @option{-l} (which triggers the
7900cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectoption @samp{%array}) Flex generates a different behavior:
7901cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7902cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
7903cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project$ @kbd{flex -l -osplit-lines.c split-lines.l}
7904cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project$ @kbd{gcc     -osplit-lines   split-lines.c -ll}
7905cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project$ @kbd{printf 'one\ntwo\n' | ./split-lines}
7906cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project"two", "two"
7907cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
7908cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7909cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7910cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Implementing Gotos/Loops
7911cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Implementing Gotos/Loops
7912cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7913cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@display
7914cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectMy simple calculator supports variables, assignments, and functions,
7915cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbut how can I implement gotos, or loops?
7916cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end display
7917cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7918cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAlthough very pedagogical, the examples included in the document blur
7919cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe distinction to make between the parser---whose job is to recover
7920cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe structure of a text and to transmit it to subsequent modules of
7921cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe program---and the processing (such as the execution) of this
7922cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstructure.  This works well with so called straight line programs,
7923cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecti.e., precisely those that have a straightforward execution model:
7924cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexecute simple instructions one after the others.
7925cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7926cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex abstract syntax tree
7927cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex @acronym{AST}
7928cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf you want a richer model, you will probably need to use the parser
7929cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectto construct a tree that does represent the structure it has
7930cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrecovered; this tree is usually called the @dfn{abstract syntax tree},
7931cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projector @dfn{@acronym{AST}} for short.  Then, walking through this tree,
7932cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttraversing it in various ways, will enable treatments such as its
7933cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexecution or its translation, which will result in an interpreter or a
7934cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcompiler.
7935cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7936cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis topic is way beyond the scope of this manual, and the reader is
7937cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinvited to consult the dedicated literature.
7938cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7939cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7940cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Multiple start-symbols
7941cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Multiple start-symbols
7942cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7943cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@display
7944cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectI have several closely related grammars, and I would like to share their
7945cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectimplementations.  In fact, I could use a single grammar but with
7946cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmultiple entry points.
7947cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end display
7948cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7949cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison does not support multiple start-symbols, but there is a very
7950cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsimple means to simulate them.  If @code{foo} and @code{bar} are the two
7951cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectpseudo start-symbols, then introduce two new tokens, say
7952cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{START_FOO} and @code{START_BAR}, and use them as switches from the
7953cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectreal start-symbol:
7954cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7955cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
7956cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%token START_FOO START_BAR;
7957cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%start start;
7958cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstart: START_FOO foo
7959cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     | START_BAR bar;
7960cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
7961cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7962cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThese tokens prevents the introduction of new conflicts.  As far as the
7963cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparser goes, that is all that is needed.
7964cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7965cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectNow the difficult part is ensuring that the scanner will send these
7966cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttokens first.  If your scanner is hand-written, that should be
7967cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstraightforward.  If your scanner is generated by Lex, them there is
7968cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsimple means to do it: recall that anything between @samp{%@{ ... %@}}
7969cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectafter the first @code{%%} is copied verbatim in the top of the generated
7970cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yylex} function.  Make sure a variable @code{start_token} is
7971cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectavailable in the scanner (e.g., a global variable or using
7972cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{%lex-param} etc.), and use the following:
7973cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7974cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@example
7975cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* @r{Prologue.}  */
7976cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%%
7977cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@{
7978cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (start_token)
7979cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    @{
7980cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      int t = start_token;
7981cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      start_token = 0;
7982cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      return t;
7983cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    @}
7984cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%@}
7985cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* @r{The rules.}  */
7986cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end example
7987cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7988cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7989cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Secure?  Conform?
7990cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Secure?  Conform?
7991cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7992cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@display
7993cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIs Bison secure?  Does it conform to POSIX?
7994cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end display
7995cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7996cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf you're looking for a guarantee or certification, we don't provide it.
7997cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHowever, Bison is intended to be a reliable program that conforms to the
7998cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@acronym{POSIX} specification for Yacc.  If you run into problems,
7999cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectplease send us a bug report.
8000cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8001cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node I can't build Bison
8002cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section I can't build Bison
8003cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8004cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@display
8005cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectI can't build Bison because @command{make} complains that
8006cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{msgfmt} is not found.
8007cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhat should I do?
8008cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end display
8009cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8010cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectLike most GNU packages with internationalization support, that feature
8011cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectis turned on by default.  If you have problems building in the @file{po}
8012cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsubdirectory, it indicates that your system's internationalization
8013cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsupport is lacking.  You can re-configure Bison with
8014cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@option{--disable-nls} to turn off this support, or you can install GNU
8015cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgettext from @url{ftp://ftp.gnu.org/gnu/gettext/} and re-configure
8016cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison.  See the file @file{ABOUT-NLS} for more information.
8017cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8018cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8019cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Where can I find help?
8020cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Where can I find help?
8021cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8022cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@display
8023cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectI'm having trouble using Bison.  Where can I find help?
8024cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end display
8025cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8026cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFirst, read this fine manual.  Beyond that, you can send mail to
8027cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@email{help-bison@@gnu.org}.  This mailing list is intended to be
8028cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectpopulated with people who are willing to answer questions about using
8029cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectand installing Bison.  Please keep in mind that (most of) the people on
8030cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe list have aspects of their lives which are not related to Bison (!),
8031cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectso you may not receive an answer to your question right away.  This can
8032cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbe frustrating, but please try not to honk them off; remember that any
8033cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthelp they provide is purely voluntary and out of the kindness of their
8034cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthearts.
8035cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8036cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Bug Reports
8037cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Bug Reports
8038cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8039cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@display
8040cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectI found a bug.  What should I include in the bug report?
8041cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end display
8042cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8043cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBefore you send a bug report, make sure you are using the latest
8044cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectversion.  Check @url{ftp://ftp.gnu.org/pub/gnu/bison/} or one of its
8045cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmirrors.  Be sure to include the version number in your bug report.  If
8046cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe bug is present in the latest version but not in a previous version,
8047cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttry to determine the most recent version which did not contain the bug.
8048cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8049cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf the bug is parser-related, you should include the smallest grammar
8050cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectyou can which demonstrates the bug.  The grammar file should also be
8051cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcomplete (i.e., I should be able to run it through Bison without having
8052cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectto edit or add anything).  The smaller and simpler the grammar, the
8053cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecteasier it will be to fix the bug.
8054cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8055cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectInclude information about your compilation environment, including your
8056cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectoperating system's name and version and your compiler's name and
8057cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectversion.  If you have trouble compiling, you should also include a
8058cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttranscript of the build session, starting with the invocation of
8059cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`configure'.  Depending on the nature of the bug, you may be asked to
8060cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsend additional files as well (such as `config.h' or `config.cache').
8061cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8062cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectPatches are most welcome, but not required.  That is, do not hesitate to
8063cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsend a bug report just because you can not provide a fix.
8064cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8065cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSend bug reports to @email{bug-bison@@gnu.org}.
8066cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8067cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Other Languages
8068cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Other Languages
8069cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8070cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@display
8071cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWill Bison ever have C++ support?  How about Java or @var{insert your
8072cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfavorite language here}?
8073cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end display
8074cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8075cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectC++ support is there now, and is documented.  We'd love to add other
8076cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlanguages; contributions are welcome.
8077cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8078cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Beta Testing
8079cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Beta Testing
8080cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8081cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@display
8082cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhat is involved in being a beta tester?
8083cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end display
8084cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8085cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIt's not terribly involved.  Basically, you would download a test
8086cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrelease, compile it, and use it to build and run a parser or two.  After
8087cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthat, you would submit either a bug report or a message saying that
8088cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecteverything is okay.  It is important to report successes as well as
8089cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfailures because test releases eventually become mainstream releases,
8090cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbut only if they are adequately tested.  If no one tests, development is
8091cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectessentially halted.
8092cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8093cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBeta testers are particularly needed for operating systems to which the
8094cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdevelopers do not have easy access.  They currently have easy access to
8095cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrecent GNU/Linux and Solaris versions.  Reports about other operating
8096cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsystems are especially welcome.
8097cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8098cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Mailing Lists
8099cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@section Mailing Lists
8100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@display
8102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectHow do I join the help-bison and bug-bison mailing lists?
8103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end display
8104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSee @url{http://lists.gnu.org/}.
8106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c ================================================= Table of Symbols
8108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Table of Symbols
8110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@appendix Bison Symbols
8111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex Bison symbols, table of
8112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex symbols in Bison, table of
8113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Variable} @@$
8115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn an action, the location of the left-hand side of the rule.
8116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Locations, , Locations Overview}.
8117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Variable} @@@var{n}
8120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn an action, the location of the @var{n}-th symbol of the right-hand
8121cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectside of the rule.  @xref{Locations, , Locations Overview}.
8122cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8123cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8124cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Variable} $$
8125cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn an action, the semantic value of the left-hand side of the rule.
8126cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Actions}.
8127cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8129cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Variable} $@var{n}
8130cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn an action, the semantic value of the @var{n}-th symbol of the
8131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectright-hand side of the rule.  @xref{Actions}.
8132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8133cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8134cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Delimiter} %%
8135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDelimiter used to separate the grammar rule section from the
8136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison declarations section or the epilogue.
8137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Grammar Layout, ,The Overall Layout of a Bison Grammar}.
8138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8140cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c Don't insert spaces, or check the DVI output.
8141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Delimiter} %@{@var{code}%@}
8142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAll code listed between @samp{%@{} and @samp{%@}} is copied directly to
8143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe output file uninterpreted.  Such code forms the prologue of the input
8144cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfile.  @xref{Grammar Outline, ,Outline of a Bison
8145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectGrammar}.
8146cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8147cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8148cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Construct} /*@dots{}*/
8149cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectComment delimiters, as in C.
8150cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8151cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Delimiter} :
8153cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSeparates a rule's result from its components.  @xref{Rules, ,Syntax of
8154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectGrammar Rules}.
8155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Delimiter} ;
8158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTerminates a rule.  @xref{Rules, ,Syntax of Grammar Rules}.
8159cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Delimiter} |
8162cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSeparates alternate rules for the same result nonterminal.
8163cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Rules, ,Syntax of Grammar Rules}.
8164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Symbol} $accept
8167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe predefined nonterminal whose only rule is @samp{$accept: @var{start}
8168cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project$end}, where @var{start} is the start symbol.  @xref{Start Decl, , The
8169cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectStart-Symbol}.  It cannot be used in the grammar.
8170cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8171cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8172cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %debug
8173cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectEquip the parser for debugging.  @xref{Decl Summary}.
8174cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8175cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8176cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@ifset defaultprec
8177cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %default-prec
8178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAssign a precedence to rules that lack an explicit @samp{%prec}
8179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmodifier.  @xref{Contextual Precedence, ,Context-Dependent
8180cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectPrecedence}.
8181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8182cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end ifset
8183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %defines
8185cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison declaration to create a header file meant for the scanner.
8186cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Decl Summary}.
8187cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8188cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8189cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %destructor
8190cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSpecify how the parser should reclaim the memory associated to
8191cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdiscarded symbols.  @xref{Destructor Decl, , Freeing Discarded Symbols}.
8192cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8193cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8194cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %dprec
8195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison declaration to assign a precedence to a rule that is used at parse
8196cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttime to resolve reduce/reduce conflicts.  @xref{GLR Parsers, ,Writing
8197cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@acronym{GLR} Parsers}.
8198cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8199cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8200cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Symbol} $end
8201cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe predefined token marking the end of the token stream.  It cannot be
8202cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectused in the grammar.
8203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8204cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8205cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Symbol} error
8206cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA token name reserved for error recovery.  This token may be used in
8207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgrammar rules so as to allow the Bison parser to recognize an error in
8208cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe grammar without halting the process.  In effect, a sentence
8209cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcontaining an error may be recognized as valid.  On a syntax error, the
8210cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttoken @code{error} becomes the current look-ahead token.  Actions
8211cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcorresponding to @code{error} are then executed, and the look-ahead
8212cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttoken is reset to the token that originally caused the violation.
8213cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Error Recovery}.
8214cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8215cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8216cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %error-verbose
8217cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison declaration to request verbose, specific error message strings
8218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwhen @code{yyerror} is called.
8219cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8220cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8221cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %file-prefix="@var{prefix}"
8222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison declaration to set the prefix of the output files.  @xref{Decl
8223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSummary}.
8224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8225cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8226cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %glr-parser
8227cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison declaration to produce a @acronym{GLR} parser.  @xref{GLR
8228cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectParsers, ,Writing @acronym{GLR} Parsers}.
8229cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8230cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %initial-action
8232cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectRun user code before parsing.  @xref{Initial Action Decl, , Performing Actions before Parsing}.
8233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %left
8236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison declaration to assign left associativity to token(s).
8237cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Precedence Decl, ,Operator Precedence}.
8238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8239cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %lex-param @{@var{argument-declaration}@}
8241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison declaration to specifying an additional parameter that
8242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yylex} should accept.  @xref{Pure Calling,, Calling Conventions
8243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfor Pure Parsers}.
8244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %merge
8247cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison declaration to assign a merging function to a rule.  If there is a
8248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectreduce/reduce conflict with a rule having the same merging function, the
8249cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfunction is applied to the two semantic values to get a single result.
8250cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{GLR Parsers, ,Writing @acronym{GLR} Parsers}.
8251cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8252cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8253cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %name-prefix="@var{prefix}"
8254cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison declaration to rename the external symbols.  @xref{Decl Summary}.
8255cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8256cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8257cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@ifset defaultprec
8258cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %no-default-prec
8259cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDo not assign a precedence to rules that lack an explicit @samp{%prec}
8260cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmodifier.  @xref{Contextual Precedence, ,Context-Dependent
8261cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectPrecedence}.
8262cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8263cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end ifset
8264cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8265cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %no-lines
8266cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison declaration to avoid generating @code{#line} directives in the
8267cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparser file.  @xref{Decl Summary}.
8268cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8269cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8270cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %nonassoc
8271cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison declaration to assign nonassociativity to token(s).
8272cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Precedence Decl, ,Operator Precedence}.
8273cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8274cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8275cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %output="@var{file}"
8276cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison declaration to set the name of the parser file.  @xref{Decl
8277cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSummary}.
8278cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8279cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8280cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %parse-param @{@var{argument-declaration}@}
8281cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison declaration to specifying an additional parameter that
8282cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yyparse} should accept.  @xref{Parser Function,, The Parser
8283cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFunction @code{yyparse}}.
8284cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8285cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8286cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %prec
8287cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison declaration to assign a precedence to a specific rule.
8288cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Contextual Precedence, ,Context-Dependent Precedence}.
8289cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8290cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8291cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %pure-parser
8292cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison declaration to request a pure (reentrant) parser.
8293cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Pure Decl, ,A Pure (Reentrant) Parser}.
8294cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8295cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8296cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %require "@var{version}"
8297cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectRequire version @var{version} or higher of Bison.  @xref{Require Decl, ,
8298cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectRequire a Version of Bison}.
8299cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8300cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8301cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %right
8302cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison declaration to assign right associativity to token(s).
8303cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Precedence Decl, ,Operator Precedence}.
8304cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8305cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8306cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %start
8307cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison declaration to specify the start symbol.  @xref{Start Decl, ,The
8308cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectStart-Symbol}.
8309cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8310cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8311cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %token
8312cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison declaration to declare token(s) without specifying precedence.
8313cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Token Decl, ,Token Type Names}.
8314cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8315cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8316cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %token-table
8317cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison declaration to include a token name table in the parser file.
8318cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Decl Summary}.
8319cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8320cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8321cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %type
8322cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison declaration to declare nonterminals.  @xref{Type Decl,
8323cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project,Nonterminal Symbols}.
8324cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8325cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8326cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Symbol} $undefined
8327cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe predefined token onto which all undefined values returned by
8328cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yylex} are mapped.  It cannot be used in the grammar, rather, use
8329cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{error}.
8330cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8331cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8332cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Directive} %union
8333cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBison declaration to specify several possible data types for semantic
8334cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvalues.  @xref{Union Decl, ,The Collection of Value Types}.
8335cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8336cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8337cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Macro} YYABORT
8338cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectMacro to pretend that an unrecoverable syntax error has occurred, by
8339cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmaking @code{yyparse} return 1 immediately.  The error reporting
8340cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfunction @code{yyerror} is not called.  @xref{Parser Function, ,The
8341cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectParser Function @code{yyparse}}.
8342cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8343cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8344cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Macro} YYACCEPT
8345cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectMacro to pretend that a complete utterance of the language has been
8346cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectread, by making @code{yyparse} return 0 immediately.
8347cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Parser Function, ,The Parser Function @code{yyparse}}.
8348cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8349cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8350cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Macro} YYBACKUP
8351cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectMacro to discard a value from the parser stack and fake a look-ahead
8352cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttoken.  @xref{Action Features, ,Special Features for Use in Actions}.
8353cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8354cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8355cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Variable} yychar
8356cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectExternal integer variable that contains the integer value of the
8357cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlook-ahead token.  (In a pure parser, it is a local variable within
8358cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yyparse}.)  Error-recovery rule actions may examine this variable.
8359cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Action Features, ,Special Features for Use in Actions}.
8360cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8361cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8362cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Variable} yyclearin
8363cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectMacro used in error-recovery rule actions.  It clears the previous
8364cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlook-ahead token.  @xref{Error Recovery}.
8365cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8366cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8367cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Macro} YYDEBUG
8368cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectMacro to define to equip the parser with tracing code.  @xref{Tracing,
8369cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project,Tracing Your Parser}.
8370cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8371cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8372cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Variable} yydebug
8373cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectExternal integer variable set to zero by default.  If @code{yydebug}
8374cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectis given a nonzero value, the parser will output information on input
8375cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsymbols and parser action.  @xref{Tracing, ,Tracing Your Parser}.
8376cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8377cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8378cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Macro} yyerrok
8379cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectMacro to cause parser to recover immediately to its normal mode
8380cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectafter a syntax error.  @xref{Error Recovery}.
8381cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8382cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8383cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Macro} YYERROR
8384cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectMacro to pretend that a syntax error has just been detected: call
8385cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yyerror} and then perform normal error recovery if possible
8386cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(@pxref{Error Recovery}), or (if recovery is impossible) make
8387cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yyparse} return 1.  @xref{Error Recovery}.
8388cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8389cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8390cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Function} yyerror
8391cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectUser-supplied function to be called by @code{yyparse} on error.
8392cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Error Reporting, ,The Error
8393cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectReporting Function @code{yyerror}}.
8394cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8395cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8396cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Macro} YYERROR_VERBOSE
8397cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAn obsolete macro that you define with @code{#define} in the prologue
8398cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectto request verbose, specific error message strings
8399cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwhen @code{yyerror} is called.  It doesn't matter what definition you
8400cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectuse for @code{YYERROR_VERBOSE}, just whether you define it.  Using
8401cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{%error-verbose} is preferred.
8402cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8403cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8404cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Macro} YYINITDEPTH
8405cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectMacro for specifying the initial size of the parser stack.
8406cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Memory Management}.
8407cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8408cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8409cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Function} yylex
8410cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectUser-supplied lexical analyzer function, called with no arguments to get
8411cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe next token.  @xref{Lexical, ,The Lexical Analyzer Function
8412cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yylex}}.
8413cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8414cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8415cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Macro} YYLEX_PARAM
8416cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAn obsolete macro for specifying an extra argument (or list of extra
8417cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectarguments) for @code{yyparse} to pass to @code{yylex}.  The use of this
8418cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmacro is deprecated, and is supported only for Yacc like parsers.
8419cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Pure Calling,, Calling Conventions for Pure Parsers}.
8420cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8421cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8422cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Variable} yylloc
8423cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectExternal variable in which @code{yylex} should place the line and column
8424cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnumbers associated with a token.  (In a pure parser, it is a local
8425cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvariable within @code{yyparse}, and its address is passed to
8426cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yylex}.)
8427cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectYou can ignore this variable if you don't use the @samp{@@} feature in the
8428cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgrammar actions.
8429cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Token Locations, ,Textual Locations of Tokens}.
8430cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn semantic actions, it stores the location of the look-ahead token.
8431cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Actions and Locations, ,Actions and Locations}.
8432cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8433cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8434cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Type} YYLTYPE
8435cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectData type of @code{yylloc}; by default, a structure with four
8436cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmembers.  @xref{Location Type, , Data Types of Locations}.
8437cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8438cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8439cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Variable} yylval
8440cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectExternal variable in which @code{yylex} should place the semantic
8441cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvalue associated with a token.  (In a pure parser, it is a local
8442cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvariable within @code{yyparse}, and its address is passed to
8443cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yylex}.)
8444cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Token Values, ,Semantic Values of Tokens}.
8445cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn semantic actions, it stores the semantic value of the look-ahead token.
8446cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Actions, ,Actions}.
8447cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8448cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8449cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Macro} YYMAXDEPTH
8450cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectMacro for specifying the maximum size of the parser stack.  @xref{Memory
8451cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectManagement}.
8452cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8453cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8454cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Variable} yynerrs
8455cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectGlobal variable which Bison increments each time it reports a syntax error.
8456cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project(In a pure parser, it is a local variable within @code{yyparse}.)
8457cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Error Reporting, ,The Error Reporting Function @code{yyerror}}.
8458cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8459cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8460cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Function} yyparse
8461cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe parser function produced by Bison; call this function to start
8462cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparsing.  @xref{Parser Function, ,The Parser Function @code{yyparse}}.
8463cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8464cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8465cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Macro} YYPARSE_PARAM
8466cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAn obsolete macro for specifying the name of a parameter that
8467cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{yyparse} should accept.  The use of this macro is deprecated, and
8468cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectis supported only for Yacc like parsers.  @xref{Pure Calling,, Calling
8469cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectConventions for Pure Parsers}.
8470cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8471cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8472cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Macro} YYRECOVERING
8473cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe expression @code{YYRECOVERING ()} yields 1 when the parser
8474cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectis recovering from a syntax error, and 0 otherwise.
8475cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Action Features, ,Special Features for Use in Actions}.
8476cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8477cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8478cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Macro} YYSTACK_USE_ALLOCA
8479cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectMacro used to control the use of @code{alloca} when the C
8480cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@acronym{LALR}(1) parser needs to extend its stacks.  If defined to 0,
8481cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe parser will use @code{malloc} to extend its stacks.  If defined to
8482cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project1, the parser will use @code{alloca}.  Values other than 0 and 1 are
8483cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectreserved for future Bison extensions.  If not defined,
8484cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{YYSTACK_USE_ALLOCA} defaults to 0.
8485cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8486cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn the all-too-common case where your code may run on a host with a
8487cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlimited stack and with unreliable stack-overflow checking, you should
8488cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectset @code{YYMAXDEPTH} to a value that cannot possibly result in
8489cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectunchecked stack overflow on any of your target hosts when
8490cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@code{alloca} is called.  You can inspect the code that Bison
8491cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgenerates in order to determine the proper numeric values.  This will
8492cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrequire some expertise in low-level implementation details.
8493cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8494cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8495cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@deffn {Type} YYSTYPE
8496cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectData type of semantic values; @code{int} by default.
8497cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Value Type, ,Data Types of Semantic Values}.
8498cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end deffn
8499cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8500cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Glossary
8501cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@appendix Glossary
8502cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@cindex glossary
8503cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8504cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@table @asis
8505cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item Backus-Naur Form (@acronym{BNF}; also called ``Backus Normal Form'')
8506cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFormal method of specifying context-free grammars originally proposed
8507cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectby John Backus, and slightly improved by Peter Naur in his 1960-01-02
8508cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcommittee document contributing to what became the Algol 60 report.
8509cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Language and Grammar, ,Languages and Context-Free Grammars}.
8510cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8511cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item Context-free grammars
8512cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectGrammars specified as rules that can be applied regardless of context.
8513cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThus, if there is a rule which says that an integer can be used as an
8514cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexpression, integers are allowed @emph{anywhere} an expression is
8515cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectpermitted.  @xref{Language and Grammar, ,Languages and Context-Free
8516cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectGrammars}.
8517cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8518cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item Dynamic allocation
8519cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAllocation of memory that occurs during execution, rather than at
8520cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcompile time or on entry to a function.
8521cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8522cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item Empty string
8523cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAnalogous to the empty set in set theory, the empty string is a
8524cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcharacter string of length zero.
8525cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8526cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item Finite-state stack machine
8527cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA ``machine'' that has discrete states in which it is said to exist at
8528cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecteach instant in time.  As input to the machine is processed, the
8529cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmachine moves from state to state as specified by the logic of the
8530cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmachine.  In the case of the parser, the input is the language being
8531cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectparsed, and the states correspond to various stages in the grammar
8532cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrules.  @xref{Algorithm, ,The Bison Parser Algorithm}.
8533cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8534cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item Generalized @acronym{LR} (@acronym{GLR})
8535cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA parsing algorithm that can handle all context-free grammars, including those
8536cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthat are not @acronym{LALR}(1).  It resolves situations that Bison's
8537cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectusual @acronym{LALR}(1)
8538cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectalgorithm cannot by effectively splitting off multiple parsers, trying all
8539cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectpossible parsers, and discarding those that fail in the light of additional
8540cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectright context.  @xref{Generalized LR Parsing, ,Generalized
8541cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@acronym{LR} Parsing}.
8542cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8543cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item Grouping
8544cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA language construct that is (in general) grammatically divisible;
8545cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfor example, `expression' or `declaration' in C@.
8546cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Language and Grammar, ,Languages and Context-Free Grammars}.
8547cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8548cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item Infix operator
8549cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAn arithmetic operator that is placed between the operands on which it
8550cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectperforms some operation.
8551cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8552cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item Input stream
8553cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA continuous flow of data between devices or programs.
8554cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8555cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item Language construct
8556cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectOne of the typical usage schemas of the language.  For example, one of
8557cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe constructs of the C language is the @code{if} statement.
8558cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Language and Grammar, ,Languages and Context-Free Grammars}.
8559cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8560cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item Left associativity
8561cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectOperators having left associativity are analyzed from left to right:
8562cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{a+b+c} first computes @samp{a+b} and then combines with
8563cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@samp{c}.  @xref{Precedence, ,Operator Precedence}.
8564cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8565cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item Left recursion
8566cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA rule whose result symbol is also its first component symbol; for
8567cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexample, @samp{expseq1 : expseq1 ',' exp;}.  @xref{Recursion, ,Recursive
8568cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectRules}.
8569cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8570cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item Left-to-right parsing
8571cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectParsing a sentence of a language by analyzing it token by token from
8572cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectleft to right.  @xref{Algorithm, ,The Bison Parser Algorithm}.
8573cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8574cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item Lexical analyzer (scanner)
8575cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA function that reads an input stream and returns tokens one by one.
8576cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Lexical, ,The Lexical Analyzer Function @code{yylex}}.
8577cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8578cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item Lexical tie-in
8579cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA flag, set by actions in the grammar rules, which alters the way
8580cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttokens are parsed.  @xref{Lexical Tie-ins}.
8581cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8582cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item Literal string token
8583cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA token which consists of two or more fixed characters.  @xref{Symbols}.
8584cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8585cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item Look-ahead token
8586cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA token already read but not yet shifted.  @xref{Look-Ahead, ,Look-Ahead
8587cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTokens}.
8588cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8589cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item @acronym{LALR}(1)
8590cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe class of context-free grammars that Bison (like most other parser
8591cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgenerators) can handle; a subset of @acronym{LR}(1).  @xref{Mystery
8592cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectConflicts, ,Mysterious Reduce/Reduce Conflicts}.
8593cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8594cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item @acronym{LR}(1)
8595cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe class of context-free grammars in which at most one token of
8596cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlook-ahead is needed to disambiguate the parsing of any piece of input.
8597cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8598cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item Nonterminal symbol
8599cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA grammar symbol standing for a grammatical construct that can
8600cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbe expressed through rules in terms of smaller constructs; in other
8601cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwords, a construct that is not a token.  @xref{Symbols}.
8602cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8603cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item Parser
8604cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA function that recognizes valid sentences of a language by analyzing
8605cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe syntax structure of a set of tokens passed to it from a lexical
8606cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectanalyzer.
8607cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8608cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item Postfix operator
8609cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAn arithmetic operator that is placed after the operands upon which it
8610cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectperforms some operation.
8611cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8612cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item Reduction
8613cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectReplacing a string of nonterminals and/or terminals with a single
8614cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnonterminal, according to a grammar rule.  @xref{Algorithm, ,The Bison
8615cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectParser Algorithm}.
8616cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8617cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item Reentrant
8618cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA reentrant subprogram is a subprogram which can be in invoked any
8619cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnumber of times in parallel, without interference between the various
8620cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinvocations.  @xref{Pure Decl, ,A Pure (Reentrant) Parser}.
8621cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8622cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item Reverse polish notation
8623cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA language in which all operators are postfix operators.
8624cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8625cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item Right recursion
8626cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA rule whose result symbol is also its last component symbol; for
8627cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectexample, @samp{expseq1: exp ',' expseq1;}.  @xref{Recursion, ,Recursive
8628cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectRules}.
8629cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8630cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item Semantics
8631cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn computer languages, the semantics are specified by the actions
8632cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttaken for each instance of the language, i.e., the meaning of
8633cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecteach statement.  @xref{Semantics, ,Defining Language Semantics}.
8634cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8635cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item Shift
8636cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA parser is said to shift when it makes the choice of analyzing
8637cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfurther input from the stream rather than reducing immediately some
8638cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectalready-recognized rule.  @xref{Algorithm, ,The Bison Parser Algorithm}.
8639cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8640cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item Single-character literal
8641cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA single character that is recognized and interpreted as is.
8642cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Grammar in Bison, ,From Formal Rules to Bison Input}.
8643cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8644cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item Start symbol
8645cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe nonterminal symbol that stands for a complete valid utterance in
8646cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe language being parsed.  The start symbol is usually listed as the
8647cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfirst nonterminal symbol in a language specification.
8648cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Start Decl, ,The Start-Symbol}.
8649cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8650cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item Symbol table
8651cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA data structure where symbol names and associated data are stored
8652cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectduring parsing to allow for recognition and use of existing
8653cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinformation in repeated uses of a symbol.  @xref{Multi-function Calc}.
8654cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8655cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item Syntax error
8656cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAn error encountered during parsing of an input stream due to invalid
8657cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsyntax.  @xref{Error Recovery}.
8658cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8659cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item Token
8660cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA basic, grammatically indivisible unit of a language.  The symbol
8661cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthat describes a token in the grammar is a terminal symbol.
8662cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe input of the Bison parser is a stream of tokens which comes from
8663cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe lexical analyzer.  @xref{Symbols}.
8664cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8665cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@item Terminal symbol
8666cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA grammar symbol that has no rules in the grammar and therefore is
8667cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgrammatically indivisible.  The piece of text it represents is a token.
8668cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@xref{Language and Grammar, ,Languages and Context-Free Grammars}.
8669cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end table
8670cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8671cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Copying This Manual
8672cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@appendix Copying This Manual
8673cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8674cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@menu
8675cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project* GNU Free Documentation License::  License for copying this manual.
8676cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@end menu
8677cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8678cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@include fdl.texi
8679cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8680cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@node Index
8681cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@unnumbered Index
8682cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8683cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@printindex cp
8684cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8685cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@bye
8686cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8687cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c LocalWords: texinfo setfilename settitle setchapternewpage finalout
8688cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c LocalWords: ifinfo smallbook shorttitlepage titlepage GPL FIXME iftex
8689cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c LocalWords: akim fn cp syncodeindex vr tp synindex dircategory direntry
8690cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c LocalWords: ifset vskip pt filll insertcopying sp ISBN Etienne Suvasa
8691cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c LocalWords: ifnottex yyparse detailmenu GLR RPN Calc var Decls Rpcalc
8692cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c LocalWords: rpcalc Lexer Gen Comp Expr ltcalc mfcalc Decl Symtab yylex
8693cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c LocalWords: yyerror pxref LR yylval cindex dfn LALR samp gpl BNF xref
8694cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c LocalWords: const int paren ifnotinfo AC noindent emph expr stmt findex
8695cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c LocalWords: glr YYSTYPE TYPENAME prog dprec printf decl init stmtMerge
8696cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c LocalWords: pre STDC GNUC endif yy YY alloca lf stddef stdlib YYDEBUG
8697cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c LocalWords: NUM exp subsubsection kbd Ctrl ctype EOF getchar isdigit
8698cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c LocalWords: ungetc stdin scanf sc calc ulator ls lm cc NEG prec yyerrok
8699cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c LocalWords: longjmp fprintf stderr preg yylloc YYLTYPE cos ln
8700cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c LocalWords: smallexample symrec val tptr FNCT fnctptr func struct sym
8701cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c LocalWords: fnct putsym getsym fname arith fncts atan ptr malloc sizeof
8702cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c LocalWords: strlen strcpy fctn strcmp isalpha symbuf realloc isalnum
8703cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c LocalWords: ptypes itype YYPRINT trigraphs yytname expseq vindex dtype
8704cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c LocalWords: Rhs YYRHSLOC LE nonassoc op deffn typeless typefull yynerrs
8705cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c LocalWords: yychar yydebug msg YYNTOKENS YYNNTS YYNRULES YYNSTATES
8706cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c LocalWords: cparse clex deftypefun NE defmac YYACCEPT YYABORT param
8707cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c LocalWords: strncmp intval tindex lvalp locp llocp typealt YYBACKUP
8708cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c LocalWords: YYEMPTY YYEOF YYRECOVERING yyclearin GE def UMINUS maybeword
8709cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c LocalWords: Johnstone Shamsa Sadaf Hussain Tomita TR uref YYMAXDEPTH
8710cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c LocalWords: YYINITDEPTH stmnts ref stmnt initdcl maybeasm VCG notype
8711cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c LocalWords: hexflag STR exdent itemset asis DYYDEBUG YYFPRINTF args
8712cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c LocalWords: YYPRINTF infile ypp yxx outfile itemx vcg tex leaderfill
8713cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c LocalWords: hbox hss hfill tt ly yyin fopen fclose ofirst gcc ll
8714cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c LocalWords: yyrestart nbar yytext fst snd osplit ntwo strdup AST
8715cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project@c LocalWords: YYSTACK DVI fdl printindex
8716