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