3

当我尝试对 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;
}

此代码中断:错误:无法转换const boost::spirit::file_iterator<char_t, boost::spirit::fileiter_impl::mmap_file_iterator<char_t> >const char*参数传递

4

4 回答 4

3

很难从发布的代码中分辨出来,因为它包含一些基本错误。更正这些后,它可以在我的机器上正常编译(使用 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;
}
于 2009-02-09T21:35:06.560 回答
0

这是让 char * 指向与迭代器相同的元素的一种方法:

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

我不确定你是如何编译它的:

vector<char> v;
v.push_back("3.2");
于 2009-02-09T20:32:16.850 回答
0

编译错误不在提供的示例中。在上面的语法中我没有语义动作,而在我简化的代码中我做了。

这些操作的回调使用 char* 而不是我使用的迭代器类型。

于 2009-02-09T21:50:44.917 回答
0

您可以尝试确保您的语义操作在参数类型上是多态的。正是在代码中你想要这样的东西:

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()]
于 2009-02-10T22:51:39.527 回答