%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Hevea code for syntax definitions of the ocaml manual % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Important commands % \token, for typesetting grammar terminals % \nonterm, for typesetting grammar non-terminals % % Beware: \nonterm introduces either a local anchor or a local reference % -Anchors are introduced when \nonterm occurs in the first column of % syntax definitions (environment 'syntax') % - References are introduced everywhere else % % For pure typesetting effect without links (eg. to typeset 'e' as 'expr') % use the \nt command (eg. \nt{e}). % In syntax definitions, the tool 'transf' translates @word@ into \nt{word}. % % Warnings are produced % - For references to non-defined non terminals % - For multiple definitions of the same non-terminal % Warnings can be avoided for a given non-terminal 'expr' by issuing % the command \stx@silent{'expr'} % %It is also possible to alias a nonterminal: %\stx@alias{name}{othername} %will make reference to 'name' point to the definition of non-terminal %'othername' \newif\ifspace \def\addspace{\ifspace\;\spacefalse\fi} \ifhtml \newcommand{\token}[1]{\texttt{\blue#1}} \else \newcommand{\token}[1]{\texttt{#1}} \fi %%% warnings \def\stx@warning#1#2{\@ifundefined{stx@#1@silent}{\hva@warn{#2}}{}} \def\stx@silent#1{\def\csname stx@#1@silent\endcsname{}} %%% Do not warn about those %initial example \stx@silent{like}\stx@silent{that}% %Not defined \stx@silent{regular-char}% \stx@silent{regular-string-char}% %\stx@silent{regular-char-str}% \stx@silent{lowercase-ident}% \stx@silent{capitalized-ident}% \stx@silent{space}% \stx@silent{tab}% \stx@silent{newline}% %Used in many places \stx@silent{prefix}% \stx@silent{name}% \stx@silent{xname}% %Not defined \stx@silent{external-declaration}% \stx@silent{unit-name}% %%Redefined in exten.etex \stx@silent{parameter}% \stx@silent{pattern}% \stx@silent{constr-decl}% \stx@silent{type-param}% \stx@silent{let-binding}% \stx@silent{expr}% \stx@silent{typexpr}% \stx@silent{module-expr}% \stx@silent{type-representation}% \stx@silent{definition}% \stx@silent{specification}% \stx@silent{type-equation}% \stx@silent{class-field}% \stx@silent{mod-constraint}% \stx@silent{module-type}% \stx@silent{constant}% %%Redefined in names.etex \stx@silent{label-name}% %%Not really defined in lexyacc.etex \stx@silent{character-set}% \stx@silent{symbol}% %%Not defined in debugger.etex \stx@silent{integer} %%Not defined in ocamldoc.etex \stx@silent{string} \stx@silent{id} \stx@silent{Exc} \stx@silent{URL} %%%%%%%%%%%%% %% Aliases %% %%%%%%%%%%%%% \newcommand{\stx@alias}[2]{\def\csname stx@#1@alias\endcsname{#2}} \stx@alias{typ}{typexpr}% \stx@alias{met}{method-name}% \stx@alias{tag}{tag-name}% \stx@alias{lab}{label-name}% \stx@alias{C}{constr-name} %%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%special anchor \newstyle{a.syntax:link}{color:maroon;text-decoration:underline} \newstyle{a.syntax:visited}{color:maroon;text-decoration:underline} \newstyle{a.syntax:hover}{color:black;text-decoration:none;background-color:\#FF6060} %compatibility for hevea-1.1?/heeva-2.?? \ifu\@tr@url \providecommand{\@tr@url}[1]{#1}\def\stx@id{NAME}\else \def\stx@id{id}\fi \newcommand{\@syntaxlocref}[2] {\@aelement{href="\@print{#}\@tr@url{#1}" class="syntax"}{#2}} \newcommand{\@syntaxaname}[2] {\@aelement{\stx@id="#1" class="syntax"}{#2}} %%Refer to anchor, internal : %#1 -> anchor #2 -> visible tag \def\@ref@anchor#1#2{% \@ifundefined{stx@#1@exists} {\stx@warning{#1}{Undefined non-terminal: '#1'}#2} {\@syntaxlocref{#1}{#2}}} %%Refer to anchor \def\ref@anchor#1{% \ifu\csname stx@#1@alias\endcsname \@ref@anchor{#1}{#1}\else \@ref@anchor{\csname stx@#1@alias\endcsname}{#1}\fi} \def\stx@exists#1{\def\csname stx@#1@exists\endcsname{}} %%Define anachor \def\def@anchor#1{% \@ifundefined{stx@#1} {{\@nostyle\@auxdowrite{\string\stx@exists\{#1\}}}% \gdef\csname stx@#1\endcsname{}\@syntaxaname{#1}{#1}} {\@ifundefined{stx@#1@silent} {\hva@warn{Redefinition of non-terminal '#1'}#1} {\ref@anchor{#1}}}} %%%Change \@anchor and initial definition, for html only, of course! \ifhtml \def\set@name{\let\@anchor\def@anchor} \let\@anchor\ref@anchor \else \def\set@name{} \def\@anchor{} \fi %%%Format non-terminal \def\nt#1{\textit{\maroon#1}} %%%Link for non-terminal and format \def\nonterm#1{\addspace\nt{\@anchor{#1}}\spacetrue} \def\brepet{\addspace\{} \def\erepet{\}} \def\boption{\addspace[} \def\eoption{]} \def\brepets{\addspace\{} \def\erepets{\}^+} \def\bparen{\addspace(} \def\eparen{)} \def\orelse{\mid \spacefalse} \def\is{ & ::= & \spacefalse } \def\alt{ \\ & \mid & \spacefalse } \def\sep{ \\ \\ \spacefalse } \def\cutline{} \def\emptystring{\epsilon} \def\syntax{$$\begin{array}{>{\set@name}rcl}\spacefalse} \def\endsyntax{\end{array}$$} \def\syntaxleft{$\begin{array}{>{\set@name}rcl}\spacefalse} \def\endsyntaxleft{\end{array}$} \def\synt#1{$\spacefalse#1$}