2016-07-22 2 views
2

Я пытаюсь разобрать строку в структуры, используя подталкивание дух x3:Синтаксический список строк с последующим списком строк с духом x3

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 % ".") потребляет всю строку. Как я могу изменить правило для правильного анализа в структуре?

ответ

3

id_string Предполагается, что ваш что-то вроде этого:

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), то есть она всегда потребляет один pпосле разделитель. Однако то, что вы хотите, это *(p >> delimit), так что после разделителя не остается p и вместо этого остается для следующего правила.

Смежные вопросы