プログラミング言語 TL/1 のパーサを Scheme (R7RS) で書きました。

https://github.com/SaitoAtsushi/TL1

月刊アスキーの 1981 年 1 月号に掲載されている仕様をほぼ満足するようになっているはずです。 同時に掲載されていたパズルゲーム「連珠」のコードは解釈できることを確認しています。

注意すべき点は箇条書にします。

構文 CALL, SENSE, USR には非対応です。 将来的にコードジェネレータまで作ることを考えると、過去の TL/1 処理系と同じ挙動を再現するのは難しいためです。

PORT 変数には非対応です。 これも現代のコンピュータアーキテクチャで再現する意味がありません。

サブプログラム (関数や手続き) の宣言だけして実体を定義しなくてもエラーを報告しません。 TL/1 の処理系にはいくつかの派生があり、処理系が用意している関数や手続きにも違いがあるので、欠けている関数や手続きについて宣言を入れれば既存の TL/1 プログラムをとりあえず通すということが出来るようにしています。

ASCII コードの範囲外の文字がソースプログラム中に有った場合の挙動は未定義です。 Scheme の I/O 機構に頼っていますが、それらは文字コードの扱いには未定義な部分があるためです。 Gauche や Sagittarius などはデフォルトで UTF-8 であれば処理でき、また、変換ポートを噛ませることで様々な文字コードに対応できますが、ここでは R7RS ポータブルな範囲だけで書いています。

アリティ (引数の個数) チェックはしていません。

IF や CASE の ELSE 節は有っても無くてもよいです。

大域単変数と大域配列を合わせた大きさ、小域単変数と小域配列を合わせた大きさはそれぞれ 256 バイト以内と規定されていますが、このパーサではチェックしません。

Document ID: 8d76dd2033b9bfe6610bf1fc6860c369