2011-11-02 99 views
0

我是新來的boost :: spirit。我偶然發現了一件簡單的事情。給定一個字符串,像這樣:boost :: spirit :: qi - 可選匹配

Optional text KEYWORD further text 

我需要將它解析爲一個像這樣的字符串:

T KEYWORD further text 

其中「T」纔出現可選的文本存在。我得到的是這個規則:

start = (+(char_ - "KEYWORD")) [_val += 'T'] | eps 
     >> "KEYWORD"   [_val += _1] 
     >> *char_    [_val += _1]; 

但它失敗。有誰能幫助我嗎?

+0

它失敗。怎麼樣?什麼? – sehe

+0

謝謝,sehe。精神在我看來有點棘手。 –

+0

是的,我知道你的意思。這對我來說是值得的,但如果你正在尋找更簡單的東西來獲得正確的(並且更快的編譯),我衷心推薦['CoCo/R C++'](http://ssw.jku.at/coco/# CPP),我在Spirit之前使用了我所有的解析需求。它具有能夠以多種語言(C#,Java,C++,C#,VB,Oberon,Ruby,Python,Oberon,Ada等)重用現有語法的顯着優勢。 – sehe

回答

3

它很大程度上取決於您指定屬性的目標類型,以及(在較小程度上)空白策略是什麼,即語法是否使用船長。

現在,這裏就是我會寫:

#include <boost/spirit/include/qi.hpp> 

namespace qi = boost::spirit::qi; 

template <typename V> 
    void test(const V& input) 
{ 
    typedef typename V::const_iterator It; 

    using namespace qi; 
    rule<It, bool(), space_type>  preambule = +(!lit("KEYWORD") > omit[char_]) > attr(true) | attr(false); 
    rule<It, std::string(), space_type> word  = +char_; 

    It first(input.begin()), last(input.end()); 

    bool hasPreamble; 
    std::string furtherText; 

    bool ok = phrase_parse(first, last, 
      preambule > "KEYWORD" > raw[ *char_ ], space, 
      hasPreamble, furtherText); 

    if (ok) 
     std::cout << (hasPreamble?"T ":"") << "KEYWORD " << furtherText << std::endl; 

    if (first!=last) 
     std::cout << "hmmm: '" << std::string(first, last) << "'" << std::endl; 
} 

int main() 
{ 
    test(std::string("KEYWORD further text")); 
    test(std::string("one KEYWORD further text")); 
    test(std::string("one two KEYWORD further text")); 
} 

輸出繼電器:

KEYWORD further text 
T KEYWORD further text 
T KEYWORD further text 
相關問題