158 lines
4.8 KiB
Plaintext
158 lines
4.8 KiB
Plaintext
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
% 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$}
|