私は grako (Python 用の PEG パーサー ジェネレーター ライブラリ) を使用して、ドキュメントに 1 つ以上のプロトコルを含めることができる単純な宣言型言語を解析しています。
もともと、ドキュメントのルート ルールは次のように記述されていました。
document = {protocol}+ ;
これはプロトコルのリストを適切に返しますが、構文エラーが最初のプロトコルにある場合にのみ役立つエラーを返します。それ以外の場合は、無効なプロトコルとそれ以降のすべてを黙って破棄します。
また、いくつかのバリエーションを試しました:
document = protocol document | $ ;
しかし、プロトコルが 1 つしかない場合、これはリストにはなりません。また、いずれかno available options: (...) document
のプロトコルにエラーが含まれている場合にのみ、有用なエラー メッセージも表示されません。
次の両方を行うルールを作成するにはどうすればよいですか?
- プロトコルが 1 つしかない場合でも、常にリストを返します
- 単に無効なドキュメントだと言ったり、破損したプロトコルを黙って削除したりするのではなく、一致の失敗に関する役立つエラー メッセージを表示します。