hugh@phoibos.cs.kun.nl (Hugh Osborne) (11/05/90)
% These are the BNF style macros. In the documentation it is assumed
% that you will place these in a file called "bnf.sty"
\def\@actifygrammarchars{\catcode`\ \active\catcode`\:\active\catcode`\,\active\catcode`\;\active\catcode`\.\active\catcode`\<\active\catcode`\>\active}
\def\@deactifygrammarchars{\@makeother\ \@makeother\:\@makeother\,\@makeother\;\@makeother\.\@makeother\<\@makeother\>}
\begingroup
\@actifygrammarchars
\gdef\@defcolon#1{
\catcode`\:\active
\def:{\def\newline{\hfill\break\hspace*{2em}}{\@deactifygrammarchars #1}}}
\gdef\@defcomma#1{
\catcode`\,\active
\def,{\def\newline{\hfill\break\hspace*{4em}}{\@deactifygrammarchars #1}}}
\gdef\@defsemicolon#1{
\catcode`\;\active
\def;{\def\newline{\hfill\break\hspace*{2em}}{\@deactifygrammarchars #1}}}
\gdef\@defperiod#1{
\catcode`\.\active
\def.{\def\newline{\vskip10pt plus10pt minus5pt}{\@deactifygrammarchars #1}}}
\gdef\@defnonterminal#1{
\def\@first##1##2{##1}
\def\@second##1##2{##2}
\catcode`\<\active
\def<{{\@deactifygrammarchars \@first#1}}
\catcode`\>\active
\def>{{\@deactifygrammarchars \@second#1}}}
\endgroup
\def\quotesymbol{\begingroup\@makeother\""\endgroup}
\def\lessthan{\begingroup\@makeother\<<\endgroup}
\def\greaterthan{\begingroup\@makeother\>>\endgroup}
\newif\if@string
\@stringfalse
\begingroup
\catcode`\"\active
\gdef\@defquote#1{
\def\@openquote##1##2{##1}
\def\@closequote##1##2{##2}
\catcode`\"\active
\def"{\if@string\@closequote#1\endgroup\@stringfalse
\else\@openquote#1\begingroup\@deactifygrammarchars\@stringtrue\fi}}
\endgroup
\newif\if@colon
\newif\if@semicolon
\newif\if@period
\newif\if@comma
\newif\if@quote
\newif\if@nonterminal
\newenvironment{grammar}%
{\begin{quote}%
\@colonfalse%
\@semicolonfalse%
\@periodfalse%
\@commafalse%
\@quotefalse%
\@nonterminalfalse%
\@dogrammarchars}%
{\@deactifygrammarchars%
\end{quote}}
\def\@dogrammarchars{
\@ifnextchar [{\@getchardef}{\@defaultchardefs}}
\def\@getchardef[(#1)#2]{
\@dogrammarchar{#1}[#2]
\@dogrammarchars}
\def\@dogrammarchar#1[#2]{
\csname if@#1\endcsname\else
\csname @def#1\endcsname{#2}\csname @#1true\endcsname\fi}
\def\@defaultchardefs{
\if@quote\else\@defquote{{``}{''}}\fi%
\if@nonterminal\else\@defnonterminal{<>}\fi%
\if@colon\else\@defcolon{:\\}\fi%
\if@semicolon\else\@defsemicolon{;\\}\fi%
\if@period\else\@defperiod{.\\}\fi%
\if@comma\else\@defcomma{, }\fi}%