% rail.tex - documentation file for Rail package % % To create rail.dvi, use % % latex rail (creates rail.rai from rail.tex) % rail rail (creates rail.rao from rail.rai) % latex rail (creates rail.dvi from rail.tex and rail.rao) % % Or type % % make doc % % 09-Jul-90 L. Rooijakkers % 08-Oct-90 L. Rooijakkers alternate star layout % 07-Feb-91 L. Rooijakkers auto indexing, embedded options % 08-Feb-91 L. Rooijakkers version 1.0 #0 docs % 12-Feb-91 L. Rooijakkers patchlevel 1 % 28-Jun-94 K. Barthelmann adapted for LaTeX2e % 13-Dec-96 K. Barthelmann added second author, updated availability section % 28-Oct-97 K. Barthelmann updated availability section % 18-Apr-98 K. Barthelmann added backward compatibility (sub)section % 21-May-98 K. Barthelmann describe new \railoption for arrow-heads % contributed by J. Olsson % \documentclass[a4paper]{article} \usepackage{rail} \railoptions{+ac} % \railoptions{-h} \railalias{quote}{'} \railalias{dquote}{"} \railalias{cr}{\char"5C\char"5C} \railterm{quote,dquote,cr} \newcommand\Rail{Rail} \newcommand\nt[1]{\textit{#1}} \newcommand\file[1]{\textit{file}\texttt{.#1}} \newcommand\lit[1]{\texttt{#1}} \newcommand\cs[1]{\lit{\char"5C\relax#1}} \newenvironment{example}% {\begin{trivlist}\item[]\begin{tabular}{l}}% {\end{tabular}\end{trivlist}} \title{ \Rail \\[1ex] Syntax Diagrams For \LaTeX } \author{ L.W.J. Rooijakkers\thanks{original version} \\ University of Nijmegen \\ The Netherlands \\ E-mail: \texttt{lwj@cs.kun.nl} \and K. Barthelmann\thanks{update} \\ University of Mainz \\ Germany \\ E-mail: \texttt{barthel@informatik.uni-mainz.de} } \date{May 21, 1998} \begin{document} \maketitle \section{Introduction} The \Rail\ package allows you to include syntax diagrams (also known as \emph{railroad diagrams}) in a \LaTeX\ document. Such a diagram looks like this: \label{example} \begin{rail} decl : 'def' identifier '=' ( expression + ';' ) | 'type' identifier '=' type ; \end{rail} (If you like arrow-heads where the lines enter the boxes, a nice feature contributed by J.~Olsson, see Section \ref{sec:options}.) The idea is that any sequence of terminals and nonterminals that can be produced by starting at the left and following the lines is a valid sentence of some language. As such, these diagrams are analogous to BNF with embedded regular expressions for each right-hand side. Actually, the input language looks like that, except that production rules need not be named and there is some extra annotation. This document describes version 1.2 of the \Rail\ package. \section{Usage} To use the \Rail\ package in your \LaTeX\ document you need to write \begin{example} \verb!\usepackage{rail}! \end{example} in the document's preamble. It is usually best to put the \lit{rail} option last. Then you can display diagrams in your document body by using \begin{example} \verb!\begin{rail}! \\ \nt{rules} \\ \verb!\end{rail}! \end{example} where the syntax of \nt{rules} is given in Figures \ref{rules} and \ref{body}, as a railroad diagram. There are also various options you can set in the preamble. \begin{figure} \begin{rail} rules : ( rule ? + ';' ) ; rule : ( identifier ':' ) ? body[1--5] ; \end{rail} \caption{Input syntax for \Rail} \label{rules} \end{figure} \begin{figure} \begin{rail} body : [1] ( ( '[' string ']' ) ? body[2--6] + '|' ) | [2] body[3--6] '*' body[5--6] | [2] body[3--6] '+' body[5--6] | [3] ( body[4--5] + ) | [4] body[5] '?' | [5] identifier ( '[' string ']' ) ? | [5] quote string quote | [5] dquote string dquote | [5] '(' body[1--6] ')' | [5] cr | [6] ; \end{rail} \caption{Input syntax for \Rail, continued} \label{body} \end{figure} After running your \file{tex} through \LaTeX, a file named \file{rai} will have been created, containing all the \nt{rules} from your document. This file must then be processed with the \lit{rail} program to produce \file{rao} containing \LaTeX\ formatting instructions for each diagram This is done with the command \begin{example} \texttt{rail} \textit{file} \end{example} On the next \LaTeX\ run, the diagrams will be picked up and integrated into the output. If the diagrams in \file{rao} are not up-to-date with your \LaTeX\ file, the \lit{rail} package will detect this and warn you with \begin{example} \verb!Package rail Warning: Railroad diagram {!\nt{number}\verb!} doesn't match on input line !\nt{number}\verb!.! \end{example} for each diagram, and again at the end of the document with \begin{example} \verb!Package rail Warning: Railroad diagram(s) may have changed. Use 'rail' and rerun.! \end{example} The \nt{number} between braces can be used to find the diagram in \file{rai} or \file{rao} if needed. \section{Input language} As said before, diagrams are displayed by using \begin{example} \verb!\begin{rail}! \\ \nt{rules} \\ \verb!\end{rail}! \end{example} Refer to Figures \ref{rules} and \ref{body} for the syntax of \nt{rules}. This syntax is rather strict. Some use of \TeX\ macros within \nt{rules} is possible, but no nested environments are allowed. However, defining a macro to save typing is possible. As seen in the figure, \nt{rules} consist of zero or more occurrences of a \nt{rule}, separated by one or more semicolons. Each \nt{rule} starts with an optional \nt{identifier} giving the name of the rule, followed by the rule \nt{body} (named rules can be indexed automatically with the \lit{-i} option, see below) . This looks pretty much like BNF, but there are some other operators. Most of these are very similar to the usual operators of regular expressions, others are for formatting only. Parentheses \verb!( )! are used for grouping. The italic numbers in the figure are the priority levels of each alternative. An occurrence like \begin{rail} body[3--5] \end{rail} means that only alternatives with a priority in the range 3--5 are allowed at that point. I will illustrate the meaning of the various operators with small examples. \subsection{Atoms} The primitive atoms of the rules are identifiers and various forms of strings. Identifiers usually signify nonterminals, but they can also be used for terminal symbols (see \cs{railterm} below). Strings delimited by single quotes (\verb!'!) or double quotes (\verb!"!) signify terminals. Either kind of string may not contain tabs, newlines or it's closing quote. Note that these strings pass through \TeX\ several times, thus it is unwise to use special characters like \verb!{!, \verb!}!, \verb!$!, \verb!%!, \verb!&!, \verb!\! in strings. If you need to use these as symbols, see \cs{railalias} below. Any nonterminal is formatted in a square box, like \begin{rail} nonterminal \end{rail} while any terminal text is formatted in a box with rounded corners like \begin{rail} 'terminal' \end{rail} Nonterminal identifiers can be annotated by following them with a string enclosed in \verb![! and \verb!]!. This is described below under the \verb!|! operator. The fonts used for typesetting terminals, nonterminals and annotations can be specified, see \cs{rail}\ldots\lit{font} below. \subsection{Concatenation} The most basic operation is concatenation, for which the operator is invisible. It works exactly like you think. Entering \verb!x y z! produces \begin{rail} x y z \end{rail} Related to concatenation is the empty body. It can occur only as operand of \verb!|!, \verb!*! or \verb!+! or within parentheses. A safe way to write the empty body is \verb!()!, which displays as \begin{rail} () \end{rail} i.e., nothing. However, the invisible empty body is useful with the repetition operators, as will be seen below. A feature related to concatenation is the ability to split long horizontal sequences with \verb!\\!. As an example, \verb!a b c d e \\ f g h i j! results in \begin{rail} a b c d e \\ f g h i j \end{rail} It is possible to create horrible graphic constructions with this operator, for example \verb!\\ | \\!: \begin{rail} \\ | \\ \end{rail} or \verb!( \\ * \\ ) \\!: \begin{rail} ( \\ * \\ ) \\ \end{rail} Nevertheless, every input should result in reasonable output. \subsection{Choice} The next operation is choice, for which the operator is \verb!|!. It has the lowest priority of all. Entering \verb!x | y | z! produces \begin{rail} x | y | z \end{rail} With this operator, parentheses are significant. The expressions \verb!( x | y ) | z! and \verb!x | ( y | z )! produce \begin{rail} ( x | y ) | z \end{rail} and \begin{rail} x | ( y | z ) \end{rail} respectively, which have a different layout (but represent the same language). Related to choice are priority annonations, of the form \texttt{[}\nt{string}\texttt{]}. An example of their use can be seen in the railroad diagram for \nt{body}. They should only be used with the top-level choice of a rule body, since otherwise their meaning is not clear. As an example, \verb![1] x y | [2] z! produces \begin{rail} [1] x y | [2] z \end{rail} When used with identifiers as in \verb!body[2--5]! they produce \begin{rail} body[2--5] \end{rail} The \nt{string} between \verb![! and \verb!]! may not contain tabs, newlines or \verb!]!. Remember that you should use \verb!--! to produce a number dash (see \emph{\LaTeX: A Document Preparation System}, page~14). \subsection{Repetition} There are also the repetition operators \verb!*! and \verb!+!, which are similar to their regular-expression counterparts. For our purposes, \verb!+! is the most basic one. The expression \verb!x + y! means ``one or more times \verb!x!, separated by \verb!y!,'' and is displayed as \begin{rail} x + y \end{rail} The utility of this construction is most obvious with things like \begin{rail} identifier + ',' \end{rail} The second argument of \verb!+! can be empty, resulting in the usual meaning of \verb!x +! as ``one or more times \verb!x!,'' which is displayed as you would expect: \begin{rail} x + \end{rail} The Kleene star operator \verb!*! is just a shorthand: \verb!x * y! is identical in meaning to \verb!() | x + y! and both display as \begin{rail} () | x + y \end{rail} Analogously, \verb!x *! is usually identical to \verb!() | x + ! and displays as \begin{rail} () | x + \end{rail} However, it is also possible to transform this to \verb!() + x! which displays as \begin{rail} () + x \end{rail} This can be made the default behaviour of \Rail\ by using the \lit{-a} option, either on the command line or with \verb!\railoptions! (see below). \subsection{Optional things} Then there is the optionality operator \verb!?!. The expression \verb!x ?! is actually just a shorthand for \verb!() | x! and displays like \begin{rail} x ? \end{rail} \subsection{An example} As an example, here is the input for the example diagram on page \pageref{example}: \begin{verbatim} \begin{rail} decl : 'def' identifier '=' ( expression + ';' ) | 'type' identifier '=' type ; \end{rail} \end{verbatim} \section{Formatting} \subsection{Indexing} The \Rail\ package can automatically index named rules. This is specified with the \lit{-i} option of the \lit{rail} command, which can be given on the command line or with \cs{railoptions}. If enabled, every rule of the form \begin{example} \nt{identifier} \lit{:} \nt{body} \end{example} will generate a \LaTeX\ \cs{index} command for this identifier, normally in \textit{italic} font (this can be changed with \cs{railindexfont}). \subsection{Terminal identifiers} It is possible to use identifiers as terminals, with optional user-specified formatting. To declare identifiers as terminals, use \begin{example} \verb!\railterm{!\nt{identifier}\verb!,!\nt{identifier}\verb!,!\ldots\verb!}! \end{example} To declare an identifier as a symbol with user-specified formatting, use \begin{example} \verb!\railalias{!\nt{identifier}\verb!}{!\nt{text}\verb!}! \end{example} Henceforth, \nt{text} will be used to format the symbol named \nt{identifier}. For example, the following commands can be used to use special \TeX\ characters as terminals: \begin{example} \verb!\railalias{lbrace}{\{}! \\ \verb!\railalias{rbrace}{\}}! \\ \verb!\railalias{dollar}{\$}! \\ \verb!\railalias{percent}{\%}! \\ \verb!\railalias{ampersand}{\&}! \\ \verb!\railalias{backslash}{\char"5C}! \\ \verb!\railterm{lbrace,rbrace,dollar,percent,ampersand,backslash}! \end{example} \subsection{Fonts} To format all text, the \Rail\ package uses fonts that are all configurable with the following commands: \begin{trivlist}\item[] \begin{tabular}{|l|l|l|} \hline Text & Command & Default \\ \hline\hline rule names & \cs{railnamefont} & \textit{italic font} (\cs{rmfamily}\cs{itshape}) \\ nonterminals & \cs{railnontermfont} & \textup{roman font} (\cs{rmfamily}\cs{upshape}) \\ terminals & \cs{railtermfont} & \texttt{typewriter font} (\cs{ttfamily}\cs{upshape}) \\ annotations & \cs{railannotatefont} & \textit{italic font} (\cs{rmfamily}\cs{itshape}) \\ index entries & \cs{railindexfont} & \textit{italic font} (\cs{rmfamily}\cs{itshape}) \\ \hline \end{tabular} \end{trivlist} All of these are used like \begin{example} \verb!\rail!\ldots\verb!font{!\nt{font}\verb!}! \end{example} where \nt{font} is a font control sequence like \cs{rmfamily} or a type style like \cs{bfseries} (it can actually be any sequence of formatting commands). \subsection{Style parameters} Every diagram is formatted as a \LaTeX\ \lit{picture} environment inside a \lit{list} environment. The formatting parameters of the \lit{list} environment can be set with \begin{example} \verb!\railparam{!\textit{decls}\verb!}! \end{example} where \textit{decls} will be used as the \textit{decls} argument of the \lit{list} environment. For example, \begin{example} \verb!\railparam{\addtolength{\itemsep}{1ex}}! \end{example} increases the amount of vertical space between rules. The \lit{picture} line thickness is used for all lines in diagrams, so \cs{thinlines}, \cs{thicklines} and \cs{linethickness}\verb!{!\textit{len}\verb!}! can be used to change it. However, \cs{unitlength} is not used (but see \cs{railunit} below). Some of the formatting within the \lit{picture} can be changed by modifying style parameters. If any of these are modified, the command \cs{railinit} should be executed before the next \lit{rail} environment, otherwise some changes will not take effect. Otherwise, these parameters are subject to grouping. \begin{description} \item[\cs{railnamesep}] The amount of vertical space between the rule name and the rule body. \item[\cs{railunit}] This is the value of \cs{unitlength} used within diagrams. Usually set to \verb!1sp! to provide maximal resolution. \item[\cs{railextra}] The amount of extra line length added at the left and right ends of the diagram. \item[\cs{railboxheight}] The height of the boxes enclosing terminals and nonterminals. This value is used as the size argument to \cs{oval}. For best results, only use multiples of \verb!4pt!. \item[\cs{railboxskip}] The amount of vertical space between the lines of a diagram. \item[\cs{railboxleft}] The amount of extra line length added at the left of a box. \item[\cs{railboxright}] Idem on the right. \item[\cs{railovalspace}] The amount of extra space added to the size of the text to get the horizontal size of the oval box enclosing it. \item[\cs{railframespace}] Idem for square boxes. \item[\cs{railtextleft}] The amount of extra line length added at the left of an annotation. \item[\cs{railtextright}] Idem at the right. \item[\cs{railtextup}] The amount that annotation text is shifted up from the line it is attached to. \item[\cs{railjoinsize}] The radius of the circle segments used to join and split lines. This value is used as the size argument to \cs{oval}. For best results, only use multiples of \verb!4pt!. \end{description} \subsection{Backward compatibility} The command \verb!\railtoken{!\textit{identifier}\verb!}{!\textit{text}\verb!}! has been retained as an abbreviation for \begin{example} \verb!\railalias{!\textit{identifier}\verb!}{!\textit{text}\verb!}! \verb!\railterm{!\textit{identifier}\verb!}! \end{example} Diagrams are now set flush left by default. If you prefer some indentation, you can use \cs{railparam}, for example \begin{example} \verb!\railparam{\setlength{\leftmargin}{\leftmargini}}! \end{example} Older \Rail\ files probably need to be processed again. \section{The \texttt{rail} program} The full synopsis of the \lit{rail} program is \begin{example} \lit{rail} [\lit{+-acdhit}] [\nt{file}] \end{example} This will read \file{rai} and create \file{rao} if there are no errors. If there are any errors, \file{rao} will be removed. If no \nt{file} argument is given, \lit{rail} reads from standard input and writes to standard output. \subsection{Options}\label{sec:options} Option arguments start with a minus or a plus sign, followed by one or more option letters. If a minus sign is used, the options are set. With a plus sign, the options are reset. By default, no options are set. Options can also be set or reset from the \LaTeX\ file (see below). This overrides the corresponding options setting from the command line. The effect of setting each option is described below. \begin{description} \item[\lit{-a}] An alternate layout is used for the \verb!*! operator with an empty second argument. Instead of transforming \verb!x *! into \verb!() | x +! it is transformed into \verb!() + x!. \item[\lit{-c}] The input is checked for undefined identifiers and unnamed rules. Statistics about those are printed to the standard output stream. \item[\lit{-d}] Turns on \textit{yacc} debugging output. This only works if the program has been compiled with \verb!YYDEBUG! defined (which is the default) and your \textit{yacc} supports it. \item[\lit{-h}] Arrow-heads are drawn where lines enter the boxes. \item[\lit{-i}] Index entries are generated for all named rules, i.e., rules that are of the form \begin{example} \nt{identifier} \lit{:} \nt{body} \end{example} \item[\lit{-t}] Print the parse tree of a rule body as comments in the \verb!.rao! file. \end{description} Options can be set from a \LaTeX\ file by use of \begin{example} \verb!\railoptions{!\nt{options}\verb!}! \end{example} where \nt{options} is a set of option arguments just like those allowed on the command line. Options specified this way override those on the command line. The option settings take effect immediately. Setting options this way is especially useful for the \lit{-a}, \lit{-c} and \lit{-t} options. Messages about redefined identifiers are printed according to the setting of \lit{-c} in effect at that point, but messages about undefined identifiers and unnamed rules are printed only if \lit{-c} is still in effect at the end of the input file. \subsection{Manual page} There may also be an \textit{nroff}/\textit{troff} manual page available, which you can obtain by using \verb!man rail!. This manual page is distributed with the \Rail\ package as the file \verb!rail.man!. \subsection{Bugs} Due to the use of a \textit{yacc} parser, the error messages are not very helpful (essentially only '\lit{syntax error}'), but this is difficult to correct. \section{Availability} As of version 1.1, the \Rail\ package is available for Internet anonymous FTP or WWW from CTAN (Comprehensive \TeX\ Archive Network) hosts in the directory \lit{support/rail}. Please report any bugs or complaints to the second author, K.~Barthelmann. The first author, L.W.J.~Rooijakkers, seems to be no longer reachable. Requests for features might be honored if I have the time (no chance \lit{:-)}) or need the feature myself. Have fun! \end{document}