自作言語やインタープリタの作り方の勉強。
書籍「GO言語でつくるインタプリタ」で紹介されている、Monkey言語のインタープリタを作成します。
著者がGOのコードを公開していますが、読者によって様々な言語に移植されています。
今回は読者のコードを参考にJavaScriptで書いてみました。(本はまだ買ってない)
インタープリタ = Lexer + Parser + Eval
機能 | 解説 |
---|---|
Lexer | ソースコードを先頭から1文字ずつ読み込んで、プログラムとしての最小単位(トークン)に分解する |
Parser | トークンを先頭から1個ずつ読み込んで、プログラムとして意味のある単位(ノード)に組み立てる。ノードには値・式・文があり、1本のツリー(AST)を作る |
Eval | ASTを評価・実行する |
※ASTはHTMLに例えるとDOMみたいなもの
インタープリタをコードで説明すると
function interpreter(code){
const lexer = new Lexer(code)
const ast = new Parser(lexer).parse()
return Eval(ast)
}
ソースコード
機能 | 依存関係 | 難易度 |
---|---|---|
lexer.js | token.js | ★ |
parser.js | lexer.js token.js ast.js | ★★★ |
eval.js | parser.js object.js functions.js | ★★ |
実行環境
JavaScript製なのでWebで実行できます。
開発者ツールのコンソールを開けば、トークン列とASTの内容を確認できます。
学習メモ
ソースコードを読むだけで理解できるように、できるだけ平易に書いてますが、根本的にインタープリタは難しいので限界もあります。
Prattパーサーと呼ばれるParser部の難易度が高い。特にparseExpression()
の所。
どういう関数がどういう順番で実行されるのかログを取ったり、ASTを確認したりして、時間を掛けて体で覚えていくのが良いかと。