ソースコードの文法

この章ではパステルステッチのソースコード (source code) の文法を規定する。

コードブロック

パステルステッチのソースコードは 0 個以上のコードブロック (code block) から成る。コードブロックは ^code 構文抽出器キーワードで始まり、^end-code 構文抽出器キーワードで終わる。コードブロックの外はコメントであり、^code 構文抽出器キーワードを除く任意の文字列を書くことができる。^code 構文抽出器キーワードから次の改行までは、コンパクト形式 (compact form) のコードブロックキャプション (code block caption) である。コードブロックキャプションもコメントであり、改行を除く任意の文字列を記述できる。コードブロックの内部は 0 個以上のブロックまたは文から成る。

以下に例を示す。この例では Simple program がコードブロックキャプションである。コメントを除いた実際のプログラムは print: ^[Hello world!] ^! の 1 行である。

^code Simple program
print: ^[Hello world!] ^!
^end-code

互換性についての注意 過去の言語仕様との互換性のため、^end-code 構文抽出器キーワードのかわりに ^endcode を使用できる。この仕様は将来的に削除される可能性がある。

ブロック

ブロック (block) はブロック開始文 (block beginning statement) で始まり、0 個以上のブロックまたは文が続き、ブロック終了文 (block ending statement) で終わる。

ブロック開始文は引数 (argument) を持つ場合と持たない場合がある。引数を持たないブロック開始文は、ブロック開始語と改行 (line break) から成る。引数を持つブロック開始文は、単独引数形式 (single argument form) と複数引数形式 (multi-argument form) がある。単独引数形式のブロック開始文は、ブロック開始語、式 (expression)、改行から成る。複数引数形式のブロック開始文は、ブロック開始語、引数列 (arguments)、改行から成る。これらの要素の前後に空白があってもよい。

ブロック開始語はいずれも構文抽出器キーワードであり、以下の 9 種類がある。

ブロック終了文は構文抽出器キーワード ^end と改行から成る。これらの要素の前後に空白があってもよい。

以下の例では procedure ブロックと mulde ブロックを使用している。procedure ブロックは単独引数形式の引数を持っている。mulde ブロックは引数を持っていない。

^code Block
^procedure proc
	print: ^[procedure] ^!
^end
^mulde
	print: ^[mulde] ^!
	proc
^end
^end-code

以下の例では mulde, mulde, procedure の順にブロックを入れ子にしている。

^code Block nesting
^mulde
	print: ^[external] ^!
	^mulde
		print: ^[mulde] ^!
		^procedure internal
			print: ^[internal] ^!
		^end
	^end
^end
^end-code

^end-code 構文抽出器キーワードはコードブロックを閉じる。このとき、閉じていないブロックがあると、それらのブロックはすべて閉じられる。例えば、上の例は以下のように書き直すことができる。

^code Block and end-code
^mulde
	print: ^[external] ^!
	^mulde
		print: ^[mulde] ^!
		^procedure internal
			print: ^[internal] ^!
^end-code

文 (statement) は、構文抽出器ディレクティブ (syntactic abstractor directive) または統合演算文 (unified operation statement) である。

統合演算文は統合演算形式と改行から成る。統合演算形式の前後に空白があってもよい。

構文抽出器ディレクティブ

構文抽出器ディレクティブには以下のものがある。

caption 構文抽出器ディレクティブは ^caption 構文抽出器キーワード、文字列、改行で構成される。これらの要素の前後に空白があってもよい。

name 構文抽出器ディレクティブは ^name 構文抽出器キーワード、姓を表す記号、名前、改行で構成される。これらの要素の前後に空白があってもよい。

emit または unemit 構文抽出器ディレクティブは、それぞれ ^emit または ^unemit 構文抽出器キーワード、引数 (単独引数形式または複数引数形式)、改行で構成される。これらの要素の前後に空白があってもよい。

統合演算形式

統合演算形式 (unified operation form) は引数を持つ場合と持たない場合がある。引数を持たない場合、統合演算形式は 1 個の式である。その式は演算指定子 (operation specifier) と呼ばれる。統合演算形式が引数を持つとき、その引数は単独引数形式または複数引数形式である。いずれの場合にも、統合演算形式は、式、コロン、引数から構成される。これらの要素の前後に空白があってもよい。このとき最初の式は演算指定子である。

単独引数形式は 1 個の式である。複数引数形式は 1 個以上のラベル付き引数の列である。それぞれのラベル付き引数の前後に空白があってもよい。

ラベル付き引数 (labeled argument) は、名前 (name) と、分離可能な式 (separable expression) から成る。これらの要素の前後に空白があってもよい。

以下の例では、writeprint が演算指定子である。write で始まる統合演算形式の引数は複数引数形式で、引数は tovalue の 2 個である。print で始まる統合演算形式の引数は単独引数形式である。

^code Arguments
write: to (hello) value ^[Hello world!] ^!
write: to (world) value [hello]
print: [world]
^end-code

文字列 (string) と浮動小数点数 (floating point number) は式 (expression) である。式をパーレン (parenthesis) で囲んだものは式である。統合演算形式をブラケット (bracket) で囲んだものは式である。これを統合演算式 (unified operation expression) という。これらの式は分離可能な式である。

複合名 (compound name) は式である。式を演算子 (operator) で結合したものは式である。これらは分離可能な式ではない。

演算子

演算子 (operator) は以下のものがある。なお、この文書では、断りのない限り、演算子は 2 項演算子である。前置単項演算子または後置単項演算子として使用できる演算子は、そのつど明記する。

算術演算子は ∗, /, ;, +, − の 5 種類である。 順に積算、除算、有理数、加算、減算を意味する。演算子の優先順位 (order of operators) は、 /;+ よりも強い。算術演算子のうち 2 項演算子であるものは左結合である。

^code Arithmetic binary operators
print: 10 ∗ 20
write: to (a) value (30 + 40 ∗ 50)
print: (100 + 200) / (300 + 400)
write: to (b) value ((500 ∗ 600) / 700 + 800)
^end-code

+ 演算子は前置単項演算子または後置単項演算子としても使用できる。 演算子は前置単項演算子としても使用できる。以下に例を示す。

^code
write: to (a +) value ((−20) ∗ 10 + (−10 ∗ 20))
print: [a +]
^end-code

型変換演算子 (type conversion operator) は ^convert 構文抽出器キーワードで表される。

マップ演算子 (map operator) は ^map 構文抽出器キーワードで表される。

結合演算子はコンマ記号で表される。結合演算子は左結合である。以下に例を示す。

^code Comma operator
write: to (set a) value ([make immutable set container], a, b, c, d, e)
^end-code

互換性についての注意 積集合 ^intersection と差集合 ^setminus は削除された。和集合は結合演算子に名称を変更した。

比較演算子は =, <, ^le, ^type, ^alias がある。意味は順に、等しい、小なり、小なりまたは等しい、型比較、同一参照である。このうち後半の 3 種類は構文抽出器キーワードである。以下に例を示す。

^code Relational operators
^if 10 < 20 ^and 20 ^le 30
	^if 100 = 100 ^and ^not 100 = 200
		print: ^[relational operators] ^!
^end-code

比較演算子には、それぞれ対応する比較可能演算子 (comparability operator) が存在する。それぞれ ^?=, ^?<, ^?le, ^?type, ^?alias 構文抽出器キーワードで表される。

互換性についての注意 部分集合演算子 ^subset と、その比較可能演算子 ^?subset は削除された。

論理演算子は ^not, ^and, ^or, ^unless がある。このうち ^not^unless は前置単項演算子である。結合の優先順位は ^not, ^and, ^or, ^unless の順である。意味は ^not^unless が論理否定、^and が論理積、^or が論理和である。論理演算子のうち 2 項演算子であるものは右結合である。以下に例を示す。

^code Boolean operators
^if ^unless false ^and true ^or ^not true ^and true
	print: ^[boolean operators] ^!
^end-code

書き込み演算子 (writing operator) は ^write 構文抽出器キーワードで表される。

シーケンシャル演算子 (sequential operator) は &^return-and-then の 2 種類がある。シーケンシャル演算子は右結合である。

演算子の総合的な結合順位は算術演算子、型変換演算子、マップ演算子、結合演算子、比較演算子、論理演算子、書き込み演算子、シーケンシャル演算子の順である。比較演算子と比較可能演算子の結合順位は等しい。

互換性についての注意 型変換演算子と結合演算子の結合順位が変更されたため、プログラムの書き換えが必要になる場合がある。

演算子の一覧を以下の表に示す。

表記 意味 優先順位 位置 結合方向
積算 1 中置
/ 除算 1 中置
; 有理数 1 中置
+ 加算 2 前置、後置、中置
減算 2 前置、中置
^convert 型変換 3 中置 なし
^map マップ 4 中置 なし
, 結合 5 中置
= 等しい 6 中置 なし
^?= 等しい比較可能 6 中置 なし
< 小なり 6 中置 なし
^?< 小なり比較可能 6 中置 なし
^le 小なりまたは等しい 6 中置 なし
^?le 小なりまたは等しい比較可能 6 中置 なし
^type 型比較 6 中置 なし
^?type 型比較可能 6 中置 なし
^alias 同一参照 6 中置 なし
^?alias 同一参照比較可能 6 中置 なし
^not 論理否定 7 前置 なし
^and 論理積 8 中置
^or 論理和 9 中置
^unless 論理否定 10 前置 なし
^write 書き込み演算子 11 中置 なし
& シーケンシャル演算子 12 中置
^return-and-then シーケンシャル演算子 12 中置

複合名

パステルステッチの複合名 (compound name) は以下の形式で記述できる。

姓を明示する形式は、固有名 (personal name) と姓 (family name) をこの順に記述する。これらの要素の前後に空白があってもよい。固有名は名前である。姓は、^( 構文抽出器キーワード、名前、右パーレンの順に記述する。この文書では姓は上付き文字で表現される。

姓を記号で指定する形式では、固有名の前または後に、姓を表す記号 (family name symbol) を記述する。これらの要素の前後に空白があってもよい。姓を表す記号はナンバーサイン、ドル、アットマーク、アポストロフィー、エクスクラメーションである。

姓を省略する形式では、単に固有名を記述する。

演算子に対応する複合名は、演算子をブレース (brace) で囲んだものである。演算子と固有名の対応を以下の表に示す。姓はいずれも main である。

演算子固有名
{∗}multiply
{/}divide
{;}rational number
{+}plus
{−}minus
{^map}map
{^convert}convert
{,}union
{=}equal
{^?=}equal comparable
{<}less
{^?<}less comparable
{^le}less or equal
{^?le}less or equal comparable
{^type}type
{^?type}type comparable
{^not}not
{^and}and
{^or}or
{^write}write
{&}and then
{^return-and-then}return and then

^unless 演算子は、演算子に対応する複合名を持たない。

名前

名前 (name) はクラス 2 または 4 の文字の 1 字以上の並びである。ただし、オブジェクトコードでは、名前はクラス 4 の文字のみで構成される。構文抽出器はクラス 2 の文字を名前から除去する。

文字列

文字列 (string) は 1 個以上のアトミック文字列 (atomic string) の列である。アトミック文字列の前後に空白があってもよい。

アトミック文字列には以下の形式がある。

複数文字形式は、構文抽出器キーワード ^[ と右ブラケットの間に、クラス 2, 3, 4, 5 の文字 (ただし右ブラケットを除く) の 1 字以上の並びを挟んだものである。

単独図形文字形式は、アンダースコアーと、クラス 3 または 4 の文字から成る。

構文抽出器キーワード形式のアトミック文字列は、^empty-string, ^&, ^!, ^@ のいずれかの構文抽出器キーワードである。^empty-string アトミック文字列は空文字列を意味する。^& アトミック文字列と ^! アトミック文字列は、それぞれ水平タブと改行を意味する。^@ アトミック文字列は、このアトミック文字列が記述された位置を表す文字列を意味する。具体的にどのような文字列であるかは実装により異なる。

これらの例を以下に示す。

^code Strings
print: _[_^___^_]_p_ _(_-___-_)_b ^!
print: ^[a] ^& ^[b] ^& ^[c] ^! 
print: ^[aa] ^& ^[bb] ^& ^[cc] ^! 
^end-code

浮動小数点数

浮動小数点数 (floating point number) は、左パーレン、^float 構文抽出器キーワード、空白、クラス 3 または 4 の文字 (ただし右パーレンを除く) の 1 字以上の並び、右パーレンの順に記述する。以下に例を示す。

^code Floating point numbers
print: (^float 3.14) + (^float 1.5e+2)
^end-code

構文抽出器キーワード

構文抽出器キーワード (syntactic abstractor keyword) は構文抽出器によって解釈されるキーワードである。構文抽出器キーワードは キャレット (caret) で始まり、いずれかの構文抽出器キーワードと一致するまで続く。

この文書では構文抽出器キーワードを色の異なる太い文字で表記する。実際の構文抽出器では文字の色と装飾は影響しない。

空白

空白 (blank) は、スペース、水平タブ、無効化された改行 (ineffective line break) の 0 個以上の並びである。無効化された改行は、改行、スペースまたは水平タブの 0 字以上の並び、大なりから構成される。パステルステッチでは、大なり記号は比較演算子ではなく、改行を無効化する記号である。以下の例では、write: to (a quick brown fox) という行と value (jumped over the lazy dog) という行の間の改行が無効化されている。

^code Blanks
write: to (jumped over the lazy dog) value (10)
write: to (a quick brown fox)
>	value (jumped over the lazy dog)
print: [[a quick brown fox]], ^!
^end-code

文字クラス

パステルステッチでは文字を以下のように分類する。以下の表に ASCII での文字コード、パステルステッチでの文字クラス (character class)、この文章での名称を示す。

文字コード (16 進法)グリフ文字クラスこの文書での名称
00-080
091水平タブ
0A1改行
0B-1F0
202スペース
21!3エクスクラメーション
22"3
23#3ナンバーサイン
24$3ドル
25%4パーセント
26&3アンパサンド
27'3アポストロフィ
28(3左パーレン
29)3右パーレン
2A*3アスタリスク
2B+3プラス
2C,3コンマ
2D-3マイナス
2E.3
2F/3スラッシュ
30-390-94算用数字
3A:3コロン
3B;3セミコロン
3C<3小なり
3D=3イコール
3E>3大なり
3F?3
40@3アットマーク
41-5AA-Z4アルファベット大文字
5B[3左ブラケット
5C\3
5D]3右ブラケット
5E^3キャレット
5F_3アンダースコアー
60`3
61-7Aa-z4アルファベット小文字
7B{3左ブレース
7C|3
7D}3右ブレース
7E~3
7F0
その他5

文字クラス 0 はパステルステッチのソースコードとオブジェクトコードに含めることができない制御文字である。

文字クラス 1 はソースコードに含めることができる制御文字である。また、文字クラス 1 の文字を文字列に含めることができるが、ソースコードでは構文抽出器キーワード、オブジェクトコードでは実態参照で表現される。

文字クラス 2 はスペースである。スペースは文字列に含めることができる。また、ソースコードでは名前にスペースを含めることができるが、オブジェクトコードではこのスペースは除かれる。

文字クラス 3 は図形文字である。ソースコードでは、アンダースコアーに続いてクラス 3 の文字を記述することにより、単独図形文字形式のアトミック文字列を記述できる。クラス 3 の文字は文字列に含めることができる。

クラス 4 の文字は名前に使用することができる。クラス 4 の文字は文字列に含めることができる。クラス 4 は算用数字、アルファベット大文字、アルファベット小文字、パーセントから成る。

ASCII 互換でない文字はクラス 5 である。文字エンコーディングが UTF-8 である場合、最上位ビットが 1 であるバイトはクラス 5 である。クラス 5 の文字は文字列に含めることができる。