2 %% This is file `syntax.sty',
3 %% generated with the docstrip utility.
5 %% The original source files were:
7 %% syntax.dtx (with options: `package')
8 %% doafter.dtx (with options: `macro')
12 %% syntax package -- typesetting syntax descriptions
13 %% Copyright (c) 1996 Mark Wooding
15 %% This program is free software; you can redistribute it and/or modify
16 %% it under the terms of the GNU General Public License as published by
17 %% the Free Software Foundation; either version 2 of the License, or
18 %% (at your option) any later version.
20 %% This program is distributed in the hope that it will be useful,
21 %% but WITHOUT ANY WARRANTY; without even the implied warranty of
22 %% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 %% GNU General Public License for more details.
25 %% You should have received a copy of the GNU General Public License
26 %% along with this program; if not, write to the Free Software
27 %% Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
29 \NeedsTeXFormat{LaTeX2e}
30 \ProvidesPackage{syntax}
31 [1996/05/17 1.9 Syntax typesetting (MDW)]
33 %% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
34 %% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
35 %% Digits \0\1\2\3\4\5\6\7\8\9
36 %% Exclamation \! Double quote \" Hash (number) \#
37 %% Dollar \$ Percent \% Ampersand \&
38 %% Acute accent \' Left paren \( Right paren \)
39 %% Asterisk \* Plus \+ Comma \,
40 %% Minus \- Point \. Solidus \/
41 %% Colon \: Semicolon \; Less than \<
42 %% Equals \= Greater than \> Question mark \?
43 %% Commercial at \@ Left bracket \[ Backslash \\
44 %% Right bracket \] Circumflex \^ Underscore \_
45 %% Grave accent \` Left brace \{ Vertical bar \|
46 %% Right brace \} Tilde \~}
48 \DeclareOption{rounded}{\sd@roundtrue}
49 \DeclareOption{square}{\sd@roundfalse}
50 \DeclareOption{nounderscore}{\@uscorefalse}
52 \newif\if@uscore\@uscoretrue
53 \ExecuteOptions{square}
57 \expandafter\def\expandafter\dospecials\expandafter{\dospecials\do#1}%
58 \expandafter\def\expandafter\@santize\expandafter{%
59 \@sanitize\@makeother#1}%
62 \def\do##1{\ifnum`#1=`##1 \else\noexpand\do\noexpand##1\fi}%
63 \edef\dospecials{\dospecials}%
64 \def\@makeother##1{\ifnum`#1=`##1 \else%
65 \noexpand\@makeother\noexpand##1\fi}%
66 \edef\@sanitize{\@sanitize}%
67 \def\@makeother##1{\catcode`##112}%
73 \hrule\@width.6em\@depth.4ex\@height-.34ex%
75 \ifdim\fontdimen\@ne\font=\z@%
79 \let\usc@builtindischyphen\-
82 \expandafter\@firstoftwo%
84 \expandafter\@secondoftwo%
87 {\textunderscore\@ifnextchar_{}{\usc@builtindischyphen}}%
94 \lowercase{\endgroup\def~{\protect\@uscore.}}%
97 \expandafter\let\csname?\string\textunderscore\endcsname\underscore
99 \@ifundefined{cc@\string#1}{%
105 \expandafter\let\csname mn@\string#1\endcsname~%
106 \expandafter\edef\csname cc@\string#1\endcsname{%
107 \catcode`\noexpand#1\the\catcode`#1%
108 \let\noexpand~\expandafter\noexpand%
109 \csname mn@\string#1\endcsname%
110 \noexpand\remspecial\noexpand#1%
111 \let\csname cc@\string#1\endcsname\relax%
113 \def~{\verb~\syn@ttspace}%
117 \PackageWarning{syntax}{Character `\expandafter\@gobble\string#1'
118 is already a verbatim\MessageBreak
123 \@ifundefined{cc@\string#1}{%
124 \PackageWarning{syntax}{Character `\expandafter\@gobble\string#1'
125 is not a verbatim\MessageBreak
128 \csname cc@\string#1\endcsname%
131 \newcommand{\syntleft}{$\langle$\normalfont\itshape}
132 \newcommand{\syntright}{$\rangle$}
133 \newcommand{\ulitleft}{\normalfont\ttfamily\syn@ttspace\frenchspacing}
134 \newcommand{\ulitright}{}
135 \newcommand{\litleft}{`\bgroup\ulitleft}
136 \newcommand{\litright}{\ulitright\egroup'}
137 \def\synt#1{\mbox{\syntleft{#1\/}\syntright}}
138 \def\lit{\@ifstar{\lit@i\ulitleft\ulitright}{\lit@i\litleft\litright}}
139 \def\lit@i#1#2#3{\mbox{#1{#3\/}#2}}
140 \def\syn@ttspace@{\spaceskip.35em\@plus.2em\@minus.15em\relax}
141 \def\ttthinspace{\let\syn@ttspace\syn@ttspace@}
142 \def\ttthickspace{\let\syn@ttspace\@empty}
144 \def\readupto#1#2#3{%
147 \let\do\@makeother\dospecials%
151 \gdef\verb@balance@group{\verb@egroup%
152 \@latex@error{\noexpand\verb illegal in command argument}\@ehc}%
153 \def\@vhook{\verb@egroup#3}%
154 \aftergroup\verb@balance@group%
155 \lowercase{\let~\@vhook}%
157 \def\syn@assist#1#2#3#4#5{%
164 \def\ch##1{\char`##1}%
169 \lowercase{\endgroup\def~}%
178 \/\endgroup#4\egroup#5%
186 \gdef\syn@shorts#1#2{%
191 {\act_{\@foundunderscore}}%
217 \def\syntaxShortcuts#1#2{%
228 \def\synshorts{\syntaxShortcuts\relax\relax}
235 \def\syntax#{\bgroup\syntaxShortcuts\relax\relax\let\@let@token}
236 \newskip\grammarparsep
237 \grammarparsep8\p@\@plus\p@\@minus\p@
238 \newdimen\grammarindent
240 \newcommand{\grammarlabel}[2]{%
243 \def\gr@implitem<#1> #2 {%
244 \sbox\z@{\hskip\labelsep\grammarlabel{#1}{#2}}%
247 \vskip-\baselineskip%
248 \hrule\@height\z@\@depth\z@\relax%
256 \newenvironment{grammar}{%
258 \labelwidth\grammarindent%
259 \leftmargin\grammarindent%
260 \advance\grammarindent\labelsep
263 \parsep\grammarparsep%
266 \syntaxShortcuts\relax\relax%
267 \def\alt{\\\llap{\textbar\quad}}%
270 \parshape\@ne\@totalleftmargin\linewidth%
282 \def\gr@endsyntdiag]{\end{syntdiag}\gr@setpar\par}%
283 \def\[{\@ifnextchar[{\begin{syntdiag}\@gobble}\gr@leftsq}%
284 \def\]{\@ifnextchar]\gr@endsyntdiag\gr@rightsq}%
290 \newskip\sdstartspace
295 \newdimen\sdrulewidth
296 \newdimen\sdcirclediam
298 \dimendef\sd@lower\z@
299 \dimendef\sd@upper\tw@
301 \dimendef\sd@topcirc6
302 \dimendef\sd@botcirc8
305 \advance\sd@mid-\dp\strutbox%
307 \sd@upper\sdrulewidth%
308 \advance\sd@upper\sd@mid%
309 \sd@lower\sdrulewidth%
310 \advance\sd@lower-\sd@mid%
311 \sd@topcirc-.5\sdcirclediam%
312 \advance\sd@topcirc\sd@mid%
313 \sd@botcirc-.5\sdcirclediam%
314 \advance\sd@botcirc-\sd@mid%
316 \newcommand{\sdsize}{%
319 \newcommand{\sdlengths}{%
320 \setlength{\sdstartspace}{1em minus 10pt}%
321 \setlength{\sdendspace}{1em minus 10pt}%
322 \setlength{\sdmidskip}{0.5em plus 0.0001fil}%
323 \setlength{\sdtokskip}{0.25em plus 0.0001fil}%
324 \setlength{\sdfinalskip}{0.5em plus 10000fil}%
325 \setlength{\sdrulewidth}{0.2pt}%
326 \setlength{\sdcirclediam}{8pt}%
327 \setlength{\sdindent}{0pt}%
332 \newif\ifsd@backwards
333 \def\sd@err{\PackageError{syntax}}
337 \raise\sd@mid\box\tw@%
342 \setbox\tw@\hbox{\kern-6\p@\@linefnt\char'55}%
347 \raise\sd@mid\hbox{\@linefnt\char'33\kern-6\p@}%
352 \setbox\tw@\hb@xt@\z@{\kern-\sdrulewidth\@linefnt\char'66\hss}%
353 \setbox\tw@\hbox{\lower10\p@\box\tw@}%
358 \setbox\tw@\hb@xt@\z@{\kern-\sdrulewidth\@linefnt\char'77\hss}%
362 \@getcirc\sdcirclediam%
363 \advance\@tempcnta#1%
364 \setbox\tw@\hbox{\lower\sdrulewidth%
365 \hbox{\@circlefnt\char\@tempcnta}}%
372 \dp\tw@.5\sdcirclediam%
373 \kern-\tw@\sdrulewidth%
374 \raise\sd@mid\box\tw@%
375 \kern.5\sdcirclediam%
380 \dp\tw@.5\sdcirclediam%
381 \kern.5\sdcirclediam%
382 \raise\sd@mid\box\tw@%
386 \ht\tw@.5\sdcirclediam%
388 \kern-\tw@\sdrulewidth%
389 \raise\sd@mid\box\tw@%
390 \kern.5\sdcirclediam%
394 \ht\tw@.5\sdcirclediam%
396 \kern.5\sdcirclediam%
397 \raise\sd@mid\box\tw@%
400 \hb@xt@.5\sdcirclediam{%
401 \sd@rule\hskip.5\sdcirclediam%
407 \hb@xt@.5\sdcirclediam{%
410 \sd@rule\hskip.5\sdcirclediam%
413 \def\sd@rule{\leaders\hrule\@height\sd@upper\@depth\sd@lower}
418 \nobreak\sd@rule\hskip\skip@%
424 \sd@rule\hskip\sdstartspace%
425 \sd@rule\hskip3.5\p@%
429 \nobreak\sd@rule\hskip\skip@%
435 \syntaxShortcuts\sd@tok@i\sd@tok@ii%
436 \@ifnextchar[\syntdiag@i{\syntdiag@i[]}%
438 \def\syntdiag@i[#1]{%
443 \leftmargin\sdindent%
444 \rightmargin\leftmargin%
452 \nobreak\sd@rule\hskip\sdstartspace%
455 \interlinepenalty100%
459 \def\gr@leftsq{\begin{stack}\\}%
460 \def\gr@rightsq{\end{stack}}%
461 \def\({\begin{stack}}%
470 \nobreak\sd@rule\hskip\sdmidskip%
471 \sd@rule\hskip\sdfinalskip%
475 \@namedef{syntdiag*}{%
476 \syntaxShortcuts\sd@tok@i\sd@tok@ii%
477 \@ifnextchar[\syntdiag@s@i{\syntdiag@s@i[]}%
479 \def\syntdiag@s@i[#1]{%
480 \@ifnextchar[{\syntdiag@s@ii{#1}}{\syntdiag@s@iii{#1}{\hbox}}%
482 \def\syntdiag@s@ii#1[#2]{\syntdiag@s@iii{#1}{\hb@xt@#2}}
483 \def\syntdiag@s@iii#1#2{%
488 \def\left##1{\def\sd@startarr{##1}}%
489 \def\right##1{\def\sd@endarr{##1}}%
496 \sd@qarrow\sd@startarr%
497 \sd@rule\hskip\sdmidskip%
503 \@namedef{endsyntdiag*}{%
505 \sd@rule\hskip\sdmidskip%
506 \sd@rule\hskip\sdfinalskip%
507 \sd@qarrow\sd@endarr%
512 \lccode`\~=`\<\lowercase{\def~{<}}%
513 \hbox{\csname sd@arr@#1\endcsname}%
516 \@namedef{sd@arr@>>-}{\sd@rightarr\kern-.5\p@\sd@rightarr\kern-\p@}
517 \@namedef{sd@arr@>-}{\sd@rightarr\kern-\p@}
518 \@namedef{sd@arr@->}{\sd@rightarr}
519 \@namedef{sd@arr@-><}{\sd@rightarr\kern-\p@\sd@leftarr}
520 \@namedef{sd@arr@...}{$\cdots$}
521 \@namedef{sd@arr@-}{}
522 \def\sd@newline{\@ifstar{\vadjust{\penalty\@M}\sd@nl@i}\sd@nl@i}
523 \def\sd@nl@i{\@ifnextchar[\sd@nl@ii\sd@nl@iii}
524 \def\sd@nl@ii[#1]{\vspace{#1}\sd@nl@iii}
526 \nobreak\sd@rule\hskip\sdmidskip%
527 \sd@rule\hskip\sdfinalskip%
532 \nobreak\sd@rule\hskip\sdstartspace%
533 \sd@rule\hskip3.5\p@%
538 \setbox\z@\hbox\bgroup%
548 \advance\@tempdima-\dp\z@%
549 \advance\@tempdima-\tw@\sd@mid%
550 \lower.5\@tempdima\box\z@%
566 \syntaxShortcuts\relax\relax%
573 \newcommand\stack[1][t]{%
575 \begingroup\sd@basefalse%
581 \ifsd@round\llap{\sd@trcirc\kern\tw@\sdrulewidth}\fi%
585 \ifsd@round\llap{\sd@brcirc\kern\tw@\sdrulewidth}\fi%
587 \sd@err{Bad position argument passed to stack}%
588 {The positioning argument must be one of `t' or `b'. I%
589 have^^Jassumed you meant to type `t'.}%
596 \setbox\z@\hbox\bgroup%
602 \sd@dostack\sd@upper\sd@lower\relax\relax%
606 \sd@dostack{\ht\z@}\sd@botcirc\sd@blcirc\sd@brcirc%
608 \sd@dostack{\ht\z@}\sd@botcirc\relax\relax%
611 \sd@dostack{\ht\z@}\sd@lower\relax\relax%
618 \rlap{\kern\tw@\sdrulewidth\sd@tlcirc}%
620 \rlap{\kern\tw@\sdrulewidth\sd@blcirc}%
623 \endgroup\sd@gap\sdmidskip%
630 \sd@dostack\sd@topcirc{\dp\z@}\relax\relax%
632 \sd@dostack\sd@topcirc{\dp\z@}\sd@tlcirc\sd@trcirc%
635 \sd@dostack\sd@upper{\dp\z@}\relax\relax%
640 \sd@dostack{\ht\z@}{\dp\z@}\sd@blcirc\sd@brcirc%
642 \sd@dostack{\ht\z@}{\dp\z@}\sd@tlcirc\sd@trcirc%
645 \sd@dostack{\ht\z@}{\dp\z@}\relax\relax%
649 \setbox\z@\hbox\bgroup%
652 \def\sd@dostack#1#2#3#4{%
655 \kern-\tw@\sdrulewidth%
656 \vrule\@height\@tempdima\@depth\@tempdimb\@width\tw@\sdrulewidth%
664 \vrule\@height\@tempdima\@depth\@tempdimb\@width\tw@\sdrulewidth%
665 \kern-\tw@\sdrulewidth%
668 \newcommand\rep[1][t]{%
670 \begingroup\sd@basefalse%
671 \ifsd@backwards\sd@backwardsfalse\else\sd@backwardstrue\fi%
680 \sd@err{Bad position argument passed to loop}%
681 {The positioning argument must be `t' or `b'. I have^^J%
682 assumed you meant to type `t'.}%
687 \setbox\tw@\copy\strutbox%
688 \setbox\z@\hbox\bgroup\strut%
694 \sd@doloop\tw@\z@\relax\relax%
695 \sd@tlcirc\sd@trcirc{\sd@rlc\sd@blcirc}{\sd@llc\sd@brcirc}%
697 \sd@doloop\tw@\z@\relax\sd@downarr\relax\relax\relax\relax%
701 \sd@doloop\z@\tw@\relax\relax%
702 {\sd@rlc\sd@tlcirc}{\sd@llc\sd@trcirc}\sd@blcirc\sd@brcirc%
704 \sd@doloop\z@\tw@\sd@uparr\relax\relax\relax\relax\relax%
708 \endgroup\sd@gap\sdmidskip%
712 \def\\{\sd@err{Too many \string\\\space commands in loop}\@ehc}%
713 \setbox\tw@\hbox\bgroup\strut%
715 \def\sd@doloop#1#2#3#4#5#6#7#8{%
716 \@tempdima\dp#1\relax%
717 \@tempdimb\ht#2\relax%
722 \sd@doloop@i#1#3\sd@topcirc\@tempdima{#5}{#6}%
723 \sd@doloop@i#2#4\@tempdimb\sd@botcirc{#7}{#8}%
725 \sd@doloop@i#1#3\sd@upper\@tempdima{#5}{#6}%
726 \sd@doloop@i#2#4\@tempdimb\sd@lower{#7}{#8}%
730 \def\sd@doloop@i#1#2#3#4#5#6{%
731 \ifsd@backwards#2\fi%
732 \kern-\tw@\sdrulewidth%
733 \vrule\@height#3\@depth#4\@width\tw@\sdrulewidth%
741 \vrule\@height#3\@depth#4\@width\tw@\sdrulewidth%
742 \ifsd@backwards\else#2\fi%
743 \kern-\tw@\sdrulewidth%
747 %% doafter package -- insert a token really after a group
748 %% Copyright (c) 1996 Peter Schmitt and Mark Wooding
750 \let\@@aftergroup\aftergroup
752 \def\@tempa{\@@aftergroup#1}%
753 \afterassignment\doafter@i\let\@let@token%
757 \let\aftergroup\@my@aftergroup%
758 \@@aftergroup\@prepare@after\@tempa%
760 \def\ag@cnt@local{0 }
761 \let\ag@cnt@global\ag@cnt@local
762 \def\@my@aftergroup{%
764 \count@\ag@cnt@local%
766 \xdef\ag@cnt@global{\the\count@\space}%
768 \let\ag@cnt@local\ag@cnt@global%
769 \@@aftergroup\@after@token\@@aftergroup%
775 \def\@start@after@group{%
777 \count@\ag@cnt@global%
778 \clubpenalty\ag@cnt@local%
779 \let\@after@token\@after@token@i%
781 \def\@after@token@i{%
782 \advance\count@\m@ne%
783 \ifnum\count@=\clubpenalty%
784 \global\let\ag@cnt@global\ag@cnt@local%
785 \expandafter\@after@aftertoken\expandafter\@after@all%
787 \expandafter\@@aftergroup%
790 \let\@after@all\endgroup
791 \def\@prepare@after{%
792 \ifx\ag@cnt@local\ag@cnt@global\else%
793 \expandafter\@prepare@after@i%
796 \def\@prepare@after@i#1{%
798 \def\@after@all{\@@aftergroup#1\endgroup}%
800 \def\@after@aftertoken#1{%
801 \let\bgroup\relax\let\egroup\relax%
803 \futurelet\@let@token\@after@aftertoken@i%
805 \def\@after@aftertoken@i{%
806 \ifcat\noexpand\@let@token{%
808 \else\ifcat\noexpand\@let@token}%
811 \def\@tempa##1{\@@aftergroup##1\the\toks@}%
812 \expandafter\expandafter\expandafter\@tempa%
817 %% End of file `syntax.sty'.