2016-08-21 4 views
0

私の問題は次のとおりです。私は次のようにのように定義されたASTノードがあります。コンテナを使用してastノードに単一の値を解析する

struct foo_node{ 
    std::vector<std::string> value; 
} 

を、私は正常に動作し、構造体に解析するために、このようなパーサ、持っている:

typedef x3::rule<struct foo_node_class, foo_node> foo_node_type; 
const foo_node_type foo_node = "foo_node"; 
auto const foo_node_def = "(" >> +x3::string("bar") >> ")"; 

を今、私はそれを達成したいですパーサーはまた、括弧を使わずに"bar"を解析しますが、その単一のバーのみが解析されます。

auto const foo_node_def = x3::string("bar") 
          | "(" > +x3::string("bar") > ")"; 

をしかしx3::string("bar")std::vector<std::string>文字列を返していないので、これは、私のコンパイル時のエラーを与える:私はこのようにそれを実行しようとしました。 私の質問は、x3::string("bar")パーサ(および文字列を返す他のすべてのパーサ)がベクトルを解析する方法は何ですか?

+1

いつも投稿してください。 a [mcve] –

+0

私は完全に同意しますMCVE/SSCCEの要件。あなたの場合、専門家だけが "推測する"方法を知っているということは、命名の競合や必須のものが不足していた(SPIRIT_DEFINE) – sehe

+0

私は本当に申し訳ありません。 – Exagon

答えて

2

単一の要素を解析し、単一要素のコンテナ属性がx3::repeat(1) [ p ]あるとして、それを公開する方法は:

Live On Coliru

#include <boost/fusion/adapted/struct.hpp> 
#include <boost/spirit/home/x3.hpp> 
#include <iostream> 

namespace x3 = boost::spirit::x3; 

struct foo_node { 
    std::vector<std::string> value; 
}; 

BOOST_FUSION_ADAPT_STRUCT(foo_node, value) 

namespace rules { 
    auto const bar 
     = x3::string("bar"); 

    auto const foo_node 
     = '(' >> +bar >> ')' 
     | x3::repeat(1) [ +bar ] 
     ; 
} 

int main() { 
    for (std::string const input : { 
      "bar", 
      "(bar)", 
      "(barbar)", 
      }) 
    { 
     auto f = input.begin(), l = input.end(); 

     foo_node data; 
     bool ok = x3::parse(f, l, rules::foo_node, data); 

     if (ok) { 
      std::cout << "Parse success: " << data.value.size() << " elements\n"; 
     } else { 
      std::cout << "Parse failed\n"; 
     } 

     if (f != l) 
      std::cout << "Remaining unparsed: '" << std::string(f,l) << "'\n"; 
    } 
} 

プリント

Parse success: 1 elements 
Parse success: 1 elements 
Parse success: 2 elements 
関連する問題