我想知道如何将 python 多行注释与 flex 相匹配。我遇到了一些麻烦,以下工作正常Regexr https://regexr.com/,但不被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}
这与您原来的正则表达式非常相似,但它不会尝试将其反斜杠处理限制为\"
,这样就可以正确识别\\
作为反斜杠字符。
一个可能更容易阅读(但稍微慢一些)的解决方案是使用 start 启动条件。这里我用的是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;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)