2021-05-10に投稿

Juliaでかんたんな自作言語のコンパイラを書いた

とりあえず触って慣れようということで、何も分からないところからいきなり作り初めてその都度調べるという感じで雑に書いてみました。

https://github.com/sonota88/vm2gol-v2-julia

移植元

ライフゲームのプログラムだけコンパイルできればOKという簡単なコンパイラです。
ベースになっているバージョン: tag:57 のあたり

メモ

できあがりサイズ(行数)は Ruby 版と同じくらい。

$ wc -l *.jl lib/*.jl
  359 codegen.jl
  113 lexer.jl
  360 parser.jl
  107 lib/json.jl
   56 lib/utils.jl
  995 合計

Ruby のような動的言語で書くのと似たフィーリングで書けました。

ただし、こういうのはダメで、

xs = ["a"]
push!(xs, 1) # xs に整数を追加
#=> ERROR: LoadError: MethodError: Cannot `convert` an object of type Int64 to an object of type String

次のように型について教えてあげないといけない、なんて場面はあったり。

xs = Any["a"]
push!(xs, 1)

今回のおためし。
ブランチ: trial

今回は case 文のネストを減らしてみました。
おためしというか v3 ですでに適用済みになっていて、 v2 にも取り込もうかなと考えているもの。

// before

case {
  (current_val == 0) {
    case {
      (count == 3) {
        set next_val = 1;
      }
    }
  (0 == 0) {
    case {
      (count == 2) {
        set next_val = 1;
      }
      (count == 3) {
        set next_val = 1;
      }
    }
  }
}
// after

case
when (current_val == 0) {
  case
  when (count == 3) {
    set next_val = 1;
  }
when (0 == 0) {
  case
  when (count == 2) {
    set next_val = 1;
  }
  when (count == 3) {
    set next_val = 1;
  }
}

{} が1段なくなるため、ネストが減り、行数も減ってちょっとコンパクトになります。

ついでに、when 句の先頭にキーワード when を置くようにしてみました。パーサの都合としてはあってもなくてもほとんど違いはなく、 when を置いた方がなんとなく見た目的に落ち着きがよいかな、という程度の理由です。

他の言語への移植

上から新しい順。

Originally published at qiita.com
ツイッターでシェア
みんなに共有、忘れないようにメモ

sonota486

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント