首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >促进精神x3变异体与std::对

促进精神x3变异体与std::对
EN

Stack Overflow用户
提问于 2018-11-26 21:38:43
回答 1查看 495关注 0票数 1

我试着运行一些简单的解析器来解析1,11,3,6-4。基本上,整数列表与范围表示法。

我想把所有的东西放到AST中,而不需要语义操作。所以我使用x3::variant。我的代码“似乎”与表达式示例非常相似。但是,它不能在g++ 6.2下编译。它确实可以用clang++ 6.0编译,但会产生错误的结果。

boost版本为1.63。似乎我有一些‘移动’或初始化问题。

代码语言:javascript
运行
复制
#include <iostream>
#include <list>
#include <vector>
#include <utility> 

#include <boost/spirit/home/x3.hpp>
#include <boost/spirit/home/x3/support/ast/variant.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/fusion/adapted/std_pair.hpp>
#include <boost/fusion/include/io.hpp>

namespace ns
{
  namespace ast
  {
    namespace x3 = boost::spirit::x3;

    // forward definition
    class uintObj;
    struct varVec;

    // define type
    using uintPair_t = std::pair<unsigned int, unsigned int>;
    using uintVec_t = std::vector<uintObj>;

    // general token value:
    class uintObj : public x3::variant <
      unsigned int,
      uintPair_t
      >
    {
     public:
      using base_type::base_type;
      using base_type::operator=;
    };

    struct varVec
    {
      uintVec_t valVector;
    };
  }
}

BOOST_FUSION_ADAPT_STRUCT(
  ns::ast::varVec,
  valVector
  )

namespace ns
{
  namespace parser
  {
    // namespace x3 = boost::spirit::x3;
    // using namespace x3;
    using namespace boost::spirit::x3;

    // definition of the range pair:
    rule<class uintPair, ast::uintPair_t> const uintPair = "uintPair";

    auto const uintPair_def =
      uint_
      >> '-'
      >> uint_
      ;

    rule<class uintObj, ast::uintObj> const uintObj = "uintObj";

    auto const uintObj_def =
      uint_
      | uintPair
      ;

    // define rule definition : rule<ID, attrib>
    // more terse definition :
    // struct varVec_class;
    // using varVec_rule_t = x3::rule<varVec_class, ast::varVec>;
    // varVec_rule_t const varVec = "varVec";
    // varVec is the rule, "varVec" is the string name of the rule.
    rule<class varVec, ast::varVec> const varVec = "varVec";

    auto const varVec_def =
      '['
      >> uintObj % ','
      >> ']'
      ;

    BOOST_SPIRIT_DEFINE(
      varVec,
      uintObj,
      uintPair
      );
  }
}

int main()
{
  std::string input ("[1, 11, 3, 6-4]\n");
  std::string::const_iterator begin = input.begin();
  std::string::const_iterator end = input.end();

  ns::ast::varVec result;                 // ast tree
  using ns::parser::varVec;               // grammar
  using boost::spirit::x3::ascii::space;

  bool success = phrase_parse(begin, end, varVec, space, result);

  if (success && begin == end)
    std::cout << "good" << std::endl;
  else
    std::cout << "bad" << std::endl;

  return 0;
}
EN

回答 1

Stack Overflow用户

发布于 2018-11-26 22:54:28

将替代顺序交换为uintObj_def

代码语言:javascript
运行
复制
auto const uintObj_def =
    uintPair
  | uint_
  ;

现在的公式在uint_上总是匹配的,因为uintPair以有效的uint_开头。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53489465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档