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


移植一覧に戻る


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

github.com

移植元

以前作ったこれです。コンパイラ部分だけだと1000行くらいという素朴さ。

ベースになっているバージョン: tag:45 のあたり (追記 2021-06-08 ステップ58 の変更まで反映しました)

作り方はここに全部書いています(Ruby 版のものですが): vm2gol v2 製作メモ

メモ

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


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


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

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

(2021-06-05 追記: その後の修正を加えるために以下の修正はいったん取り消しましたが、一応 trial ブランチに残してあります。)

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