Tho*_*mas 49 c regex lex string-literals flex-lexer
我正在尝试学习flex,并希望匹配字符串文字.我的代码目前看起来像:
"\""([^\n\"\\]*(\\[.\n])*)*"\"" {/*matches string-literal*/;}
Run Code Online (Sandbox Code Playgroud)
我一直在努力与变化一个小时左右,并不能让它按照应有的方式工作.我基本上希望匹配一个不能包含换行符的字符串文字(除非它被转义)并支持转义字符.
我可能只是写一个糟糕的正则表达式或一个与flex不兼容的表达式.请指教!
Jon*_*erg 111
字符串由引号组成
"
Run Code Online (Sandbox Code Playgroud)
其次是零或多个逃脱任何东西
\\.
Run Code Online (Sandbox Code Playgroud)
或非引用字符
[^"\\]
Run Code Online (Sandbox Code Playgroud)
最后是终止报价
"
Run Code Online (Sandbox Code Playgroud)
把它们放在一起,你就得到了
\"(\\.|[^"\\])*\"
Run Code Online (Sandbox Code Playgroud)
分隔引号是转义的,因为它们是Flex元字符.
小智 20
对于单行......您可以使用:
\"([^\\\"]|\\.)*\" {/*matches string-literal on a single line*/;}
Run Code Online (Sandbox Code Playgroud)
如何使用开始状态......
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直到它到达另一个引用,在此它恢复到正常状态.