私はflexを学ぶために実験しており、文字列リテラルと一致させたいと思っています。私のコードは現在次のようになっています:
"\""([^\n\"\\]*(\\[.\n])*)*"\"" {/*matches string-literal*/;}
私は1時間かそこらの間、バリエーションに苦労してきましたが、それを本来の方法で動作させることはできません。私は本質的に、改行を含めることができない(エスケープされていない限り)文字列リテラルと一致し、エスケープされた文字をサポートすることを望んでいます。
私はおそらく、不十分な正規表現またはflexと互換性のない正規表現を書いているだけでしょう。お知らせ下さい!
文字列は引用符で構成されます
"
ゼロ以上のエスケープされたものが続く
\\.
または引用符以外の文字
[^"\\]
そして最後に終了の引用
"
それをすべてまとめると、あなたは持っています
\"(\\.|[^"\\])*\"
区切り引用符はFlexメタ文字であるためエスケープされます。
1行の場合...これを使用できます。
\"([^\\\"]|\\.)*\" {/*matches string-literal on a single line*/;}
開始状態を使用してみてください...
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
予想される状態を示します。フレックス入力がクォートを検出すると、別の状態に切り替わり、別のクォートに到達するまで字句解析を続けます。クォートでは、通常の状態に戻ります。
これは、埋め込みテンプレート_${...}
_を含む単一行の文字列リテラルに 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);
. ;
}
遅れて届くが、それを必要とする次の人に役立つ答え:
\"(([^\"]|\\\")*[^\\])?\"