2012-05-13 80 views
1

我試圖解析測試結果的日誌文件具有以下語法填充矢量 升壓精神繼承字符串屬性在ASCII字符

template<typename Iterator> 
struct test_step_parse: qi::grammar<Iterator, TestResults(), ascii::space_type> { 
test_step_parse() : test_step_parse::base_type(rqmts) { 
    using qi::lit; 
    using qi::lexeme; 
    using qi::omit; 
    using qi::int_; 
    using qi::eol; 
    using qi::char_; 

    test_step = lit("Test Step No.") >> int_; 

    pass_or_fail = lit("-") >> (string("Passed") | string("Failed")); 

    fdor_rqmts = -lit("OID") 
       >> lit("FDOR") 
       >> -lit("OID") 
       >> int_ 
       >> *(-omit[char_(",/\\")] >> -(lit("FDOR")^lit("OID")) >> int_) 
       ; 

    sard_rqmts = -lit("OID") 
       >> lit("SARD") 
       >> -lit("OID") 
       >> int_ 
       >> *(-omit[char_(",/\\")] >> -(lit("SARD")^-lit("OID")) >> int_) 
         ; 

    comment = lit("Comment:") >> lexeme[*(char_ - eol)] ; 

    rqmts = test_step 
      >> pass_or_fail 
      >> omit[*(char_ - lit("REQUIREMENT VERIFIED:"))] 
      >> lit("REQUIREMENT VERIFIED:") 
      >> (fdor_rqmts^sard_rqmts) 
      >> omit[+char_("=")] 
      >> -comment 
      ; 

    BOOST_SPIRIT_DEBUG_NODE(test_step); 
    BOOST_SPIRIT_DEBUG_NODE(pass_or_fail); 
    BOOST_SPIRIT_DEBUG_NODE(fdor_rqmts); 
    BOOST_SPIRIT_DEBUG_NODE(sard_rqmts); 
    BOOST_SPIRIT_DEBUG_NODE(comment); 
    BOOST_SPIRIT_DEBUG_NODE(rqmts); 
} 

qi::rule<Iterator, TestResults(), ascii::space_type> rqmts; 
qi::rule<Iterator, int(), ascii::space_type> test_step; 
qi::rule<Iterator, std::string(), ascii::space_type> pass_or_fail; 
qi::rule<Iterator, std::string(), ascii::space_type> comment; 
qi::rule<Iterator, std::vector<int>(), ascii::space_type> fdor_rqmts; 
qi::rule<Iterator, std::vector<int>(), ascii::space_type> sard_rqmts; 

}; 

語法解析成功。然而,試圖自動填充我的用戶自定義的結構,類型的std :: string的規則「評論」的屬性時,被傳遞到載體爲ASCII符號。

這是我的用戶自定義的結構:

struct TestResults { 
    int test_step_no; 
    std::string pass_or_fail; 
    std::vector<int> FDOR; 
    std::vector<int> SARD; 
    std::string comment; 
}; 

BOOST_FUSION_ADAPT_STRUCT(
    atp::TestResults, 
    (int, test_step_no) 
    (std::string, pass_or_fail) 
    (std::vector<int>, FDOR) 
    (std::vector<int>, SARD) 
    (std::string, comment) 
) 

調試出認沽表明規則暴露了正確的類型,但不知何故,他們沒有得到放置在正確的結構。

任何想法我做錯了什麼?對不起,術語等

使用gcc 4.6.3的任何濫用和提高1-47。謝謝。

更新:爲了澄清,所以我期待解析如下:

std::string test_test = 
"Test Step No. 953-Failed\n" 
"==============================================================================\n" 
"STEP 7.7:\n" 
"Test step, etc.\n" 
"===============================================================================\n" 
"REQUIREMENT VERIFIED: FDOR 12345" 
"      SARD 12345, 12356\n" 
"===============================================================================\n" 
"Comment: Didn't work.\n" 
; 

使用調試器,似乎所有的規則都正確暴露自己的屬性:

<rqmts> 
    <try>Test Step No. 953-Fa</try> 
    <test_step> 
    <try>Test Step No. 953-Fa</try> 
    <success>-Failed\n============</success> 
    <attributes>[953]</attributes> 
    </test_step> 
    <pass_or_fail> 
    <try>-Failed\n============</try> 
    <success>\n===================</success> 
     <attributes>[[F, a, i, l, e, d]]</attributes> 
     </pass_or_fail> 
    <fdor_rqmts> 
    <try> FDOR 12345   </try> 
     <success>     </success> 
     <attributes>[[12345]]</attributes> 
    </fdor_rqmts> 
    <sard_rqmts> 
     <try>     </try> 
     <success>\n===================</success> 
     <attributes>[[12345, 12356]]</attributes> 
    </sard_rqmts> 
    <comment> 
     <try>Comment: Didn't work</try> 
     <success>\n</success> 
     <attributes>[[D, i, d, n, ', t, , w, o, r, k, .]]</attributes> 
    </comment> 
    <success>\n</success> 
     <attributes>[[953, [F, a, i, l, e, d], [12345], [68, 105, 100, 110, 39, 116, 32, 119, 111, 114, 107, 46], []]]</attributes> 
</rqmts> 

所以,一切似乎不同之處在於「評論」屬性(的std :: string)是工作被塞入在「SARD」屬性(矢量),作爲ASCII數字的載體,即,

[68, 105, 100, 110, 39, 116, 32, 119, 111, 114, 107, 46] = "Didn't work." 
+0

你能舉一個例子,說明你在字符串中得到了什麼,以及你期望的是什麼? – Zero

+0

上面提供的澄清。 – j0nnyf1ve

回答

2

問題是分析器(A^B)返回一個類型,它是A類型和B類型的元組,即在您的情況下,即(fdor_rqmts^sard_rqmts)返回類型boost::tuple<std::vector<int>, std::vector<int> >。的解析器如何結合

詳細信息可在Boost documentation找到。

所以,你必須修改您struct適合解析器將返回類型的選擇(這是一個屬性語法的唯一選擇)

struct TestResults { 
    int test_step_no; 
    std::string pass_or_fail; 
    boost::tuple<std::vector<int>, std::vector<int> > FdorOrSard; 
    std::string comment; 
}; 

或指定動作。然後你的語法會成爲類似:

struct TestResults { 
    int test_step_no; 
    std::string pass_or_fail; 
    std::vector<int> FDOR; 
    std::vector<int> SARD; 
    std::string comment; 
}; 

test_step [ at<0>(_val) = _1] 
>> pass_or_fail [ at<1>(_val) = _1 ] 
>> omit[*(char_ - lit("REQUIREMENT VERIFIED:"))] 
>> lit("REQUIREMENT VERIFIED:") 
>> (fdor_rqmts [at<2>(_val) = _1 ]^sard_rqmts [at<3>(_val) = _1]) 
>> omit[+char_("=")] 
>> -comment [at<4>(_val) = _1]; 

的行動仍依賴於具有調整結構,但現在他們清楚地描述如何將解析結果。請注意我們正在做什麼用(A^B)的結果,而不是我們在做與A結果或B結果的東西。

作爲一個方面說明,我碰到的混合>>>其中spirit決定窩在搞笑方面的成果的問題 - 個人而言,我發現它幾乎是不可能的事實是什麼結構確定後返回了,所以我傾向於當我無法獲得基於屬性的語法時,堅持使用動作。有沒有在這個問題上這樣的事情更多的信息:boost::spirit::qi Expectation Parser and parser grouping unexpected behaviour

編輯:我假設你知道行動是如何工作的,以及包括使用你需要聲明。第一對精靈解析器教程對此很有幫助,否則回答任何問題!您可能還必須使用at_c而不是at - 我真的永遠無法弄清楚鳳凰/功能提升的細節......

+0

謝謝!這現在有道理......我是新手。我無法讓元組正常工作(即使我這樣做,是否會保證始終填充正確的元素?),但我會嘗試語義操作。再次感謝。 – j0nnyf1ve