Altlr バージョン 3.4 を使用しています。
最初の質問です。文法を参照してください。
request: 'C' DELIM source DELIM target
{ System.out.println("Hi"); }
;
source: ID ;
target: ID ;
DELIM: '|' ;
fragment ALPHA: 'a'..'z' | 'A'..'Z' ;
fragment NUM: '0'..'9' ;
ID: ALPHA (ALPHA | NUM)* ;
「ソース」と「ターゲット」を空にすることはできません。しかし、私のテストでは次のことが示されています。
- 入力 "C|n1|n2" の場合: 通常の場合、問題ありません。
- 入力 "C||n2" の場合: 構文エラー、および "Hi" は出力されません。期待される。Ok
- 入力 "C|n1|" の場合 : 構文エラーですが、"Hi" が出力されます。良くない。
「リクエスト」トークンに到達した場合は、他のものを設定する必要があります。しかし、構文エラーの場合でも、コードは「リクエスト」トークンに到達します。なんで?
2 番目の質問: 固定長のトークン (たとえば、正確に 10 桁のトークン) のルールを指定するにはどうすればよいですか?
3 番目の質問は、エラー処理に関するものです。パーサーでemitErrorMessage()をオーバーライドしてエラーフラグを設定しましたが、レクサーで別のemitErrorMessage()を見つけました。パーサー オブジェクトとレクサー オブジェクトの間でエラー フラグを共有したくありません。レキサーでemitErrorMessage()をオーバーライドして何もせず、パーサーに完全に依存してエラーを報告することはできますか? または、別の言い方をすれば、エラーが発生した場合、パーサーはそれを確実にキャプチャしますか?
また、エラー フラグが 1 つのエラーに設定されている場合、パーサーは実際に回復して別のルールに一致させることができるので、前のエラーは誤警報でしょうか?
助けてくれてありがとう!