Пример простой грамматики Boost :: Spirit

Я просматриваю руководства Boost Spirit (и Boost Fusion) (версия 1.48.0) . Я играл с примером игрушечного сотрудника. Ссылка на источник находится здесь:

http://www.boost.org/doc/libs/1_48_0/libs/spirit/example/qi/employee.cpp

Вот грамматика примера:

employee_parser() : employee_parser::base_type(start)
    {
        using qi::int_;
        using qi::lit;
        using qi::double_;
        using qi::lexeme;
        using ascii::char_;

        quoted_string %= lexeme['"' >> +(char_ - '"') >> '"'];

        start %=
            lit("employee")
            >> '{'
            >>  int_ >> ','
            >>  quoted_string >> ','
            >>  quoted_string >> ','
            >>  double_
            >>  '}'
            ;
    }

    qi::rule quoted_string;
    qi::rule start;

И мои модификации удаляют обработку кавычек и просто анализируют любой символ между разделителем и назначают его структуре, на которую сопоставлен синтаксический анализатор.

        //quoted_string %= lexeme['"' >> +(char_ - '"') >> '"'];
        start %=
            lit("employee")
            >> '{'
            >>  int_ >> ','
            >>  +(char_) >> ','
            >>  +(char_) >> ','
            >>  double_
            >>  '}'
            ;

Я предполагаю, что char_ включает все символы, пока не будет достигнута запятая. Однако компиляция и выполнение со следующей строкой возвращает ошибку при синтаксическом анализе.

./employee
employee{10,my,name,20.0}
-------------------------
Parsing failed
-------------------------

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

Спасибо!

6
задан Paul Rigor 22 February 2014 в 18:14
поделиться