構文解析器(こうぶんかいせきき)は、テキストの構造を解析するプログラムです。一般にパーサ(parser)またはパーザとも呼ばれます。
プログラミング言語処理系の入力部分で利用されるのが代表的ですが、それ以外にも設定ファイルの読み込みや、
自然言語処理など、構造を持ったテキストデータを扱う様々な場面で用いられます。
構文解析のアルゴリズムは複雑になることも多いですが、パーサジェネレータと呼ばれるツールを利用することで、構文規則を記述するだけで、
構文解析器を自動的に生成することが可能です。これにより、プログラマーは複雑な
構文解析処理を自ら実装する必要がなくなり、開発効率を大幅に向上させることができます。
構文解析器の主な役割は、入力された文字列が、事前に定義された形式文法の規則に従って生成できるかどうかを判定することです。この判定方法は、大きく分けて次の2つのアプローチに分類できます。
トップダウン
構文解析では、解析の開始点として開始記号(文法の根となる要素)を設定します。そこから文法規則を適用し、入力文字列に一致するように構文木を構築していきます。例えるならば、まず大きな要素から解析を始め、徐々に細部に分解していくようなイメージです。JavaCCなどのツールは、このトップダウン
構文解析の手法を使用しています。
ボトムアップ
構文解析では、入力文字列を解析の開始点とします。そして、文法規則を逆方向に適用していくことで、最終的に開始記号に到達することを目指します。例えるならば、まず入力文字列中の最も基本的な要素を特定し、それらを含むより大きな要素、さらに大きな要素、というように、段階的に解析していくイメージです。Yaccなどのツールは、このボトムアップ
構文解析の手法を採用しています。
また、
構文解析器は「左端導出」を行うか、「右端導出」を行うかという分類方法もあります。これは
文脈自由文法における導出の順序に関する分類です。
LL法は左端導出、
LR法は右端導出に対応しており、それぞれ異なる解析戦略をとります。
以下に、代表的な
構文解析器の種類を、トップダウン
構文解析とボトムアップ
構文解析に分けて示します。
再帰下降構文解析
LL法
末尾再帰構文解析
パックラット
構文解析
LR法
S
LR法
LALR法
C
LR法
GLR法
アーリー法
CYK法
パーサジェネレータ
以下に、代表的なパーサジェネレータをいくつか示します。これらのツールを使うことで、構文解析器を自動生成することができます。
ANTLR
Bison
Coco/R
GOLD
JavaCC
Lemon Parser
LRgen
Rebol
SableCC
Spirit Parser Framework
Yacc
これらのパーサジェネレータは、それぞれ異なる文法記述形式や解析アルゴリズムを採用しており、用途や要件に応じて適切なツールを選択する必要があります。