2

我创建了 test.l,输入到 flex,它以 main 函数结束。

当 main 函数实现为:

int
main(void)
{
    yylex();
    return 0;
}

我没有问题。

我想诱使解析器相信第一个字符始终是分号,所以我将 main 实现为

int
main(void)
{
    unput(';');
    yylex();
    return 0;
}

以上导致段故障。

为什么使用 unput 会导致段错误?

4

2 回答 2

6

它导致段错误,因为 yylex() 尚未初始化 unput() 所需的输入缓冲区等。

可能有一种更好的方法来设计您的扫描仪,而无需将其引入前导分号,但如果您必须这样做,那么一种解决方案可能是使用开始条件。像这样的东西:

%x SPECIAL
%%
    BEGIN(SPECIAL); /* Go to SPECIAL state when yylex first called */

<SPECIAL>.  { unput(*yytext); unput(';'); BEGIN(INITIAL); }

... rest of rules ...
于 2009-04-01T06:27:44.097 回答
0

下面的代码意思没有错。

int main(void) { unput(';'); yylex(); return 0; }

问题来自声明unput宏的 flex,当然您之前应该初始化 lex。

但是如果你把你的 main 放在外面.l file,你的代码就不会出现段错误。

于 2010-07-16T03:56:07.473 回答