This page describes the full grammar of the core and module language of Standard ML ('97 revision), including all "derived forms" from Appendix A of the language definition.
See below for explanation of the notation.
con | ::= | int | integer |
word | word | ||
float | floating point | ||
char | character | ||
string | string | ||
int | ::= | 〈~〉num | decimal |
〈~〉0xhex | hexadecimal | ||
word | ::= | 0wnum | decimal |
0wxhex | hexadecimal | ||
float | ::= | 〈~〉num.num | floating point |
〈~〉num〈.num〉e〈~〉num | scientific | ||
char | ::= | #"ascii" | character |
string | ::= | "〈ascii〉*" | string |
num | ::= | 〈digit〉+ | number |
hex | ::= | 〈digit | letter〉+ | hexadecimal number (letters may only be in the range A-F) |
ascii | ::= | ... | single non-" ASCII character or \-headed escape sequence |
id | ::= | letter〈letter | digit | ' | _〉* | alphanumeric |
〈! | % | & | $ | # | + | - | / | : | < | = | > | ? | @ | \ | ~ | ` | ^ | | | *〉+ | symbolic (not allowed for type variables or module language identifiers) | ||
var | ::= | '〈letter | digit | ' | _〉* | unconstrained |
''〈letter | digit | ' | _〉* | equality | ||
longid | ::= | id1.···.idn | qualified (n ≥ 1) |
lab | ::= | id | identifier |
num | number (may not start with 0) |
exp | ::= | con | constant |
〈op〉 longid | value or constructor identifier | ||
exp1 exp2 | application | ||
exp1 id exp2 | infix application | ||
( exp ) | parentheses | ||
( exp1 , ... , expn ) | tuple (n ≠ 1) | ||
{ 〈exprow〉 } | record | ||
# lab | record selector | ||
[ exp1 , ... , expn ] | list (n ≥ 0) | ||
( exp1 ; ... ; expn ) | sequence (n ≥ 2) | ||
let dec in exp1 ; ... ; expn end | local declaration (n ≥ 1) | ||
exp : typ | type annotation | ||
raise exp | exception raising | ||
exp handle match | exception handling | ||
exp1 andalso exp2 | conjunction | ||
exp1 orelse exp2 | disjunction | ||
if exp1 then exp2 else exp3 | conditional | ||
while exp1 do exp2 | iteration | ||
case exp of match | case analysis | ||
fn match | function | ||
exprow | ::= | lab = exp 〈, exprow〉 | expression row |
match | ::= | pat => exp 〈| match〉 | match |
pat | ::= | con | constant |
_ | wildcard | ||
〈op〉 id | variable | ||
〈op〉 longid 〈pat〉 | construction | ||
pat1 id pat2 | infix construction | ||
( pat ) | parentheses | ||
( pat1 , ... , patn ) | tuple (n ≠ 1) | ||
{ 〈patrow〉 } | record | ||
[ pat1 , ... , patn ] | list (n ≥ 0) | ||
pat : typ | type annotation | ||
〈op〉 id 〈: typ〉 as pat | layered | ||
patrow | ::= | ... | wildcard |
lab = pat 〈, patrow〉 | pattern | ||
id 〈: typ〉 〈as pat〉 〈, patrow〉 | variable |
typ | ::= | var | variable |
〈typ〉(,) longid | constructor | ||
( typ ) | parentheses | ||
typ1 -> typ2 | function | ||
typ1 * ... * typn | tuple (n ≥ 2) | ||
{ 〈typrow〉 } | record | ||
typrow | ::= | lab : typ 〈, typrow〉 | type row |
dec | ::= | val 〈var〉(,) valbind | value |
fun 〈var〉(,) funbind | function | ||
type typbind | type | ||
datatype datbind 〈withtype typbind〉 | data type | ||
datatype id = datatype longid | data type replication | ||
abstype datbind 〈withtype typbind〉 with dec end | abstract type | ||
exception exnbind | exception | ||
structure strbind | structure (not allowed inside expressions) | ||
empty | |||
dec1 〈;〉 dec2 | sequence | ||
local dec1 in dec2 end | local | ||
open longid1 ... longidn | inclusion (n ≥ 1) | ||
nonfix id1 ... idn | nonfix (n ≥ 1) | ||
infix 〈digit〉 id1 ... idn | left-associative infix (n ≥ 1) | ||
infixr 〈digit〉 id1 ... idn | right-associative infix (n ≥ 1) | ||
valbind | ::= | pat = exp 〈and valbind〉 | destructuring |
rec valbind | recursive | ||
funbind | ::= | funmatch 〈and funbind〉 | clausal function |
funmatch | ::= | 〈op〉 id pat1 ... patn 〈: typ〉 = exp 〈| funmatch〉 | nonfix (n ≥ 1) |
pat1 id pat2 〈: typ〉 = exp 〈| funmatch〉 | infix | ||
( pat1 id pat2 ) pat'1 ... pat'n 〈: typ〉 = exp 〈| funmatch〉 | infix (n ≥ 0) | ||
typbind | ::= | 〈var〉(,) id = typ 〈and typbind〉 | abbreviation |
datbind | ::= | 〈var〉(,) id = conbind 〈and datbind〉 | data type |
conbind | ::= | id 〈of typ〉 〈| conbind〉 | data constructor |
exnbind | ::= | id 〈of typ〉 〈and exnbind〉 | generative |
id = longid 〈and exnbind〉 | renaming |
Note: Omitted op on constructors.
str | ::= | longid | identifier |
struct dec end | structure | ||
str : sig | transparent annotation | ||
str :> sig | opaque annotation | ||
id ( str ) | functor application | ||
id ( dec ) | functor application | ||
let dec in str end | local declaration | ||
strbind | ::= | id 〈:〈>〉 sig〉 = str 〈and strbind〉 | structure |
sig | ::= | id | identifier |
sig spec end | signature | ||
sig where type typrefin | refinement | ||
typrefin | ::= | 〈var〉(,) longid = typ 〈and type typrefin〉 | type refinement |
spec | ::= | val valdesc | value |
type typdesc | type | ||
eqtype typdesc | equality type | ||
type typbind | type abbreviation | ||
datatype datdesc | data type | ||
datatype id = datatype longid | data type replication | ||
exception exndesc | exception | ||
structure strdesc | structure | ||
empty | |||
spec1 〈;〉 spec2 | sequence | ||
include sig | inclusion | ||
include id1 ... idn | inclusion (n ≥ 1) | ||
spec sharing type longid1 = ... = longidn | type sharing (n ≥ 2) | ||
spec sharing longid1 = ... = longidn | structure sharing (n ≥ 2) | ||
valdesc | ::= | id : typ 〈and valdesc〉 | value |
typdesc | ::= | 〈var〉(,) id 〈and typdesc〉 | abstract type |
datdesc | ::= | 〈var〉(,) id = condesc 〈and datdesc〉 | data type |
condesc | ::= | id 〈of typ〉 〈| condesc〉 | data constructor |
exndesc | ::= | id 〈of typ〉 〈and exndesc〉 | exception |
strdesc | ::= | id : sig 〈and strdesc〉 | structure |
prog | ::= | dec | core declaration |
functor fctbind | functor declaration | ||
signature sigbind | signature declaration | ||
empty | |||
prog1 〈;〉 prog2 | sequence | ||
fctbind | ::= | id1 ( id2 : sig ) 〈:〈>〉 sig〉 = str 〈and fctbind〉 | plain |
id ( spec ) 〈:〈>〉 sig〉 = str 〈and fctbind〉 | opened | ||
sigbind | ::= | id = sig 〈and sigbind〉 | signature |
Note: Omitted exp; derived form for interactive toplevel.
We liberally use the following notation in the grammar:
Andreas Rossberg,
rossberg@mpi-sws.org. Last modified: 2022/09/14 / Imprint / Data protection |