使用 boost Spirit 为变量分配默认值

2023-11-29

假设我有以下字符串要解析:

“1.2、2.0、3.9”

当我为其应用以下解析器时:

struct DataStruct
{
    double n1, n2, n3;
};

BOOST_FUSION_ADAPT_STRUCT(DataStruct, (double, n1)(double, n2)(double, n3))

qi::rule<std::string::iterator, DataStruct()> data_ =
                                                      qi::double_ >> ','
                                                   >> qi::double_ >> ','
                                                   >> qi::double_;

auto str = "1.2, 2.0, 3.9";
auto it - str.begin();
if (qi::parse(it, str.end(), data_, res))
{
    std::cout << "parse completed" << std::endl;
}

一切都很好,但是当我认为我可以得到“null”(即“1.2,null,3.9”)而不是字符串中的某些 double 时,我想将 0 值分配给 DataStruct 中适当的 double 值。有什么办法可以做到这一点吗?


通常的技巧是使用替代品qi::attr:

rule_def = parser_expression | qi::attr(default_value);

在你的情况下,也许:

reader_ = qi::double_ | qi::lit("null") >> qi::attr(0);

Demo

Live On Coliru

#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
struct DataStruct { double n1, n2, n3; };

BOOST_FUSION_ADAPT_STRUCT(DataStruct, n1, n2, n3)

namespace qi = boost::spirit::qi;

int main() {
    using Iterator = typename std::string::const_iterator;

    qi::rule<Iterator, double()> reader_   = qi::double_ | qi::lit("null") >> qi::attr(0);
    qi::rule<Iterator, DataStruct()> data_ = reader_ >> ',' >> reader_ >> ',' >> reader_;

    DataStruct res;
    auto const str = std::string("1.2,null,3.9");
    Iterator start = str.begin(), end = str.end();

    if (qi::parse(start, end, data_ >> qi::eoi, res)) {
        std::cout << "parsed: " << boost::fusion::as_vector(res) << "\n";
    }
    else {
        std::cout << "parse failed\n";
    }
}

Prints

parsed: (1.2 0 3.9)

注意审查更改(不使用命名空间,检查eoi).

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

使用 boost Spirit 为变量分配默认值 的相关文章

随机推荐

  • 如何从C程序中执行sql语句?

    如何从 C 程序执行 SQL 语句 例如我想显示输出 select from EMP 来自 C 程序 我需要使用存储过程来执行此操作吗 我需要任何库文件来做到这一点吗 我的C编译器是Tiny C Compiler 目前使用的是SQL ser
  • ACTION_SEND 在同一 Intent 中发送图像和文本

    所以我想做一些类似的事情 Intent intent new Intent Intent ACTION SEND intent putExtra Intent EXTRA STREAM Uri parse myMessageAsImage
  • 如何让您的 Discord 机器人在您输入命令后收听您的消息?

    我正在制作一个 Google Assistant Discord 机器人 但我想知道你的机器人将如何回复你的第二条消息 例如 首先 你说hey google 然后机器人说I m listening 然后你说what time is it他说
  • CPU 100%时如何提高Redis性能?分片?最快的.Net 客户端?

    由于我们网站上的负载大量增加 redis 现在正在努力应对峰值负载 因为 redis 服务器实例的 CPU 使用率达到 100 在八个核心之一上 导致超时 我们已将客户端软件更新至 ServiceStack V3 来自 BookSleeve
  • TaskQueue 无法执行 HTTP 调用 - 缺少强制标头?

    错误在这段代码中 public String getVersion String result null int index this getRequest getProtocol indexOf 47 if index 1 result
  • ScrollView 内的 TabHost 强制其滚动到底部

    我的问题与这个未回答的问题非常相似 但有一些细微的差别 我将解释一下 滚动视图内的 TabHost 单击选项卡时始终向下滚动 我的 ScrollView 开始滚动到底部 显示 TabHost 内容而不是顶部的内容 您可以在链接的问题中看到屏
  • 在 C++ 程序中覆盖标准 C 库函数

    我想知道编译器 链接器如何从 2 个可用的 printf 函数中进行选择 一种是用户定义的 另一种是标准c库实现 include
  • React跨组件共享方法

    到目前为止我有一个看起来像这样的组件 import React from react Import images import logo from images logo small png class LoginForm extends
  • 如何从 Servlet 过滤器中的 URL 中提取用户名和密码?

    我创建了一个BasicAuthFilter它有这个签名 Override public void doFilter ServletRequest request ServletResponse response FilterChain ch
  • $(selector).on() 中的 jQuery 未捕获类型错误

    我收到以下错误 未捕获的 TypeError jQuery event special handleObj origType 中间值 handle handleObj handler apply 不是函数 这是我的代码 它介于beforeS
  • 如何将值从 Firebase 返回到 React 组件? [复制]

    这个问题在这里已经有答案了 我正在尝试从 Firebase 上的实时数据库读取值并将其呈现在元素中 但它始终返回未定义 我有以下代码 const getStudentName studentId gt firebase database r
  • PIVOT 语句有 ANSI 规范吗?

    最近我问了一个问题如何使用 PIVOT 在其单元格中同时显示平均值和计数 针对 SQL Server 2005 和 Oracle 11g 的问题已得到解答 显然 sql server 的实现相当有限 并且 Oracle 的实现会产生奇怪的列
  • 在 XNA 中统一调整窗口大小

    好吧 我正在尝试让我的游戏窗口能够调整大小均匀地 我到处都检查过 但似乎找不到任何相关信息 有任何想法吗 由于字符限制 我无法发布代码 如果有人可以帮助我并看看我做错了什么 我将不胜感激 发生这种情况时如何调整后备缓冲区的大小也很有帮助 因
  • 原始数组类型上的 Java Arrays.asList 产生意外的列表类型[重复]

    这个问题在这里已经有答案了 可能的重复 Arrays asList 无法正常工作 显然返回类型是Arrays asList new int 1 2 3 is List
  • 用Java制作窗口

    我正在尝试用 Java 制作一系列 GUI 窗口 首先 关于设计的问题 我计划有 8 9 类似类型的窗户 带计时器的问候语介绍 显示上述内容几秒钟后 一个类似 输入你的名字 输入你的姓氏 的窗口 带有两个单选按钮的问题窗口 输入您的密码 窗
  • 配置 Gradle 4.7 为 JUnit 5 测试生成 HTML 报告

    我有一个基于以下内容的应用程序 Spring Framework5 0 4 发布 Gradle 4 7 通过配置的多模块项目 JUnit 5 1 1 有关 Gradle 与 JUnit 的配置位于build gradle文件位于根模块 su
  • javascript中typeof的用法是什么?

    typeof返回原始数据类型 但我不明白为什么它在 JavaScript 中使用 我不明白为什么它在 JavaScript 中使用 typeof习惯于 返回原始数据 例如 如果我想知道某些东西是否未定义 我可以这样做 if typeof o
  • Google Chrome 不考虑 window.name

    我知道在 window open url name 中 如果具有该名称的弹出窗口已经存在 该名称基本上限制浏览器不再打开弹出窗口 例如 页面 A 打开名为 thug 的弹出窗口 现在我打开一个新选项卡 输入 localhost page 然
  • JQuery Toggle 无法正常工作

    我在使用 JQuery Toggle 时遇到问题 我有以下代码 var jQuery document ready function sh zone buttons delegate sh zone button login menu cl
  • 使用 boost Spirit 为变量分配默认值

    假设我有以下字符串要解析 1 2 2 0 3 9 当我为其应用以下解析器时 struct DataStruct double n1 n2 n3 BOOST FUSION ADAPT STRUCT DataStruct double n1 d