コンパイラコンパイラ【compiler compiler】
概要

人間が読み書きしやすい高水準言語で書かれたプログラムはそのままでは実行できないため、コンパイラによって機械語コードや中間コードに変換される。コンパイラは対象言語ごとに個別に開発する必要があるが、字句解析や構文解析など言語を問わず共通する処理が多く、新しい言語の処理系を一から実装するには大きな労力を要する。
こうした背景から、言語仕様を記述するだけで必要なプログラムを自動生成する技術が研究され、コンパイラコンパイラが開発されるようになった。コンパイラは字句解析や構文解析、意味解析、最適化、コード生成などの処理段階から構成されるが、コンパイラコンパイラはこれらの全段階ではなく、特定の処理のみを対象とするものが多い。
文法規則から構文解析器を生成するものは「パーサジェネレータ」(parser generator)、字句規則から字句解析器を生成するものは「スキャナジェネレータ」(scanner generator)と呼ばれる。代表的なパーサジェネレータとして、UNIX系システムで広く使われてきた「yacc」(yet another compiler compiler)がよく知られている。
yaccは文脈自由文法で記述された規則からC言語の構文解析器コードを生成するものであり、コンパイラ全体を生成するわけではない。その後継の「GNU Bison」や、字句解析器を生成する「lex」「flex」、さらに複数のターゲット言語に対応した汎用パーサジェネレータ「ANTLR」(ANother Tool for Language Recognition)なども広く利用されている。
コンパイラコンパイラはコンパイラ開発だけでなく、インタプリタ、設定ファイル解析器、ドメイン固有言語(DSL)の処理系、クエリ言語処理系など様々な用途に応用されており、言語処理ソフトウェア開発を支える基盤技術の一つとなっている。