如何将原始输入捕获到精神语法的合成输出中?

2023-12-15

我正在研究 boost::spirit::qi::grammar 并希望将原始文本的一部分复制到语法的合成输出结构中(更具体地说,与规则的组件之一匹配的部分) )。该语法最终将用作更复杂语法的子语法,因此我实际上无法访问原始输入。

我猜测这可以通过语义操作或语法上下文来完成,但我找不到在不访问原始 parse() 的情况下执行此操作的示例。

这是我到目前为止所拥有的:

#include <iostream>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
#include <boost/fusion/include/adapt_struct.hpp>

namespace qi = boost::spirit::qi;

struct A
{
    std::string header;
    std::vector<int> ints;
    std::string inttext;
};

BOOST_FUSION_ADAPT_STRUCT(
    A,
    (std::string, header)
    (std::vector<int>, ints)
    //(std::string, inttext)
)

template <typename Iterator>
struct parser : qi::grammar< Iterator, A() >
{
    parser() : parser::base_type(start)
    {
        header %= qi::lexeme[ +qi::alpha ];
        ints %= qi::lexeme[ qi::int_ % qi::char_(",_") ]; // <---- capture the original text that matches this into inttext
        start %= header >> ' ' >> ints;
    }

    qi::rule<Iterator, std::string()> header;
    qi::rule<Iterator, std::vector<int>() > ints;
    qi::rule<Iterator, A()> start;
};

int main()
{
    A output;
    std::string input("out 1,2_3");
    auto iter = input.begin();
    parser<decltype(iter)> p;
    bool r = qi::parse(iter, input.end(), p, output);
    if( !r || iter != input.end() )
    {
        std::cout << "did not parse";
    }
    else
    {
        // would like output.inttext to be "1,2_3"
        std::cout << output.header << ": " << output.inttext << " -> [ ";
        for( auto & i: output.ints )
            std::cout << i << ' ';
        std::cout << ']' << std::endl;
    }
}

类似于您在不使用语义操作的情况下提出的问题:

#include <iostream>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/spirit/repository/include/qi_iter_pos.hpp>

namespace qi = boost::spirit::qi;
using boost::spirit::repository::qi::iter_pos;

struct ints_type
{
   std::vector<int> data;
   std::string::const_iterator begin;
   std::string::const_iterator end;   
};

struct A
{
    std::string header;
    ints_type ints;
};

BOOST_FUSION_ADAPT_STRUCT(
    ints_type,
    (std::string::const_iterator, begin)
    (std::vector<int>, data)
    (std::string::const_iterator, end)
)

BOOST_FUSION_ADAPT_STRUCT(
     A,
     (std::string, header)
     (ints_type, ints)
)

template <typename Iterator>
struct parser : qi::grammar< Iterator, A() >
{
    parser() : parser::base_type(start)
    {
        header %= qi::lexeme[ +qi::alpha ];
        ints %= qi::lexeme[ iter_pos >> qi::int_ % qi::char_(",_") >> iter_pos ]; // <---- capture the original text that matches this into inttext
        start %= header >> ' ' >> ints;
    }

    qi::rule<Iterator, std::string()> header;
    qi::rule<Iterator, ints_type() > ints;
    qi::rule<Iterator, A()> start;
};

int main()
{
    A output;
    std::string input("out 1,2_3");
    auto iter = input.begin();
    parser<decltype(iter)> p;
    bool r = qi::parse(iter, input.end(), p, output);
    if( !r || iter != input.end() )
    {
        std::cout << "did not parse";
    }
    else
    {
        // would like output.inttext to be "1,2_3"
        std::cout << output.header << ": " << std::string(output.ints.begin,output.ints.end) << " -> [ ";
        for( auto & i: output.ints.data )
            std::cout << i << ' ';
        std::cout << ']' << std::endl;
    }
}

使用语义动作:

#include <iostream>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/spirit/repository/include/qi_iter_pos.hpp>

namespace qi = boost::spirit::qi;
namespace phx = boost::phoenix;
using boost::spirit::repository::qi::iter_pos;

struct ints_type
{
   std::vector<int> data;
   std::string inttext; 
};

struct A
{
    std::string header;
    ints_type ints;

};

BOOST_FUSION_ADAPT_STRUCT(
    ints_type,
    (std::vector<int>, data)
    (std::string, inttext)
)

BOOST_FUSION_ADAPT_STRUCT(
     A,
     (std::string, header)
     (ints_type, ints)
)

template <typename Iterator>
struct parser : qi::grammar< Iterator, A() >
{
    parser() : parser::base_type(start)
    {
        header %= qi::lexeme[ +qi::alpha ];
        ints = qi::lexeme[
                  (iter_pos >> qi::int_ % qi::char_(",_") >> iter_pos)
                     [phx::at_c<0>(qi::_val)=qi::_2,
                      phx::at_c<1>(qi::_val)=phx::construct<std::string>(qi::_1,qi::_3)] 
               ]; 
        start %= header >> ' ' >> ints;
    }

    qi::rule<Iterator, std::string()> header;
    qi::rule<Iterator, ints_type() > ints;
    qi::rule<Iterator, A()> start;
};

int main()
{
    A output;
    std::string input("out 1,2_3");
    auto iter = input.begin();
    parser<decltype(iter)> p;
    bool r = qi::parse(iter, input.end(), p, output);
    if( !r || iter != input.end() )
    {
        std::cout << "did not parse";
    }
    else
    {
        // would like output.inttext to be "1,2_3"
        std::cout << output.header << ": " << output.ints.inttext << " -> [ ";
        for( auto & i: output.ints.data )
            std::cout << i << ' ';
        std::cout << ']' << std::endl;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将原始输入捕获到精神语法的合成输出中? 的相关文章

随机推荐

  • 如何捕获Retrofit android中的异常

    我已将类定义如下 我在这里使用了 dagger 和 Retrofit 我正在尝试做什么 我正在努力抓住OfflineException在下面的请求中 如何在主活动中正确捕获它 请求拦截器 java public class RequestI
  • 通过更改 Android 中的应用程序语言来更改默认手机语言?

    有没有办法通过更改应用程序的语言来更改手机的语言 我的意思是 当我更改应用程序的语言时 默认手机语言也会更改 对此有什么想法请在这里分享 提前致谢 我不知道它可以通过编程方式更改 但是在更改应用程序语言后 您也可以要求用户更改设备语言 要求
  • 使用 MySql、PHP 和 ADODB 在准备好的语句中参数化 IN 子句

    我正在编写一些 SQL 并使用 AdoDb 连接到我的数据库并运行查询等 我正在使用参数化查询并遇到了障碍 它们是一种将值数组传递给 AdoDb MySql 中的 in clause 进行参数化的方法 我的问题是 如果我传递一个准备好的字符
  • 在 C/C++ 中编写“指向某物的指针”的好方法

    在 C C 中是否有一种 好 的方法来编写 指向某物的指针 我用来写void foo char str 但有时我发现这很不合逻辑 因为str是 指向 char 的指针 那么附加 应该更合乎逻辑 到类型名称 指针的书写有规则吗 char st
  • VideoView 位于 SurfaceView 之上

    我尝试展示一个VideoView在一个上面SurfaceView 但它不可见 但会对点击做出反应 MediaController 出现并播放声音 该视频似乎是在后面播放的SurfaceView所以我也尝试利用setZOrderMediaOv
  • Facebook 单点登录无法在 Windows 10 设备上运行的 Windows Phone 8.1 应用程序中运行

    我已经提到过this使用 facebook 应用程序实现 facebook 登录的链接 效果很好 从 Facebook 应用程序登录后 它会重定向到我的应用程序 但是当我在 Windows 10 设备上运行此应用程序时 Facebook 应
  • CoreData多对多关系

    CoreData中如何操作多对多关系 例如 我有 2 个实体 食谱和配料 CoreData 像食谱 gt 成分一样链接它们 现在我需要为配方中的每种成分添加属性 计数 我该怎么做 Thanks Core Data 会为您负责对象图一致性维护
  • 未知的服务器标记“ajaxToolkit:HtmlEditorExtender”

    我正在使用 ajaxcontrols 并且所有控件都运行良好但我没有找到任何名为 HtmlEditorExtender 的控件 所以我刚刚在 html 页面中复制了此标签
  • SingleWrite 与 TripleWrite

    我非常清楚何时何地使用 SingleWrite 作为 MQ 中的日志算法是有利的 它有利于高吞吐量 低并发工作负载 当工作负载更加并发时 TripleWrite 的开销就不那么重要了 我不明白并且正在努力寻找任何有关 TripleWrite
  • 应用程序从 Rails 5.2 升级到 6.0 后运行 rspec 时出现 PG::ConnectionBad(连接已关闭)

    我尝试将我的应用程序从 Rails 5 2 升级到 6 0 升级后运行rspec它会引发错误PG ConnectionBad connection is closed 该错误是由表达式引起的ActiveRecord Migration ma
  • 路径依赖类型是子类型吗?

    trait A trait B def foo A this B new B def bar A B foo def baz A this B bar type mismatch found A B required A this B 我说
  • 选择字段中不同的第一个单词

    我希望能够执行选择查询 仅获取字符串中不同的第一个单词 不包括最后一个单词 如果不清楚 这是我想要的下表结果 苹果 iPhone 4S苹果 iPhone 4苹果 iPhone 6 Plus id model 1 Apple iPhone 4
  • 如果我在 scanf 函数中使用带有字符串的“&”会发生什么?

    我刚刚在博客中看到一些代码 它使用了 scanf s T 但正如我们所知 我们不应该在字符串中使用 符号 因为它会自动分配该字符串的首地址 我确实运行了该代码 令人惊讶的是它正在工作 所以我想知道当我使用时会发生什么 在字符串中 inclu
  • 如何使用 python 更改桌面背景?

    如何使用 python 更改桌面背景 我想在 Windows 和 Linux 上都这样做 在Python2 5或更高版本的Windows上 使用ctypes加载user32 dll并调用SystemParametersInfo 使用 SPI
  • 记住刷新后哪个选项卡处于活动状态

    我在网页上使用 jquery 选项卡 当刷新页面时 它会丢失我曾经使用过的选项卡并返回到第一个选项卡 有谁遇到过这个问题并知道如何解决它 和其他人一样 我也在 jQueryUI 1 10 中为 ui tabs cookie 历史而苦苦挣扎
  • 使用散点图可视化大型 3D 数据集

    我正在 MATLAB 中运行模拟 其中有一个大型 3D 数据集 每个时间步长都会发生变化 我尝试使用 3D 散点图来可视化数据 其中随着模拟的进行 点会呈现不同的位置 大小 颜色和透明度级别 尺寸和颜色信息是多余的 在 MATLAB 中渲染
  • 如何让子控件正确的 id 到客户端

    我正在研究 ASP NET 但没有使用任何 ASP NET 的 AJAX 框架 现在我尝试使用 经典 JavaScript 方式 AJAX 更新客户端网格控件单元格中文本框和下拉列表的内容 但我面临的问题是 我想在客户端呈现时更新的控件 文
  • 更好的 SEO 可以从文章的 URL Slug 中删除“停止”字样? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我看到一个 WordPress 插件可以从文章 URL Slug 中删除某些单词 举个例子 在没有插件的情况下 如果我创建一篇标题为 的文章 使用 Trello 应用程序将您的项目组织到看
  • 使用 JSON-Framework 将 NSMutableArray 作为 JSON 发送

    我在项目中成功使用 JSON Framework 来解码从服务器发送的 JSON 现在我需要以相反的方式进行操作 并且我遇到了问题 因为要发送的数据是从 CoreData 获取的 NSMutableArray 使用时 NSString js
  • 如何将原始输入捕获到精神语法的合成输出中?

    我正在研究 boost spirit qi grammar 并希望将原始文本的一部分复制到语法的合成输出结构中 更具体地说 与规则的组件之一匹配的部分 该语法最终将用作更复杂语法的子语法 因此我实际上无法访问原始输入 我猜测这可以通过语义操