構文抽出器

構文抽出器はパステルステッチのソースコードをオブジェクトコードに変換する。この章では ソースコードの文法オブジェクトコードの形式 の仕様から自明でない部分についてのみ規定する。

コードブロックキャプション

ソースコードでのコンパクト形式のコードブロックキャプション、または caption 構文抽出器ディレクティブが、オブジェクトコードのコードブロックキャプションに相当する。1 個のコードブロックに、コンパクト形式のコードブロックキャプションと caption 構文抽出器ディレクティブがどちらも記述されたときは、caption 構文抽出器ディレクティブが優先される。

演算子

ソースコードでの演算子はオブジェクトコードでは統合演算式に変換される。この統合演算式の演算指定子には、演算子に対応する複合名が置かれる。演算子の左辺と右辺は、それぞれ left 引数と right 引数に置かれる。前置単項演算子は right 引数を持つが left 引数を持たない。後置単項演算子として使用された + 演算子は、left 引数に左辺が、right 引数に offsetargument 複合名が置かれる。

^not 演算子と ^unless 演算子は、どちらも notmain 複合名を演算指定子とする統合演算式に変換される。

^write 演算子は writemain 複合名を演算指定子とする統合演算式に変換される。^write 演算子の左辺は to 引数に、右辺は value 引数に置かれる。

浮動小数点数

ソースコードでの浮動小数点数は、オブジェクトコードでは decode floating point numbermain 複合名を演算指定子とする統合演算式に変換される。この統合演算式の main 引数には文字列が置かれる。

複合名の姓の推定

オブジェクトコードでは、複合名は固有名と姓の組である。ソースコードで、姓を記号で指定する形式または姓を省略する形式を使用した場合は、構文抽出器が姓を推定する。

name 構文抽出器ディレクティブは、姓を記号で指定する形式で推定される姓を設定する。name 構文抽出器ディレクティブの有効範囲は、それが記述された位置から、コードブロックの終端までである。また、有効な name 構文抽出器ディレクティブがない場合、姓を記号で指定する形式で推定される姓は、記号 # に対しては argument である。有効な name 構文抽出器ディレクティブがない場合に、他の記号を使用したときの動作は、実装により異なる。name 構文抽出器ディレクティブの例を以下に示す。

^code Family name symbols
^name # family name 2
^name $ family name 3
^name @ family name 4
^name ' family name 5
^name ! family name 6
^end-code

姓を省略する形式では、姓 main が推定される。ただし、固有名が算用数字 (0 から 9 の文字) のみで構成されている場合は、姓 decimal が推定される。

糖衣構文

ソースコードでの mulde, reverse-continuation, not-for-interpreter ブロックは糖衣構文である。また、ソースコードでの emit, unemit 構文抽出器ディレクティブは糖衣構文である。これらのブロックと構文抽出器ディレクティブは、オブジェクトコードでは、他のブロックまたは統合演算文の組み合わせで表現される。

以下に示すコードは一例であり、詳細は実装により異なる。

mulde ブロック

以下の 2 個のコードブロックは、前者が後者の糖衣構文である。ここで、arguments は任意の引数の並び、sequence は文またはブロックの並びである。

^code
^mulde arguments
	sequence
^end
^end-code
^code
muldestatic local name: arguments
^procedure muldementioned above
	sequence
^end
^end-code

reverse-continuation ブロック

以下の 2 個のコードブロックは、前者が後者の糖衣構文である。

^code
^reverse-continuation arguments
	sequence
^end
^end-code
^code
^loop
	^continuation arguments
		break
	^end
	sequence
^end
^end-code

not-for-interpreter ブロック

以下の 2 個のコードブロックは、前者が後者の糖衣構文である。

^code
^not-for-interpreter
	sequence
^end
^end-code
^code
^dependency [pre runtime false]
	sequence
^end
^end-code

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

以下の 2 個のコードブロックは、前者が後者の糖衣構文である。ここで exp_1exp_2 は任意の式、other_argument は引数の並びである。

^code
^emit if (exp_1) value (exp_2) other_arguments
^end-code
^code
^name $ resolution argument
^name @ static local name
^name ' mentioned above
false ^and @before
false ^and @after
suggest: if ($verb = collect + before')
> evaluate [collect]
> next (omit force sequentially)
> hint (collect + before')
> other_arguments
force: if ($verb = collect ^and (exp_1))
> evaluate [collect + after']
> hint (collect)
> other_arguments
^procedure collect + after'
	return:
	> [collect + before': argument pack [get arguments: #offset]],
	> (exp_2)
^end
^end-code

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

以下の 2 個のコードブロックは、前者が後者の糖衣構文である。

^code
^unemit if (exp_1) value (exp_2) other_arguments
^end-code
^code
^name $ resolution argument
^name @ static local name
^name ' mentioned above
false ^and @before
false ^and @after
suggest: if ($verb = collect + before')
> evaluate [collect]
> next (omit force sequentially)
> hint (collect + before')
> other_arguments
force: if ($verb = collect ^and (exp_1))
> evaluate [collect + after']
> hint (collect)
> other_arguments
^procedure collect + after'
	return:
	> [[collect + before': argument pack [get arguments: #offset]]:
	> method (erase) main (exp_2)]
^end
^end-code