2016-07-22 8 views
2

で文字列のリストが続く文字列のリストの解析:私はブーストスピリット×3を使用して、構造体の中に文字列を解析しようとしている精神×3

struct identifier { 
    std::vector<std::string> namespaces; 
    std::vector<std::string> classes; 
    std::string identifier; 

}; 

は今私のような文字列に一致するようにパーサー規則を持っていますこれは:

foo::bar::baz.bla.blub 
foo.bar 
boo::bar 
foo 

私のパーサーのルールはこのようになります。

auto const nested_identifier_def = 
     x3::lexeme[ 
       -(id_string % "::") 
       >> -(id_string % ".") 
       >> id_string 
     ]; 

ここで、id_stringは、alphanumの組み合わせを解析します。 このルールは、私がそれを必要とするように解析しないことを知っています。例えば、foo.barの解析中に、この部分のルール-(id_string % ".")が文字列全体を消費するためです。 構造体で正しく解析するためにルールを変更するにはどうすればよいですか?あなたのid_stringを想定し

答えて

3

はこのようなものです:

auto const id_string = x3::rule<struct id_string_tag, std::string>{} = 
    x3::lexeme[ 
      (x3::alpha | '_') 
     >> *(x3::alnum | '_') 
    ]; 

その後、私は、これはあなたが後にしているものだと思う:

auto const nested_identifier_def = 
     *(id_string >> "::") 
    >> *(id_string >> '.') 
    >> id_string; 

Online Demo

問題がp % delimitがあるということですp >> *(delimit >> p)の省略形です。つまり、常に1つを消費します。pの後に区切り記号。しかし、あなたが望むのは*(p >> delimit)なので、pがデリミタの後に消費されず、代わりに次のルールのために残されます。

関連する問題