在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,直到达到另一个报价,在这个报价中返回到正常状态。

答案迟到,但对下一个需要它的人有用:

 \"(([^\"]|\\\")*[^\\])?\"