2011-03-09 99 views
5

基本上我正在執行一個表達式解析器。因爲我需要儘可能好的性能,並且根據文檔的語法結構可能會非常慢,所以我希望在解析之前重新使用語法並綁定符號表。由於語法的客戶端可能有一個符號表,它在解析之前構建和維護,我理想的情況是避免複製實際的表,因此我導致下面的代碼(簡化)用於翻譯術語:在boost :: spirit中使用指向解析器的指針

qi::symbols< char, double >* m_Symbols; 
qi::rule< Iterator, double(), ascii::space_type > m_Val; 

m_Val = qi::int_[ _val = boost::phoenix::static_cast_<double>(boost::spirit::_1) ] | qi::double_ | m_Symbols; 

這裏的問題是m_Symbols。我想要的是m_Val通過引用保存m_Symbols,因爲當我們綁定符號表時,我自然會修改指針,我認爲可以通過使用boost :: phoenix :: ref來以某種方式解決這個問題。但是更大的問題是,在合成新的分析器時,我似乎無法使用指針分析器。在表達式中使用解引用直接引用m_Symbols,這是不需要的,我想將解引用延遲到解析時間。

+0

這似乎是減少語法實例數量的錯誤方法。爲什麼不只是有一個靜態/單例實例的語法,並使其不可複製? – ildjarn 2011-03-09 19:16:55

+0

不幸的是,我仍然必須在解析之前綁定符號表,這會導致相同的問題。 – Ylisar 2011-03-10 12:16:48

回答

2

我相信一個簡單的

qi::symbols<char, double>* m_Symbols; 
qi::rule<Iterator, double(), ascii::space_type> m_Val; 

m_Val = qi::int_ | qi::double_ | qi::lazy(*m_Symbols); 

應該做你所需要的。 lazy解析器(請參閱here)僅在解析時間評估其參數(重複)。

+0

感謝您的幫助,真棒與專家幫助!可悲的是我已經嘗試了這個解決方案,看起來似乎qi :: lazy()不太樂意接受這個表達式。我從MSVC 2008中得到以下錯誤:1> /main.cpp(75):error C2784:'proto :: terminal > :: type boost :: spirit :: lazy(const boost :: phoenix :: actor &)':無法爲'const boost :: phoenix :: actor &'從'boost :: spirit :: qi :: symbols'推導出模板參數' 這使我相信m_Symbols在傳遞給lazy()之前被取消引用? – Ylisar 2011-03-10 10:48:32

+2

似乎下面的技巧:qi :: lazy(* boost :: phoenix :: val(boost :: phoenix :: ref(m_Symbols)))。 Val作爲包裝來緩解解引用,請確保指針不被複制。 – Ylisar 2011-03-10 12:40:09