約 1 か月前に半関連の質問をし ました。複数のパスでの解析は PEG 文法では一般的ですか? いくつかのテキストの入力をパスで段階的に解析するために、いくつかの文法を書くことが問題ないかどうかを調べようとしていました。私のお気に入りのプロジェクトである音楽プログラミング言語 (MPL) パーサーのために、3 つの個別の文法を作成しました。
ソース ファイルの内容全体を取得し、コメントを削除します。
ソース ファイル (コメントを削除) を取得し、楽器ごとに分けます。これにより、楽器の名前/定義と、その楽器によって「演奏される」「音楽コード」のペアが作成されます。
実際に音楽コード (楽器ごとに 1 つのテキスト文字列) を解析し、楽器ごとに音楽の「イベント」の解析ツリーを返します。
私の以前の質問に答えたある人は、これは健全なアプローチであり、パーサー ジェネレーター ツールにこれを自動的に/単純に行う方法がない場合は、コメント削除パスを用意するのが合理的であると示しました。文法を統一する唯一の潜在的な理由は、パフォーマンス要件があるかどうかだけですが、私の場合はありません。
しかし、これについてさらに考えてみると、例外処理への影響について疑問に思っています。理想的には、パーサーが例外をスローしたときに、元のソース ファイルの正しい行番号を識別し、解析エラーを識別するエラー メッセージを表示するようにしたいと考えています。私が選んだパーサー生成ツールであるInstaparseには、次のような行番号と列番号を識別する素敵なエラー メッセージがあります。
Parse error at line 1, column 1:
bbaaaab
^
Expected:
"ab"
問題は、これらのエラーがパスごとにスローされることです。ソース ファイルからコメントを削除するために使用している最初の文法がある場合、元の行番号は保持されず、次のパスに進みます。そうでないことを心から願っていますが、正しい行番号を維持する唯一の方法は、すべてを単一の非常に複雑な文法に統合することだと私には思えます。これを回避する方法はありますか?複数の連続した文法を記述し、元の入力からの行番号を保持するためのパターンはありますか?