0

我将 flex 中的标记定义为

%%

@[^\\\"  \n\(\),=\{\}#~]+              {yylval.sval = strdup(yytext + 1); return ENTRYTYPE;}
[A-Za-z][A-Za-z0-9:"]*                   { yylval.sval = strdup(yytext); return KEY; }
\"([^"]|\\.)*\"|\{([^"]|\\.)*\}        { yylval.sval = strdup(yytext); return VALUE; }
[ \t\n]                                ; /* ignore whitespace */
[{}=,]                                 { return *yytext; }
.                                      { fprintf(stderr, "Unrecognized character %c in input\n", *yytext); }
%%

(虽然,不是一个好方法)问题是 VALUE 变量对于带引号的字符串做得很好,形式为“some quote”;但不适用于尝试用大括号(形式为{某些句子})括起来的形式。有什么乱七八糟的?

4

1 回答 1

1

我认为你想要这个,而不是:

\"([^"]|\\.)*\"|\{([^\}]|\\.)*\}        { yylval.sval = strdup(yytext); return VALUE; }

更好的是,以下内容将更清晰,更易于维护:

\"([^"]|\\.)*\"                         { yylval.sval = strdup(yytext); return VALUE; }
\{([^\}]|\\.)*\}                        { yylval.sval = strdup(yytext); return VALUE; }

更新

我已经在字符类表达式中转义了右括号。

于 2013-04-29T13:43:09.100 回答