尝试使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置于此状态并缓冲每一行?
由于
答案 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
的使用将是有用的。