簡體   English   中英

升壓::精神::氣

[英]boost::spirit::qi

請考慮以下代碼:(Boost.Spirit 2.5.1)

qi::parse(str.begin(), str.end(), (+qi::alpha)[[](const string& s){cout << s<< '\n';}]
                                    >> (*(qi::char_(',') | qi::char_('\'')))
                                    >> qi::uint_[[](int integer){cout << integer << '\n';}]);

[[](int integer){cout << integer << '\\n';}]有效,但+qi::alpha的類似代碼沒有。

我該如何更正代碼?

Boost Spirit 1尚不支持C ++ 0x / C ++ 11 lambdas 編輯顯然支持改進(我今天早些時候使用較舊的boost版本進行了測試)。 現在使用Boost 1_48和g ++ 4.6.1,just_work出現以下內容。 好極了!

qi::as_string[]

我想想知道qi::as_string將暴露的屬性作為std::string而不是默認的std::vector<CharT>

    qi::parse(str.begin(), str.end(),
        qi::as_string [ +qi::alpha ] 
        [
            [](const std::string&){std::cout << s << '\n';}
        ]
        >> (*(qi::char_(',') | qi::char_('\'')))
        >> qi::uint_
        [
            [](int integer){std::cout << integer << '\n';}
        ]);

但在我看來,語法不是很友好。 相反,我更喜歡phoenixV2:

    qi::parse(str.begin(), str.end(),
        qi::as_string [ +qi::alpha ] [ std::cout << _1 << '\n' ]
        >> (*(qi::char_(',') | qi::char_('\'')))
        >> qi::uint_ [ std::cout << _1 << '\n' ]);

這已經短得多,語法也不那么神秘。 看一下

一個有點人為的例子展示了其中的一些實際操作,PLUS將屬性引用直接傳遞給parse函數:

#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <algorithm>
namespace qi = boost::spirit::qi;
namespace phx = boost::phoenix;

bool reverse(std::string& value)
{
    std::reverse(value.begin(), value.end());
    return true; // false makes the parsing fail
}

int main()
{
    std::string str("sometext,123");

    auto f(str.begin()), l(str.end());

    std::string s;
    unsigned int i;

    qi::parse(f,l,
            qi::as_string [ +qi::alpha ] [ reverse ]
            >> qi::omit [ *qi::char_(",\'") ]
            >> qi::uint_,

            s, i);

    std::cout << s << std::endl;
    std::cout << i << std::endl;
}

輸出:

txetemos
123

1 PhoenixV3可能在1_48中有一些支持(未檢查); 你想要的

 #define BOOST_RESULT_OF_USE_DECLTYPE
 #define BOOST_SPIRIT_USE_PHOENIX_V3

參見例如http://boost.2283326.n4.nabble.com/Boost-Spirit-Phoenix-V3-An-Overview-td3583792.html

您的代碼給了我以下編譯器錯誤,跳過一些位

/usr/include/boost/spirit/home/support/action_dispatch.hpp:142:13:
error: no matching function for call to
‘action_dispatch<>::do_call(
    const main()::<lambda(const string&)>&,
    action_dispatch<>::fwd_tag<std::vector<char>>,
...

歸結為傳遞給你的lambda的參數是vector<char> ,而不是string

所以,用vector<char>替換string

(+qi::alpha)[[](const std::vector<char>& s) {
      cout << std::string(s.begin(), s.end()) << '\n';
}]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM