キマイラ・サイトに置いた実装(zipファイル)は、コーディングはイイカゲンなものですが、全体の成り立ちは割とまじめ(クソマジメと言っていいくらい)な構成にしています。
教科書どおり、字句解析器(Lexer)からトークン(Token)が構文解析器(Parser)に渡ります。構文解析器が構文構造(ツリーの必要がないので、インストラクションのリスト)を組み上げて、解釈実行系(Interp)がそれを実行します。
Java IOと同じように、処理パイプラインをラッキョウ方式で実現してます。Groovy風擬似コードで書けば:
lexer = new Lexer(input) // inputをLexerの皮で包む parser = new Parser(lexer) // lexerをParserの皮で包む program = parser.parse() // 構文解析 interp = new Interp(program)// programをInterpの皮で包む interp.execute() // 解釈実行
その他、いくつかの注意点:
- IOはインタプリタやVMの外の環境がサポートする必要があります。IOEnvironmentというインターフェースを介して実際のIOサポートを実行系に渡しています。
- Inspectorというインターフェースはデバッグ用の覗き屋のためのもので、実行ログ(-logオプション)の書き出しは、Inspectorインターフェースを使ってます。
- ネストしたswitch文など、あまりに退屈なので、ひな形を自動生成しているところがあります。(手書きしたほうが早かった気もするが。)
- Whitespace言語の仕様で、Java実装に向かないところは勝手に制限を付けています。たとえば、原仕様では整数はBigNumなのですが、これはちょっと、、、、
僕は最初、バイトコードコンパイラを作って、それをバイコードVMで実行しようと思っていましたが、ちょっと横着して、構文構造を直接解釈実行してます。が、Whitespace言語では、インタプリタとVMの差がわずかなので、少し変更するだけで「コンパイラ+VM」にもできますね。
(オシマイ)