このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

Whitespace処理系から言語処理の一般論へ

キマイラ・サイトに置いた実装(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」にもできますね。

(オシマイ)