Boost C++ - 寻找精神符号表

2023-12-01

在 Boost Spirit 中如果我有符号表

struct Foo : boost::spirit::qi::symbols<char, MyEnums::FruitType>
{
    Foo(const std::string& name = std::string("FooTable")
      : boost::spirit::qi::symbols<char, MyEnums::FruitType>(name)
    {
        add("apple", MyEnums::Apple)
           ("orange", MyEnums::Orange)
           ("peach", MyEnums::Peach);
    }
}

稍后在我的代码中,如果我有数据类型,如何获取符号?例如:

Foo fruitSymbolTable;
MyEnums::FruitType fruit = MyEnums::Apple;

std::string fruitTypeString = ???? // want it to be equal to "apple"

我怎样才能用桌子得到“苹果”?

另外,我知道我可以有一个像这样的表:

struct Foo : boost::spirit::qi::symbols<char, MyEnums::FruitType>
{
    Foo(const std::string& name = std::string("FooTable")
      : boost::spirit::qi::symbols<char, MyEnums::FruitType>(name)
    {
        add("apple", MyEnums::Apple)
           ("apple2", MyEnums::Apple)
           ("orange", MyEnums::Orange)
           ("peach", MyEnums::Peach);
    }
}

其中 MyEnums::Apple 可以是“apple”或“apple2”,在这种情况下我更愿意获得“第一个”匹配。我怎样才能做到这一点?


嗯,看来你想从一个qi::symbols解析器到karma::symbols发电机。

我想说这样的事情不存在。既然您可能已经寻找过它,我认为可以肯定地假设它没有。

我知道它会有什么用处,所以你可以考虑将它贡献给 Spirit Repository。

我花了一些时间在这里编写一个简单的映射器,该映射器可以从qi::symbols to karma::symbols:

template <typename Char, typename T, typename Lookup, typename Filter>
    karma::symbols<T, std::basic_string<Char> > 
    inverse(qi::symbols<Char,T,Lookup,Filter> const& parser)
{
    karma::symbols<T, std::basic_string<Char> > generator;

    parser.for_each([&generator](std::basic_string<Char> const& symbol, T v) 
        { 
            generator.add(v, symbol); 
        });

    return generator;
}

EDIT在C++03风格中:

template <typename Char, typename T, typename Lookup, typename Filter>
    karma::symbols<T, std::basic_string<Char> > 
    inverse(qi::symbols<Char,T,Lookup,Filter> const& parser)
{
    struct _adder { 
        karma::symbols<T, std::basic_string<Char> > result;

        void operator()(std::basic_string<Char> const& symbol, T v) { 
            result.add(v, symbol); 
        }
    } adder;

    parser.for_each(adder);
    return adder.result;
}

Note这确实not但处理解析符号表中可能重复映射的值。

这是一个简单的示例程序,表明它是有效的:http://liveworkspace.org/code/3uzQKi

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

namespace qi     = boost::spirit::qi;
namespace karma  = boost::spirit::karma;

template <typename ItType>
struct parser : public qi::grammar<ItType, int()>
{
    parser() : parser::base_type(start)
    {
        _sym.add("aap", 1)("noot", 2)("mies", 3);
        start = _sym;
    }
  // private:
    qi::symbols<char, int> _sym;
    qi::rule<ItType, int()> start;
};

template <typename ItType>
struct generator : public karma::grammar<ItType, int()>
{
    template<typename Sym>
    generator(Sym&& sym) : generator::base_type(start)
    {
        // _sym.add(1, "aap")(2, "noot")(3, "mies");
        _sym = std::move(sym);
        start = _sym;
    }
  private:
    karma::symbols<int, std::string> _sym;
    karma::rule<ItType, int()> start;
};

template <typename Char, typename T, typename Lookup, typename Filter>
    karma::symbols<T, std::basic_string<Char> > 
    inverse(qi::symbols<Char,T,Lookup,Filter> const& parser)
{
    karma::symbols<T, std::basic_string<Char> > generator;

    parser.for_each([&generator](std::basic_string<Char> const& symbol, T v) 
        { 
            generator.add(v, symbol); 
        });

    return generator;
}

void testcase(std::string const& str)
{
    typedef std::string::const_iterator It;

    It begin = str.cbegin();
    It end   = str.cend();

    static const parser<It> p;

    int out;
    bool ok = qi::parse(begin, end, p, out);
    std::cout << std::boolalpha << ok << '\n';
    std::cout << "remains: '" << std::string(begin, end) << "'\n";
    if (ok)
    {
        std::cout << "parsed value: " << out << "\n";
        static const generator<boost::spirit::ostream_iterator> g(inverse(p._sym));
        std::cout << "generator: " << karma::format(g, out) << "\n";
    }

}

int main()
{
    const auto v = std::vector<std::string>{ "aap", "noot", "mies" };
    for (auto it=v.begin(); it!=v.end(); ++it)
        testcase(*it);
}

Output:

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

Boost C++ - 寻找精神符号表 的相关文章

  • 我如何使用 cout << myclass

    myclass是我写的一个C 类 当我写的时候 myclass x cout lt lt x 我该如何输出10 or 20 2 就像一个integer or a float value 通常通过重载operator lt lt 对于你的班级
  • Linux中如何避免sleep调用因信号而中断?

    我在 Linux 中使用实时信号来通知串行端口中新数据的到达 不幸的是 这会导致睡眠呼叫在有信号时被中断 有人知道避免这种行为的方法吗 我尝试使用常规信号 SIGUSR1 但我不断得到相同的行为 来自 nanosleep 联机帮助页 nan
  • OpenCV 旋转图像而不裁剪澄清

    我想扩展这个主题 参考用户 Lars Schillingmann 给出的这个 SO 问题和接受的答案 在 C 中的 OpenCV 中旋转图像而不裁剪 https stackoverflow com questions 22041699 ro
  • CMake source_group() 无法在分层项目设置中正常工作

    在进行更改以使 CMake 项目具有分层文件夹管理后 source group 似乎不再正常工作 CMake 只是将所有内容转储到默认过滤器中 我尝试了各种正则表达式来从父级获取每个源文件的相对文件路径 甚至对父级 CMakeLists t
  • 关于我的编译器中缺少 stdafx.h(Windows 上的 mingw32)

    我有一个简单的问题 我注意到我的编译器中没有 stdafx h Windows 上的 mingw32 我应该拥有它吗 或者也许有办法绕过它 谢谢阅读 编辑 好的 这是我取出 stdafx h 的所有包含内容后的当前构建日志 http pas
  • 可空可选参数

    我在 asp net mvc 应用程序中使用带有 edmx 文件和 POCO 的实体框架 4 首先 我有一个映射到数据库中的表的人员类 public class Person public Int32 ID get set public s
  • C# CreatePipe() -> 受保护的内存错误

    我尝试使用 C 创建管道 代码非常简单 但是当行与CreatePipe 调用被执行我得到一个System AccessViolationException并出现以下错误消息 尝试读取或写入受保护的内存 这通常表明其他内存已损坏 这是我的表单
  • 从任务并行库更新 ProgressBar UI 对象

    基本上我想更新 FormMain WindowsForm 上的 ProgressBar UI 对象 我正在使用 NET 4 0 以下是 Form1 Designer cs 中的代码 namespace ProgressBarApp publ
  • C# P2P聊天应用程序设计

    我想创建一个不使用显式服务器的简单聊天应用程序 主要要求是用户可以同时与许多朋友聊天 就像在 Skype 等上一样 我在这里指的不是会议聊天 而是多个单独的聊天窗口 目前 我只想要一个 LAN 消息应用程序 但如果设计能够轻松扩展到 Int
  • 如何在configure.in中测试C++库的可用性?

    我正在 GNU Linux 上开发一个 C 项目 并且正在寻找一种方法来使用 Autotools 测试 IBM Informix 库的存在性和可用性 即编辑configure in 我没有使用 Autotools 的经验 所以基本上我是从该
  • C++ Microsoft:如何将 uuid/guid 与模板专业化相关联

    我想将 uuid guid 与模板专业化相关联 以下代码可用于将 uuid 与非模板接口 类 结构 关联 interface declspec uuid CECA446F 2BE6 4AAC A117 E395F27DF1F8 ITest
  • 有没有工具可以检测 Visual C++ 6.0 上的缓冲区溢出? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 由于堆问题 我一直遇到崩溃问题 所以我猜想某个地方发生了缓冲区溢出 我如何检测它 I use Compuware 边界检查器 http w
  • 状态代码:404,原因短语:“未找到”,版本:1.1,

    我使用 Web api 自托管 public class TestController ApiController HttpPost public void Testp FromBody string title Console Write
  • 如何反转无符号整数的 4 个字节? [复制]

    这个问题在这里已经有答案了 我试图通过使用 和 以及按位 AND 和 OR 和 来反转无符号整数 但不知道如何执行此操作 我已经拥有的 int main int argc char argv unsigned int getal scanf
  • 在第 i 个位置切换一点[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 C 中设置 清除和切换单个位 https stackoverflow com questions 47981 how do you set clear and toggle a single
  • 我可以以编程方式更改 Xamarin.Forms 中的 styles.xml 吗?

    我们有一个可自定义颜色的应用程序 这使得列表视图中所选项目的橙色 Android 默认值有时看起来很糟糕 我们想要更改列表视图所选项目的颜色 我知道如何在我们页面的后台代码 xaml cs 中执行此操作 并且我知道您可以在 styles x
  • 如何使用 C# 和 IBM Watson SDK 将实时音频流立即发送到 IBM Watson Speech-To-Text,而不在本地保存音频文件?

    我需要使用 IBM Watson SDK 使用麦克风录制音频 并使用 C 将其发送到 IBM Watson 语音转文本 我可以通过在本地保存音频文件然后使用发送它来实现此功能NAudio图书馆 但我的要求是使用流模式将实时音频发送到 IBM
  • 单击用户控件时如何防止窃取焦点? [复制]

    这个问题在这里已经有答案了 我希望能够单击我的用户控件 而不让它从任何其他控件中窃取焦点 我知道当你点击标签时它不会夺走焦点 如何才能做到这一点 尝试禁用您的控件ControlStyles Selectable http msdn micr
  • 在c#中搜索支持rar格式的压缩库

    我想在我的应用程序中添加功能来解压缩 并可选择压缩 各种格式的文件 我有支持 zip gzip 7zip 和 bzip2 的库 但还是没有找到支持rar的库 我知道 rar 是商业的 但也许有一些 net 库可用于解压缩 rar s 最好是
  • 查找文本中所有关键字的有效算法

    我有很多字符串 其中包含许多不同拼写的文本 我通过搜索关键字来标记这些字符串 如果找到关键字 我将使用该关键字的关联文本 假设搜索字符串可以包含文本 schw schwa 和 施瓦茨 我有三个关键字 全部解析为文本 schwarz 现在我正

随机推荐

  • iFrame 内容在 IE8 中不显示[重复]

    这个问题在这里已经有答案了 我有一个带有 iFrame 的网站 主页上有一些非常基本的 JS iframed 页面也有简单的 JS 当我照常嵌入 iframe 时 除了 IE8 之外 它在所有浏览器中都可以正常工作 我尝试了各种方法 第一
  • 错误 - “全局符号需要显式包名称”

    我正在尝试编写矩阵乘法的脚本 它只是一个基本程序 但我无法弄清楚以下错误 全局符号 ref mat1 需要在 multiplication pl 第 49 行显示显式包名称 全局符号 ref mat2 需要在 multiplication
  • 从另一个表中的另一列计算列值

    我有一个表 其中包含商店中每件商品的单价和其他详细信息 CREATE TABLE Item Item id CHAR 4 Description CHAR 40 Sizes CHAR 40 Weight REAL Unit price RE
  • 参考 XSD 模型组的特定元素?

    我们可以创建一个组并引用该组的元素吗 例如 我们有一个小组说
  • 使用 iMacros 和 javascript 检查 html 元素是否存在

    我想检查 iMacros 中是否存在 HTML 元素 如果是的话 我想访问一个 URL 如果没有 我想转到其他网址 因为 iMacros 没有语句 所以我将 javascript 与 iMacros 的 EVAL 一起使用 这是处理 jav
  • 日历月份错误

    我尝试用日历设置几年后的简单日期 字符串日期是此方法的参数 SimpleDateFormat format new SimpleDateFormat dd mm yyyy String DateTimeParts date split St
  • 使用discord.py更改角色层次结构

    我想在discord py 中创建一个新角色 但我希望这个角色位于 比方说 角色中的第三位 我怎样才能实现这个目标 你会使用Role edit 通过一个position值 该值必须低于您的最高角色的职位 bot command async
  • patsy 的倒数

    Patsy 的幂不允许负整数 所以 如果我们有一些系列数据X patsy dmatrices X X 1 X 返回错误 我如何将 X 的倒数添加到这样的帕西公式中 运算符的特殊含义在嵌入式函数调用中被关闭 所以如果你写X 1 x然后帕西将其
  • 使用Boost预处理器解析元素序列

    我定义了一个宏 define TYPES height int 10 width int 20 如何使用 Boost Preprocessor 来扩展这个宏 int height 10 int width 20 我最多能得到的是高度 整数
  • JavaScript 计算公式不起作用

    我有以下 JavaScript 函数来使用文本框进行一些计算 但是当我在文本框上调用此函数时 它不起作用 这是我的JS代码 Update
  • 如何在 SQL Server 中动态使用数据库名称

    我需要获取 SQL Server 中的所有表名 为此 我使用以下代码 select TABLE NAME from INFORMATION SCHEMA TABLES 我需要使用动态数据库名称 为此 我尝试使用以下代码 Declare db
  • 如何使用CSV Config Set的共享模式在Jmeter中运行线程?

    有没有办法在 CSV 数据集配置中使用 共享模式 的 编辑 选项 我在官方网站上找到了说明吗 apache jmeter 组件 CSV 数据集配置 标识符 共享相同标识符的所有线程共享相同的标识符 文件 例如 如果您有 4 个线程组 您可以
  • 在启用 crsf 和安全组件的 cakephp 3.4 中通过 ajax 发送表单

    需要帮忙 我希望能够通过 ajax 将表单发送到控制器进行处理 同时在应用程序控制器 cakephp 3 4 中启用 crsf 和安全组件 将不胜感激我能得到的任何帮助 谢谢 为了发送 ajax 请求 您需要首先通过文档中指定的 head
  • 如何将 gzipped rdf 文件加载到 rdf4j 存储库?

    我想将 gzipped rdf 文件加载到org eclipse rdf4j repository Repository 上传期间 必须将状态消息记录到控制台 我的 rdf 文件的未压缩数据大小约为 1GB 压缩数据大小约为 50MB 实际
  • 如何判断 Intent.createChooser 选择了哪个应用程序?

    Code Intent launchIntent new Intent Intent ACTION MAIN launchIntent addCategory Intent CATEGORY HOME Intent chooser Inte
  • 如何克隆继承的对象?

    我有一个Tile使用此方法的类 public object Clone return MemberwiseClone 还有另一个班级Checker继承自Tile 我也有一个Board类是一个List
  • java中如何检测文件系统已更改

    我想知道如何在java中有效地实现文件系统更改 假设我在文件夹中有一个文件并修改该文件 我希望尽快得到 java 的有关此更改的通知 如果可能的话 不要频繁轮询 因为我想我可以打电话java io file lastModified每隔几秒
  • 管道缓冲区大小是 4k 还是 64k?

    我在多个地方读到管道的默认缓冲区大小是 4kB 例如 here 和我的ulimit a倾向于证实这一说法 ulimit a core file size blocks c 0 data seg size kbytes d unlimited
  • 通过powershell安装docker时出错

    在 Windows Server 2016 上安装 docker 时出现此错误 有什么想法吗 PS C Users Administrator gt Install Package Name docker ProviderName Dock
  • Boost C++ - 寻找精神符号表

    在 Boost Spirit 中如果我有符号表 struct Foo boost spirit qi symbols