V10/cmd/sml/doc/refman/gram.tex
\chapter{Syntax of the full language}
\label{grammar}
{\samepage
\renewcommand{\lhs}[1]{\pagebreak[1] \\ \vspace{2ex}
#1 \ \( \rightarrow \) \' }
\newcommand{\also}[0]{\nopagebreak[3] \\}
\begin{tabbing}
longword \( \rightarrow \) \= \{ lab = exp , \rep{0} , lab = exp \} \
\ \ \ \= \kill
\+
\lhs{ide} ID \> {\em symbolic or alphabetic}
\also \verb"*" \> {\em \verb"*" is legal as a value-identifer}
\also = \> {\em \verb"=" may be used but not rebound }
\lhs{opid} ide \>
\also \res{op} ide \> {\em removes infix status }
\lhs{qualid} ide
\also ID . qualid
\lhs{ident} opid
\also qualid
\lhs{lab} ID \>
\also INT \> {\em numeric labels}
\lhs{const} INT \>
\also REAL \>
\also STRING \>
\also () \>
\also ident \> {\em nullary constructor}
\lhs{exp} ident \> {\em variable}
\also const
\also \# lab \> {\em field selector }
\also \{ lab = exp , \rep{0} , lab = exp \} \> {\em record}
\also ( exp , \rep{2} , exp ) \> {\em tuple }
\also ( exp ; \rep{1} ; exp ) \> {\em sequence }
\also \verb"[" exp , \rep{0} , exp \verb"]" \> {\em list}
\also \res{let} decs \res{in} expseq \res{end} \> {\em local
declaration}
\also exp exp \> {\em application; left--associative}
\also exp ide exp \>{\em infixed application}
\also exp : ty \>{\em type constraint}
\also exp \res{andalso} exp \>{\em conjunction}
\also exp \res{orelse} exp \>{\em disjunction}
\also \res{fn} match \>{\em function}
\also \res{case} exp \res{of} match \>{\em case expression}
\also \res{while} exp \res{do} exp \>{\em iteration}
\also \res{if} exp \res{then} exp \res{else} exp \>{\em conditional}
\also exp \res{handle} match \>{\em handle exception; right--associative}
\also \res{raise} exp \>{\em raise exception}
\lhs{match} pat \verb"=>" exp $\mid$ \rep{1} $\mid$ pat \verb"=>" exp \>
\lhs{apat} ident \>{\em variable binding }
\also const \>{\em constant pattern}
\also \verb"_" \>{\em wildcard}
\also ( pat )
\also ( pat , \rep{2} , pat) \>{\em tuple}
\also \{ patfield , \rep{0} , patfield \} \>{\em record}
\also \{ patfield , \rep{0} , patfield , ... \} \>{\em flexible record}
\also \verb"[" pat , \rep{0} , pat \verb"]" \>{\em list}
\lhs{pat} apat \>{\em atomic}
\also ident apat \>{\em construction; left--associative}
\also pat ide pat \>{\em infixed construction}
\also pat : ty \>{\em type constraint}
\also opid constraint \res{as} pat \>{\em layered}
\lhs{patfield} lab = pat \>{\em normal}
\also ID \>{\em abbreviation}
\also ID \res{as} pat \>{\em abbreviation}
\lhs{ty} \res{tyvar} \>{\em type variable}
\also \{ lab : ty , \rep{0} , lab : ty \} \>{\em record type}
\also ( ty )
\also ( ty , \rep{2} , ty ) qualid \>{\em type construction}
\also ty qualid \>{\em unary type construction}
\also qualid \>{\em nullary type construction}
\also ty \verb"*" \rep{2} \verb"*" ty \>{\em typle type}
\also ty \verb"->" ty \>{\em function type; right--associative}
\lhs{vb} pat = exp \>{\em simple }
\also vb \res{and} \rep{1} \res{and} vb \>{\em multiple}
\lhs{constraint} \> {\em absent}
\also : ty \>{\em type constraint}
\lhs{rvb} opid constraint = \res{fn} match \>{\em simple recursive}
\also rvb \res{and} \rep{1} \res{and} rvb \>{\em mutually recursive}
\lhs{clause} opid apat \rep{1} apat constraint = exp \>{\em prefix}
\also pat ide pat constraint = exp \>{\em infix}
\lhs{fb} clause $\mid$ \rep{1} $\mid$ clause \>{\em clausal function}
\also fb \res{and} \rep{1} \res{and} fb \>{\em mutually recursive}
\lhs{tb} tyvars ID = ty \>{\em simple }
\also tb \res{and} \rep{1} \res{and} tb \>{\em multiple}
\lhs{tyvars} \> {\it absent}
\also \res{tyvar} \>{\em single}
\also ( \res{tyvar} , \rep{2} , \res{tyvar} ) \>{\em multiple}
\lhs{db} tyvars ID = constr $\mid$ \rep{1} $\mid$ constr \>{\em
simple}
\also db \res{and} \rep{1} \res{and} db \>{\em mutually recursive}
\lhs{constr} opid \>{\em nullary (constant)}
\also opid \res{of} ty \>{\em unary}
\lhs{eb} ide \>{\em nullary (constant)}
\also ide \res{of} ty \>{\em unary}
\also ide = qualid \>{\em re--naming}
\also eb \res{and} \rep{1} \res{and} eb \>{\em multiple}
\lhs{ldec} \res{val} vb \>{\em value declaration}
\also \res{val} \res{rec} rvb \>{\em recursive value declaration}
\also \res{fun} fb \>{\em function declaration}
\also \res{type} tb \>{\em type declaration}
\also \res{datatype} db \>{\em datatype declaration}
\also \res{exception} eb \>{\em exception declaration}
\also \res{local} ldec \res{in} ldec \res{end} \>{\em local
declaration}
\also \res{open} qualid \rep{1} qualid \>{\em structure visibility}
\also fixity ide \rep{1} ide \>{\em directive}
\also ldec ldec \>{\em declaration sequence}
\also ldec \verb";" \>{\em optional semicolon}
\lhs{fixity} \res{infix} INT \>{\em declare infix,
left--associative}
\also \res{infix} \>{\em declare infix, precedence 0}
\also \res{infixr} INT \>{\em infix, right associative}
\also \res{infixr} \>{\em infix, right assoc., prec. 0}
\also \res{nonfix} \>{\em cancel infix status}
\lhs{sgn} ID
\also \res{sig} specs \res{end}
\lhs{specs} spec
\also specs spec
\also specs ;
\lhs{spec} \res{structure} ID : sgn \res{and} \rep{1} \res{and} ID : sgn
\also \res{datatype} db \res{and} \rep{1} \res{and} db
\also \res{type} tyvars ID \res{and} \rep{1} \res{and} tyvars ID
\also \res{val} ide : ty \res{and} \rep{1} \res{and} ide : ty
\also \res{exception} exnspec \res{and} \rep{1} \res{and} exnspec
\also \res{sharing} sharspec \res{and} \rep{1} \res{and} sharspec
\lhs{exnspec} ide
\also ide \res{of} ty
\lhs{sharspec} qualid = \rep{2} = qualid
\end{tabbing}
This description is at present incomplete, as it is missing the
grammar rules for structures and functors.
}