flex / lex中字符串文字的正则表达式

时间:2010-01-11 03:45:22

标签: c regex lex string-literals flex-lexer

我正在尝试学习flex并希望匹配字符串文字。我的代码目前看起来像:

"\""([^\n\"\\]*(\\[.\n])*)*"\""        {/*matches string-literal*/;}

我一直在努力应对变化一个小时左右,并且不能让它按照应有的方式运行。我基本上希望匹配一个不能包含新行的字符串文字(除非它被转义)并支持转义字符。

我可能只是写一个糟糕的正则表达式或一个与flex不兼容的表达式。请指教!

6 个答案:

答案 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);
  .                         ;
}