web-dev-qa-db-ja.com

flex / lexの文字列リテラルの正規表現

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

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

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

私はおそらく、不十分な正規表現またはflexと互換性のない正規表現を書いているだけでしょう。お知らせ下さい!

49
Thomas

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

"

ゼロ以上のエスケープされたものが続く

\\.

または引用符以外の文字

[^"\\]

そして最後に終了の引用

"

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

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

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

110

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

\"([^\\\"]|\\.)*\"  {/*matches string-literal on a single line*/;}
18
Pete

開始状態を使用してみてください...

 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予想される状態を示します。フレックス入力がクォートを検出すると、別の状態に切り替わり、別のクォートに到達するまで字句解析を続けます。クォートでは、通常の状態に戻ります。

8
t0mm13b

これは、埋め込みテンプレート_${...}_を含む単一行の文字列リテラルに Zolang で使用するものです

\"(\$\{.*\}|\\.|[^\"\\])*\"

フレックスでの文字列の処理に関するコードスニペットを貼り付けてください。

開始条件 を使用して文字列リテラルを処理すると、よりスケーラブルで明確になります。

%x SINGLE_STRING

%%

\"                          BEGIN(SINGLE_STRING);
<SINGLE_STRING>{
  \n                        yyerror("the string misses \" to termiate before newline");
  <<EOF>>                   yyerror("the string misses \" to terminate before EOF");
  ([^\\\"]|\\.)*            {/* do your work like save in here */}
  \"                        BEGIN(INITIAL);
  .                         ;
}
0
pwxcoo

遅れて届くが、それを必要とする次の人に役立つ答え:

\"(([^\"]|\\\")*[^\\])?\"
0
david