Pythonの複数行コメントをflexと一致させる方法を知りたいです。そして、私はいくつかの問題に遭遇します、以下は正規表現でうまくいきます、しかしフレックスによって認識されません、私はそれを修正する方法がわかりません。
"""[^"\\]*(?:(?:\\.|"{1,2}(?!"))[^"\\]*)*"""
以前、私は以下を使用しました:
["]{3}(\\["])*(["]{0,2}[^"](\\["])*)*["]{3}
次のようなコメントを検出できます:
"""A\"""A"""
ただし、次のように複数の\を処理することはできません。
'''A\\\\'''A=B'''C'''
それを全体として認識しない:
'''A\\\\''' (comment)
A=B
'''C'''(comment)
単一の正規表現でPythonの長い文字列を認識できます。それはきれいではありませんが、私はそれがうまくいくと信じています:
["]{3}(["]{0,2}([^\\"]|\\(.|\n)))*["]{3}
これは元の正規表現とかなり似ていますが、バックスラッシュの処理をに制限しようとしない\"
ため\\
、バックスラッシュ文字として正しく識別できます。
おそらく読みやすい(ただし少し遅い)解決策は、startstart条件を使用することです。ここでyymore()
は、"""
区切り文字を含まない単一のトークンを作成するために使用しますが、本番コードはおそらくPythonのさまざまなバックスラッシュエスケープを解釈しようとします。(単一の正規表現で文字列全体を認識しようとするのではなく、開始条件の使用を動機付けるのはまさにこの必要性です。)
%x SC_LONGSTRING
%%
["]{3} BEGIN(SC_LONGSTRING);
<SC_LONGSTRING>{
[^\\"]+ yymore();
\\(.|\n) yymore();
["]["]? yymore();
["]{3} { BEGIN(INITIAL);
yylval.str = malloc(yyleng - 2);
memcpy(yylval.str, yytext, yyleng - 3);
yylval.str[yyleng - 3] = 0;
return TOKEN_STRING;
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加