使用* y alnum精神定义语法时出错

时间:2014-01-30 18:27:09

标签: boost-spirit-qi

我有以下语法,当我编译时,我有很多错误。

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

namespace qi = boost::spirit::qi;

template <typename It>
struct parser : qi::grammar<It, std::string()>
{
   parser() : parser::base_type(E)
   {
      using namespace qi;
      E = F >> E1;
      E1 = *( '+' >> F  | '-' >> F );
      F = ('(' >> E >> ')') | P | alnum;
      P = '@' >> +(~ char_('@') - V) >> V;
      V = string(".pv@") | string(".cv@");
   }

private:
   qi::rule<It, std::string()> E, E1, F, P, V;
};
你能告诉我我错了吗? 我知道错误与* y alnum有关,但我不知道为什么?

1 个答案:

答案 0 :(得分:0)

提供的代码没有编译问题。

我可以想象你以微妙的方式称呼它

  • 如果您使用qi::phrase_parse,您的语法/规则将需要接受/指定相同的队长
  • first迭代器需要作为大多数qi::parse_ *来电的参考
  • 如果第一个迭代器是const_iterator,则第二个迭代器必须是相同类型才能工作
#include <boost/spirit/include/qi.hpp>

namespace qi = boost::spirit::qi;

template <typename It>
struct parser : qi::grammar<It, std::string()>
{
   parser() : parser::base_type(E)
   {
      using namespace qi;
      E = F >> E1;
      E1 = *( '+' >> F  | '-' >> F );
      F = ('(' >> E >> ')') | P | alnum;
      P = '@' >> +(~ char_('@') - V) >> V;
      V = string(".pv@") | string(".cv@");
   }

private:
   qi::rule<It, std::string()> E, E1, F, P, V;
};

int main()
{
    std::string const input("123");

    typedef std::string::const_iterator It;
    It f(input.begin()), l(input.end());
    std::string output;
    bool ok = qi::parse(f,l,parser<It>(),output);
    if (ok)
        std::cout << "Output: '" << output << "'\n";
}

查看 Live On Coliru