パーサーコンビネーターライブラリを使用してパーサーを構築しています。 ASTノードがテキスト入力で開始および終了した場所(行番号と列番号))を追跡する必要があります。
この問題にどのようにアプローチし、および/またはそれに対処するための戦略は何ですか?
明確化:行と列のデータがどのように/いつ/どこで計算されるかについて質問しています。 2つの可能な選択肢は、1)トークン(文字)が消費されるたびに更新される状態アラモナドとモナド変換子の追加部分として、および2)トークンストリームを前処理してそれぞれに行/列を追加することです。
欠点:1)バックトラックがある場合、同じ作業が複数回実行されることになります。 2)入力ストリーム全体が事前に行われた場合、メモリ使用量が大幅に増加します。
テキストの場所に関する情報を持つコンポーネントは、通常、パーサーではなくlexerです。通常、場所(行/列)をトークン自体に添付して、パーサーが入力トークンを処理するときにソースの場所情報にアクセスできるようにします。
バイソンでパーサーを作成しました。通常、位置データは、ロケーションタイプを提供するバイソンによって処理されます。トークンを提供するときに、このタイプにもロケーション情報を入力します。次に、ルールが縮小されたときにこの場所の値にアクセスできます。
IOW:トークンごとにBisonに渡してから、ルールごとに返します。