如何使用boost-spirit将结果放入STL图?

2023-12-23

 #include <QtCore/QCoreApplication>

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

 #define CODE_CPP_KEYWORD_ENUM "enum"

namespace haha
{
    //简单表示c++的enum的类(A structure use to simply description C++ enum)
    struct CPPCodeEnum
    {
        //enum的名称(enum Name)
        ::std::string enumName;
        //成员的名称(enum Members‘name)
        ::std::list<::std::string> enumMembers;
    };
}

namespace haha
{
    namespace fusion = boost::fusion;
    namespace phoenix = boost::phoenix;
    namespace qi = boost::spirit::qi;
    namespace ascii = boost::spirit::ascii;

    //enum的简单解析器
    template <typename Iterator>
    struct CPPCodeEnumGrammar 
        : qi::grammar<Iterator, CPPCodeEnum(),ascii::space_type >
    {
        CPPCodeEnumGrammar() 
            : CPPCodeEnumGrammar::base_type(start)
        {

            using qi::_val;
            using qi::_1;
            using qi::lit;
            using qi::lexeme;
            using qi::raw;
            using qi::space;
            using ascii::char_;
            using ascii::string;
            using phoenix::push_back;
            //解析一个变量名(他不符合C++的命名规范,暂时只是个替代品)
            quoted_string = lexeme[+(qi::alpha|qi::digit | char_('_'))];

            start =
                //解析“enum”
                lit(CODE_CPP_KEYWORD_ENUM)>>
                //取得enum名
                *quoted_string[ phoenix::bind(&CPPCodeEnum::enumName, _val)= _1]>>
                char_("{")>>
                //解析enum的成员
                *(quoted_string[push_back(phoenix::bind(&CPPCodeEnum::enumMembers, _val), _1)]%',')>>
                //可有可无的逗号小尾巴
                -char_(",")>>
                char_("}");

        }

        qi::rule<Iterator, std::string(),ascii::space_type > quoted_string;
        qi::rule<Iterator, CPPCodeEnum(), ascii::space_type > start;
    };
}



int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    //模拟C++的一段代码(test string simulate a section of C++ code)
    ::std::string teststr="enum myename {m1,m2  ,m3 ,m4 ,}";

    using boost::spirit::ascii::space;

    std::string::const_iterator iter = teststr.begin();
    std::string::const_iterator end = teststr.end();

    haha::CPPCodeEnumGrammar<std::string::const_iterator> myCPPCodeEnumGrammar;
    haha::CPPCodeEnum data;

    bool r = phrase_parse(iter, end, myCPPCodeEnumGrammar,  space, data);

    return a.exec();
}

我上面的代码工作正常,但是,它太简单了,无法解析这样的代码:(enum myename {m1=1,m2=44 ,m3=89 ,m4=0 ,})。我需要两个枚举成员的名称和值。现在我决定“CPPCodeEnum::enumMembers”的替代类型


    list < std::string::string>  

      map < std::string::string,int>  
.但是我不知道如何使用boost-spirit将结果放入STL图?

请看一下本文 http://boost-spirit.com/home/articles/qi-example/parsing-a-list-of-key-value-pairs-using-spirit-qi/,它准确地描述了您想要实现的目标。要点是 Spirit.Qi 允许直接将键/值对解析为映射,而无需任何额外代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用boost-spirit将结果放入STL图? 的相关文章

随机推荐

  • Java中如何安排周期性任务?

    我需要安排一个任务以固定的时间间隔运行 我怎样才能在长间隔 例如每 8 小时 的支持下做到这一点 我目前正在使用java util Timer scheduleAtFixedRate Does java util Timer schedul
  • 仅针对 Tab 和 Enter 自动完成

    在这种情况下如何禁用自动完成 Pressing after Rate autocomplets with DeviceRotationRate as displayed 我只想使用 Tab 或 和 Enter 进行自动完成 所以我会知道会发
  • 使用 EPPlus 加载大量 Excel 数据

    我有一个基本的 winforms 应用程序 用户可以上传 excel 文件 xlsx 并且我想读取该文件的内容 因此我使用 EPPlus 问题是 我正在尝试加载一个非常大的 Excel 文件的内容 它有 7 个选项卡 其中一个选项卡有超过
  • 如何解决异常 在 laravel 5.5 中运行 Dusk 是不安全的?

    我将我的项目从 laravel 5 4 升级到 laravel 5 5 我在本地环境中没有任何问题 但在服务器中我收到此异常 我搜索了很多 我知道这个问题可能会重复 但没有解决方案解决我的问题 当环境是生产环境时 如何不注册黄昏 我在 Ap
  • 函数调用中的新运算符

    我的问题是分配的对象会发生什么new函数调用内部的运算符 一个具体的例子 我有一个私有向量pV我想将其发送到类之外的对象 函数 foo gt func std vector
  • 是否可以使用 Epplus 在 Excel 中复制行(包含数据、合并、样式)?

    问题是我需要使用整个集合的单个模板将集合中的数据多次插入 Excel 中 using var pckg new ExcelPackage new FileInfo association TemplatePath var workSheet
  • 获取数据表列数据类型

    DataTable dt new DataTable dt Columns Add new DataColumn gridColumn1 typeof bool 我期望以下行的结果包含有关 DataColumns 类型 布尔 的信息 dt
  • 如何在While循环中有两个条件?

    基本上我的代码中有两个 while 循环 它们所做的只是从 0 到 10 或 10 以 1 为增量进行计数 计数向量是 count1 和 count2 这发生在我的代码中的两个单独的 while 循环中 但是 我现在需要每个计数相互依赖 因
  • Twitter API 是否允许按用户名和主题标签进行过滤?

    我可以获取特定用户使用特定主题标签的所有推文吗 我可以只获取过去 100 条推文 然后在我这边进行过滤 但如果 Twitter 可以在他们这边进行过滤 那就方便多了 这可能吗 Twitter 的高级搜索 http search twitte
  • 使用 MockMvc 获取 httpServletRequest 属性

    我有一个非常简单的控制器 以这种方式定义 RequestMapping value api test method RequestMethod GET produces application json public ResponseBod
  • 如何用Java绕点旋转多边形?

    我正在创建一个 Canvas 对象 直线 顶点 三角形 我想对它们应用围绕点的旋转 我无法使用 Canvas 的rotate 方法 因为点附加到地图上的GeoPoint 所以如果我使用rotate 方法 所有地图都会旋转 问题是 Canva
  • Django 管理内联表单 - 将外键查询集限制为一组值

    我有一些相互关联的模型需要在单个管理页面上共存 想法是这样的 戏剧作品有演员 演员有特定的角色 戏剧作品与给定的书面文本 戏剧 改编等 相关 并且书面文本包含该文本的所有角色的列表 添加作品时 每个演员都需要与这些角色之一关联 数据模型的工
  • Rails:文件路径

    我里面有app一个名为csv在这个目录中我有一个名为names csv我想用File read path string 函数来读取文件 文件的相对路径是什么 file File join Rails root app csv names c
  • 将当前时间添加到日期时间?

    我有一个代表日期的字符串 它从 DropDownList 中返回 该字符串是 2010 年 8 月 27 日 例如 现在我想将当前时间添加到此并将其解析为 Datetime 所以最终它应该是一个 DateTime 类似2010年8月27日
  • 如何使用 ts.transform 将附加语句注入到函数中

    我使用 Typescript 编译器 API ts transform ts updateFunctionDeclaration 在现有源文件中的函数开头注入附加语句 这非常有效 除了当我打印转换后的代码 使用 ts Printer 时 原
  • Dart - 将纪元以来的毫秒数(UNIX 时间戳)转换为人类可读的时间

    有没有一种好方法可以将纪元 例如 1486252500000 13 位 以来的毫秒数格式化为人类可读的格式 DateTime自纪元以来确实有一个毫秒的命名构造函数 https api dartlang org stable 1 24 2 d
  • 命名方法规则简单,兼容ARC命名约定

    我很难理解 ARC 的命名约定 我一直使用 ARC 进行编码 我想这就是原因 1 类方法 我应该为以下方法选择什么名称 这两个名称在内存管理方面有什么区别 这个名字 MyObject newObjectFrom MyObject anObj
  • 将 python 脚本的输出获取到 Jenkinsfile 中的变量中

    我有一个 Python 脚本 它在标准输出上返回一个字符串 python 脚本返回的值可以收集在 bash 脚本中 如下所示 bin bash outputString my python script py some parameter
  • 函数式编程和依赖倒置:如何抽象存储?

    我正在尝试创建一个具有较低级别库的解决方案 该库将知道在调用某些命令时需要保存和加载数据 但保存和加载函数的实现将在特定于平台的项目中提供它引用较低层的库 我有一些模型 例如 type User UserID UserID Situatio
  • 如何使用boost-spirit将结果放入STL图?

    include