レクサーとパーサーの典型的な構成を知っています。レクサーはソースコードを読み取り、トークンを生成します。トークンはパーサーに送信され、パーサーはそれらを文法生成の終端記号として使用します。典型的な再帰下降パーサーでは、開始非終端記号を表すトップレベル関数を呼び出すことから始めます。この関数は他の関数を呼び出し、レクサーからトークンごとに読み取ります。
しかし、同じレクサーの上に2つの異なるパーサーが必要な場合はどうなりますか?
つまり、レクサーでの不要な重複作業を避けるために、同じソースを複数回読み取ることは望ましくないため、つまり、複数のパスを許可しないため、両方とも同じ場所から読み取ることになります。順番に次のトークンが生成されたときに、両方のパーサーが同時にそれを消費するようにしたいだけです。
ただし、これらのパーサーの1つで呼び出すことができる最上位関数は1つだけです。両方を同時に呼び出すことはできません:/
これらのパーサーをある種のステップモードで実行する方法はありますか?つまり、新しいトークンを取得したら、それを両方のパーサーに次々に渡したいのですが、その1つのトークンだけ進めて、内部状態とデータ構造を可能な限り更新し、すぐに返します。別のトークンを待つ。
この種の構成はこれまで見たことがありません。そのようにパーサーを構築することは可能ですか?この種のパーサーをコードでどのように構造化できるかについての資料はありますか?名前はありますか?
編集1: パーサジェネレータツールを使用したくありませんが、この種のものが内部でどのように機能するかを学びたいので、自分でコードを記述します。