57

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

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

我已经在变化中苦苦挣扎了一个小时左右,但无法让它按应有的方式工作。我本质上希望匹配一个不能包含换行符(除非它被转义)并支持转义字符的字符串文字。

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

4

6 回答 6

125

字符串由引号组成

"

后跟零个或多个逃脱的任何东西

\\.

或非引号字符、非反斜杠字符

[^"\\]

最后是终止报价

"

把它们放在一起,你就有了

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

分隔引号被转义,因为它们是 Flex 元字符。

于 2010-01-11T03:53:59.477 回答
27

对于单行......你可以使用这个:

\"([^\\\"]|\\.)*\"  {/*matches string-literal on a single line*/;}
于 2012-02-13T12:30:52.377 回答
9

如何使用启动状态...

int enter_dblquotes = 0;

%x DBLQUOTES
%%

\" { 开始(DBLQUOTES); enter_dblquotes++; }

<DBLQUOTES>*\"
{
   如果(输入_dblquotes){
       handle_this_dblquotes(yytext);
       开始(初始);/* 恢复正常 */
       enter_dblquotes--;
   }
}
         ...更多规则如下...

它类似于那种效果(flex 使用%sor%x来指示预期的状态。当 flex 输入检测到一个引号时,它会切换到另一个状态,然后继续进行词法分析,直到它到达另一个引号,在该引号中它会恢复到正常状态.

于 2010-01-11T04:04:00.537 回答
2

粘贴我在 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);
  .                         ;
}
于 2019-02-20T15:23:30.503 回答
1

这就是我们在Zolang中用于嵌入模板的单行字符串文字${...}

\"(\$\{.*\}|\\.|[^\"\\])*\"

于 2018-09-27T00:48:55.423 回答
-1

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

\"(([^\"]|\\\")*[^\\])?\"
于 2017-06-03T20:31:46.253 回答