提升精神规则可以参数化吗

2023-12-02

在我的 Boost Spirit 语法中,我希望有一条规则可以做到这一点:

规则<...> noCaseLit = no_case[ lit( "KEYWORD" ) ];

但对于自定义关键字,我可以这样做:

... >> noCaseLit( "SomeSpecialKeyword" ) >> ... >> noCaseLit( "OtherSpecialKeyword1" )

Boost Spirit 规则是否可能实现这一点?如果可以,如何实现?

附:我以不区分大小写的事情为例,我所追求的是一般的规则参数化。

Edits:通过评论中“sehe”提供的链接,我能够接近我想要的,但我还没有完全实现。

/* Defining the noCaseLit rule */
rule<Iterator, string(string)> noCaseLit = no_case[lit(_r1)];
/* Using the noCaseLit rule */
rule<...> someRule = ... >> noCaseLit(phx::val("SomeSpecialKeyword")) >> ...

我还没有找到一种方法来自动将文字字符串转换为 Phoenix 值,以便我可以使用如下规则:

rule<...> someRule = ... >> noCaseLit("SomeSpecialKeyword") >> ...

最简单的方法是简单地创建一个返回规则/解析器的函数。在接近结尾的示例中这一页您可以找到一种方法来声明函数的返回值。 (相同here在评论的例子中)。

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

namespace ascii = boost::spirit::ascii;
namespace qi = boost::spirit::qi;

typedef boost::proto::result_of::deep_copy<
            BOOST_TYPEOF(ascii::no_case[qi::lit(std::string())])
        >::type nocaselit_return_type;

nocaselit_return_type nocaselit(const std::string& keyword)
{
    return boost::proto::deep_copy(ascii::no_case[qi::lit(keyword)]);
}

//C++11 VERSION EASIER TO MODIFY (AND DOESN'T REQUIRE THE TYPEDEF)
//auto nocaselit(const std::string& keyword) -> decltype(boost::proto::deep_copy(ascii::no_case[qi::lit(keyword)]))
//{
//  return boost::proto::deep_copy(ascii::no_case[qi::lit(keyword)]);
//}


int main()
{
    std::string test1="MyKeYWoRD";
    std::string::const_iterator iter=test1.begin();
    std::string::const_iterator end=test1.end();
    if(qi::parse(iter,end,nocaselit("mYkEywOrd"))&& (iter==end))
        std::cout << "Parse 1 Successful" << std::endl;
    else
        std::cout << "Parse 2 Failed. Remaining: " << std::string(iter,end) << std::endl;

    qi::rule<std::string::const_iterator,ascii::space_type> myrule = 
    *(
            ( nocaselit("double") >> ':' >> qi::double_ ) 
        |   ( nocaselit("keyword") >> '-' >> *(qi::char_ - '.') >> '.')
    );

    std::string test2=" DOUBLE : 3.5 KEYWORD-whatever.Double  :2.5";
    iter=test2.begin();
    end=test2.end();
    if(qi::phrase_parse(iter,end,myrule,ascii::space)&& (iter==end))
        std::cout << "Parse 2 Successful" << std::endl;
    else
        std::cout << "Parse 2 Failed. Remaining: " << std::string(iter,end) << std::endl;


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

提升精神规则可以参数化吗 的相关文章

  • 将运算符 << 添加到 std::vector

    我想添加operator lt lt to std vector
  • Qt - QProcess 不工作

    我尝试启动 Internet Explorer 所以我使用下面的代码 QProcess process new QProcess this QString temp C Program Files Internet Explorer iex
  • 在 CPP 类中将 C 函数声明为友元

    我需要在 C 函数中使用类的私有变量 我正在做这样的事情 class Helper private std string name public std getName return name friend extern C void in
  • Grpc - 将消息从一个客户端发送到连接到同一服务器的另一个客户端

    是否可以将消息从一个客户端发送到连接到同一服务器的另一个客户端 我想将数据从一个客户端发送到服务器然后发送到特定客户端 我想我需要获取客户端 ID 但我不知道如何获取此 ID 以及如何从服务器将此消息发送到该客户端 我这里有一个样本 这是一
  • Rx.NET 中是否有一个Subject 实现,其功能类似于BehaviourSubject,但仅在值发生更改时才发出?

    有没有Subject https learn microsoft com en us previous versions dotnet reactive extensions hh229699 v vs 103 Rx NET 中的实现在功能
  • MVC3中设置下拉列表中的所选项目

    我必须为视图中的下拉列表设置所选项目 但它不起作用 View div class editor label Html LabelFor model gt model Gender div div class editor field Htm
  • 当事件button.click发生时,如何获取按钮名称/标签?

    我以编程方式制作按钮并将它们添加到堆栈面板中 以便每次用户导航到页面时按钮都会发生变化 我正在尝试做这样的事情 当我单击创建的按钮时 它将获取按钮的标签并转到正确的页面 但是 我无法使用 RoutedEventHandler 访问按钮元素
  • RestSharp获取序列化输出

    我正在寻找一种方法来访问 AddBody 调用的序列化结果 我正在使用内置的 RestSharp 序列化器 例子 class Foo public string FooField void SendRecord var f new Foo
  • 语音识别编程问题入门

    所以 你们可能都看过 钢铁侠 其中托尼与一个名为贾维斯的人工智能系统进行交互 演示剪辑here http www youtube com watch v Go8zsh1Ev6Y 抱歉 这是广告 我非常熟悉 C C 和 Visual Basi
  • C++中判断unicode字符是全角还是半角

    我正在编写一个终端 控制台 应用程序 该应用程序应该包装任意 unicode 文本 终端通常使用等宽 固定宽度 字体 因此要换行文本 只需计算字符数并观察单词是否适合一行并采取相应的操作 问题是 Unicode 表中的全角字符在终端中占用了
  • 如何使用 x64 运行 cl?

    我遇到了和这里同样的问题致命错误 C1034 windows h 未设置包含路径 https stackoverflow com questions 931652 fatal error c1034 windows h no include
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • 模板外部链接?谁能解释一下吗?

    模板名称具有链接 3 5 非成员函数模板可以有内部链接 任何其他模板名称应具有外部链接 从具有内部链接的模板生成的实体与在其他翻译单元中生成的所有实体不同 我知道使用关键字的外部链接 extern C EX extern C templat
  • 模板类中的无效数据类型生成编译时错误?

    我正在使用 C 创建一个字符串类 我希望该类仅接受数据类型 char 和 wchar t 并且我希望编译器在编译时使用 error 捕获任何无效数据类型 我不喜欢使用assert 我怎样才能做到这一点 您可以使用静态断言 促进提供一个 ht
  • 使动态创建的链接标签在 Winforms 中可点击

    我正在制作一个程序 允许用户单击由动态链接标签创建的公司名称 在我想知道如何做到这一点之前 我从未在 C 中使用过链接标签 可为特定用户生成的业务数量各不相同 因此每个用户的链接标签数量并不相同 然后我想捕获业务 ID 以进行 Json 调
  • 如何解压 msgpack 文件?

    我正在将 msgpack 编码的数据写入文件 在编写时 我只是使用 C API 的 fbuffer 如 我为示例删除了所有错误处理 FILE fp fopen filename ab msgpack packer pk msgpack pa
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • 代码中的.net Access Forms身份验证“超时”值

    我正在向我的应用程序添加注销过期警报 并希望从我的代码访问我的 web config 表单身份验证 超时 值 我有什么办法可以做到这一点吗 我认为您可以从 FormsAuthentication 静态类方法中读取它 这比直接读取 web c
  • Visual Studio 2015 - Web 项目上缺少共享项目参考选项卡

    我从 MSDN 订阅升级到 Visual Studio 2015 因为我非常兴奋地阅读有关共享项目的信息 当我们想要做的只是重用代码时 不再需要在依赖项中管理 21382 个 nuget 包 所以我构建了一个测试共享项目 其中包含一些代码
  • EntityFramework 6.0.0.0 读取数据,但不插入

    我创建了一个基于服务的数据库 folderName gt Add New Item gt Data gt Service based Database文件到 WPF 应用程序中 然后我用过Database First方法并创建了Person

随机推荐

  • Google 搜索 API - 仅返回 4 个结果

    经过大量实验和谷歌搜索 以下 Python 代码成功调用了 Google 的搜索 APi 但只返回 4 个结果 在阅读了 Google 搜索 API 文档后 我认为 start 会返回其他结果 但这并没有发生 有人可以指点一下吗 谢谢 Py
  • 有没有办法确定 Apple Watch 和 iPhone 之间的粗略距离?

    我知道在 Apple Watch 发布之前这个问题可能无法解答 但有人知道是否有办法确定 Apple Watch 和 iPhone 之间的粗略距离 以英尺为单位 目前 WatchKit框架不会向您提供此类信息 因为第三方应用程序的功能仍然相
  • WCF 64 位不工作

    我正在尝试开发一个在 64 位环境中运行的简单 WCF 服务 我在Windows 7下启动VS2010 新解决方案 gt WCF 项目 gt 运行 gt 工作正常 一旦我更改项目的属性以使其在 64 位中编译 运行它就会抛出以下异常 Cou
  • 将多个 csv 文件平均为 r 中的 1 个平均文件

    我有大约 300 个风速 温度 压力等的 csv 文件 每列都是 2007 年到 2012 年的不同时间 每个文件都来自不同的位置 我想将所有文件合并为一个 即所有 300 个文件的平均值 因此 新文件中每个文件的行数和列数都相同 但每个单
  • Android - 清除 Facebook 访问令牌

    我有一个SettingsActivity其中有多种选项 包括查找 Facebook 好友和注销 因此 当用户选择查找她的 Facebook 好友时 她将被发送到另一个活动 我让她使用她的 Facebook 帐户登录并保存她的访问令牌 然后
  • 当容器是超链接时,Flex 图像不会随屏幕尺寸缩小

    有人可以告诉我这是否是 Flexbox 的一个未记录的错误 或者我只是做错了 我有 3 个图像在 div 容器内排成一行 这对人们来说很简单 如果没有任何超链接 所有 3 个图像都会按其应有的方式完美缩小 div style width 1
  • 有没有适用于 Java Swing 的优秀且免费的日期和时间选择器? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 有没有适用于 Java Swing 的优秀且免费的日期和时间选择器 有很多可用的日期选择器 但没有日期和时间选择器 这是迄今为止我遇到的最接近的 寻找日期和时间选择器 Anybody
  • iOS 在 iOS 6 中隐藏标签栏会产生黑条(iOS 6 的修复会破坏 iOS 7!)

    我有一个选项卡式应用程序 在一个选项卡中有一个UIWebView 当我将设备旋转到横向时 我已经制作了UIWebView全屏显示 同时隐藏状态和标签栏 我已经在 iOS 6 中工作了 最初在旋转和隐藏选项卡栏时 它会在选项卡栏所在的位置留下
  • Spring引导redirectAttributes.addFlashAttribute不保留立即重定向中的值

    我有一个实现 GET POST GET 重定向模式的控制器类 我尝试在 POST 请求中使用 addFlashAttribute 并重定向到 GET 但 GET 中的模型对象不包含设置值 这是我的代码 Controller RequestM
  • 如何以编程方式更改 Eclipse 首选项

    应该采用什么方法来更改 Eclipse 首选项 它们存储在
  • 在 C# 中使用正则表达式突出显示单词列表

    我有一些包含缩写的网站内容 我有该网站公认的缩写列表及其解释 我想创建一个正则表达式 它允许我用一些标记替换内容中找到的所有可识别的缩写 例如 内容 This is just a little test of the memb to see
  • 使选定的文本视图字符串变为粗体、斜体、下划线,就像 iOS 的本机“Notes”应用程序一样

    是否有任何帮助可以使选定的文本字符串视图变为粗体 斜体 下划线 就像 iOS 的本机 Notes 应用程序一样 请给我有用的链接 我厌倦了一整天的寻找 非常感谢 我附上了我的代码 使属性字符串粗体和斜体都像iPhone Notes 的本机应
  • java:在 Mac OsX 上禁用 TrayIcon 右键单击

    我正在尝试开发一个由系统托盘图标提供的 Mac OsX 应用程序 因此在第一次尝试使用最简单的代码来实现它后 我注意到 mac osX 10 8 上的每个应用程序托盘图标 系统和用户应用程序 都允许通过左键和右键单击激活相对弹出菜单 但在我
  • 初始化惰性实例时将参数传递给构造函数

    据我所知 如果声明了一个变量Lazy 然后当我们使用Value财产 我需要传递一些参数给它Lazy实例但找不到正确的语法 这不是我的设计 我正在使用 MEF 并且ExportFactory 它返回我Lazy我的零件的实例 我的部件有构造函数
  • 在经典 ASP/VBScript 应用程序中通过 LDAP 访问员工 ID

    我有一个旧的 ASP VBScript 应用程序 我正在维护 升级它 它目前使用旧的 已弃用的方式来收集配置文件信息 如下所示 strNTUser Request ServerVariables AUTH USER strNTUser re
  • 将 TTF 字体添加到 PhoneGap 应用程序

    我遵循了这一点 http forrst com posts Using custom fonts on iPad and iPhone with Phone u2P 我无法在 iPhone 上显示该字体 我不确定的是 在哪里添加 向您的 i
  • 如何使用 __get() 在多级对象属性访问中返回 null?

    如何使用 get 在访问如下情况的多级对象属性中返回 null 例如 这是我的课程 class property public function get name return isset this gt name this gt name
  • 掌握 Javascript Function.bind()

    function def console log this x var f def bind x 777 f prints 777 The bind创建一个函数f这与def 除了在f this被设定为 x 777 是否可以访问该对象f被绑定
  • 将分号分隔符 SQL 拆分为行[重复]

    这个问题在这里已经有答案了 只是想寻求帮助 我试图用分号作为分隔符来分割分隔值 逗号无法替换为分号 因为有些值带有逗号 ID Value 1 A B C D E F 变换为 ID Value 1 A B 1 C 1 D 1 E F 我尝试调
  • 提升精神规则可以参数化吗

    在我的 Boost Spirit 语法中 我希望有一条规则可以做到这一点 规则 noCaseLit no case lit KEYWORD 但对于自定义关键字 我可以这样做 gt gt noCaseLit SomeSpecialKeywor