使用输出错误

时间:2009-04-01 05:36:20

标签: c parsing lex flex-lexer

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

当主要功能实现为:

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

我没问题。

我想欺骗解析器相信第一个字符总是一个分号,所以我将main实现为

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

以上导致段故障。

为什么使用输出会导致段故障?

2 个答案:

答案 0 :(得分:6)

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

设计扫描仪可能有一种更好的方法,无需将其划分为前导分号,但如果必须这样做,那么一种解决方案可能就是使用启动条件。像这样:

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

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

... rest of rules ...

答案 1 :(得分:0)

以下代码的含义没有错误。

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

问题来自flex,它声明了unput宏,当然你应该在之前初始化lex。

但是如果你把你的主要放在.l file之外,你的代码就不会发生段错误。