2

私は grako (Python 用の PEG パーサー ジェネレーター ライブラリ) を使用して、ドキュメントに 1 つ以上のプロトコルを含めることができる単純な宣言型言語を解析しています。

もともと、ドキュメントのルート ルールは次のように記述されていました。

document = {protocol}+ ;

これはプロトコルのリストを適切に返しますが、構文エラーが最初のプロトコルにある場合にのみ役立つエラーを返します。それ以外の場合は、無効なプロトコルとそれ以降のすべてを黙って破棄します。

また、いくつかのバリエーションを試しました:

document = protocol document | $ ;

しかし、プロトコルが 1 つしかない場合、これはリストにはなりません。また、いずれかno available options: (...) documentのプロトコルにエラーが含まれている場合にのみ、有用なエラー メッセージも表示されません。

次の両方を行うルールを作成するにはどうすればよいですか?

  1. プロトコルが 1 つしかない場合でも、常にリストを返します
  2. 単に無効なドキュメントだと言ったり、破損したプロトコルを黙って削除したりするのではなく、一致の失敗に関する役立つエラー メッセージを表示します。
4

1 に答える 1

1

これが解決策です:

document = {protocol ~ }+ $ ;

パーサーがファイルの終わりを確認するために を追加しない場合、解析するプロトコルがさらにある場合でも$、解析は 1 つ以上のprotocolで成功します。

カット式 ( ) を追加する~と、パーサーは、解析で最も近いオプション/選択肢で解析されたものにコミットします (クロージャーは のオプションですX = a X|();)。によって解析されるもの内にカット式を追加protocolすると、エラー メッセージが入力の予想される障害点により近くなります。

于 2016-10-06T01:39:52.440 に答える