在flex / lex中的string文字的正则expression式
我正在尝试学习flex,并希望匹配string文字。 我的代码目前看起来像:
"\""([^\n\"\\]*(\\[.\n])*)*"\"" {/*matches string-literal*/;}
我一直在挣扎一个小时左右的变化,不能按照它应该的方式工作。 我基本上希望匹配一个string文字,不能包含一个新行(除非它被转义),并支持转义字符。
我可能只是写一个可怜的正则expression式,或者与flex不兼容。 请指教!
你会发现这些链接有帮助
-
ANSI C语法,Lex规范
-
ANSI C Yacc语法
一个string由一个引号组成
"
其次是零或更多的任何逃脱的东西
\\.
或非引号字符
[^"\\]
最后终止报价
"
把它放在一起,你已经得到了
\"(\\.|[^"\\])*\"
分隔符引号会被转义,因为它们是Flex元字符。
对于单行…你可以使用这个:
\"([^\\\"]|\\.)*\" {/*matches string-literal on a single line*/;}
如何使用开始状态…
int enter_dblquotes = 0; %x DBLQUOTES %% \“{BEGIN(DBLQUOTES); enter_dblquotes ++;} <DBLQUOTES> * \” { if(enter_dblquotes){ handle_this_dblquotes(yytext中); BEGIN(INITIAL); / *恢复正常* / enter_dblquotes--; } } ...更多规则遵循...
类似于这种效果(flex使用%s
或%x
来指示预期的状态,当flexinput检测到一个报价时,它切换到另一个状态,然后继续search,直到达到另一个报价,在这个报价中返回到正常状态。
答案迟到,但对下一个需要它的人有用:
\"(([^\"]|\\\")*[^\\])?\"