我创建了 test.l,输入到 flex,它以 main 函数结束。
当 main 函数实现为:
int
main(void)
{
yylex();
return 0;
}
我没有问题。
我想诱使解析器相信第一个字符始终是分号,所以我将 main 实现为
int
main(void)
{
unput(';');
yylex();
return 0;
}
以上导致段故障。
为什么使用 unput 会导致段错误?
我创建了 test.l,输入到 flex,它以 main 函数结束。
当 main 函数实现为:
int
main(void)
{
yylex();
return 0;
}
我没有问题。
我想诱使解析器相信第一个字符始终是分号,所以我将 main 实现为
int
main(void)
{
unput(';');
yylex();
return 0;
}
以上导致段故障。
为什么使用 unput 会导致段错误?
它导致段错误,因为 yylex() 尚未初始化 unput() 所需的输入缓冲区等。
可能有一种更好的方法来设计您的扫描仪,而无需将其引入前导分号,但如果您必须这样做,那么一种解决方案可能是使用开始条件。像这样的东西:
%x SPECIAL
%%
BEGIN(SPECIAL); /* Go to SPECIAL state when yylex first called */
<SPECIAL>. { unput(*yytext); unput(';'); BEGIN(INITIAL); }
... rest of rules ...
下面的代码意思没有错。
int main(void) { unput(';'); yylex(); return 0; }
问题来自声明unput
宏的 flex,当然您之前应该初始化 lex。
但是如果你把你的 main 放在外面.l file
,你的代码就不会出现段错误。