式expの構文の定義は, 演算子式infix, 関数適用式appexp, 原子式atexp を用いて階層的に定義される.
式(トップレベル)
exp | ::= | infix | |
---|---|---|---|
exp : ty | |||
exp andalso exp | |||
exp orelse exp | |||
exp handle match | |||
raise exp | |||
if exp then exp else exp | |||
while exp do exp | |||
case exp of match | |||
fn match | |||
_import string : cfunty | C関数のインポート | ||
exp : _import cfunty | C関数のインポート | ||
_sizeof( ty ) | 型のサイズ | ||
_dynamic exp as ty | 動的型キャスト | ||
_dynamiccase exp of match | 動的型キャスト付き場合分け | ||
_sqlserver appexp : ty | SQLサーバ | ||
_sql pat => sqlfn | SQL実行関数 | ||
_sql sql | SQLクエリ断片 |
match | ::= | pat => exp | match | パターンマッチング |
---|
演算子式
infix | ::= | appexp |
infix vid infix |
関数適用式
appexp | ::= | atexp | |
---|---|---|---|
appexp atexp | 関数適用(左結 合) | ||
appexp # { exprow } | レコードフィールドアップデート |
原子式
atexp | ::= | scon | 定数 |
---|---|---|---|
op longVid | 識別子 | ||
{exprow } | レコード | ||
(exp,,exp) | 組() | ||
() | unit型定数 | ||
#lab | レコードフィールドセレクト | ||
[exp,,exp] | リスト() | ||
(exp;;exp) | 逐次実行式() | ||
let declList in exp;;exp end | 局所宣言() | ||
_sql (sql) | SQLクエリ断片 | ||
(exp) |
exprow | ::= | lab = exp , exprow | レコードフィールド |
---|
この階層によって,構文の結合力(まとまりの強さ)が表現される. 原子式が結合の最小単位であり,関数適用式appexp, 演算子式infix,式expの各定義は,この順の結合力が強い. ただし,演算子式infixを構成する各要素間の結合力は, 文法ではなく,演算子宣言によって決定される. さらに演算子式は,演算子宣言の結合の強さに従って,組への関数適用 に展開される糖衣構文である. そこでまず,次節(19.1)において演算子式の 展開を定義したのち,式の文法で表現される結合力の強順に,各構造とその式が もつ型と値を説明する.