\def\filedate{12/09/92 12:56pm}
%\iffalse
%%% ====================================================================
%%%  @LaTeX-file{
%%%     filename        = "bnf.sty",
%%%     date            = "9 Dec 1992",
%%%     time            = "12:56 BST",
%%%     author          = "Mike Piff",
%%%     address         = "Dr M. J. Piff
%%%                        University of Sheffield
%%%                        Department of Pure Mathematics
%%%                        Hicks Building
%%%                        Hounsfield Road
%%%                        SHEFFIELD S3 7RH
%%%                        England",
%%%     telephone       = "0742-305468",
%%%     email           = "[email protected] (Janet)",
%%%     keywords        = "Backus,Naur,syntax,grammar",
%%%     supported       = "yes",
%%%     checksum        = "10141 528 2414 20734",
%%%     docstring       = "A style option to LaTeX for producing
%%%                        Backus-Naur Form syntax notation.",
%%%  }
%%% ====================================================================
%% This is BNF.STY
%% Copyright (C) 1992 by Mike Piff.
%% All rights reserved.
%% Copying of this file is authorized only if
%% you make absolutely no changes to your copy.
%%
%% Usage:
%% \documentstyle[bnf]{article} %% in LaTeX
%<+driver>\documentstyle[12pt,doc,bnf]{article}
%<+driver>%    Select paper size.
%<+driver>\def\firstletter#1#2\end{#1}
%<+driver>\typein[\papersize]{Intended paper size?^^J%
%<+driver>Choices: US letter size or A4; enter u or a, please:}%
%<+driver>\edef\setpapersize{\lowercase{\edef\noexpand\papersize{%
%<+driver>  \noexpand\firstletter\papersize u\noexpand\end}}}
%<+driver>\setpapersize
%<+driver>\if a\papersize\relax
%<+driver>  \typeout{%
%<+driver>OK, adjusting textwidth and textheight for A4 paper size}
%<+driver>%    A4 paper size, 21cm x 30cm
%<+driver>  \textwidth 6.375 true in \textheight 42\baselineskip
%<+driver>\else
%<+driver>  \typeout{%
%<+driver>Adjusting textwidth and textheight for US letter paper size}
%<+driver>%    US letter-size paper, 8.5 x 11 in:
%<+driver>  \textwidth 6.5in \textheight 8.9in
%<+driver>\fi
%<+driver>\begin{document}
%<+driver>   \DocInput{bnf.doc}
%<+driver>\end{document}
%<*style>
%\fi
%
\typeout{Backus-Naur Form style option for LaTeX, (c) Mike Piff, \filedate}
%\CheckSum{334}
%\MakeShortVerb{\"}
%\emergencystretch1in
%\title{{\protect\bf Backus Naur Form in \protect\LaTeX}}
%\author{Mike Piff}
%\date{\filedate}
%\maketitle
%\thispagestyle{headings}
%\begin{abstract}
%  This article explains how to produce Backus-Naur Form
%  in a \LaTeX\ document.
%  The objective is to produce this notation as simply and efficiently
%  as possible.
%  Thus, short cuts looking like the teletype equivalents are set up
%  for most of the symbolism.
%  This has the advantage that the source looks generally comparable
%  to the typeset equivalent.
%\end{abstract}
%
%\section{Introduction}
%\begin{bnf}
%The macros described below grew out of a sub-task of the \LaTeX-3 project.
%The objective was to program \LaTeX\ to produce Backus-Naur Form, or BNF
%for short, which is a way of describing the syntax of formal languages.
%In particular, the context-free syntax of modern programming languages
%and of \TeX\ itself are described in this notation.
%
%The idea is that we set up an extended language consisting of all of
%the symbols that are part of our real language, the {\bf terminal}
%symbols, such as "a", "(", "@" or "{", and also some {\bf non-terminal}
%symbols which represent syntactic structures, such as
%$<statement>$, $<space token>$ or $<module>$.
%A list of {\bf productions} is then given.
%In the usual {\bf context-free} case, each one of these productions states
%that a certain non-terminal can be replaced by a string of terminal
%and non-terminal symbols. For instance, a production might express the fact
%that a $<statement>$ could be a $<while statement>$. We write
%$$<statement>-><while statement>$$
%in BNF. Another production might say
%$$<while statement>->"WHILE" <condition> "DO" <statement sequence> "END"$$
%to indicate the form of a while-loop in the language.
%
%In general there will be several productions from any given non-terminal.
%For instance, a $<statement>$ could also be a $<for statement>$.
%Each non-terminal defines a {\bf language} of strings or {\bf words}
%in the terminal alphabet. Starting from the non-terminal, randomly
%substitute a replacement string for it. Then, in that replacement string,
%choose any non-terminal and randomly substitute one of its replacement
%expressions. Continue randomly replacing non-terminals until a string
%with no non-terminals results. This string is in the language defined
%by the non-terminal. For instance, the non-terminal $<statement>$ would
%define a language consisting of all valid statements in the programming
%language, and a non-terminal $<module>$ would generate all valid
%modules.
%
%Because it is possible for a non-terminal to expand to nothing at all,
%we introduce the symbol $\Empty$ to indicate a null replacement string.
%
%In more complicated examples, we have {\bf context sensitive} productions,
%such as
%$$"a"<B>"cd"<E>->"d"<D>$$
%which say that the string $"a"<B>"cd"<E>$ may be replaced by the string
%$"d"<D>$ anywhere that it appears. There might not be any direct replacement
%for either $<B>$ or $<E>$.
%
%Backus-Naur Form allows us to condense several productions into one
%compound production.
%Thus, the productions
%\begin{eqnarray*}
%  <S>&->&"a"<B><D>"c"\\
%  <S>&->&"a"<C><D>"c"
%\end{eqnarray*}
%are condensed into the single production
%$$<S>->"a"(<B>|<C>)<D>"c".$$
%It indicates certain {\em alternatives\/} in the replacement.
%
%Similarly, the two productions
%\begin{eqnarray*}
%  <S>&->&"a"<B><C>"c"<D>"c"\\
%  <S>&->&"a"<D>"c"
%\end{eqnarray*}
%can be condensed into
%$$<S>->"a"[<B><C>"c"]<D>"c".$$
%This indicates that a substring $s$ in the replacement string
%is {\em optional}. We have the alternative form
%$$<S>->"a"(<B><C>"c"|\Empty)<D>"c".$$
%
%
%A more complex case is that of an unlimited number of repetitions of a
%substring. For instance, identifiers are often defined as consisting of
%a letter followed by arbitrarily many letters and digits.
%An example might then be
%\begin{eqnarray*}
%  <identifier>&->&<letter><sequence>\\
%  <sequence>&->&\Empty\\
%  <sequence>&->&<letter><sequence>\\
%  <sequence>&->&<digit><sequence>
%\end{eqnarray*}
%where it is assumed that these are the only productions that use the
%non-terminal $<sequence>$. The above productions are condensed into
%$$<identifier>-><letter>{@ <letter>|<digit>}.$$
%
%Further notation is used to express the fact that the string $w_2$ is
%obtained from the string $w_1$ by the use of just one substitution defined
%by one production. We write $w_1=>w_2$. If $w_2$ is obtainable from $w_1$
%by a sequence of substitutions we write $w_1=>^*w_2$.
%\end{bnf}
%
%\section{The macros}
%The macros in "bnf.sty" can be used in one of two ways.
%The first is to use the long forms of the commands to generate the
%BNF notation. These only work in mathematics mode.
%
%The second is to
%surround the block where BNF notation is required within a "bnf"
%environment, or to use the command "\bnf" locally or globally.
%In either case, the effect is to change the meaning of certain characters
%in the input stream when they are met in mathematics mode. This makes
%it possible to use the short forms of the commands.
%
%We first describe the long forms of the commands.
%
%The notation $\begin{NonTerminal}non terminal\end{NonTerminal}$
%is produced by the environment "NonTerminal",
%surrounding the name of the symbol. Spaces in the name are respected, and
%the font used is governed by the definition of "\NonTerminalStyle".
%
%A terminal letter or string is produced by the command "\Terminal",
%which equates to "\verb*" in \LaTeX; thus \verb*|\Terminal"xy z"|
%produces $\Terminal"xy z"$, and \verb*|\Terminal`"`|
%produces~$\Terminal`"`$.
%By redefining the commands "\PreTerminal" and "\PostTerminal", the
%terminal strings can be started and ended with given strings; for instance,
%we might want all such terminal strings to begin and end with a
%double quote symbol. We could achieve this by means of the following
%definitions.
%\begin{verbatim}
%   \def\PreTerminal{\mbox{\tt"}} \let\PostTerminal\PreTerminal
%\end{verbatim}
%The empty string $\Empty$ is generated
%by "\Empty".
%
%The production symbol $\Production$ is produced by "\Production", while
%"\Yields" yields $\Yields$. The alternative symbol $\OR$ is "\OR",
%and the optional brackets $\Optional w_1\endOptional$ are generated by
%the environment "Optional". Environment "Star" will generate the
%repetition braces $\Star w_2\endStar$. Ordinary round meta-brackets
%$\Bracket w_3\endBracket$ are generated by the "Bracket" environment.
%
%Here is an example, taken from Modula-2.
%\begin{verbatim}
%$$    \begin{NonTerminal}Case Statement\end{NonTerminal}
%      \Production\Terminal"CASE"
%      \begin{NonTerminal}expression\end{NonTerminal}
%      \Terminal"OF"
%      \begin{NonTerminal}case\end{NonTerminal}
%      \begin{Star}
%         \Terminal"|"\begin{NonTerminal}case\end{NonTerminal}
%      \end{Star}
%      \begin{Optional}
%         \Terminal"ELSE"
%         \begin{NonTerminal}Statement Sequence\end{NonTerminal}
%      \end{Optional}
%      \Terminal"END" $$
%\end{verbatim}
%{\small
%$$    \begin{NonTerminal}Case Statement\end{NonTerminal}
%      \Production\Terminal"CASE"
%      \begin{NonTerminal}expression\end{NonTerminal}
%      \Terminal"OF"
%      \begin{NonTerminal}case\end{NonTerminal}
%      \begin{Star}
%         \Terminal"|"\begin{NonTerminal}case\end{NonTerminal}
%      \end{Star}
%      \begin{Optional}
%         \Terminal"ELSE"
%         \begin{NonTerminal}Statement Sequence\end{NonTerminal}
%      \end{Optional}
%      \Terminal"END" $$
%}%
%
%\begin{bnf}
%The short forms are now described. We can get $<A>$ by typing "<A>",
%and
%\DeleteShortVerb\"
%$"ab c"$
%\MakeShortVerb\"
%by typing \verb*|"ab c"| or \verb*|`ab c`|. The pairs "->" and "=>" give
%$->$ and $=>$ respectively, and $[s_1](s_2|s_3)$ is obtained by
%typing "[s_1](s_2|s_3)". Notice that these yield "\left" and "\right"
%style brackets. The Star environment ${@w}$ can be produced by
%"{@w}". There seemed to be no obvious way to obtain this one
%directly from the braces. The "@" symbol produces a "Star" group
%starting at the current point and ending at the end of the current group.
%Thus, it must be used within grouping brackets "{" and~"}".
%
%There is another restriction on the use of "@". Because we might also want to
%produce $@<$ and $@>$ in some BNF text, these can be obtained by using
%the pairs "@<" and "@>". An alternative that is provided is to use
%"\lt" and~"\gt". Otherwise "<" and ">" will attempt to open and close
%a "NonTerminal" environment, probably unsuccessfully.
%\end{bnf}
%
%Here are some examples of the short forms.
%\begin{verbatim}
%\begin{bnf}
%   \begin{eqnarray*}
%      <assignment>& -> & <non-macro assignment> | <macro assignment>\\
%      <equals> & ->& <optional spaces> | <optional spaces>"="_{12}\\
%      <def>&->&"\def"|"\gdef"|"\edef"|"\xdef"\\
%      <normal integer>&->&<integer constant>\\
%               &&|<integer constant><one optional space>\\
%               &&|"'"_{12}<octal constant><one optional space>\\
%               &&|`"`_{12}<hexadecimal constant><one optional space>\\
%               &&|"`"_{12}<character token><one optional space>\\
%      <S>&->& "a" <B>\\
%      <S>&->&\Empty\\
%      <B>&->& "b" <B>\\
%      <B>&->&{@ a{@ b{@ c{@ d{@ e<B>}}}}}\\
%      <B>&->& ["c"{@"ab"}"d"] | {@ {@"aba"}["d"]{@"baab"}}
%   \end{eqnarray*}
%\end{bnf}
%\end{verbatim}
%\begin{bnf}
%   \begin{eqnarray*}
%      <assignment>& -> & <non-macro assignment> | <macro assignment>\\
%      <equals> & ->& <optional spaces> | <optional spaces>"="_{12}\\
%      <def>&->&"\def"|"\gdef"|"\edef"|"\xdef"\\
%      <normal integer>&->&<integer constant>\\
%               &&|<integer constant><one optional space>\\
%               &&|"'"_{12}<octal constant><one optional space>\\
%               &&|`"`_{12}<hexadecimal constant><one optional space>\\
%               &&|"`"_{12}<character token><one optional space>\\
%      <S>&->& "a" <B>\\
%      <S>&->&\Empty\\
%      <B>&->& "b" <B>\\
%      <B>&->&{@ a{@ b{@ c{@ d{@ e<B>}}}}}\\
%      <B>&->& ["c"{@"ab"}"d"] | {@ {@"aba"}["d"]{@"baab"}}
%   \end{eqnarray*}
%\end{bnf}
%
%\StopEventually{}
%\section{Implementation of the long forms}
%The "NonTerminal" environment is easy to implement.
%We set nonterminal letters in roman by default, that is, maths family~0,
%and make sure that spaces are respected. The boolean is there to
%make the checking of the short forms easier later. Certain characters
%can be excluded from the text of a nonterminal, and an error message
%issued if they are encountered.
%    \begin{macrocode}
\newif\ifnonterminal
\def\NonTerminal{\left\langle\obeyspaces\ControlSpaces
  \nonterminaltrue\NonTerminalStyle}
\def\endNonTerminal{\right\rangle}
\def\NonTerminalStyle{\fam0 }
{\obeyspaces\gdef\ControlSpaces{\let =\ }}
%    \end{macrocode}
%
%The "Star", "Optional" and "Bracket" environments are all similar.
%A small amount of extra space has been introduced round each,
%to improve their appearance.
%    \begin{macrocode}
\def\Star{\,\left\{}  \def\endStar{\right\}\,}
\def\Optional{\,\left[} \def\endOptional{\right]\,}
\def\Bracket{\,\left(} \def\endBracket{\right)\,}
%    \end{macrocode}
%
%The single symbols have easy definitions.
%    \begin{macrocode}
\def\OR{\mathop{\left|\right.}\nolimits}
\def\Production{\mathrel{\longrightarrow}}
\def\Yields{\mathrel{\Longrightarrow}}
\def\Empty{\varepsilon}
%    \end{macrocode}
%
%By far the most difficult effect to produce is that of a terminal.
%We could make "\Terminal" expand to "\verb*", but that prevents us
%from including extra text before and after the terminal string.
%Thus a definition similar to that of "\verb*" from NFSS is included.
%    \begin{macrocode}
\begingroup
\catcode`\`=\active
\gdef\TerminalFont{\tt \catcode96\active
  \def`{\leavevmode\kern\z@\char96 }}
\endgroup
\begingroup
 \catcode`\~=\active
 \lccode`\~=`\^^M
 \lowercase{\endgroup
   \gdef\Terminal{\relax\PreTerminal
     \ifmmode \hbox \else \leavevmode\null \fi
     \bgroup
     \TerminalFont
     \catcode`~\active
     \def~{\egroup\@latexerr{Terminal string ended by
                             end of line.}\@ehc}%
   \let\do\@makeother \dospecials
   \@sTerminal}}
\def\@sTerminal#1{%
 \catcode`#1\active
 \lccode`\~`#1%
 \lowercase{\def~{\egroup\PostTerminal}}}%
%    \end{macrocode}
%The default leading and trailing text is defined to be empty.
%    \begin{macrocode}
\def\PreTerminal{} \def\PostTerminal{}
%    \end{macrocode}
%
%\section{Implementation of the short forms}
%
%Our first task is to make $<$ and $>$ available as mathematical symbols.
%    \begin{macrocode}
\mathchardef\lt="313C \mathchardef\gt="313E
%    \end{macrocode}
%The next task is more subtle, and at first puzzled the author when he
%tried to make a preliminary version of these macros work.
%The problem is that we are making "-" into an active character.
%If we do this we find that it tries to expand in text as well, and so
%we make sure that it only expands in maths mode.
%Our objective is to make "->" expand to $\Production$, but here is
%where things go wrong. In plain \TeX, the control sequence
%"\longrightarrow" is defined to expand to a "\relbar" and a "\rightarrow".
%In turn, a relbar expands to yield a "-" again, and so we are in an
%infinite loop.
%
%The solution seems to be to abandon the definition of "\relbar" in
%plain \TeX\ and produce our own. The same applies to "=" and "\Relbar".
%We also make a hyphen available for use within nonterminals.
%    \begin{macrocode}
\mathchardef\HYPHEN="2D  \mathchardef\MINUS="2200
\mathchardef\Relbar="303D  \def\relbar{\mathrel{\smash{\MINUS}}}
\mathchardef\EQUALS="303D
%    \end{macrocode}
%
%We next define "\bnf" to set the mathcodes of the characters we wish to
%use to the active value \verb|"8000|. Thus in text they will behave as
%normal characters, but in mathematics they will expand as though they were
%active characters.  We also allow "bnf" to be an environment.
%    \begin{macrocode}
\def\mathactive{"8000}
\def\bnf{%
  \mathcode`"=\mathactive
  \mathcode`[=\mathactive \mathcode`\]=\mathactive
  \mathcode`(=\mathactive \mathcode`\)=\mathactive
  \mathcode`|=\mathactive \mathcode`-=\mathactive
  \mathcode`<=\mathactive \mathcode`\>=\mathactive
  \mathcode`@=\mathactive \mathcode`==\mathactive
  \mathcode96 \mathactive
}
\def\endbnf{}
%    \end{macrocode}
%
%Several characters are not allowed to appear in nonterminal names,
%and so we define an error message to warn the user.
%    \begin{macrocode}
\def\NotInNonTerminal{\errmessage{Not allowed in a non-terminal}}
%    \end{macrocode}
%
%Several of our mathactive characters have similar definitions;
%we use this fact to allow some condensation of our file.
%    \begin{macrocode}
\def\NotNTdef#1#2{\gdef#1{\ifnonterminal\NotInNonTerminal\else#2\fi}}
%    \end{macrocode}
%
%The expansion text of all our mathactive characters must be defined
%inside a group in which they are all active.
%    \begin{macrocode}
\begingroup
  \catcode`"\active
  \catcode`[\active \catcode`\]\active
  \catcode`(\active \catcode`\)\active
  \catcode`|\active \catcode`-\active
  \catcode`<\active \catcode`>\active
  \catcode`@\active \catcode`=\active
  \catcode96 \active
%    \end{macrocode}
%First we have the two short forms of "\Terminal".
%    \begin{macrocode}
  \gdef"{\Terminal"}%
  \gdef`{\Terminal`}%
%    \end{macrocode}
%Next a block of definitions of characters which are illegal inside
%nonterminals.
%    \begin{macrocode}
  \NotNTdef[\Optional        \NotNTdef]\endOptional
  \NotNTdef(\Bracket         \NotNTdef)\endBracket
  \NotNTdef|\OR              \NotNTdef<\NonTerminal
%    \end{macrocode}
%The end of a nonterminal has to be defined directly, of course.
%    \begin{macrocode}
  \gdef>{\endNonTerminal}%
%    \end{macrocode}
%A "-" character in a nonterminal is just a hyphen, but otherwise it
%could possibly be a production arrow.
%    \begin{macrocode}
  \gdef-{%
     \ifnonterminal
        \def\Nnext{\HYPHEN}%
     \else
        \def\Nnext{\futurelet\Next\SeeIfProdn}%
     \fi\Nnext}
%    \end{macrocode}
%The "=" character, on the other hand, should not appear in a nonterminal.
%Otherwise, it could be a yields arrow.
%    \begin{macrocode}
  \gdef={%
     \ifnonterminal
        \def\Nnext{\NotInNonTerminal}%
     \else
        \def\Nnext{\futurelet\Next\SeeIfYields}%
     \fi\Nnext}%
%    \end{macrocode}
%The "@" character should examine the next character to see whether it should
%be given a special treatment.
%    \begin{macrocode}
  \gdef@{% either an escape char or a star group
     \ifnonterminal
        \def\Nnext{\NotInNonTerminal}%
     \else
        \def\Nnext{\futurelet\Next\SeeIfSpecial}%
     \fi\Nnext}%
\endgroup
%    \end{macrocode}
%
%All that remains now is to see that the checks used above
%are defined. First we have the check for a production.
%    \begin{macrocode}
\def\SeeIfProdn{%
  \if\noexpand\Next\noexpand>%
     \def\Nnext{\Production\@gobble}%
  \else
     \def\Nnext{\MINUS}%
  \fi
  \Nnext}
%    \end{macrocode}
%Second we have the check for a yields.
%    \begin{macrocode}
\def\SeeIfYields{%
  \if\noexpand\Next\noexpand>%
     \def\Nnext{\Yields\@gobble}%
  \else
     \def\Nnext{\EQUALS}%
  \fi\Nnext}
%    \end{macrocode}
%Finally the "@" character must produce a "Star" environment unless it
%is immediately followed by "<" or~">".
%    \begin{macrocode}
\def\SeeIfSpecial{%
  \if\noexpand\Next\noexpand<%
     \def\Nnext{\lt\@gobble}%
  \else
     \if\noexpand\Next\noexpand>%
        \def\Nnext{\gt\@gobble}%
     \else
        \def\Nnext{\Star\bgroup\aftergroup\endStar\aftergroup\egroup}%
     \fi
  \fi\Nnext}
%    \end{macrocode}
%\Finale

%\endinput
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Dr M J Piff                      %%  e-mail:
%% Department of Pure Mathematics   %%
%% University of Sheffield          %%  [email protected]
%% Hicks Building                   %%  [email protected]
%% Hounsfield Road                  %%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% SHEFFIELD S3 7RH                 %%  Telephone: SHEFFIELD (0742) 768555
%% England                          %%             Ext. 4431
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%