我有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 );
}
}
不知何故,转义序列\“仅在字符串的开头匹配。如果\”在字符串的后面出现,则看起来字符\和“分别匹配。
例如:
通行证: "\" "
失败: " \" "
失败: "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] 删除。
我来说两句