Go言語でつくるインタプリタ

[cover photo]
TOPICS
Programming
発行年月日
PRINT LENGTH
316
ISBN
978-4-87311-822-2
原書
Writing An Interpreter In Go
FORMAT
Print PDF EPUB
Ebook
2,992円
Ebookを購入する
Print
3,740円

本書は、Go言語でプログラミング言語のインタプリタを作りながら、プログラミング言語とそのインタプリタについて学ぶ書籍です。
順を追ってコードを示し、C言語風の構文を持つ言語「Monkeyプログラミング言語」のインタプリタを組み立てていきます。字句解析器、構文解析器、評価器を作りながら、ソースコードをトークン列に、トークン列を抽象構文木に変換し、その抽象構文木を評価し実行する方法を学びます。さらに、インタプリタに新しいデータ型を導入し、組み込み関数を追加して、言語を拡張していきます。付録では構文マクロシステムについても扱います。
本書では、Go言語標準のツールキット以外のサードパーティライブラリやフレームワークは使用せず、0行のコードからはじめて、完動するインタプリタができあがるところまでを体験します。その過程を通じて、プログラミング言語とインタプリタの仕組みを実践的に学ぶことができます。

正誤表

ここで紹介する正誤表には、書籍発行後に気づいた誤植や更新された情報を掲載しています。以下のリストに記載の年月は、正誤表を作成し、増刷書籍を印刷した月です。お手持ちの書籍では、すでに修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷版、刷り年月日をご確認の上、ご利用ください。

第2刷正誤表

・p.xii 下から8行目
【誤】https://interpreterbook.com/waiig_code_1.4.zip
【正】https://interpreterbook.com/waiig_code_1.7.zip

・p.xiii 上から1行目〜2行目
【誤】
後世のために記しておくと、本書執筆時には私はGo1.7を使用している。
それから、direnv(https://direnv.net)を使うことをおすすめする。これを使うと…
【正】
後世のために記しておくと、私がこの本を書いたときにはGo 1.7を使用していた。今、本書を最新版にアップデートするにあたって、Go 1.14を使用している。
あなたがGo 1.13以降を使用しているのであれば、codeフォルダに含まれるコードはそのまま実行できるはずだ。
もし、Go modulesをサポートしていない、古いバージョンのGoを使用しているのであれば、direnv(https://direnv.net/)を使うことをおすすめする。これを使うと…

目次

訳者まえがき
はじめに

1章 字句解析
    1.1 字句解析
    1.2 トークンを定義する
    1.3 字句解析器(レキサー)
    1.4 トークン集合の拡充と字句解析器の拡張
    1.5 REPLのはじまり

2章 構文解析
    2.1 構文解析器(パーサー)
    2.2 パーサージェネレータじゃないの?
    2.3 Monkey言語のための構文解析器を書く
    2.4 構文解析器の第一歩:let文
    2.5 return文の構文解析
    2.6 式の構文解析
        2.6.1 Monkeyにおける式
        2.6.2 トップダウン演算子順位解析(Pratt構文解析)
        2.6.3 用語
        2.6.4 ASTの準備
        2.6.5 Pratt構文解析器の実装
        2.6.6 識別子
        2.6.7 整数リテラル
        2.6.8 前置演算子
        2.6.9 中置演算子
    2.7 Pratt構文解析の仕組み
    2.8 構文解析器の拡張
        2.8.1 真偽値リテラル
        2.8.2 グループ化された式
        2.8.3 if式
        2.8.4 関数リテラル
        2.8.5 呼び出し式
        2.8.6 TODOの削除
    2.9 読み込み―構文解析―表示―繰り返し

3章 評価
    3.1 シンボルに意味を与える
    3.2 評価の戦略
    3.3 Tree-Walkingインタプリタ
    3.4 オブジェクトを表現する
        3.4.1 オブジェクトシステムの基礎
        3.4.2 整数
        3.4.3 真偽値
        3.4.4 null
    3.5 式の評価
        3.5.1 整数リテラル
        3.5.2 REPLを完成させる
        3.5.3 真偽値リテラル
        3.5.4 null
        3.5.5 前置式
        3.5.6 中置式
    3.6 条件分岐
    3.7 return文
    3.8 中止! 中止! 間違い発見! あるいはエラー処理
    3.9 束縛と環境
    3.10 関数と関数呼び出し
    3.11 ゴミを片付けているのは誰か

4章 インタプリタの拡張
    4.1 データ型と関数
    4.2 文字列
        4.2.1 字句解析器における文字列の対応
        4.2.2 文字列の構文解析
        4.2.3 文字列の評価
        4.2.4 文字列結合
    4.3 組み込み関数
        4.3.1 len
    4.4 配列
        4.4.1 字句解析器で配列に対応する
        4.4.2 配列リテラルの構文解析
        4.4.3 添字演算子式の構文解析
        4.4.4 配列リテラルの評価
        4.4.5 添字演算子式の評価
        4.4.6 配列のための組み込み関数を追加する
        4.4.7 配列の試運転
    4.5 ハッシュ
        4.5.1 ハッシュリテラルの字句解析
        4.5.2 ハッシュリテラルの構文解析
        4.5.3 オブジェクトをハッシュ化する
        4.5.4 ハッシュリテラルを評価する
        4.5.5 ハッシュの添字式を評価する
    4.6 グランドフィナーレ

付録 マクロシステム
    A.1 マクロシステム
    A.2 Monkeyのためのマクロシステム
    A.3 クオート(quote)
    A.4 アンクオート(unquote)
        A.4.1 木を歩く
        A.4.2 unquote呼び出しの置換
    A.5 マクロ展開
        A.5.1 macroキーワード
        A.5.2 マクロリテラルの構文解析
        A.5.3 マクロを定義する
        A.5.4 マクロを展開する
        A.5.5 お馴染みのunlessマクロ
    A.6 REPLを拡張する
    A.7 マクロの夢をみよう

参考資料
索引