2015-04-27 2 views
4

Я пытаюсь разобрать объект, где порядок атрибутов не имеет значения.Операторы списка ключевых слов в Boost

Например, синтаксический анализ сотруднику

работника {фамилия = "Doe", ПгвЬЫат = "Джон", возраст = 30}

должен быть таким же, как

сотрудник {age = 30, firstname = "john", фамилия = "doe"}

Так в идеале мое правило должно быть что-то вроде (не против отсутствия формального определения)

unordered_rule %= lit("employee") >> "{" 
      >> kwd("surname")["=" > quoted_string] 
      /kwd("age")["=" > int_] 
      /kwd("firstname")["=" > quoted_string] 
      /kwd("age")["=" > int] >> "}"; 

Но, во-первых, как я включаю разделительные запятые в правило синтаксического анализа? И для моей структуры C++ struct employee { std::string firstname; ... int age; }, имеет ли порядок атрибутов или как повысить значение, какое ключевое слово соответствует тому атрибуту, даже после того, как структура была преобразована в вектор слияния?

Это действительно не подходит для меня даже после прочтения документации по операторам списка ключевых слов.

ответ

1

Заказываются последовательности Fusion. Таким образом, порядок, в котором синтезируются атрибуты, должен соответствовать порядку, в котором поля были адаптированы к последовательности слияния.

Я не знаю элегантный способ включения разделителей (я думаю, кто-то должен расширить директиву парсера списка ключевых слов для этого ... Не стесняйтесь :)).

Вы можете использовать сочетание пропускания, например. (qi::space | ',') и qi::lexeme[] вокруг соответствующих предметов (см. Boost spirit skipper issues).

Или вы можете использовать опережения-утверждал, повторяющееся выражение как

unordered_rule %= lit("employee") >> "{" 
     >> (kwd("surname") >> (&lit('}') | ',')) [ "=" > quoted_string ] 
     /kwd("age")  >> (&lit('}') | ',')) [ "=" > int_ ] 
     /kwd("firstname") >> (&lit('}') | ',')) [ "=" > quoted_string ] 
     /kwd("age")  >> (&lit('}') | ',')) [ "=" > int ] 
     >> "}"; 

(не проверено на данный момент).

+0

Так можно ли использовать синтаксический анализ неупорядоченного текста, например моего примера, в последовательность слияния? Или я должен сделать это по-другому? – mercurial

+0

Huh. Я не думаю, что упоминал о каких-либо ограничениях. Я просто ответил на ваш вопрос и показал способ разбора разграничения. – sehe

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