我正在尝试学习flex并希望匹配字符串文字。我的代码目前看起来像:
"\""([^\n\"\\]*(\\[.\n])*)*"\"" {/*matches string-literal*/;}
我一直在努力应对变化一个小时左右,并且不能让它按照应有的方式运行。我基本上希望匹配一个不能包含新行的字符串文字(除非它被转义)并支持转义字符。
我可能只是写一个糟糕的正则表达式或一个与flex不兼容的表达式。请指教!
答案 0 :(得分:108)
字符串由引号
组成"
之后是零或多个逃脱的任何东西
\\.
或非引用字符
[^"\\]
最后是终止报价
"
把它们放在一起,你就得到了
\"(\\.|[^"\\])*\"
分隔引号是转义的,因为它们是Flex元字符。
答案 1 :(得分:18)
对于单行...您可以使用:
\"([^\\\"]|\\.)*\" {/*matches string-literal on a single line*/;}
答案 2 :(得分:8)
如何使用开始状态...
int enter_dblquotes = 0; %x DBLQUOTES %% \" { BEGIN(DBLQUOTES); enter_dblquotes++; } <DBLQUOTES>*\" { if (enter_dblquotes){ handle_this_dblquotes(yytext); BEGIN(INITIAL); /* revert back to normal */ enter_dblquotes--; } } ...more rules follow...
它类似于该效果(flex使用%s
或%x
来指示预期的状态。当flex输入检测到引用时,它会切换到另一个状态,然后继续lexing直到它达到另一个引用,它将恢复到正常状态。
答案 3 :(得分:0)
答案迟到但对下一个需要它的人有用:
\"(([^\"]|\\\")*[^\\])?\"
答案 4 :(得分:0)
这是我们在Zolang中使用带有嵌入式模板${...}
的单行字符串文字的方法
\"(\$\{.*\}|\\.|[^\"\\])*\"
答案 5 :(得分:0)
粘贴有关在Flex中处理字符串的代码段,希望能激发您的思考。
使用Start Condition处理字符串文字将更具可伸缩性和清晰性。
%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);
. ;
}