Egy név lehet
Nem használhatók a következő, ún. fenntartott szavak vagy kulcsszók:
A neveket különféle osztályokba soroljuk:
var | értékváltozó | value variable | long |
con | adatkonstruktor | value constructor | long |
excon | kivételkonstruktor | exception constructor | long |
tyvar | típusváltozó | type variable | |
tycon | típuskonstruktor | type constructor | long |
lab | mezőnév | record label | |
unitid | modulnév unit identifier |
Egy név az infix vagy az infixr direktívával infix helyzetűnek deklarálható. Ha az id név infix helyzetű, akkor az exp1 id exp2 kifejezés, szükség esetén zárójelek között, minden olyan helyen használható, ahol az id(exp1, exp2) vagy az id{1= exp1, 2= exp2 } kifejezések egyébként használhatók. Infix helyzetű nevek mintában szintén használhatók.
Egy minősített nevet vagy egy olyan nevet, amelyet az op szócska előz meg, sohasem lehet infix helyzetben alkalmazni. Az infix, infixr és nonfix direktívák szintaxisa a következő (n ≥1):
infix | < d > | id1 … idn | balra köt | left associative |
infixr | < d > | id1 … idn | jobbra köt | right associative |
nonfix | < d > | id1 … idn | nem köt | non associative |
A d decimális számjegy opcionális és a nevek precedenciáját adja meg; alapértelmezés szerinti értéke 0. Nagyobb szám magasabb precedenciát jelent. Az infix, infixr és nonfix direktívák érvényességi tartománya a szokásos, azaz a let kifejezésen és a local deklaráción belül lokális érvényűek. Azonos precedenciájú, de különféle balra kötő operátorok balra, azonos precedenciájú, de különféle jobbra kötő operátorok pedig jobbra kötnek. Tilos azonos prcedenciájú, de különböző kötésű operátorokat használni ugyanabban a kifejezésben.
exp ::=infexp | exp : ty | típusmegkötés (L) | type constraint (L) |
exp1 andalso exp2 | feltételes konjunkció | sequential conjunction | |
exp1 orelse exp2 | feltételes alternáció | sequential disjunction | |
exp handle match | kivétel kezelése | handle exception | |
raise exp | kivétel jelzése | raise exception | |
if exp1 then exp2 | feltételes kifejezés | conditional expression | |
else exp3 | |||
while exp1 do exp2 | iteráció | iteration | |
case exp of match | esetszétválasztás | case analysis | |
fn match | lambda-kifejezés | function expression |
infexp ::= appexp
inf exp1 id inf exp2 infix alkalmazás infixed application
appexp ::= atexp
appexp atexp (prefix) alkalmazás application
atexp ::= | scon | állandó | special constant |
< op > longvar | értékváltozó value variable | ||
< op > longcon | adatkonstruktor | value constructor | |
< op > longexcon | kivételkonstruktor | exception constructor | |
{ < exprow > } | rekord | record | |
# lab | rekordszelektor | record selector | |
( ) | 0-as | 0-tuple | |
( exp1,…, expn ) | n-es, n ≥ 2 | n-tuple, n ≥ 2 | |
[ exp1,…, expn ] | lista, n ≥ 2 | list, n ≥ 2 | |
# [ exp1,…, expn ] | vektor, n ≥ 2 | vector, n ≥2 | |
(exp1,…, expn) | kifejezéssorozat, n ≥ 2 | sequence, n ≥ 2 | |
let dec | |||
in exp1;…; expn | lokális kifejezés, n ≥ 1 | local expression, n ≥ 1 | |
end | |||
( exp ) |
exprow ::=
lab = exp< , exprow > kifejezéssor expression row
match ::=
mrule < | match > klóz/változatsorozat
mrule ::=
pat => exp klóz, változat match, rule
dec ::= | val tyvarseq valbind | értékdeklaráció | value declaration |
un tyvarseq fvalbind | f függvénydeklaráció | function declaration | |
type typbind | típusdeklaráció | type declaration | |
datatype datbind | adattípus deklaráció | datatype declaration | |
< withtype typbind > | |||
abstype datbind | abstípus deklaráció | abstype declaration | |
< withtype typbind > | |||
with dec end | |||
exception exbind | kivételdeklaráció | exception declaration | |
local dec1 in dec2 end | lokális deklaráció | local declaration | |
open unitid1…unitidn | open deklaráció, | open declaration, | |
üres deklaráció | empty declaration | ||
dec1 < ; > dec2 | deklaráció sorozat | sequential declaration | |
infix < d > id1 idn | infix-direktíva, n ≥ 1 | infix (left) directive, n ≥ 1 | |
infixr < d > id1 idn | infixr-direktíva, n ≥ 1 | infixr (right) directive, n ≥ 1 | |
nonfix id1 … idn | nonfix-direktíva, n ≥ 1 | nonfix directive, n ≥ 1 |
valbind ::=
pat = exp < and valbind > értékkötés value binding
rec valbind < and valbind > rekurzív kötés recursive binding
typbind::= tyvarseq tycon = ty < and typbind>
datbind::= tyvarseq tycon = conbind < and datbind >
conbind::= < op > con < of ty > < | conbind >
exbind ::=
< op > excon < of ty > < and exbind >
< op > excon = op longexcon < and exbind>
Megjegyzés: fvalbind fenti definíciójában, ha var infix helyzetűnek van deklarálva, akkor vagy meg kell előznie az op szócskának, vagy infix helyzetben kell használni. Ez azt jelenti, hogy a klózok elején op var (atpat, atpat’) helyett (atpat var atpat’) írható. A zárójelek elhagyhatók, ha atpat’ után közvetlenül :ty vagy = áll.