% Bison Quick Reference

%**start of header
\newcount\columnsperpage

% This file can be printed with 1 or 2 columns per page (see below).
% Specify how many you want here.  Nothing else needs to be changed
% unless you are maintaining the documentation.
% For printing reference cards to use in books, specify one column
% per page and reduce to 80%.
% Note that if columnsperpage is set to 2, there will be a few overfull
% boxes, but they are not serious. Just uncomment \finalout.

\columnsperpage=1

% comment out this line if you want page numbers to appear.
\nopagenumbers

\def\finalout{\overfullrule=0pt}
%\finalout

% Copyright (c) 1998, 2001  Free Software Foundation, Inc.
%
% This file is part of Bison.
%
% Bison is free software; you can redistribute them and/or modify them
% under the terms of the GNU General Public License as published by the
% Free Software Foundation; either version 2, or (at your option) any
% later version.
%
% Bison is distributed in the hope that it will be useful, but WITHOUT
% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
% FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
% for more details.
%
% You should have received a copy of the GNU General Public License
% along with either Flex or Bison; see the file COPYING.  If not, write
% to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
% Boston, MA 02110-1301, USA.
%
% This file is intended to be processed by plain TeX (TeX82).
%
% The final reference card has two columns:
% This file can be used to produce it in any of three ways:
% 1 column per page
%    produces two separate pages, each of which needs to be reduced to 80%.
%    This gives the best resolution.
% 2 columns per page
%    produces a single page.
%    You will still need to cut and paste.
% Which mode to use is controlled by setting \columnsperpage above.
%
% Authors:
%  Brendan Kehoe
%  UUCP: widener!brendan
%  Internet: brendan@cs.widener.edu
%
%  Gavin Nicol
%  Internet: nick@nsis.cl.co.jp
%
% This refcard format was created by Steve Gildea.
%
% Thanks to Paul Rubin, Bob Chassell, Len Tower, and Richard Mlynarik
% for their many good ideas.

% We only change the following to change the version numbers and
% such.

\def\bisonversion{1.31}                    % the bison version

\def\refcardversion{0.5}                   % reference card version
\def\month{November}                       % month
\def\year{2001}                            % year
\def\version{\month\ \year, Bison Refcard Version \refcardversion}

% for copyright notices
\def\small{\smallfont\textfont2=\smallsy\baselineskip=.8\baselineskip}
\def\medium{\mediumfont\textfont2=\mediumsy\baselineskip=.8\baselineskip}

\def\copyrightnotice{
\vskip .15ex plus .25 fill
\begingroup\medium
\centerline{Copyright \copyright\ \year\ Free Software Foundation, Inc.}
\vskip .2\baselineskip
\centerline{\version}
\vskip .2\baselineskip
\centerline{designed by Brendan Kehoe and Gavin Nicol}
\vskip .2\baselineskip
\centerline{for Bison \bisonversion}

Permission is granted to make and distribute copies of this card
provided the copyright notice and this permission notice
are preserved on all copies.
\vskip .2\baselineskip
For information, write to the:
\vskip .2\baselineskip
\centerline{Free Software Foundation, Inc.}
\vskip .2\baselineskip
\centerline{51 Franklin Street, Fifth Floor}
\vskip .2\baselineskip
\centerline{Boston, MA 02110-1301 USA}
\endgroup}

%%%% smallcopyrightnotice for two column printing on one page.
\def\smallcopyrightnotice{
\vskip .15ex plus .25 fill
\begingroup\small
\centerline{Copyright \copyright\ \year\ Free Software Foundation, Inc.}
\vskip .2\baselineskip
\centerline{\version}
\vskip .2\baselineskip
\centerline{designed by Brendan Kehoe and Gavin Nicol}
\vskip .2\baselineskip
\centerline{for Bison \bisonversion}

Permission is granted to make and distribute copies of this card
provided the copyright notice and this permission notice
are preserved on all copies.
\vskip .2\baselineskip
For information, write to the:
\vskip .2\baselineskip
\centerline{Free Software Foundation, Inc.}
\vskip .2\baselineskip
\centerline{51 Franklin Street, Fifth Floor}
\vskip .2\baselineskip
\centerline{Boston, MA 02110-1301 USA}
\endgroup}

% make \bye not \outer so that the \def\bye in the \else clause below
% can be scanned without complaint.
\def\bye{\par\vfill\supereject\end}

\newdimen\intercolumnskip
\newbox\columna
\newbox\columnb

\def\ncolumns{\the\columnsperpage}

\message{[\ncolumns\space
  column\if 1\ncolumns\else s\fi\space per page]}

\def\scaledmag#1{ scaled \magstep #1}

% This multi-way format was designed by Stephen Gildea
% October 1986.
\if 1\ncolumns
  \hsize 4in
  \vsize 10in
% We want output .3 inch *from top of paper edge*; i.e. -.7in from TeX default
  \voffset -.7in % Comment out for xdvi viewing; include for printing.
  \font\titlefont=\fontname\tenbf \scaledmag3
  \font\headingfont=\fontname\tenbf \scaledmag2
  \font\smallfont=cmr6
  \font\smallsy=cmsy6
  \font\mediumfont=cmr10
  \font\mediumsy=cmsy10


% two lines below commented out in Yet Another Attempt to eliminate
% page numbers from the output.
  \footline{\hss}
% \footline{\hss\folio}
  \def\makefootline{\baselineskip10pt\hsize6.5in\line{\the\footline}}
\else
  \hsize 3.2in
  \vsize 7.95in
  \hoffset -.75in
  \voffset -.745in
  \font\titlefont=cmbx10 \scaledmag2
  \font\headingfont=cmbx10 \scaledmag1
  \font\smallfont=cmr6
  \font\smallsy=cmsy6
  \font\eightrm=cmr8
  \font\eightbf=cmbx8
  \font\eightit=cmti8
  \font\eighttt=cmtt8
  \font\eightsy=cmsy8
  \textfont0=\eightrm
  \textfont2=\eightsy
  \def\rm{\eightrm}
  \def\bf{\eightbf}
  \def\it{\eightit}
  \def\tt{\eighttt}
%%%% Reduce skip from .8 to .75 to permit printing on two pages.
  \normalbaselineskip=.75\normalbaselineskip
  \normallineskip=.75\normallineskip
  \normallineskiplimit=.75\normallineskiplimit
  \normalbaselines\rm           %make definitions take effect

  \if 2\ncolumns
    \let\maxcolumn=b
    \footline{\hss\rm\folio\hss}
    \def\makefootline{\vskip 2in \hsize=6.86in\line{\the\footline}}
  \font\mediumfont=cmr10
  \font\mediumsy=cmsy10

% Leave 3 column code here in case size increases.
  \else \if 3\ncolumns
    \let\maxcolumn=c
    \nopagenumbers
  \font\mediumfont=cmr10
  \font\mediumsy=cmsy10

  \else
    \errhelp{You must set \columnsperpage equal to 1, 2, or 3.}
    \errmessage{Illegal number of columns per page}
  \fi\fi

  \intercolumnskip=.46in
  \def\abc{a}
  \output={%
      % This next line is useful when designing the layout.
      %\immediate\write16{Column \folio\abc\space starts with \firstmark}
      \if \maxcolumn\abc \multicolumnformat \global\def\abc{a}
      \else\if a\abc
        \global\setbox\columna\columnbox \global\def\abc{b}
        %% in case we never use \columnb (two-column mode)
        \global\setbox\columnb\hbox to -\intercolumnskip{}
      \else
        \global\setbox\columnb\columnbox \global\def\abc{c}\fi\fi}
  \def\multicolumnformat{\shipout\vbox{\makeheadline
      \hbox{\box\columna\hskip\intercolumnskip
        \box\columnb\hskip\intercolumnskip\columnbox}
      \makefootline}\advancepageno}
  \def\columnbox{\leftline{\pagebody}}

  \def\bye{\par\vfill\supereject
    \if a\abc \else\null\vfill\eject\fi
    \if a\abc \else\null\vfill\eject\fi
    \end}
\fi

% we won't be using math mode much, so redefine some of the characters
% we might want to talk about
\catcode`\^=12
\catcode`\_=12

\chardef\\=`\\
\chardef\{=`\{
\chardef\}=`\}

\hyphenation{mini-buf-fer}

\parindent 0pt
% \parskip 1ex plus .5ex minus .5ex
\parskip 0.5ex plus .25ex minus .25ex

\outer\def\newcolumn{\vfill\eject}

\outer\def\title#1{{\titlefont\centerline{#1}}\vskip 1ex plus .5ex}

\outer\def\section#1{\par\filbreak
  \vskip 1.5ex plus 1ex minus 1ex {\headingfont #1}\mark{#1}%
  \vskip 1ex plus .5ex minus 0.75ex}

\newdimen\keyindent

\def\beginindentedkeys{\keyindent=1em}
\def\endindentedkeys{\keyindent=0em}
\endindentedkeys

\def\paralign{\vskip\parskip\halign}

\def\<#1>{$\langle${\rm #1}$\rangle$}

\def\kbd#1{{\tt#1}\null}        %\null so not an abbrev even if period follows

\def\beginexample{\par\leavevmode\begingroup
  \obeylines\obeyspaces\parskip0pt\tt}
{\obeyspaces\global\let =\ }
\def\endexample{\endgroup}
\def\begincexample{%
  \par\leavevmode\begingroup%
  \obeylines\obeyspaces%
  % bpk--added indentation
  \advance\leftskip.25truein
%  \parskip0pt%
  \tt}
{\obeyspaces\global\let =\ }
\def\endcexample{\endgroup}

%%%%% Prime definition of key; redefined below to prevent overful hboxes

\def\key#1#2{\leavevmode\hbox to \hsize
  {\vtop {\hsize=.67\hsize \rightskip=1em #1}
  \kbd{#2}\hfil}}

\newbox\metaxbox
\setbox\metaxbox\hbox{\kbd{M-x }}
\newdimen\metaxwidth
\metaxwidth=\wd\metaxbox

\def\metax#1#2{\leavevmode\hbox to \hsize{\hbox to .75\hsize
  {\hskip\keyindent\relax#1\hfil}%
  \hskip -\metaxwidth minus 1fil
  \kbd{#2}\hfil}}

\def\threecol#1#2#3{\hskip\keyindent\relax#1\hfil&\kbd{#2}\quad
  &\kbd{#3}\quad\cr}

%**end of header

%     ************
%     **  BISON **
%     ************

\title{Bison Quick Reference}

\section{Starting Bison}
%***********************

To use Bison, type: \kbd{bison {\it filename}}

Options can be used as: \kbd{bison {\it options} {\it filename}}

\section{Command Line Options}
%*****************************

\key{Display usage information.}                         {-h}
\key{Display version information.}                       {-V}
\key{Generate token and {\tt YYSTYPE} definitions.}      {-d}
\key{Prepend a prefix to external symbols.}              {-p {\it prefix}}
\key{Don't put {\tt \#line} directives in the parser.}   {-l}
\key{Specify the output file.}                           {-o {\it filename}}
\key{Debug or {\it trace} mode.}                      {-t}
\key{Verbose description of the parser.}                 {-v}
\key{Emulate {\tt yacc} (generate {\tt y.tab.*} files).} {-y}

\vskip .10truein
{\bf Note:} The token and {\tt YYSTYPE} definitions are generated
to a file called {\tt y.tab.h} if the {\tt -y} option is used,
otherwise it will have the format {\tt {\it name}.tab.h}, where
{\it name} is the leading part of the parser definition filename.

\section{Definitions}
%********************

\key{Declare a terminal symbol.}{\%token <{\it t\/}>
      {\it n}}

\key{Declare a terminal symbol, and define its association.}
      {{\it association} <{\it t\/}> {\it n}}

\vskip .2\baselineskip
\key{Generate a reentrant (pure) parser.}
      {\%pure_parser}

\key{Define the union of all data types used in the parser.}
      {\%union\{{\it field list}\} }

\vskip .2\baselineskip
\key{Tell {\tt bison} where to start parsing.}
      {\%start {\it m}}

\key{Tell {\tt bison} the data type of symbols.}
      {\%type <{\it t\/}> {\it s1}\dots{\it sn}}

\vskip .10truein

In the above, {\it t} is a {\it type} defined in the {\tt \%union}
definition,  {\it n} is a {\it terminal} symbol name, {\it m} is a
{\it non-terminal} symbol name, and {\it association} can be one of
{\tt \%left}, {\tt \%right}, or {\tt \%nonassoc}.

\vskip .10truein

The {\tt <{\it t\/}>} after {\tt \%token, \%left, \%right} and {\tt
  \%nonassoc} is optional. Additionally, precedence may be overridden
in the rules with {\tt \%prec} commands.

\section{Parser Definition Files}
%*********************************

The general form for a parser definition is:

\begincexample
\{\%
   /* Initial C code.  */
\%\}

 {\it Token and type definitions}

\%\%

   Rule definition 1
          \vdots
   Rule definition {\it n}

\%\%

  /* Other C code.  */
\endcexample


% Decrease standard baselineskip for the second page
 \baselineskip = .9\baselineskip

\section {Rule definitions}
%**************************

Rules take the form:

\vskip -\baselineskip
\beginexample
     non-terminal : {\it statement} 1
                  | {\it statement} 2
                      \vdots
                  | {\it statement n}
                  ;
\endexample

Where {\it statements} can be either empty, or contain
a mixture of C code (enclosed in {\tt \{...\}}), and the
symbols that make up the non-terminal. For example:

\vskip -\baselineskip
\beginexample
     expression : number '$+$' number \{ \$\$ $=$ \$1 $+$ \$3 \}
                | number '$-$' number \{ \$\$ $=$ \$1 $-$ \$3 \}
                | number '$/$' number \{ \$\$ $=$ \$1 $/$ \$3 \}
                | number '$*$' number \{ \$\$ $=$ \$1 $*$ \$3 \}
                ;
\endexample

For altering the precedence of a symbol use:
\vskip -\baselineskip

\beginexample
     \%prec name
\endexample

For example:
\vskip -\baselineskip
\beginexample
     foo : gnu bar gnu      \%prec bar
         ;
\endexample

\section{Grammar Variables and Symbols}
%**************************************

\key{Recognize an error \& continue parsing.}{error}
\key{Access data associated with a symbol.}  {\$\$, \$0\dots\${\it n}}
\key{Access a field of the  data union.}    {\$\$.{\it t},
                                     \$0.{\it t}\dots\${\it n}.{\it t}}
\key{Access symbol's location.}             {@\$, @0\dots@{\it n}}
\key{Access data's line location.}          {@{\it x}.{\it line\_spec}}
\key{Access data's column location.}        {@{\it x}.{\it column\_spec}}


\vskip .10truein
%
Where {\it t} is a type defined in the {\tt \%union}, {\it n} is a
number, {\it x} is a number or \$, {\it line\_spec} one of {\tt
  first_line} and {\tt last_line}, and {\it column\_spec} is specified
as either {\tt first_column} or {\tt last_column}.

\section {Variables and Types}
%*****************************

\key{Current look ahead token.}                {yychar}
\key{Debug mode flag.}                         {yydebug}
\key{Data associated with the current token.}  {yylval}
\key{Source position of current token.}        {yylloc}
\key{Number of errors encountered.}            {yynerrs}
\key{Position information type.}               {YYLTYPE}
\key{Data type associated with symbols.}       {YYSTYPE}

\section {Functions}
%*******************

% Redefine to prevent overfull hboxes
\def\key#1#2{\leavevmode\hbox to \hsize
  {\vtop {\hsize=.625\hsize \rightskip=1em #1}
  \kbd{#2}\hfil}}

\key{User defined error handler.}         {int yyerror(char *)}
\key{User defined lexical analyzer.}      {int yylex()}
\key{The grammar parser.}                 {int yyparse()}

% Return to previous size
\def\key#1#2{\leavevmode\hbox to \hsize
  {\vtop {\hsize=.67\hsize \rightskip=1em #1}
  \kbd{#2}\hfil}}

\section{Macros}
%***************

\key{Quit parsing immediately. Return 1.}           {YYABORT}
\key{Quit parsing immediately. Return 0.}           {YYACCEPT}
\key{Pretend a syntax error occurred.}              {YYERROR}
\key{Value in {\tt yychar} if no look-ahead token.} {YYEMPTY}
\key{Clear previous look ahead token.}              {yyclearin}
\key{Recover normally from an error.}               {yyerrok}

% **************
% ** The end  **
% **************

\vskip \baselineskip
\if 1\ncolumns
\copyrightnotice
\else
\smallcopyrightnotice
\fi

\bye


% Local variables:
% compile-command: "tex refcard"
% End:
