如何让yacc / bison和lex / flex暂停文件扫描?

时间:2010-11-08 16:40:02

标签: c++ bison yacc lex flex-lexer

我试图使用Bison / Yacc解析文件,但我想暂停解析一段时间。我想这样做的原因是我想按顺序处理一个巨大的文件,并使用hasNext()和next()方法模拟一个java迭代器。

一个简单的例子是,使用yacc逐行拆分文件,所以我可以调用:

while(myYaccObj.hasNext())
{
    std::string line = myYaccObj.next()
}

我无法找到如何“暂停”文件扫描。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:2)

最简单的方法就是直接在动作代码中暂停。例如,您可以有一条规则:

rule:  whatever  { Pause(); }
;

这会调用你的Pause函数,它可以暂停和/或做你想做的任何事情。如果要继续解析,只需返回Pause函数。

答案 1 :(得分:0)

实际上暂停对我意味着“保持状态并完成yyparse”调用。例如,在我的gramar中,我会这样做:

rule:
    SaveLine;
    Pause;

然后控件返回到我的代码。我做我必须做的事情然后我打电话:

yyparse_resume();

并继续解析直到另一个暂停或EOF。