2015-05-07 45 views
2

我正在嘗試創建解析RTF文件的語法。在某些時候,我需要在語法範圍內存儲一些信息。我知道,我可以使用繼承的屬性,但這會惡化可讀性。boost :: spirit :: qi - 在語法結構中使用實例成員

所以我問自己,如果語法的實例成員變量可以解決我的問題,如果有,我應該怎麼在我的語法使用它們?

例如,我需要跟蹤的字符轉換的活動代碼頁中。在我的語法結構中有int codepage是否是好習慣?

我想進一步是,調用一些功能在棧上推杆和彈出的狀態變量。我想我會將狀態信息結合到一個RtfState類中,我可以根據需要進行擴展。調用語法結構的成員函數最好的方法是什麼?

回答

2

您可以。只要使用語義動作與phx::bind

namespace phx = boost::phoenix; 
switch_cp = qi::int_ [ phx::bind(&MyGrammar::_codepage, this) = _1 ]; 

但是,請記住,廢墟重入:不要使用它,如果相關規則可以被嵌套。


或者,調用方法看起來像:例如:

switch_cp = qi::int_ [ phx::bind(&MyGrammar::push_codepage, this, _1) ]; 

reset_cp = qi::eps [ phx::bind(&MyGrammar::pop_codepage, this) ] 

一般閱讀:Boost Spirit: "Semantic actions are evil"?

+0

謝謝您的回答,@sehe。我解決這樣的: '點亮( 「{」)[PHX ::綁定(RtfState :: saveState和,參考文獻(狀態))]',' 點亮( 「}」)[PHX ::綁定(RtfState :: restoreState,ref(state))]'和 'rtfFontTable [phx :: bind(&RtfState :: addFonts,ref(state),_1)]' – DaJunkie

相關問題