プログラミング言語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⟩) 組(n≥2)
     | () unit型定数
     | #⟨lab⟩ レコードフィールドセレクト
     | [⟨exp1⟩,⋯,⟨expn⟩] リスト(n≥0)
     | (⟨exp1⟩;⋯;⟨expn⟩) 逐次実行式(n≥2)
     | let ⟨declList⟩ in ⟨exp1⟩;⋯;⟨expn⟩ end 局所宣言(n≥1)
     | _sql (⟨sql⟩) SQLクエリ断片
     | (⟨exp⟩)
    ⟨exprow⟩ ::= ⟨lab⟩ = ⟨exp⟩ (, exprow)? レコードフィールド

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

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