2

字句アナライザーを作成する割り当てがあり、1 つのビットを除いてすべてが機能しています。改行を受け入れる文字列を作成する必要があり、文字列は二重引用符で区切られています。文字列は、任意の数字、文字、指定された句読点、バックスラッシュ、および区切り文字内の二重引用符を受け入れます。改行文字をエスケープする方法がわかりません。改行やタブなどの文字をエスケープする特定の方法はありますか?

これが役立つかもしれない私のコードの一部です

< STRING : ( < QUOTE> (< QUOTE > | < BACKSLASH > | < ID > | < NUM > | " " )* <QUOTE>) >
< #QUOTE : "\"" >
< #BACKSLASH : "\\" >

したがって、私の文字列は引用符を許可し、次にバックスラッシュ、空白、数字などの次の文字のいずれかを許可し、その後に別の引用符を続ける必要があります。「\n」のような改行文字が機能していません。前もって感謝します!

4

1 に答える 1

1

文字列リテラルの場合、JavaCC は Java の構文を借用しています。そのため、改行を含む 1 文字リテラルは としてエスケープされ"\r"、改行を含む 1 文字リテラルは " " としてエスケープされ\nます。

ただし、処理された文字列値は 1 文字にすぎません。それは逃避そのものではない。したがって、改行のトークンを定義するとします。

< LF : "\n" >

トークンの一致は<LF>単一の改行文字になります。別のトークンの定義でトークンを置換すると、単一の文字が効果的に置換されます。したがって、より高いレベルの定義があるとします。

< STRING : "\"" ( <LF> ) "\"" >

トークンの一致は、<STRING>引用符、改行、引用符の 3 文字になります。代わりに、エスケープシーケンスが認識されるようにする必要があるようです:

< STRING : "\"" ( "\\n" ) "\"" >

トークンの一致は、<STRING>引用符、改行を表すエスケープ シーケンス、引用符の 4 文字になります。

あなたの現在の定義では、引用符やバックスラッシュなどの他の頻繁にエスケープされるメタ文字も、エスケープ シーケンスとしてではなく、文字どおりに認識されていることがわかります。

于 2012-11-12T22:54:10.593 に答える