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

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元字符.

  • +1,清楚解释最新情况. (7认同)
  • 这个答案有几个问题.首先,它不是有效的弹性模式.前导和尾随双引号需要转义,因为否则flex会将它们视为元字符.所以模式应该是(或许)\"(\\.| [^"])*\".其次,该模式仍然不起作用.例如,它输入错误:"\\\\".第三,它不符合原始问题禁止换行的要求. (6认同)
  • 它是否在flex范围之外工作并不重要.关于flex的问题.如果flex生成的词法分析器看到`"\\\\"foo"`,它将匹配整个输入,而不是匹配`"\\\\"`部分,因为字符类不排除反斜杠. (5认同)
  • 你一定错过了"零或更多的逃脱任何东西"? (4认同)
  • 遗憾的是,这并不能解决问题.所以这会错误地说""\""` (3认同)

小智 20

对于单行......您可以使用:

\"([^\\\"]|\\.)*\"  {/*matches string-literal on a single line*/;}
Run Code Online (Sandbox Code Playgroud)


t0m*_*13b 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直到它到达另一个引用,在此它恢复到正常状态.

  • flex手册包含解析C风格字符串的完整示例(就flex使用而言):http://flex.sourceforge.net/manual/Start-Conditions.html.在该页面上搜索"引用字符串". (5认同)
  • @Samoz:不是真的,它实际上用在使用字符串文字的语言中,它会占用开头引号和结束引号之间的内容,即使内部有额外的引号,因此使用切换状态来咀嚼引号... (2认同)