4時間で書いたインタプリタ (300 LoC)

ちょっと研究上の都合から、小さな小さなインタプリタを書く必要性が生じました。作ったプログラミング言語の拡張 BNF はこんな感じ。

program ::= (command ;) *
command ::=
    | <変数> = e
    | <変数> := e
    | if e then { (command ;) * } [ else { (command ;) * } ]
    | while e { (command ;) * }
    | print e
    | dump
e ::= <整数> | <変数> | unary e | e binary e
unary ::= -
binary ::= + | - | * | / | % | = | == | <> | < | > | <= | >=

全部でぴったり 300 行です。バイト数が 8,837 というのはつまらなかった。コメントでも書いて 8,888 バイトにすればよかった。Objective Caml を使いました。ビルドには OMake を使っています。

よかったらzip を公開してますので拾って行って下さい。ダウンロードされた方はコメントしてね。LALR 文法の shift/reduce 衝突が 13 個も出るので文法記述のお手本にはなりませんね。S 先生@東工大かN 先生@筑波大にお願いして直してもらおうか。。。


  1. なんじゃこりゃ!「セミコロン、丸括弧閉じ」がニコちゃん ;) に化けてる!笑えるからそのままにしちゃお。

    返信

  2. エラーメッセージが丁寧ですね.

    返信

    1. お茶大の浅井さんが海外に行っているあいだに半年間のオートマトンと形式言語の非常勤をしていたことがあります。理論ばかりでは面白くないと思ったので、具体的な応用例を見せてあげようと思って作ったもう少し複雑なプログラミング言語を元に作りました。丁寧なエラーメッセージはお茶大の学生さんへの媚びです。あ〜嫌らしい。

      返信

Spam Protection by WP-SpamFree