boost :: spirit char / string mix - PullRequest
       23

boost :: spirit char / string mix

1 голос
/ 16 августа 2011

Я пытаюсь разобраться с использованием boost :: spirit для разбора токенов персонажа, и у меня большие трудности.Вот пример кода, над которым я работаю:

#include <boost/spirit/include/qi.hpp>
#include <iostream>
#include <string>

using namespace std;
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;

template <typename Iterator>
struct tok_parser : qi::grammar<Iterator, string(), ascii::space_type>
{
  tok_parser() : tok_parser::base_type(start)
  {
    tok1   = qi::char_("AB");
    tok2   = qi::char_("12");
    mytoks = (qi::lit("A1") | qi::lit("A2") | qi::lit("B1") | qi::lit("B2"));
    start  = mytoks;
    //start  = tok1 >> tok2;  // error 1
    //start  = +mytoks;       // error 2
  }
  qi::rule<Iterator, string(), ascii::space_type> start;
  qi::rule<Iterator, string(), ascii::space_type> mytoks;
  qi::rule<Iterator, char, ascii::space_type> tok1;
  qi::rule<Iterator, char, ascii::space_type> tok2;
};

int main(int argc, char** argv)
{
  tok_parser<string::const_iterator> g; // Our grammar
  string str = argv[1];
  string::const_iterator iter = str.begin();
  string::const_iterator end = str.end();
  bool r = phrase_parse(iter, end, g, boost::spirit::ascii::space, str);

  if (r && iter == end)
      cout << "Parsing succeeded\n";
  else
      cout << "Parsing failed\n";

  return 0;
}

ОШИБКА 1:

Я хотел бы создать два правила токена, которые позволят мне проанализировать все A1, A2, B1, B2 вместо того, чтобы перечислять все буквенные перестановки.Как и код, он компилирует и распознает целевые токены.Но если я попытаюсь собрать свой парсер из правил tok1 и tok2, он не скомпилирует ошибку, связанную с несовпадением типов:

error: invalid static_cast from type âboost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::ascii> >â to type âcharâ

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

ОШИБКА 2:

Кроме того, я хотел бы разрешить, к сожалению, анализировать произвольное количество токенов, к сожалению,предварительное добавление с оператором + также не работает должным образом.

Любые советы?

1 Ответ

3 голосов
/ 16 августа 2011

Для правил атрибут всегда нужно указывать с использованием синтаксиса объявления функции:

qi::rule<Iterator, char(), ascii::space_type> tok1;  
qi::rule<Iterator, char(), ascii::space_type> tok2;

, который должен решить проблемы вашего компилятора.

По поводу вашей проблемы перестановки: я бы предложилсделайте что-то вроде:

rule<Iterator, string(), ascii::space_type> r = char_("AB") >> char_("12");

, что будет соответствовать 'A1', 'A2', 'B1' или 'B2'.

Создание другого правила допускает необходимое повторение:

rule<Iterator, vector<string>(), ascii::space_type> rs = +r;
...