我正在尝试学习 flex 并想匹配字符串文字。我的代码目前看起来像:
"\""([^\n\"\\]*(\\[.\n])*)*"\"" {/*matches string-literal*/;}
我已经在变化中苦苦挣扎了一个小时左右,但无法让它按应有的方式工作。我本质上希望匹配一个不能包含换行符(除非它被转义)并支持转义字符的字符串文字。
我可能只是在写一个糟糕的正则表达式或一个与 flex 不兼容的表达式。请指教!
我正在尝试学习 flex 并想匹配字符串文字。我的代码目前看起来像:
"\""([^\n\"\\]*(\\[.\n])*)*"\"" {/*matches string-literal*/;}
我已经在变化中苦苦挣扎了一个小时左右,但无法让它按应有的方式工作。我本质上希望匹配一个不能包含换行符(除非它被转义)并支持转义字符的字符串文字。
我可能只是在写一个糟糕的正则表达式或一个与 flex 不兼容的表达式。请指教!
字符串由引号组成
"
后跟零个或多个逃脱的任何东西
\\.
或非引号字符、非反斜杠字符
[^"\\]
最后是终止报价
"
把它们放在一起,你就有了
\"(\\.|[^"\\])*\"
分隔引号被转义,因为它们是 Flex 元字符。
对于单行......你可以使用这个:
\"([^\\\"]|\\.)*\" {/*matches string-literal on a single line*/;}
如何使用启动状态...
int enter_dblquotes = 0; %x DBLQUOTES %% \" { 开始(DBLQUOTES); enter_dblquotes++; } <DBLQUOTES>*\" { 如果(输入_dblquotes){ handle_this_dblquotes(yytext); 开始(初始);/* 恢复正常 */ enter_dblquotes--; } } ...更多规则如下...
它类似于那种效果(flex 使用%s
or%x
来指示预期的状态。当 flex 输入检测到一个引号时,它会切换到另一个状态,然后继续进行词法分析,直到它到达另一个引号,在该引号中它会恢复到正常状态.
粘贴我在 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);
. ;
}
这就是我们在Zolang中用于嵌入模板的单行字符串文字${...}
\"(\$\{.*\}|\\.|[^\"\\])*\"
一个迟到但对下一个需要它的人有用的答案:
\"(([^\"]|\\\")*[^\\])?\"