1

レクサーとパーサーの典型的な構成を知っています。レクサーはソースコードを読み取り、トークンを生成します。トークンはパーサーに送信され、パーサーはそれらを文法生成の終端記号として使用します。典型的な再帰下降パーサーでは、開始非終端記号を表すトップレベル関数を呼び出すことから始めます。この関数は他の関数を呼び出し、レクサーからトークンごとに読み取ります。

しかし、同じレクサーの上に2つの異なるパーサーが必要な場合はどうなりますか?

つまり、レクサーでの不要な重複作業を避けるために、同じソースを複数回読み取ることは望ましくないため、つまり、複数のパスを許可しないため、両方とも同じ場所から読み取ることになります。順番に次のトークンが生成されたときに、両方のパーサーが同時にそれを消費するようにしたいだけです。

ただし、これらのパーサーの1つで呼び出すことができる最上位関数は1つだけです。両方を同時に呼び出すことはできません:/

これらのパーサーをある種のステップモードで実行する方法はありますか?つまり、新しいトークンを取得したら、それを両方のパーサーに次々に渡したいのですが、その1つのトークンだけ進めて、内部状態とデータ構造を可能な限り更新し、すぐに返します。別のトークンを待つ。

この種の構成はこれまで見たことがありません。そのようにパーサーを構築することは可能ですか?この種のパーサーをコードでどのように構造化できるかについての資料はありますか?名前はありますか?

編集1: パーサジェネレータツールを使用したくありませんが、この種のものが内部でどのように機能するかを学びたいので、自分でコードを記述します。

4

1 に答える 1

3

プル パーサーの典型的なフローについて説明しました。一度呼び出されると、すべての入力が完全に解析されるまで制御されます。パーサーは、次のトークンを取得するために自分自身でレクサーを呼び出します。一方、プッシュ パーサーは、新しいトークンが使用可能になるたびに呼び出されます。したがって、新しいトークンごとに複数のパーサーを呼び出すことができます。Classical Bison は push モードで使用できます (詳細はあります)。Lemonパーサー ジェネレーターはプッシュ パーサーを生成します。

于 2011-02-22T21:58:00.217 に答える