我如何扩展 boost Spirit 语法

2024-01-12

问题是我编写了一个对某项任务有用的语法,但现在 任务发生了变化,我需要定义新的规则。

但我不想修改我已有的语法而不是我想要的 喜欢创建一个新的语法,使用我现有的语法,无需代码 重复,所以我只需要定义我需要的新规则。我尝试过一些东西 像这样,但不起作用:

struct New_grammar : Old_grammar<Iterator, Skipper>    
{
    New_grammar() : New_grammar::base_type(Command_list)
    {
        Command_list %= qi::eps >> + Commands;
        Comandos %= oneoldCommand | NewCommand;
        NewCommand = ("NewCommand" >> stmt)[qi::_val = phoenix::new_<NewCom>(qi::_1)];
    }
    // this is a new rule I need:
    qi::rule<Iterator, Commands*(), qi::locals<std::string>, Skipper> NewCommand; 
};

基本上Old_grammar是我已有的语法,我只想添加 我需要的新规则New_grammar并且能够使用规则和 我已经在的语法Old_gramar.


我不会因为继承而使事情变得复杂。组合通常就足够了,并且不会混淆 qi 解析器接口。

我绘制了一个关于如何完成版本控制语法的小草图。假设旧语法:

template <typename It, typename Skipper>
struct OldGrammar : qi::grammar<It, Skipper, std::string()>
{
    OldGrammar() : OldGrammar::base_type(mainrule)
    {
        using namespace qi;
        rule1 = int_(1); // expect version 1
        rule2 = *char_;  // hopefully some interesting grammar
        mainrule = omit [ "version" > rule1 ] >> rule2;
    }
  private:
    qi::rule<It, Skipper, std::string()> mainrule;
    qi::rule<It, Skipper, int()>         rule1;
    qi::rule<It, Skipper, std::string()> rule2;
};

正如您所看到的,这是相当严格的,要求版本恰好为 1。然而,未来发生了,发明了新版本的语法。现在,我要添加

friend struct NewGrammar<It, Skipper>;

到旧的语法并开始实现新的语法,如果需要的话,新的语法会慷慨地回退到旧的语法:

template <typename It, typename Skipper>
struct NewGrammar : qi::grammar<It, Skipper, std::string()>
{
    NewGrammar() : NewGrammar::base_type(mainrule)
    {
        using namespace qi;
        new_rule1 = int_(2); // support version 2 now
        new_start = omit [ "version" >> new_rule1 ] >> old.rule2; // note, no expectation point

        mainrule = new_start 
                 | old.mainrule;  // or fall back to version 1 grammar
    }
  private:
    OldGrammar<It, Skipper> old;
    qi::rule<It, Skipper, std::string()> new_start, mainrule;
    qi::rule<It, Skipper, int()>         new_rule1;
};

(我没有尝试让它与继承一起工作,尽管它很可能也应该工作。)

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

我如何扩展 boost Spirit 语法 的相关文章

随机推荐

  • WCF REST 服务中的 CORS 支持

    我有一个在 Windows 服务中托管的 WCF REST 服务 我想发送 Access Control Allow Origin HTTP 标头 定义为CORS http www w3 org TR cors 与每一个回应 我尝试的解决方
  • 尽管尝试了所有方法,SMSManager仍返回RESULT_ERROR_GENERIC_FAILURE

    我正在尝试在我的应用程序中创建一项功能 可以在后台向多个联系人发送短信 我在用SMS Manager API做同样的事情 然而 每次RESULT ERROR GENERIC FAILURE返回 我读了很多关于堆栈溢出的类似帖子 并尝试了所有
  • 阻止浏览器中的 ctrl+z

    I used the code sample below to disable ctrl c and ctrl v and it works I used similar mechanics to disable ctrl z undo i
  • 将“记住我”和复选框对齐在同一行(Devise 的 CSS 问题)

    我正在使用 Devise 复选框位于 记住我 下方 这是 jsfiddle 上的 HTML 代码http jsfiddle net icyborg7 8zxyz http jsfiddle net icyborg7 8zxyz 这是标准设备
  • XML 及其在数据库中的应用

    什么是 XML 以及它如何在数据库中使用 如果这看起来像是一项家庭作业 那么它确实是 数据库通常用于为不想将其序列化为实际数据库模式的应用程序存储 XML 块 但一般来说 XML不用于数据库 这意味着数据库是用来存储数据的 而 XML 实际
  • 即使“Pip 中已满足要求”,也未找到 Python 模块

    在 OS X 中编写一些 python 它说我用 pip 安装了几个包 ImportError 没有名为 requests 的模块 运行 pip install 请求时 gt sudo H pip install requests Requ
  • .NET 矩形数组:如何循环访问?

    基本上你有两种方法可以做到这一点 for int x 0 x lt UPPER X x for int y 0 y lt UPPER Y y arr1 x y get value arr2 y x get value 唯一的区别是在内循环中
  • 用于过滤项目列表的 Lambda 表达式

    我有一个项目列表列表 我想知道是否有人可以帮助我使用 lambda 表达式来过滤此列表 我的清单如下 List
  • 为什么 PendingIntent 不发回我的 Intent 自定义 Extras 设置?

    这个问题在某种程度上与我寻找的问题有关在 startActivityForResult 中获取额外内容 https stackoverflow com questions 2859831 startactivityforresult and
  • iPhone - JSON 解析中的转义字符问题

    I am using objective C JSON parsing library and facing some issue My web service returns the JSON response My Parser fai
  • 使用 Angular 和 Express 登录用户的正确方法是什么?

    我正在构建一个简单的网站 我想让用户使用 Facebook 登录 然后根据他们是否登录显示包含自定义项目的页面 即 如果未登录 它会显示一些信息 但如果登录 它会根据用户信息显示其他信息 我正在使用 Passportjs Facebook
  • 在 Tomcat 中的上下文之间转发请求

    我希望能够使用 Tuckey URLRewrite 过滤器在 Tomcat 中进行跨上下文请求转发 例如 我希望能够使用 SEO 用户友好的 URL 路由传入请求 例如http example com group elements 3002
  • C# try {} catch {}

    您好 感谢您的阅读 我是编程以及 C 和套接字编程的新手 在我的代码中 我尝试捕获问题以在我的应用程序中提供容错能力 下列 catch ArgumentNullException e OnNetworkEvents eventArgs ne
  • SQL Server 2016 始终加密已发布 IIS 超时

    当我尝试将我的 asp net mvc 应用程序发布到我的本地 pc iis 并启用 始终加密 时 我遇到了奇怪的问题 当我尝试在本地 IIS 非快速 上使用 EF6 访问数据库时 我的应用程序保持超时 但是 如果我尝试使用 Visual
  • JavaScript 预加载图像

    我正在尝试预加载图像 以下代码有效 document ready function member photos img each function var id this attr data id var file this attr da
  • php中if条件满足后如何重定向到另一个页面? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我使用了 php 代码来重定向到另一
  • 输入元素中 textContent 的用途是什么?

    在 DOM 中提供一个输入元素 它确实有一个textContent财产连同value 众所周知 输入的值就是文本框中显示的值 并且该元素不能有任何子元素 即
  • 使用Java流合并一对“int”数组[重复]

    这个问题在这里已经有答案了 这一页 https www javatpoint com how to merge two arrays in java展示了如何组合两个数组Integer对象放入数组中Object对象 Integer firs
  • Microsoft SQL Server Express:不再支持此版本的安装程序

    我正在尝试安装 Microsoft SQL Server 2019 Express 但我不断遇到上述错误消息 我最初在尝试安装时遇到了一条单独的错误消息 无法下载所需的文件 我按照以下线程中的说明进行操作 这解决了最初的问题 但现在出现了新
  • 我如何扩展 boost Spirit 语法

    问题是我编写了一个对某项任务有用的语法 但现在 任务发生了变化 我需要定义新的规则 但我不想修改我已有的语法而不是我想要的 喜欢创建一个新的语法 使用我现有的语法 无需代码 重复 所以我只需要定义我需要的新规则 我尝试过一些东西 像这样 但