Writing An Interpreter In Go でインタプリタを作る 準備~Chapter 1

準備

動機

一応情報科は出たものの、言語理論とかに興味がなくて授業も取らなかったので、なんとなく引け目を感じていた。

明快入門 コンパイラ・インタプリタ開発 C処理系を作りながら学ぶ は目を通した。
これはCでCライクなインタプリタを作るものだったが、Goで書いてみたところかなり書きづらかったので、簡単な関数電卓ができたところでやめてしまった。

AST みたいなものには以前から興味があって、Go の AST を使ったツールも作ったことがある。
それでちょうど興味があったインタプリタ作成とGolangの両取りをできそうなこれを見つけたのでやってみる

環境

MacOS Sierra
Go 1.8

Chapter 1

この章では単純なlexerを作成する。
一応全部やりきると以下のようなコードがパースできるようになる

let five = 5;
let ten = 10;
let add = fn( x, y) {
x + y;
};
let result = add( five, ten);
!-/*5;
5 < 10 > 5;
if (5 < 10) {
return true;
} else {
return false;
}
10 == 10;
10 != 9;

結構すごい
けど let ho(ge = 123; みたいな意地悪するととたんに崩壊するのであんまりいじめないで

方法は1文字読んで switch 文にかけてどのトークンか判別する
リテラルの場合はずーっと読んで次のトークンまでをリテラルとする
== や != のような2文字演算子の場合は次のトークンをチェックして判別する

最後に REPL の原型を作ってこの章は終わり

感想

方針はCで書いたものと似た感じだったのでこれが基本的な流れなんだろうと思った。
ただ、Go のコードとして良いコードにすることは意識してないみたいで、ILLEGAL を返したりするのはモヤッとした。
今後の課題として全部終わったら手直ししてみようかな

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.