プログラミング言語SML#解説

Chapter 18. 式の構造

exp構文は以下の文法で与えられる.

原子式:appexp
atexp ::= scon 定数
 | (op)? longVid 変数
 | {(exprow)? } レコード
 | (exp1,,expn) 組(n2
 | () unit型定数
 | #lab レコードフィールドセレクト
 | [exp1,,expn] リスト(n0
 | (exp1;;expn) 逐次実行式(n2
 | let dec in exp1;;expn end 局所宣言(n1
 | (exp)
関数適用式:appexp
appexp ::= atexp
 | appexp atexp 関数適用(左結合)
 | appexp # { exprow } レコードフィールドアップデート
演算子式:infix
infix ::= appexp
 | infix vid infix 演算子式
式(トップレベル):exp
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 : ffity C関数のインポート
 | _sqlserver (appexp)? : ffity SQLサーバ式
 | _sql id => sql SQLクエリ(関数式)
補助定義
exprow ::= lab = exp (, exprow)? レコードフィールド
match ::= pat => exp (| match)? パターンマッチング
cfuntyおよびsqlの定義は, それぞれLABEL:sec:cffiおよびLABEL:sec:sqlに与える

expの構文の定義は, 演算子式infix, 関数適用式appexp, 原子式appexp を用いて階層的に定義される. この階層によって,構文の結合力(まとまりの強さ)が表現される. 原子式が結合の最小単位であり,関数適用式appexp, 演算子式infix,式expの各定義は,この順の結合力が強い. ただし,演算子式infixを構成する各要素間の結合力は, 文法ではなく,以下の演算子宣言によって決定される.

以下,まず18.1で演算子宣言とその効果を定義した後, 18.2以降の各節で,式の文法で表現される結合力の強順に,各構造と その式がもつ型と値を説明する.

Contents