LoginSignup
4
2

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-12-26

image.png

かんたんな自作言語のコンパイラをいろんな言語で書いてみるシリーズ 22番目の言語は Tcl です。

Tk の方は(Ruby/Tk で)少し触れたことがあるのですが、そういえば Tcl って書いたことなかったなと思って書いてみました。

できたもの

アドベントカレンダーの期日が過ぎてしまったのでとりあえず公開します。いろいろと雑です。3日くらいでババッと書きました。

サイズはこんな感じ。

$ wc -l *.tcl lib/*.tcl
  381 codegen.tcl
  129 lexer.tcl
  438 parser.tcl
  109 lib/json.tcl
   42 lib/types.tcl
   92 lib/utils.tcl
 1191 合計

動かし方の例

$ echo '
  func add(a, b) {
    return a + b;
  }

  func main() {
    call add(1, 2);
  }
' | ./lexer.tcl | ./parser.tcl | ./codegen.tcl

# ↓アセンブリが出力される

  call main
  exit
label add
  push bp
  cp sp bp
  cp [bp:2] reg_a
  push reg_a
  cp [bp:3] reg_a
  push reg_a
  pop reg_b
  pop reg_a
  add_ab
  cp bp sp
  pop bp
  ret
label main
  push bp
  cp sp bp
  cp 2 reg_a
  push reg_a
  cp 1 reg_a
  push reg_a
  _cmt call~~add
  call add
  add_sp 2
  cp bp sp
  pop bp
  ret
# ... snip ...

移植元

Tcl版のベースになっているバージョンは tag:62 のあたり

<自作言語処理系の説明用テンプレ>

自分がコンパイラ実装に入門するために作った素朴なトイ言語とその処理系です。簡単に概要を書くと下記のような感じ。

<説明用テンプレおわり>

メモ

自分が知っている言語の中ではシェルスクリプトに一番似ている気がします。

  • コマンド実行が基本
  • 単に foo と書くと文字列扱いで、$foo だと変数置換される
  • [...] はコマンド置換みたいな感じ

……といったあたりが分かってきた後では「なんだかすっきりした素直なシェルスクリプトみたいだな」と思いながら書いていました。

型の判別はめんどくさそうだったので、文字列だったら {str fdsa}、整数だったら {int 123} と明示的にタグ付けするスタイルにしました。

参考: Determine type of a variable in Tcl - Stack Overflow

この記事を読んだ人は(たぶん)こちらも読んでいます

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2