だから私は解決策を見つけました。
Happy には部分解析という機能があり、ドキュメンテーションgit log
に記載されていますが、ソース リポジトリを読んで発見しました。これにより、パーサーは残りの入力を破棄できます。とは異なるディレクティブを使用して宣言されてい%name
ます。
%name parser {- normal parser -}
%partial parser {- partial parser -}
しかし、それが機能する方法は、私の 2 番目の要件に適合しません。怠惰なトークナイザーに入力をこれ以上消費させるべきではありません。代わりに、解析するものがこれ以上ないことを確認するために、あと 1 つのトークンが必要です。
が有効なシンボルではなく、トークナイザーがそれを消費できないと仮定し!
、次の入力を検討してください。
begin end. valid_token!!!
begin end.!
Happy は をチェックしてvalid_token
そこで停止するため、解析 (1) は成功しますが、もう 1 つのトークンが必要なため (そしてトークナイザーがそれを与えることができないため)、解析 (2) は失敗します。
どうやらこの動作を変更する方法はないので、私の回避策は、文法のどこにも現れない特別なトークンによって字句エラーを表すことです。!
したがって、トークナイザーが(またはその他の無効な文字) に遭遇すると、特別なエラー トークンが生成されます。また、字句エラーからの回復にも役立つはずです。