flex匹配多行分组

时间:2017-09-21 16:31:37

标签: regex bison flex-lexer

尝试使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);
    }
}

以上工作的前2行,我可以成功获取内容,但多线部分失败。是否有可能或应该将\ n置于此状态并缓冲每一行?

由于

1 个答案:

答案 0 :(得分:0)

在(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的使用将是有用的。