Form Machine
I. 形式
形式とは、順序付けられた規則の集合である。
F = {R1, ...,Rn}
最初の規則 (R1) が最も優先度の高い規則であり、最後の規則 (Rn) が最も優先度の低い規則である。
Form Machine への入力は次のとおりである。 1) 入力ストリームを区切るアドレスと長さのリスト、2) 出力領域を区切るアドレスと長さのリスト、3) 形式のリストへのポインタ、4) 入力ストリームの開始位置へのポインタ、および 5) 出力領域の開始位置へのポインタ。 Form Machine は形式を入力文字列に適用し、出力領域に出力文字列を生成する。 形式は次のように適用される。
ステップ 1: R1 を現在の規則とする。
ステップ 2: 現在の規則を入力データに適用する。
ステップ 3: a) 規則が失敗した場合、優先度が一つ低い規則を現在の規則とする。
b) 規則が成功した場合、最も優先度の高い規則を現在の規則とする
c) 最も優先度の低い規則が失敗したとき、形式は失敗し、入力データへの形式の適用は終了する。
ステップ 4: ステップ 2 から続行する。
さらに、ステップ 2 の間に、入力文字列の残りが規則を満たすのに不十分である場合、その規則は失敗し、部分的な結果は出力されない。 規則が出力文字列を満たした場合、形式の適用は終了する。
II. 規則
規則とは、次の形式の置換操作である。
left-hand-side -> right-hand-side
規則の両側は、カンマで区切られたゼロ個以上の 項(以下を参照)からなる。
規則の左辺は、現在位置において入力文字列に対してパターンマッチ操作として適用される。 入力が正確に記述された場合、1) 現在の入力位置ポインタはマッチした入力の分だけ進められ、2) 右辺は出力文字列の現在位置にデータを出力し、3) 現在の出力位置ポインタは出力されたデータの分だけ進められる。
III. 項
項とは、マッチングされる入力文字列または出力される出力文字列を記述する変数である。 項には三つのフォーマットがある。
項フォーマット 1
+---------------------------------------------------------------------+
| |
| name ( data replication . value : length ) |
| type expression expression expression |
| |
|_____________________________________________________________________|
いずれのフィールドも省略可能である。
_名前_は、通常のプログラミング言語の意味での項の記号名である。 それは単一の小文字アルファベットであり、規則内で一意である。
_データ型_は、その項が表すデータの種類を記述する。それは集合の要素である。
{D, O, X, A, E, B}
データ型は以下の意味と暗黙の単位長をもつ。
Char. Meaning Length
----- -------- -------
D decimal number 1 bit
O octal number 3 bits
X hexadecimal number 4 bits
A ASCII character 8 bits
E EBCDIC character 8 bits
B binary number 1 bit
_反復式_は値式の乗数である。反復式には以下のフォーマットがある。
- 集合の要素の算術式:
{v(name), L(name) , numerals, programming variables}
v(name) は、名前付きデータ型の数値を生成する値演算子であり、L(name) は、名前付き文字列長の数値を生成する長さ演算子である。
プログラミング変数については、三番目の項フォーマットで説明する。算術演算子を以下に示すが、通常の意味をもつ。
{*, /, +, -}
または 2) 終端記号 '#'。これは値式の任意の倍数を意味する。
_値式_は、データ型によって示されるフォーマットで表現される項の単位値である。 値式は反復式に従って繰り返される。 値式のフォーマットは次のとおりである。
- 反復式の部分 1) と同じ。ここでも v(name) は数値を生成する
または 2) 集合の単一の要素
{v(name), quoted literal}
ここで v(name) はデータ型 (E または A) の値を生成する)。 (連結は複数の項によって行われることに留意されたい。)
_長さ式_は、反復式によって修飾された、値式を含むフィールドの長さである。 長さ式は反復式と同じフォーマットをもつ。
したがって、次の項は
x(E(7.'F'):L(x)) は x と名付けられ、型は EBCDIC であり、値 'FFFFFFF' をもち、長さは 7 である。
次の項
規則の左辺における y(A:8) は、入力の次の 64 ビットをその値として割り当てられる。右辺では、出力領域にデータを生成する値式 (内容) をもたないため、出力ポインタを 64 ビット位置だけ進めるだけである。
項フォーマット 2
+---------------------------------------------------------------------+
| |
| name (label) |
| |
+---------------------------------------------------------------------+
_ラベル_は、規則内で以前に名付けられた項への記号的参照である。 それはその名前の項と同じ値をもつ。
以下の恒等操作は ラベル 記法の使用を例示する。
a(A:10) -> (a)
右辺の (a) は、項 a を出力領域に出力させる。 これは以下の規則と等価である。
a(A:10) -> (Av(a):L(a))
項フォーマット 3
+---------------------------------------------------------------------+
| |
| name ( programming connective operand ) |
| variable expression |
| |
+---------------------------------------------------------------------+
_プログラミング変数_は、入出力ストリームに明示的に現れない、ユーザーが制御するデータ項目である。 その値は入力データや定数と比較でき、出力データの生成に用いることができる。 プログラミング変数は単一の小文字ギリシャ文字である。
それらは、出力領域で添字やカウンタなどを生成するため、入力領域で添字やカウンタなどを比較するため、およびデータが文脈依存である場合に置換規則を束縛するため(後述)に用いられる。
_連結子_は集合の要素である:
{<-, =, !=, >=, <=, <, >}
左向き矢印は左部分を右部分で置き換えることを表し、その他の連結子は比較子である。
_オペランド式_は集合の要素の算術式である:
{programming variables, v(name), l(name), numerals}
例えば、プログラミング変数 [alpha] の値が 0 であり、規則
a(H[alpha]:1) -> (a), ([alpha]<-[alpha]+1), (H[alpha]:1)
が十六進数字の文字列に網羅的に適用される場合
0 1 2 3 4 5
出力は次の十六進文字列となる
0 1 1 2 2 3 3 4 4 5 5 6 .
注: 上記の規則は次と等価である
a(B[alpha]:4) -> (a), ([alpha]<-[alpha]+1), (B[alpha]:4)
IV. 項関数の制限と解釈
規則が成功すると出力が生成される。 規則
a(A:#),(A'/':1)->(Ev(a):74),(E'?':1)
入力文字列は、任意個の ASCII とそれに続く終端 '/' が検索される。 ASCII (a) は 74 バイトのフィールド内で EBCDIC に変換され、その後に終端 '?' が続く。 これにより三つの問題が明らかになる:
-
任意長の項は、データが型固有でないため、リテラルによって分離されなければならない。
-
は規則の左辺でのみ使用できる。
-
切り捨てとパディングの方式が必要である。
切り捨てとパディングの方式は次のとおりである:
-
文字から文字へ (型: A, E) 出力は左詰めとし、右側で切り捨てまたは (空白による) パディングを行う。
-
文字から数値へ (A, E から D, O, H, B へ)
-
数値から文字へ (D, O, H, B から A, E へ)
-
数値から数値へ (D, O, H, B) 出力は右詰めとし、左側でパディングまたは切り捨てを行う。 出力が数値であればパディングはゼロである。