トップダウンパーサーの魅力と効果的な再帰下降パーサー
目录
- 導入
- ツールダウンパーサーの種類
- バックトラッキングなしのツールダウンパーサー
- 予測パーサー(LL(1)パーサー)
- 再帰的降下パーサーの定義と仕組み
- 再帰的降下パーサーの定義
- 再帰的降下パーサーの手続きの作成
- 开始記号の手続き
- 演算子の手続き
- 式の手続き
- 文の手続き
- 再帰的降下パーサーの使用例
- ツールダウン解析の利点
- ツールダウン解析の欠点
- 結論
再帰的降下パーサーとは何ですか? {再帰的降下パーサーの定義と仕組み}
再帰的降下パーサーは、グラマーの非終端記号ごとに再帰的なプロシージャを用いて構築される、トップダウンパーサーの一種です。再帰的降下パーサーは、グラマーの構造と非常に近いプログラムの構造を持ちます。つまり、再帰的降下パーサーは、グラマーが認識する概念に非常に近い形でプログラムを作成することができます。
再帰的降下パーサーの定義によると、再帰的降下パーサーは「相互再帰的な手続きのセットまたは非再帰的な同等の手続きから構築されるトップダウンのパーサーです。各手続きは、文法の非終端記号の1つを実装します。そのため、生成されるプログラムの構造は、グラマーの構造と非常に似ています。」
具体的には、再帰的降下パーサーでは、文法の非終端記号ごとに対応する手続きを作成します。例えば、文法の開始記号に対応する手続きや、演算子に対応する手続き、式に対応する手続きなどがあります。これらの手続きは、再帰的に自身を呼び出すこともあれば、相互に再帰することもありません。手続きは、グラマーの非終端記号に対応しており、最終的なプログラムの構造は、対応するグラマーを非常によく反映しています。
具体的な例を挙げるために、以下の文法を考えてみましょう:
E -> I E'
E' -> + I E' | ε
この文法を使用して、再帰的降下パーサーを構築し、入力文字列の解析がどのように行われるかを観察します。
まず、文法全体を反映した手続きを作成します。開始記号 E
に対応する手続きを以下のように定義します:
void E() {
if (lookAhead == 'I') { // "I" にマッチするかどうかを確認
match('I'); // "I" にマッチする場合は次の文字を取得
E_dash(); // E' の手続きを呼び出す
}
}
次に、E'
の手続きを定義します:
void E_dash() {
if (lookAhead == '+') { // "+" にマッチするかどうかを確認
match('+'); // "+" にマッチする場合は次の文字を取得
match('I'); // "I" にマッチする
E_dash(); // 再び E' の手続きを呼び出す(再帰的に)
} else {
return; // "+" にマッチしない場合は終了
}
}
以上の手続きを作成した後、入力文字列が再帰的降下パーサーによって認識されるかどうかを確認することができます。具体的な手順としては、開始記号 E
の手続きを呼び出し、そこから対応する手続きが再帰的に呼び出されることで、入力文字列が解析されます。