Lex-字符串内的双引号

用户3995057

我有lex语法,其中包含双引号字符串的规则:

...
%x DOUBLEQUOTE
...
%%
"\""                { yylval->string = NULL; BEGIN(DOUBLEQUOTE); }
<DOUBLEQUOTE> {
    "\n"            {
                        /* reset column counter on new line */
                        PARSER->linepos = 0;
                        (PARSER->linenum)++;
                        expr_parser_append_string(PARSER, &(yylval->string), yytext);
                    }
    [^\"\n]+        { expr_parser_append_string(PARSER, &(yylval->string), yytext); }
    "\\\""          { expr_parser_append_string(PARSER, &(yylval->string), yytext); }
    "\""            {
                        BEGIN(INITIAL);
                        if ( yylval->string != NULL )
                            string_unescape_c(yylval->string);
                        return ( TOKEN_STRING );
                    }
}

不知何故,转义序列\“仅在字符串的开头匹配。如果\”在字符串的后面出现,则看起来字符\分别匹配。

例如:

  1. 通行证: "\" "

  2. 失败: " \" "

  3. 失败: "This is string example: \"a string inside of string\""

为什么在字符串后面出现转义\“"\\\"",该规则不匹配

如果反斜杠不是加引号的字符串中的第一个字符,则反斜杠将在某些标记的末尾匹配。例如:

 "abc\"def"
  ^^^^       First token, longest match of [^"\n]+
      ^      Terminates quoted string

因此,您还需要排除反斜杠。但是一旦这样做,您就需要提供一种与反斜杠转义符匹配的模式,而不仅仅是反斜杠转义的引号。所以我建议:

<DOUBLEQUOTE>{
  \\?\n              { /* Handle newline */ }
  ([^"\\\n]|\\.)+    { expr_parser_append_string(PARSER,
                                                 &yylval->string,
                                                 yytext); }
  \"                 { BEGIN(INITIAL); ... }
}

注意:我在第一个模式的开头添加了一个可选的反斜杠,以处理反斜杠紧接换行符之前的情况。所述.第二图案(\\.)将不匹配换行,以便否则反斜杠换行符不会在所有识别。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章