2011-03-18 47 views
0

我有一種說不出的煩惱:齊::規則<它,的std :: string()>不解析輸入字符串

qi::rule <Iterator, std::string()> str = +alnum; 
// will not parse given input 
//param = "WELL" >> space >> str >> ((space >> no_case[control]) || (space >> no_case[limit])) >> space >> qi::eol; 

// will parse given input ok 
param = "WELL" >> space >> +alnum >> ((space >> no_case[control]) || (space >> no_case[limit])) >> space >> qi::eol; 

expression = qi::no_skip[param]; 

輸入是 「好NAME3 PROD油\ n」。控制和限制是符號表。

我在做什麼錯了?

UPD

隨着BOOST_SPIRIT_QI_DEBUG定義並與表達之前BOOST_SPIRIT_DEBUG_NODE(PARAM)我得到以下輸出如果使用的話str的:

<param> 
    <try>WELL name3 PROD OIL </try> 
Segmentation fault 

在+ alnum情況下我得到:

<param> 
    <try>WELL name3 PROD OIL </try> 
    <success></success> 
    <attributes>[]</attributes> 
</param> 

Backtrace

<param> 
    <try>WELL name3 PROD OIL </try> 

Program received signal SIGSEGV, Segmentation fault. 
0x00007ffff64db290 in boost::function4<bool, char*&, char* const&, boost::spirit::context<boost::fusion::cons<std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, boost::fusion::nil>, boost::fusion::vector0<void> >&, boost::spirit::unused_type const&>::operator() (this= 
    0x7fffffffd700, [email protected], [email protected], a2=..., a3=...) 
    at /opt/libs/boost/boost/function/function_template.hpp:1013 
1013     (this->functor BOOST_FUNCTION_COMMA BOOST_FUNCTION_ARGS); 
+0

這裏有點難以看到這裏發生了什麼 - 你能提供更多的代碼 - 最好是一個小的可編譯的測試用例嗎? – phooji 2011-03-18 18:36:39

+0

是的,請提供一個我們可以嘗試的最小但完整的代碼。例如,param如何定義? – hkaiser 2011-03-18 20:42:04

+0

對不起,延遲迴答。示例代碼 - https://gist.github.com/877743。 – W55tKQbuRu28Q4xv 2011-03-19 19:43:25

回答

2

問題是,您在堆棧上定義了規則str(作爲構造函數中的局部變量)。當您的語法的構造函數退出時,此變量超出範圍,使param規則帶有一個懸掛引用。如果您將str作爲語法的成員變量,則所有操作都按預期工作。

此外,您似乎想要跳過輸入元素之間的空格。我建議看看phrase_parse API以及如何使用skippers。

+0

哦,我的錯!它的工作原理,謝謝!現在我嘗試用lex來標記輸入:) – W55tKQbuRu28Q4xv 2011-03-20 05:52:59

+0

hkaiser射門,他得分! :) – phooji 2011-03-20 17:34:25

相關問題