2013-01-16 22 views
1

我有以下代碼(floatDecs和intDecs是符號解析器):空間跳躍不工作的精神,氣

// Definition of the value parser: 
typedef boost::variant<double,int64_t> value_type; 
typedef boost::fusion::vector<std::string, value_type> dec_type; 
rule<std::string::const_iterator, boost::variant<double,int64_t>(std::string)> value; 
value = real_parser<double, strict_real_policies<double>>() [ boost::phoenix::bind(boost::lambda::unlambda(floatDecs.add), _r1, _1) ] | 
      int_parser<int64_t, 10>()       [ boost::phoenix::bind(boost::lambda::unlambda(intDecs.add), _r1, _1) ]; 

rule<std::string::const_iterator, std::string()> ident; 
ident %= lexeme[ alpha >> *alnum ]; 

rule<std::string::const_iterator, dec_type(), boost::spirit::qi::locals<std::string>, space_type> dec; 
ident %= ident [_a = _1] >> lit('=') >> value(_a); 

boost::spirit::qi::phrase_parse(testing.cbegin(), testing.cend(), dec, space); 

的問題:它僅適用,當我在每個規則中刪除空間類型和更換最後一行

boost::spirit::qi::parse(testing.cbegin(), testing.cend(), dec); 
+0

你試圖解析什麼輸入?如果「不起作用」是什麼意思?出於好奇, – sehe

+0

,答案如何幫助?我想知道。此外,它可能會幫助您在將來寫出更好的問題。謝謝 – sehe

+0

我只是把兩個資源(他的和我的)都拿來比較,看看我做錯了什麼,因爲他的代碼正在工作。他幫我看看,我的代碼有什麼問題,所以我將他的答案標記爲有用。 – user1861174

回答

1

我不清楚你問的是什麼問題。無論如何,這裏是一個版本,修復了一些問題與您發佈的代碼,並顯示出分析與船長工程確定:

觀摩上http://liveworkspace.org/code/6GVK4$0

輸出

phrase_parse: true 
allo1 = 213.13f 

代碼

#include <boost/fusion/adapted.hpp> 
#include <boost/optional.hpp> 
#include <boost/variant.hpp> 
#include <boost/lambda/lambda.hpp> 
#include <boost/spirit/include/qi.hpp> 
#include <boost/spirit/include/karma.hpp> 
#include <boost/spirit/include/phoenix.hpp> 

namespace qi = boost::spirit::qi; 
namespace karma = boost::spirit::karma; 
namespace phx = boost::phoenix; 

int main() 
{ 
    typedef std::string::const_iterator It; 
    typedef boost::variant<double,int64_t> value_type; 
    typedef std::pair<std::string, value_type> dec_type; 

    qi::rule<It, value_type(std::string)> value = 
     qi::real_parser<double, qi::strict_real_policies<double>>() /*[ phx::bind(boost::lambda::unlambda(floatDecs.add), qi::_r1, qi::_1) ]*/ | 
     qi::int_parser<int64_t, 10>()        /*[ phx::bind(boost::lambda::unlambda(intDecs.add), qi::_r1, qi::_1) ]*/; 

    qi::rule<It, std::string()> ident = qi::lexeme[ qi::alpha >> *qi::alnum ]; 

    qi::rule<It, dec_type(), qi::space_type, qi::locals<std::string> > declaration; 
    declaration %= ident [qi::_a = qi::_1] >> '=' >> value(qi::_a); 

    std::string testing("allo1 = 213.13"); 
    dec_type parsed; 
    bool ok = qi::phrase_parse(testing.cbegin(), testing.cend(), declaration, qi::space, parsed); 
    std::cout << "phrase_parse: " << std::boolalpha << ok << "\n"; 

    using namespace karma; 
    std::cout << format(auto_ << " = " << (double_ << 'f' | int_) << eol, parsed); 
}