57

私はフレックスを学ぶために実験していて、文字列リテラルを一致させたいと思っています。私のコードは現在次のようになっています:

"\""([^\n\"\\]*(\\[.\n])*)*"\""        {/*matches string-literal*/;}

私は 1 時間ほどバリエーションに苦労してきましたが、本来の方法で動作させることができません。私は基本的に、改行を含めることができず (エスケープされていない限り)、エスケープされた文字をサポートする文字列リテラルに一致することを望んでいます。

私はおそらく、貧弱な正規表現を書いているか、flex と互換性のない正規表現を書いているだけです。お知らせ下さい!

4

6 に答える 6

125

文字列は引用符で構成されます

"

エスケープされたもののいずれかが0個以上続く

\\.

または、引用符以外の文字、円記号以外の文字

[^"\\]

そして最後に終了見積もり

"

それをすべてまとめると、あなたは持っています

\"(\\.|[^"\\])*\"

区切り引用符はFlexメタ文字であるため、エスケープされます。

于 2010-01-11T03:53:59.477 に答える
27

1行の場合...これを使用できます:

\"([^\\\"]|\\.)*\"  {/*matches string-literal on a single line*/;}
于 2012-02-13T12:30:52.377 に答える
9

開始状態を使用するのはどうですか...

int enter_dblquotes = 0;

%x DBLQUOTES
%%

\ "{BEGIN(DBLQUOTES); enter_dblquotes ++;}

<DBLQUOTES> * \ "
{{
   if(enter_dblquotes){
       handle_this_dblquotes(yytext);
       BEGIN(INITIAL); /*通常に戻ります*/
       enter_dblquotes--;
   }
}
         ...より多くのルールが続きます...

これはその効果に似ていました(flexは%s、または%xどの状態が予想されるかを示すために使用します。flex入力が引用符を検出すると、別の状態に切り替わり、別の引用符に達するまで字句解析を続け、通常の状態に戻ります。 。

于 2010-01-11T04:04:00.537 に答える