2012-07-19 59 views
5

大家好,我是新來提升和提高精神,所以我很抱歉noob問題。Boost :: Spirit結果的短語_parse

當我使用qi::phrase_parse函數時,該函數僅返回bool變量,該變量指示解析是否成功,但我不知道在哪裏可以找到解析的結果......某種語法樹等。

如果我使用宏#define BOOST_SPIRIT_DEBUG樹的XML表示打印在標準輸出上,但這些節點必須存儲在某處。你能幫我嗎?

+1

如果沒有代碼示例這是相當難回答你的問題 – sehe 2012-07-19 11:43:19

+0

我不認爲任何精神問題一個noob問題。 – Spacemoose 2015-06-28 15:24:44

回答

8

您可以'綁定'屬性引用。 qi::parseqi::phrase_parse(和相關的)接受將用於接收暴露屬性的可變參數。

一個簡單的例子是:(EDIT包括一個utree例如太)

#include <boost/fusion/adapted.hpp> 
#include <boost/spirit/include/qi.hpp> 
#include <boost/spirit/include/support_utree.hpp> 

namespace qi = boost::spirit::qi; 

int main() 
{ 
    using namespace qi; 

    std::string input("1 2 3 4 5"); 
    std::string::const_iterator F(input.begin()), f(F), l(input.end()); 

    std::vector<int> ints; 
    if (qi::phrase_parse(f = F, l, *qi::int_, qi::space, ints)) 
     std::cout << ints.size() << " ints parsed\n"; 

    int i; 
    std::string s; 
    // it is variadic: 
    if (qi::parse(f = F, l, "1 2 " >> qi::int_ >> +qi::char_, i, s)) 
     std::cout << "i: " << i << ", s: " << s << '\n'; 

    std::pair<int, std::string> data; 
    // any compatible sequence can be used: 
    if (qi::parse(f = F, l, "1 2 " >> qi::int_ >> +qi::char_, data)) 
     std::cout << "first: " << data.first << ", second: " << data.second << '\n'; 

    // using utree: 
    boost::spirit::utree tree; 
    if (qi::parse(f = F, l, "1 2 " >> qi::int_ >> qi::as_string [ +qi::char_ ], tree)) 
     std::cout << "tree: " << tree << '\n'; 

} 

輸出:

5 ints parsed 
i: 3, s: 4 5 
first: 3, second: 4 5 
tree: (3 " 4 5") 

與像數據結構 'AST' 解析器的幾個樣品:

如果你想有一個非常通用的AST結構,看utreehttp://www.boost.org/doc/libs/1_50_0/libs/spirit/doc/html/spirit/support/utree.html

+1

添加了帶有適當AST的示例解析器的鏈接。 **編輯**也包括了一個例子 – sehe 2012-07-19 12:17:44

相關問題