灵活匹配多行分组

flex match multiline grouping

尝试让 flex 解析这些东西,就好像 {} 的内容是一个块(可以匹配我可以缓冲的每一行)

[file] file_content1 = {}
[file] file_content2 = { blah }
[file] file_content3 = { multi
line
content3}
[file] file_content4 = {
multi
line
content4
}

我设置的规则基本上是

<PATH_STATE>"\{" {
    BEGIN(CONTENT_STATE);
}

<CONTENT_STATE>{
    "\}" {
        BEGIN(PATH_STATE);
        return TOK_CONTENT;
    }
    <<EOF>> {
        // eof error
    }
    (.)*/\} {
        lval.s = strdup(yytext);
    }
}

上面对前两行有效,我可以成功获取内容,但对于多行部分却失败了。是否有可能或者我应该将 \n 困在这种状态并缓冲每一行?

谢谢

在 (f)lex 中,. 不匹配换行符。另一方面,[^}] 确实匹配换行符但不匹配 },我猜这就是您要查找的内容。这样,就不需要使用开始条件了:

[{][^}]*[}] {
              yylval.s = strdup(yytext + 1);
              yylval.s[yyleng - 2] = 0;
            }
[{]         { /* Eof inside  braces error */ }

如果 yylval.s 如果你不喜欢一个字节的过度分配,你可以使用

yylval.s = malloc(yyleng - 1);
memcpy(yylval.s, yytext + 1, yyleng - 2);
yylval.s[yyleng - 2] = 0;

您可能希望在块中允许嵌套大括号。在那种情况下,开始条件是必要的,使用 yymore 会很有用。