灵活匹配多行分组
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
会很有用。
尝试让 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
会很有用。