#Script 1.2 草稿版 20 その 4
とりあえずテンソル生成式の形式的定義だけ書いた。
- Tensor
- LeftBrace Expressions? Comma? RightBrace
- LeftBrace (&MatrixTester Expressions Comma? EOS)+ RightBrace
- MatrixTester
- MatrixTesterRec Comma? EOS
- Expressions Comma? EOS RightBrace
- MatrixTesterRec
- Expression Comma MatrixTesterRec Comma Expression
- Expression Comma? EOS Expression
テンソル生成式では 1 階または 2 階のテンソルすなわちベクトルと行列だけを生成できる。3 階以上のテンソルはベクトルや行列を組合わせるなどして間接的に作る。また、テンソル生成式で 0 要素ベクトルは作れるが 0 要素行列は作れない。(ここら辺は全部構文を定義する上での制約)
例えば、3 要素ベクトルの生成式はこうなる: { 1, x, y }
2 × 3 行列の生成式はこんな感じ: { 1, 2, 3; a, b, c }
つまり各要素をカンマで区切り、行列の行はセミコロンで区切る。最後の要素・行の後に余分なカンマ・セミコロンがあっても良い。C や Java では、(行列に相当する) 2 次元配列は {{ 1, 2, 3 }, { a, b, c }}
というように初期化するが、この書式は #Script では採用できない。このような入れ子の式は、#Script では 3 要素ベクトルを要素とする 2 要素ベクトルを生成する。(これが 3 階以上のテンソル生成式がない所以である)
#Script では構文を定義するための形式文法に PEG を採用している。その為、生成式の行列のサイズが正しいかを構文解析の段階でチェックできる。例えば、{ 11, 12, 13; 21, 22; 31, 32, 33, 34 }
のような歪な形の行列は正当な行列とは認められないわけだが、このようなコードはそもそも構文解析で弾いてしまう。PEG では、全ての行が同じ数の要素を持っているかどうかを &
演算子などをうまく活用すれば検査できるのだ (既述の文法定義の &MatrixTester
の部分)。これは PEG ならではのことで、大抵のプログラミング言語が採用している文脈自由文法ではこれは (2 行以下の行列でしか) 出来ない。
#Script ではコードが文法解析を通過したら意味解析無しでそのままプログラムを実行できるという風に定義してあるので、不正な形の行列を構文解析で検査しなければ、実際にテンソル生成式が評価されるまでエラーが出なくて嬉しくない。PEG は偶偶構文レベルで行列のサイズを検査できる能力があったので、良かった良かった、という話。
| 固定リンク
コメント