我正在尝试学习flex,并希望匹配字符串文字。我的代码当前看起来像:
"\""([^\n\"\\]*(\\[.\n])*)*"\"" {/*matches string-literal*/;}
我一直在努力进行一个小时左右的变更,无法使其按预期的方式工作。我本质上希望匹配的字符串文字不能包含换行符(除非已转义)并且支持转义字符。
我可能只是写了一个不好的正则表达式或一个与flex不兼容的表达式。请指教!
字符串由引号组成
"
后跟零个或多个逃脱的东西
\\.
或非引号字符,非反斜杠字符
[^"\\]
最后是引号
"
将它们放在一起,就可以了
\"(\\.|[^"\\])*\"
因为引号是Flex元字符,所以将引号引起了转义。
对于单行...,您可以使用此:
\"([^\\\"]|\\.)*\" {/*matches string-literal on a single line*/;}
如何使用开始状态...
int enter_dblquotes = 0;%x个DBLQUOTES%%\“ {BEGIN(DBLQUOTES); enter_dblquotes ++;}* \“{如果(enter_dblquotes){handle_this_dblquotes(yytext);BEGIN(INITIAL); / *恢复正常* /enter_dblquotes--;}}...遵循更多规则...
类似于该效果(flex使用%s
或%x
指示期望的状态。当flex输入检测到引号时,它将切换到另一种状态,然后继续词法化直到到达另一个引号,在它恢复到正常状态。
到来较晚,但对下一个需要它的人很有用:
\"(([^\"]|\\\")*[^\\])?\"
这是我们在Zolang中用于带有嵌入式模板${...}
的单行字符串文字的含义>>
\"(\$\{.*\}|\\.|[^\"\\])*\"
粘贴有关在flex中处理字符串的代码段,希望激发您的思考。