プログラミング言語SML#解説 3.7.1版
III 参照マニュアル

Chapter 19

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)? } レコード
     | (exp1,,expn) 組(n2
     | () unit型定数
     | #lab レコードフィールドセレクト
     | [exp1,,expn] リスト(n0
     | (exp1;;expn) 逐次実行式(n2
     | let declList in exp1;;expn end 局所宣言(n1
     | _sql (sql) SQLクエリ断片
     | (exp)
    exprow ::= lab = exp (, exprow)? レコードフィールド

cfuntyの定義は第19.21節に, sqlおよび sqlfnの定義は 第22.2節に それぞれ与える.

この階層によって,構文の結合力(まとまりの強さ)が表現される. 原子式が結合の最小単位であり,関数適用式appexp, 演算子式infix,式expの各定義は,この順の結合力が強い. ただし,演算子式infixを構成する各要素間の結合力は, 文法ではなく,演算子宣言によって決定される. さらに演算子式は,演算子宣言の結合の強さに従って,組への関数適用 に展開される糖衣構文である. そこでまず,次節(19.1)において演算子式の 展開を定義したのち,式の文法で表現される結合力の強順に,各構造とその式が もつ型と値を説明する.