0

以下のような文字列定義を持つ ANTLR 文法ファイルがあります。

STRING
:  '"' (EscapeSequence | ~('\\'|'"') )* '"' ;
fragment EscapeSequence
  :   '\\' .
;

しかし、この Lexer ルールは、引用符の最初のインスタンスでエスケープ文字を無視します。の

id\=\"

は文字列の先頭として認識されますが、前にエスケープ文字があります。これは最初の見積もりでのみ発生します。エスケープされている場合、後続のすべての引用符は適切に認識されます。

/id\= \"Testing\" -- 両方の引用符がエスケープされているため、文字列にしないでください
/id\= "Testing" -- エスケープされていないため、引用符の間の文字列にする必要があります

解決すべき主な問題は、引用符の前の文字 (最後の 1 文字のみ) がエスケープ文字である場合に、レクサーが文字列を認識しようとするのを回避することです。複数のエスケープ文字がある場合は、開始引用符の前に 1 文字だけを考慮する必要があります。

4

1 に答える 1

0

ANTLR は、ほぼすべての状況で希望する動作を自動的に提供します。次の入力を検討してください。

/id\=\"Testing\"

重要な要件には、最初の引用文字の前にあるトークンの位置と長さが含まれます。次のブロックでは、文字間で発生する状況を説明するためだけにスペースを追加しています。

/ i d \ = \ " T e s t i n g \ "
           ^
           |
           ----------- Make sure no token can *end* here

最初の文字がその前"の文字も含むトークンの一部として含まれるようにすることで、最初の文字がトークンの開始として解釈されないようにします。\"STRING

上記の条件を満たさない場合、あなたの"キャラクターSTRINGトークンの開始として扱われます。

于 2014-07-22T14:10:54.707 に答える