2013-12-19 57 views
7

我有類似如下的工作語法:在boost :: spirit :: qi語法中處理深遞歸的正確方法是什麼?

stock_price = symbol_ >> date_ >> price_; 
stock_prices_ = stock_price_ >> stock_prices_ | eps; 
grammar_ = lit("PRICES") >> stock_prices_ >> lit("END"); 

的問題是,當股票prices_名單過高(約1000種價格說吧),在該解析賽格故障與EXC_BAD_ACCESS。我實際上可以解決這個:

stock_prices_ = stock_price_ >> stock_price_ >> stock_price_ >> stock_price >> stock_prices_ | 
       stock_price_ >> stock_prices_ | 
       eps; 

但我不認爲這是一個優雅的解決方案。有更好的解決方案嗎?

+0

也許在probelm指數上。 20個指數模式會將遞歸深度限制在每百萬40 + 1左右。 – Yakk

回答

5

我可能在這裏完全沒有問題,但kleene starplus parser和or list parser directive s有什麼錯?

stock_prices_ = +stock_price_ | eps; // one or more stock_price_ or nothing 

然而,這看起來只是克林星完全語義:

stock_price = symbol_ >> date_ >> price_; 
grammar_ = "PRICES" >> *stock_price_ >> "END"; // zero or more stock_price_ 

現在,如果你想讓他們行分隔例如,使用1

grammar_ = "PRICES" >> -(stock_price_ % eol) >> "END"; 

1與例如qi::blank隊長,不吃換行符

+0

謝謝!這很明顯,我只是沒有想到它。實施語法相當新穎。 – statguy

+1

@statguy Cheers :)我冒昧地說,_either_你來自函數式編程背景,或者你可能喜歡範式:)在純函數式編程中使用遞歸迭代是最重要的。 – sehe

相關問題