Использование синтаксического анализа итератора с грамматикой Boost :: Spirit - PullRequest
3 голосов
/ 09 февраля 2009

Когда я пытаюсь использовать форму итератора для грамматики Spirit, я получаю аргумент, передающий ошибку преобразования типа итератора в const char * Как мне это исправить?

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

Вот пример кода, демонстрирующего проблему:

#include <boost/spirit/core.hpp>
#include <boost/spirit/iterator/file_iterator.hpp>
#include <vector>
#include <string>
using std;
using boost::spirit;
struct ex : public grammar<route_grammar> {
  template <typename ScannerT> struct defintion {
    definition(ex const& self) {
      expression = real_p; 
    }
    rule<ScannerT> expression;
    rule<ScannerT> const& start() const { return expression; }
};

int main() {
  file_iterator<char> first;
  file_iterator<char> last = first.make_end();
  ex ex_p;
  parse_info<file_iterator<char> > info = parse(first, last, ex_p, space_p);
  return 0;
}

Этот код разбивается на: error: невозможно преобразовать const boost::spirit::file_iterator<char_t, boost::spirit::fileiter_impl::mmap_file_iterator<char_t> > в const char* при передаче аргумента

Ответы [ 4 ]

3 голосов
/ 10 февраля 2009

Трудно отличить код от поста, так как он содержит несколько основных ошибок. После их исправления он прекрасно компилируется на моей машине (с MSVC ++ 7.1):

#include <boost/spirit/core.hpp>
#include <vector>
#include <string>
using namespace std;
using namespace boost::spirit;
struct ex : public grammar<ex> {
template <typename ScannerT> 
struct definition {
    definition(ex const& self)
    {
    expression = real_p; 
    }
    rule<ScannerT> expression;
    rule<ScannerT> const& start() const { return expression; }
};
};

int main() {
vector<char> v;
v.push_back('3'); v.push_back('.'); v.push_back('2');
ex ex_p;
parse_info<vector<char>::iterator> info = parse(v.begin(), v.end(), ex_p, space_p);
return 0;
}
0 голосов
/ 11 февраля 2009

Вы можете убедиться, что ваши семантические действия были полиморфными по типу аргумента. Именно в коде вы хотели бы что-то вроде этого:

struct my_action {
  template <class ParamType>
  void operator()(ParamType const & parameter) const {
    // deal with parameter
  }
};

Вы бы использовали одинарное семантическое действие, как показано ниже:

real_p[my_action()]

Или, если вам нужно двоичное семантическое действие, вы сделаете что-то вроде:

struct binary_action {
  template <class ParamType>
  void operator()(ParamType const & param1, ParamType const & param2) const {
    // deal with either parameter
  }
};

(*char_p)[binary_action()]
0 голосов
/ 10 февраля 2009

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

В обратных вызовах для этих действий использовался символ * вместо типа итератора, который я использовал.

0 голосов
/ 09 февраля 2009

Вот один из способов получить, что char * указывает на те же элементы, что и итераторы:

&v.front() // v.begin()
&v.back() + 1 // v.end()

Я не уверен, как вы получили это для компиляции:

vector<char> v;
v.push_back("3.2");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...