正则表达式(在flex中)用于完整的一般句子

时间:2013-04-29 12:54:34

标签: regex flex-lexer

我在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”;但是当它们被大括号({some sentences}形式)包围时,不适用于形式。 什么是凌乱的?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

<强>更新

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