2013-02-21 4 views
5

私はブーストスピリットフレームワークを使用して独自の文法を定義しようとしていると私は、このようなマッチングルールを定義しています - some_func - その部分に渡し、一致する文字列全体をパラメータとして渡します。しかし、残念ながら私はvector<boost::variant<boost::fusion::vector2 ..a lot of stuff...)...>のようなものを得るでしょう。どういうわけか、char *、std :: string、またはvoid *のサイズでデータ全体を取得できますか? qi::as_stringブーストスピリット文字列として全試合を取得

+0

? –

+0

私はそれを >>>と記述しますが、それはseheによって編集されました。 – Dejwi

答えて

8

ルック:デモプログラムの

出力:

DEBUG: 'some\\"quoted\\"string.' 
parse success 

正直に言うと、あなたが本当に可能なエスケープ文字と「逐語的に」文字列を解析しようとしているように、それが見えます。その点に関しては、lexemeの使用は間違っているように見えます(スペースは食べられます)。エスケープされた文字列解析のサンプルを表示するには、

私は、少なくとも、作ることができると考え、単純な再配置次のようになります。

0しかし、あなたは、単にスキッパーせずにルールを宣言し、alltogether lexemeをドロップすることができることを

注:http://liveworkspace.org/code/1oEhei$0

ベクトルと何が間違っているコード(liveworkspaceに住んでいる)

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

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

struct some_func_t 
{ 
    template <typename> struct result { typedef void type; }; 
    template <typename T> 
     void operator()(T const& s) const 
     { 
      std::cout << "DEBUG: '" << s << "'\n"; 
     } 
}; 

template <typename It, typename Skipper = qi::space_type> 
    struct parser : qi::grammar<It, Skipper> 
{ 
    parser() : parser::base_type(value) 
    { 
     using namespace qi; 
     // using phx::bind; using phx::ref; using phx::val; 

     value = (
       char_('"') >> 
        qi::as_string 
        [ 
         (*qi::lexeme[ 
          char_('\\') >> char_('\\') | 
          char_('\\') >> char_('"') | 
          graph - char_('"') | 
          char_(' ') 
          ]) 
        ] [some_func(_1)] >> 
       char_('"') 
      ); 
     BOOST_SPIRIT_DEBUG_NODE(value); 
    } 

    private: 
    qi::rule<It, Skipper> value; 
    phx::function<some_func_t> some_func; 
}; 

bool doParse(const std::string& input) 
{ 
    typedef std::string::const_iterator It; 
    auto f(begin(input)), l(end(input)); 

    parser<It, qi::space_type> p; 

    try 
    { 
     bool ok = qi::phrase_parse(f,l,p,qi::space); 
     if (ok) 
     { 
      std::cout << "parse success\n"; 
     } 
     else  std::cerr << "parse failed: '" << std::string(f,l) << "'\n"; 

     if (f!=l) std::cerr << "trailing unparsed: '" << std::string(f,l) << "'\n"; 
     return ok; 
    } catch(const qi::expectation_failure<It>& e) 
    { 
     std::string frag(e.first, e.last); 
     std::cerr << e.what() << "'" << frag << "'\n"; 
    } 

    return false; 
} 

int main() 
{ 
    bool ok = doParse("\"some \\\"quoted\\\" string.\""); 
    return ok? 0 : 255; 
} 
+1

+1私は以前の 'as_string'で答えようとしていましたが、私の人生ではドキュメントの中で見つけることができませんでした - 'パーサーディレクティブ'、そうです! – ildjarn

+0

'lexeme'の使い方には何が必要かを具体的に説明しました。 – sehe

関連する問題