以下のような文字列定義を持つ ANTLR 文法ファイルがあります。
STRING
: '"' (EscapeSequence | ~('\\'|'"') )* '"' ;
fragment EscapeSequence
: '\\' .
;
しかし、この Lexer ルールは、引用符の最初のインスタンスでエスケープ文字を無視します。の
id\=\"
は文字列の先頭として認識されますが、前にエスケープ文字があります。これは最初の見積もりでのみ発生します。エスケープされている場合、後続のすべての引用符は適切に認識されます。
/id\= \"Testing\" -- 両方の引用符がエスケープされているため、文字列にしないでください
/id\= "Testing" -- エスケープされていないため、引用符の間の文字列にする必要があります
解決すべき主な問題は、引用符の前の文字 (最後の 1 文字のみ) がエスケープ文字である場合に、レクサーが文字列を認識しようとするのを回避することです。複数のエスケープ文字がある場合は、開始引用符の前に 1 文字だけを考慮する必要があります。