素朴な自作言語のコンパイラをPythonに移植した


移植一覧に戻る


Python で書いてみました。やっつけなので汚いです。Python よく知らないけどライフゲームが動いたのでヨシ、というレベルのものです。

github.com


移植元

memo88.hatenablog.com

ベースになっているバージョン: tag:45 のあたり

メモ

アセンブラVM は移植対象から外しました。Ruby 版のものを使います。


トークナイザは今のところ大した量もないのでパーサと同じファイルに書いていますが、 やっぱり分けようかなという気分になりました。


移植版は今後も継続してメンテするわけではなくババッと作って気が済んだら終わりというものなので、 Ruby 版にそのうち入れるかもしれない修正を気軽に・実験的に試してみようかと。

高水準言語部分の文法をやっぱり Ruby っぽくしようかなと考えていて、今回はそれを一部試してみました。

funcdef に変えて、 { ... }... end に変えて、 行コメントの開始文字を # に変えて……と修正していって、下記のような怪しい見た目になりました。 varset なんかはまだ残っています。

def calc_next_gen(current_val, count)
  # 注目しているセルの次世代の生死
  var next_val = 0;

  case
  when (current_val == 0)
    case
    when (count == 3)
      set next_val = 1;
    end
  when (0 == 0)
    case
    when (count == 2)
      set next_val = 1;
    when (count == 3)
      set next_val = 1;
    end
  end
  
  return next_val;
end

怪しいですが ruby -c test/*.vg.txt で文法チェックすると OK と出ます。

Ruby で実行するとさすがに何かしらエラーになるだろう……と思って試してみたら正常終了しました。 最初は意外な感じがしましたが、メソッドの定義しかしてない(メソッドを呼び出していない)ため実行時エラーも出ない、ということのようです。なるほど。