2016-05-31 10 views
1

boost.spiritパーサーを使用して解析する方法を学習しようとしています。私はVisualStudio 2015でWindows 8.1を使用しています。boost.spiritインストールドキュメントからテストプログラムをコンパイルしてインストールしました。boost.spirit.parserを使用しているときにコンパイルエラーを解読できません

私はpaserの使用についてboost.orgのチュートリアルに従っています。

'bool boost::function4<R,T0,T1,T2,T3>::operator()(T0,T1,T2,T3) const': cannot convert argument 4 from 'const boost::spirit::unused_type' to 'const boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space,boost::spirit::char_encoding::ascii>> ' 

すべてのヘルプは大歓迎されます:私はrule.hppライン304から次のエラーメッセージを取得するコンパイルすると

#include <boost/config/warning_disable.hpp> 
    #include <boost/spirit/include/qi.hpp> 
    #include <boost/spirit/include/phoenix_core.hpp> 
    #include <boost/spirit/include/phoenix_operator.hpp> 
    #include <boost/spirit/include/phoenix_object.hpp> 

    namespace qi = boost::spirit::qi; 
    namespace ascii = boost::spirit::ascii; 

    template <typename Iterator> 
    bool myParser(Iterator first, Iterator last) { 
     using qi::double_; 
     qi::rule<Iterator, double(), ascii::space_type> myrule; 
     myrule %= double_; 
     bool r = parse(first, last, myrule, ascii::space); 
     return r; 
    } 
    int main() { 
     std::string dstr = std::string("2.1"); 
     bool r = myParser(dstr.begin(), dstr.end()); 
     return 0; 
    } 

:私はダブルを解析するために、次のコードを作成しました。ありがとう

+2

'myrule%= double_;' :-D ...私は、標準のC++ライブラリ(そうではない)にそれを作るのを待つことができません。 – 6502

+2

@ 6502なぜそれが起こるのでしょうか(また、EDSL構文の選択にはほとんど間違いがありません。%% 'は風変わりですが、そのセマンティクスはありません;ここでそれを使用する理由はありません) – sehe

答えて

2

リンクのjv_に記載されているように、スキッパーを使用していますが、スキッパーを受け入れるphrase_parse APIは呼び出していません。したがって、parse呼び出しは、ascii::spaceパーサーを最初に公開された属性(double)にバインドしようとします。

割り当てが失敗します。

は、すべての可能性では、この単純な文法のためのスキッパーをしたくない、と私は書きたい:

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

template <typename Iterator> bool myParser(Iterator first, Iterator last) { 
    namespace qi = boost::spirit::qi; 
    return qi::parse(first, last, qi::double_ >> qi::eoi); 
} 

int main() { 
    std::string const dstr("2.1"); 
    bool r = myParser(dstr.begin(), dstr.end()); 
    return r?0:1; 
} 

注入力の全てが消費されたことを確認しqi::eol

+0

リライト。それは二重解析のための残虐でしたが、私はより複雑なニーズがあり、エラーの後にエラーに行きたいと思っていました。私は今セマンティックなアクションを付けて問題を抱えていますが、私は助けを求める前に自分でいくつかのデバッグをしています。 – cmoulikus

関連する問題