2010-11-08 24 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函數。