我创建了test.l,将其输入到flex,最后以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 ...

关于c - 错误地使用unput,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/704184/

10-11 15:11