2010-11-08 22 views
2

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

一个简单的例子是,使用YACC,所以我可以调用由线分割的文件:

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

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

+3

由于[过度渴望的元用户决定](http://meta.stackexchange.com/questions/23959/whats-this-about-labelled-tags),[flex]标签表示Adobe产品对于词法分析器生成器,您需要使用错误的[gnu-flex]。 – dmckee 2010-11-08 16:46:50

+3

什么哟意味着“暂停”扫描!当你调用这个函数时,Flex会生成一个函数(或方法:yylex()),它将读取** ONE **标记(lexeme)然后返回。 – 2010-11-08 19:27:53

+1

我怀疑问题是Tlol没有直接使用Flex,@Martin。相反,他使用的是Bison,而Bison在需要的时候隐式地调用'yylex'。常见的Bison用法是调用'yyparse'来产生一个大的AST。我想Tlol想知道如何递增地解析文件,而不是在一个'yyparse'调用中。 – 2010-11-08 19:56:12

回答

0

事实上,暂停我的意思是“保持状态并完成yyparse”呼叫。例如在我的Gramar中,我会这样做:

rule: 
    SaveLine; 
    Pause; 

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

yyparse_resume(); 

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

2

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

rule: whatever { Pause(); } 
; 

这就需要你Pause功能可能暂停和/或做任何你想要的。当你想继续解析时,只需要返回Pause函数。