我有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 );
}
}
以某种方式,转义序列\“仅在字符串的开头匹配。如果\”出现在字符串的后面,则看起来像字符\和“分别匹配。
例如:
Passes:"\" "
失败:" \" "
失败:"This is string example: \"a string inside of string\""
为什么在字符串中出现转义序列\“时,规则"\\\""
不匹配它?
如果反斜杠不是加引号的字符串中的第一个字符,则反斜杠将在某些标记的末尾匹配。例如:
[^\"\n]+ { expr_parser_append_string(PARSER, &(yylval->string), yytext); }