言語実装パターン

―コンパイラ技術によるテキスト処理から言語実装まで

[cover photo]
TOPICS
Programming
発行年月日
PRINT LENGTH
352
ISBN
978-4-87311-532-0
原書
Language Implementation Patterns
FORMAT
PDF
Ebook
3,960円
Ebookを購入する

構文解析器生成系ANTLRの開発者であり、サンフランシスコ大学教授のTerence Parrが贈る、言語実装パターンの解説書。構文解析、意味解析、インタプリタ構築、言語変換を通じて、言語アプリケーション開発に必要な知識が身に付きます。sedやawkなどのツールやスクリプト言語では実装が複雑になりがちなテキスト処理でも、本書のパターンを使えば素早く効率よくエレガントに実装できます。また、効率よく高度な業務処理を実現するためにDSL処理系を構築したい方、コンパイラについて基本から体系的に学びたい方にも最適な一冊です。

関連ファイル

正誤表

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

第1刷正誤表

1刷正誤表

言語実装パターン 第1刷正誤表

2011年12月28日更新

位置
p108
下から
8行目
'!' と'&&' は、「否定」と「論理和」を表す字句型とします。 '!' と'&&' は、「否定」と「論理積」を表す字句型とします。

目次

目次

『言語実装パターン』推薦のことば
謝辞
前書き

第I部 さあ、構文解析に取りかかろう
1章 言語アプリケーションのいろは
    1.1 全体のあらまし
    1.2 パターンを一巡する
        1.2.1 入力文の構文解析をする
        1.2.2 木を構築する
        1.2.3 木の走査をする
        1.2.4 入力が意味する内容を見つけ出す
        1.2.5 入力文をインタプリタで実行する
        1.2.6 ある言語から別の言語へと変換する
    1.3 アプリケーションを解体する
        1.3.1 バイトコードインタプリタ
        1.3.2 Javaバグ検出器
        1.3.3 Javaバグ検出器其の弐
        1.3.4 Cコンパイラ
        1.3.5 Cコンパイラを活用した C++実装
    1.4 パターンを選んでアプリケーションを組み上げる

2章 基本的な構文解析パターン
    2.1 句の構造を識別する
    2.2 再帰的下向き構文解析器を構築する
    2.3 文法 DSLを使って構文解析器を構築する
    2.4 文から字句を抽出する2
    パターン 1 文法を変換して再帰的下向き認識器を作成する
        目的
        解説
        実装
    パターン 2 LL(1)再帰的下向き字句解析器
        目的
        解説
        実装
        関連パターン
    パターン 3 LL(1)再帰的下向き構文解析器
        目的
        解説
        実装
        関連パターン
    パターン 4 LL(k)再帰的下向き構文解析器
        目的
        解説
        実装
        関連パターン
    この次は

3章 高度な構文解析パターン
    3.1 任意長先読みを使った構文解析
    3.2 パックラット構文解析
    3.3 意味情報を使って構文解析に指示を出す
    パターン 5 後戻り構文解析器
        目的
        解説
        実装
        関連パターン
    パターン 6 メモ化構文解析器
        目的
        解説
        実装
        関連パターン
    パターン 7 述語制御構文解析器
        目的
        解説
        実装
    この次は

第II部 言語を解析しよう
4章 中間形式木の構築
    4.1 木を構築するのはなぜ?
    4.2 抽象構文木を構築する
        4.2.1 抽象構文木で演算子の優先順位を表現する方法
        4.2.2 木をテキスト形式で表現する
        4.2.3 抽象構文木の中で疑似演算を表現する
        4.2.4 抽象構文木を Javaで実装する
        4.2.5 型付けシステムを使って木構造を強制する
    4.3 早わかり ANTLR
    4.4 ANTLR文法を使って抽象構文木を構築する
    パターン 8 構文解析木
        目的
        解説
    実装パターン 9 均質抽象構文木
        目的
        解説
        実装
        関連パターン
    パターン 10 正規化非均質抽象構文木
        目的
        解説
        関連パターン
    パターン 11 非正規化非均質抽象構文木
        目的
        解説
        関連パターン
    この次は

5章 木の走査と書換え
    5.1 木走査と訪問順序
    5.2 ノード訪問コードをカプセル化する
    5.3 文法から訪問器を自動生成する
    5.4 パターン照合と木走査を分離する
    パターン 12 組込み非均質木走査器
        目的
        解説
        実装
    パターン 13 外部木訪問器
        目的
        解説
        実装
    関連パターン
    パターン 14 木文法
        目的
        解説
        実装
        関連パターン
    パターン 15 木パターン照合器
        目的
        解説
        実装
        関連パターン
    この次は

6章 プログラム記号の記録と識別
    6.1 プログラム実体についての情報を収集する
    6.2 記号をスコープの中にまとめる
        6.2.1 単一スコープ
        6.2.2 複数スコープと入れ子スコープ
    6.3 記号を解決するパターン 16 単一スコープのための記号表
        目的
        解説
        実装
        関連パターン
    パターン 17 入れ子スコープのための記号表
        目的
        解説
        実装
        関連パターン
    この次は

7章 データ集合体のための記号表管理
    7.1 構造体のためのスコープ木を構築する
    7.2 クラスのためのスコープ木を構築する
        7.2.1 メンバアクセス式を解決する
        7.2.2 前方参照を扱う
    パターン 18 データ集合体のための記号表
        目的
        解説
        実装
        関連パターン
    パターン 19 クラスのための記号表
        目的
        解説
        実装
        関連パターン
    この次は

8章 静的型付け規則を守らせる
    パターン 20 静的な式の型を計算する
        目的
        解説
        実装
        関連パターン
    パターン 21 自動型昇格
        目的
        解説
        実装
        関連パターン
    パターン 22 静的型安全性を守らせる
        目的
        解説
        実装
        関連パターン
    パターン 23 多態型安全性を守らせる
        目的
        解説
        実装
        関連パターン
    この次は

第III部 インタプリタを構築しよう
9章 高級インタプリタの構築
    9.1 高級インタプリタのメモリシステムを設計する
    9.2 高級インタプリタの中で記号を記録する
    9.3 命令を処理する
    パターン 24 構文主導インタプリタ
        目的
        解説
        実装
        関連パターン
    パターン 25 木方式インタプリタ
        目的
        解説
        実装
        関連パターン
    この次は

10章 バイトコードインタプリタの構築
    10.1 バイトコードインタプリタ向けのプログラムを作成する
    10.2 アセンブリ言語の構文を定義する
    10.3 バイトコード機械のアーキテクチャ
        10.3.1 バイトコード命令処理器
        10.3.2 大きな定数を定数プールの中に格納する
        10.3.3 関数を呼び出す
    10.4 より高度なインタプリタを構築するには
    パターン 26 バイトコードアセンブラ
        目的
        解説
        実装
        関連パターン
    パターン 27 スタック方式バイトコードインタプリタ
        目的
        解説
        実装
        関連パターン
    パターン 28 レジスタ方式バイトコードインタプリタ
        目的
        解説
        実装
        関連パターン
    この次は

第IV部 言語の変換と生成をしよう
11章 コンピュータ言語の変換
    11.1 構文主導変換
    11.2 規則方式変換
    11.3 モデル駆動変換
        11.3.1 目的構成体ごとに固有の生成器クラスを作成する
        11.3.2 簡単ではあっても柔軟性に欠ける print文
        11.3.3 入力モデル走査を出力順序から切り離す
    11.4 入れ子になった出力モデルを構築する
        11.4.1 入力句コンポーネントから出力オブジェクト生成する
        11.4.2 変換した句を入れ子になったモデルの中に並べる
    パターン 29 構文主導変換器
        目的
        解説
        実装
        関連パターン
    パターン 30 規則方式変換器
        目的
        解説
        実装
        関連パターン
    パターン 31 目的構成体ごとに固有の生成器クラス
        目的
        解説
        実装
        関連パターン
        この次は

12章 テンプレートを使った DSL生成
    12.1 StringTemplateを使ってみよう
    12.2 StringTemplateの特徴を調べる
    12.3 簡単な入力モデルからテンプレートを生成する
    12.4 テンプレートを再利用して別の入力モデルに使用する
    12.5 木文法を使ってテンプレートを作成する
        12.5.1 訪問器と木文法を比較する
        12.5.2 木文法を使ってテンプレートを生成する
        12.5.3 Cymbolのテンプレートを定義する
        12.5.4 変換器を動かしてみる
    12.6 テンプレートをリスト形式のデータに適用する
        12.6.1 リレーショナルデータベースの中でオブジェクトを表現する
        12.6.2 入力モデルからデータを抽出する
        12.6.3 テンプレートを使って SQLを生成する
    12.7 目的変更容易な変換器を構築する
        12.7.1 Javaコードを生成する
        12.7.2 根テンプレートの中にデータを注入する
        12.7.3 STが属性を書き出す方法を変更する
        12.7.4 テンプレート階層を構築する
        12.7.5 コード生成処理をテストする
        12.7.6 オブジェクト直列化処理をテストするこの次は

13章 すべてを組み合わせる
    13.1 タンパク質構造の中のパターンを見つける
    13.2 3次元描写を構築するためのスクリプトを使う
    13.3 XMLを処理する
    13.4 一般的な設定ファイルを読み取る
    13.5 ソースコードの一部を取り除く
    13.6 Javaに新しい型を追加する
    13.7 ソースコードにプリティプリント処理を施す
    13.8 機械語コードへコンパイルする

付録 A 参考文献
索引

コラム
    無意味なコードを警告してくれる ANTLR
    構文解析器の制御フローに例外を使っても大丈夫なのはなぜ?
    パックラット構文解析が速いのはなぜ?
    木を使って入れ子構造を表現する
    木書換えの無限ループを避けるには
    ポインタ互換性の静的検査と動的検査の違い
    命令セットの設計がインタプリタの速さを左右する
    インタプリタの速さ比べ
    入力駆動生成と出力駆動生成の違いをチェスにたとえると
    テンプレートの旨味を知ろう
    インタプリタ版を作成する
    Javaオブジェクトは自分の型を知っている