プログラミング言語を作る 本を読んだところまでまとめてみる
こんにちは。Go言語でつくるインタプリタを読んでます!!!!(まだ読んでる途中)
自分の理解の整理のために、読んだところまでを自己流でまとめてみようという記事です。詳しくは書籍「Go言語でつくるインタプリタ」を読んでくださいhttps://www.oreilly.co.jp/books/9784873118222/
めちゃくちゃ端折って簡単なコードについて書くことにします。
let x = 5;
これを実行するためには、
- 字句解析
- 構文解析
- 評価
というステップを踏んでいきます。今のところ、構文解析の途中まで読みました。
1. 字句解析
let x = 5;
を読んでそのままxに5を代入できるわけではありません。
まずはプレーンテキストのプログラムを、扱える単位に変換する必要があります。
let -> LETトークン "let"
x -> IDENTトークン "x"
= -> ASSIGNトークン "="
5 -> INTトークン "5"
; -> SEMICOLONトークン ";"
という具合です。これをいい感じのループやら分岐やらで処理してやります。
上記は単純な例なので簡単ですが、例えば
let add = fn(x, y) { return x + y };
if (add(1, 2) == 3) {
return true;
} else {
return false;
}
みたいなものも解析できるように実装しなくてはなりません。といってもこの時点では括弧が揃っているかや構文として正しいかは考慮しないのでそんなに複雑ではないです。
余談ですが、let
やif
などは
var keywords = map[string]TokenType{
"if": IF,
"let": LET,
...
のようにキーワードとして置いておいて、分岐処理の時に使います。これが予約語の正体なんですね(言語によって違うのかな。Rubyはhttps://github.com/ruby/ruby/blob/master/defs/keywordsにあった)。
2. 構文解析
ステップ1ではトークンの並び順などは気にせず、書かれている内容がなんであるかを把握するまでの処理でした。構文解析ではトークンの並び順や構造を見ていきます。
例えば、let x = 5;
の場合は
- letがあったらそれはlet文である
- let文ならばletの次には識別子がくる
- 次にASSIGNトークン
- 次に式
という構造か?を見ます。書籍で扱う言語の仕様では、文はletとreturnの2種類しかなく、returnは"return"トークンの後に式があるか?だけで済みます。
これをAST(抽象構文木)にしていきます。 =の左辺には識別子、右辺には式が来る、というようなイメージの木です。
…以上
めちゃくちゃ中途半端ですがここまでしか読んでないのでここまでしか書けませんでした…。この先が気になる方はぜひ書籍を読んでみてください。
Discussion