プログラミング言語SML#解説 4.1.0版
17 字句構造

17.2 字句集合

SML#の字句は,以下の種類がある.

予約語

以下はSML#の予約語であり,識別子には使用できない.

abstype and andalso as case datatype do else end eqtype exception fn fun functor handle if in include infix infixr let local nonfix of op open orelse raise rec set sharing sig signature struct structure then type val where while with withtype ( ) [ ] { } , : :> ; ... _ = => -> #

これら文字列は,以下の識別子の項で定義される言語クラス alphaIdには含まれない.

SQL予約語

以下の各語は,SQL構文の中では予約語であり, 識別名として使用できない.

asc all begin by commit cross default delete desc distinct fetch first from group inner insert into is join limit natural next not null offset only on or order rollback row rows select set update values where

これら文字列は, 第19章および 第22章で定義される, _sqlで始まるSQL式内では,字句クラスalphaIdには含まれない. その詳細は第22節で述べる. SQL構文は,Standard MLでは構文として認識されないため, これら制限を追加してもStandard MLとの後方互換性が保たれている.

拡張予約語

_で始まる以下の名前は,SML#の拡張機能を実現するた めに導入された予約語である. これら拡張予約語は,Standard MLでは字句と認識されない語であり, これらを追加してもStandard MLとの後方互換性が保たれている.

__attribute__ _builtin _foreach _import _interface _join _dynamic _dynamiccase _polyrec _require _sizeof _sql _sqlserver _typeof _use

識別子

識別子は,プログラム中で使用される種々の名前である. SML#では,以下の7種類の識別子がある. これら7種類はその使用文脈に応じて区別されるので,同一の名前を別 の用途に使用してよい.

用途
vid 変数,データコンストラクタ
lab レコードのラベル
strid ストラクチャ名
sigid シグネチャ名
funid ファンクタ名
tycon 型構成子名
tyvar 型変数

これら識別子の構造は以下の通りである.

vid ::= alphaId  | symbolId
lab ::= alphaId  | string  | decimal  | decimal _ alphaId (注1)
strid ::= alphaId
sigid ::= alphaId
funid ::= alphaId
tyvar ::= alphaId  | ’’alphaId
tycon ::= alphaId  | symbolId

  1. 1.

    レコードラベルは, 文字列ラベル(alphaIdまたはstring), 整数ラベル(decimal), 順序付き文字列ラベル(decimal _ alphaId) の3種類がある. SML#では,レコードは,ラベルの順序に従ってソートされ,メ モリーが割り当てられる. 文字列ラベルの順序は,文字列の順序String.compareである. 数字ラベルの順序は,数字列を自然数と解釈した時の自然数の順序であ る. 順序付き文字列ラベルは,数字ラベルと文字列ラベルが_で連結 されたものであり,その順序は,数字ラベルと文字列ラベルの順序の辞書式順序 である.

各文字クラスの定義は以下の通り.

alpha ::= [A-Za-z\127-\255]
symbol ::= ! |  % |  & |  $ |  + |  / |  : |  < |  = |  > |  ? |  @ |    |   |  | |  # |  - |  ^ |  \
alphaId ::= alpha (alpha  | [0-9]  |   | _ )* (注1)
decimal ::= [1-9] [0-9]*
symbolId ::= symbol* (注2)

  1. 1.

    字句クラスalphaIdには予約語は含まれない. さらに,_sqlで始まるSQL式内では, alphaIdにはSQL予約語は含まれない.

  2. 2.

    symbolIdには予約語は含まれない. したがって,==>symbolIdの要素であるが, =>symbolIdの要素ではない.

long識別子

変数やデータ構成子名vidとストラクチャ名strid に対しては,ストラクチャ名のリストがプレフィックスされたlong識別子が定義 される.

longVid ::= (strid .)* vid
longTycon ::= (strid .)* tycon
longStrid ::= (strid .)* strid
定数リテラル scon

定数リテラルの定義は以下の通りである.

scon ::= int  | word  | real  | string  | char 定数リテラル
int ::= (~)?[0-9]+ 10進整数
 | (~)?0x[0-9a-fA-F]+ 16進整数
word ::= 0w[0-9]+ 10進符合なし整数
 | 0wx[0-9a-fA-F]+ 16進符合なし整数
real ::= (~)?[0-9]+ . [0-9]+ [Ee](~)?[0-9]+ 不動小数点数
 | (~)?[0-9]+ . [0-9]+
 | (~)?[0-9]+ [Ee](~)?[0-9]+
char ::= #" (printable | escape) " 文字
string ::= " (printable | escape)* " 文字列
printable ::= \"を除いた文字
escape ::= \a 警告文字 (ASCII 7)
 | \b バックスペース (ASCII 8)
 | \t タブ (ASCII 9)
 | \n 改行文字 (ASCII 10)
 | \v 垂直タブ (ASCII 11)
 | \f ホームフィード (ASCII 12)
 | \r リターン (ASCII 13)
 | \^[\064-\095] [\064-\095]が表す制御文字
 | \\ 文字\
 | \" 文字"
 | \ddd 十進数dddの番号を持つ文字
 | \f f\ 空白文字の列ffを無視する
 | \uxxxx 16進数表現xxxxで表される番号を持つUTF-8文字列