具有综合和继承属性的深度递归 qi 语法(解析器)

2024-02-12

我使用spirit::qi 语法来构造并返回非平凡对象作为其合成属性。问题是我希望语法递归地相互依赖。使用递归很简单rules,但我想要递归grammars.

这是一些示例代码。请注意“循环引用”的注释。显然,如果我取消注释这些行,则无法编译,因为 FooGrammar 和 BarGrammar 对象相互包含。

我可以想到两种方法来达到预期的效果,但我似乎无法让它们与 qi 一起工作:

  1. 让 BarGrammar 保存一个指向 FooGrammar 的(智能)指针。它需要将 FooGrammar 构造为 lit("start_bar") 上的语义操作。但我不知道 qi 的内部结构来知道这是否安全——我是否需要维护自己的显式 FooGrammars 堆栈?什么时候才能安全销毁它们?

  2. BarGrammar 可以将 FooGrammar 作为其 qi::locals 之一。但由于某种原因,如果我尝试将 qi::locals 中的语法传递为继承属性,则无法编译它。

有没有规范的方法来制作递归语法?

.

#include <boost/fusion/include/std_pair.hpp>
#include <boost/optional.hpp>
#include <boost/ptr_container/ptr_vector.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/spirit/include/phoenix_bind.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_object.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/variant.hpp>
namespace phoenix = boost::phoenix;
namespace spirit = boost::spirit;
namespace ascii = spirit::ascii;
namespace qi = spirit::qi;
using ascii::space_type;
using phoenix::ref;
using qi::grammar;
using qi::lit;
using qi::_r1;
using qi::_val;
using qi::lit;
using qi::omit;
using qi::rule;

#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::string;

typedef int Reffy;

struct Foo {
  int foo;
};

struct Bar {
  int bar;
};

template <typename Iterator>
struct BarGrammar;

template <typename Iterator>
struct FooGrammar : grammar<Iterator, Foo(Reffy&), space_type> {
  FooGrammar() : FooGrammar::base_type(foo_) {
    foo_ = lit("start_foo")[_val = phoenix::construct<Foo>()]
      > -bar_(_r1)
      > lit("end_foo");
    ;
  }

  BarGrammar<Iterator> bar_;
  rule<Iterator, Foo(Reffy&), space_type> foo_;
};

template <typename Iterator>
struct BarGrammar : grammar<Iterator, Bar(Reffy&), space_type> {
  BarGrammar() : BarGrammar::base_type(bar_) {
    bar_ = lit("start_bar")[_val = phoenix::construct<Bar>()]
      //> -foo_(_r1)    // CIRCULAR REFERENCE
      > lit("end_bar");
  }

  //FooGrammar<Iterator> foo_;    // CIRCULAR REFERENCE
  rule<Iterator, Bar(Reffy&), space_type> bar_;
};

int main(int argc, char *argv[]) {
  Reffy reffy(0);

  FooGrammar<string::iterator> foog;
  rule<string::iterator, space_type> top_rule = omit[ foog(ref(reffy)) ];

  string input("start_foo start_bar end_bar end_foo");
  string::iterator begin = input.begin();
  string::iterator end = input.end();
  if(qi::phrase_parse(begin, end, top_rule, ascii::space)) {
    cout << "passed" << endl;
  } else {
    cout << "failed" << endl;
  }

  return 0;
}

提前致谢!!


我在 qi 中实现 SQL 解析器时遇到了同样的问题。我对语句、字段、表等有单独的语法,但例如,字段和表有时也可以是语句(子查询)。就我而言,我是这样解决问题的:

顶层语法(您总是开始解析的语法)持有指向所有子语法的共享指针。顶部语法的构造函数将创建所有子语法的实例,并将它们彼此的实例传递为弱指针。这样,每个语法只创建一个实例。没有圆形的shared_ptr谢谢weak_ptr。所以基本上,顶层语法拥有所有子语法,并且只是相互传递指针。

所以在你的情况下,我会创建一个TopGrammar类,有自己的FooGrammar and BarGrammar。一旦它们被构造出来,就将它们互相传递指针。并且在TopGrammar的开始规则只是调用FooGrammar.

Since TopGrammar拥有所有子语法,你确信它们的寿命足够。

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

具有综合和继承属性的深度递归 qi 语法(解析器) 的相关文章

  • 如何使用 C# 中的参数将用户重定向到 paypal

    如果我有像下面这样的简单表格 我可以用它来将用户重定向到 PayPal 以完成付款
  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现

随机推荐

  • h1之后是否有必要使用H2

    如果文本太小 是否必须在 h1 之后使用 H2 那么我们可以在 h1 之后使用 h4 吗 它可以访问吗 从技术上讲 您可以使用这些的任意组合 从语义上讲 使用通用顺序是明智的 如果字体太小 可以使用 CSS 来更改 与标签h1 h6您赋予标
  • SQL Server - 使用递归外键进行级联 DELETE

    我花了很多时间试图找出如何实现删除时级联SQL Server 上的递归主键已经有一段时间了 我已经阅读了有关触发器 创建临时表等的内容 但尚未找到适合我的数据库设计的答案 这是一个用于演示目的的老板 员工数据库示例 TABLE employ
  • Flutter - 失败:构建失败并出现异常。 - 无法启动守护进程。 - Android Studio - VSCode

    每当我尝试使用 flutter run v 运行 flutter 应用程序时 都会收到以下错误 如果我不使用终端 只需单击 运行 则正在运行的 gradle 任务将继续运行 并且不会发生任何情况 I tried 在 gradle prope
  • Angular 2 ng-bootstrap 模态

    我使用组件而不是模板在应用程序中打开模态 然后我需要将对象模型传递给模态组件 问题是打字稿给出了 modalRef componentInstance 不作为属性存在的错误 我完全复制了示例表单演示页面 但再次给出同样的错误 并且永远不会在
  • 为什么有些语句在线程中运行时执行失败?

    我无法理解程序的行为这段代码示例 http rustbyexample com channels html use std comm use std thread Thread static NTHREADS uint 3 fn main
  • 服务器端处理与客户端处理+ajax?

    寻找一些一般性建议和 或想法 我正在创建一个我认为更像是一个网络应用程序而不是网页的东西 因为我想让它像一个 Gmail 应用程序 您可以让页面整天打开 同时将更新 推送 到页面 对于有兴趣我正在使用彗星编程技术 我以前从未创建过如此丰富的
  • 尝试将字符串转换为 MarketDataIncrementalRefresh

    我有一个文本文件FIX messages 所有这些和 MarketDataIncrementalRefresh 类型 X 我正在尝试找到一种使用的方法QuickFIX in C 创造MarketDataIncrementalRefresh消
  • 当用户从其他选项卡返回时重新加载页面

    我在某种重视更新的网站上工作 为此 当用户从另一个选项卡切换到网站的选项卡时 我需要刷新页面 有没有办法用 JavaScript jQuery 做到这一点 我知道location reload 用于刷新页面 但我不知道如何告诉 JavaSc
  • Three.js 2D 文本精灵标签

    我是 Three js 的新手 并且有一些属于 2D 文本的问题 我想要的是 我想要一些标签 例如 x y 和 z 轴 标签应始终面向相机 也许稍后它们应该只在悬停时才被显示 但那是另一个话题 我的问题是什么我找到了这个教程 这正是我想要达
  • 在 MongoDB GROUP BY 中执行 HAVING 的正确方法是什么?

    对于 SQL 中的这个查询 查找重复项 SELECT userId name FROM col GROUP BY userId name HAVING COUNT gt 1 我在 MongoDB 中执行了这个简单的查询 res db col
  • 如何自动读取 x86 ASM 中的值?

    我知道如何在 x86 ASM 中自动写入一个值 但我该如何阅读呢 LOCK 前缀不能与 mov 一起使用 为了增加价值 我正在做 lock inc dword ptr Counter 如何以线程安全的方式读取 Counter 正如我向你解释
  • 仅在需要时注入模块依赖项(如插件) AngularJS

    我有 2 页 我不使用angular s routing 此限制 在其中之一我想使用该指令ui grid http ui grid info docs tutorial 101 intro就像这个演示一样 var app angular m
  • std::string::compare(const char*) 可以抛出异常吗?

    这是超载 4 here https en cppreference com w cpp string basic string compare 在 异常 部分 重载 2 3 5 6 具有 pos1 和 或 pos2 参数 被命名为 thro
  • 如何使用服务帐户通过 .NET C# 访问 Google Analytics API V3?

    我意识到这个问题之前已经被问过 但几乎没有示例代码 所以我再次询问 但至少有一点方向 经过几个小时的搜索 我想出了以下部分实现 namespace GoogleAnalyticsAPITest Console using System Se
  • 如何设置目录权限

    我跟着SOlink https stackoverflow com questions 4272406 wix how to set permissions for folder and all sub folders为文件夹添加权限 但是
  • 测试 DAO 时出错:sun.reflect.generics.reflectiveObjects.TypeVariableImpl 无法转换为 java.lang.Class

    我对 Spring Hibernate 非常陌生 我正在运行测试来查看我的 DAO 是否正常工作 我收到以下错误 在谷歌搜索时会产生很多不同的答案 主要是拼写错误 我已经检查过 我希望你能帮我解决这个问题 java lang Illegal
  • PHP 警告:DOMDocument::loadHTML():属性 alt 重新定义

    我在 CentOS 上运行以下代码 roster utils gt getContentCURL http exporter nih gov ExPORTER Catalog aspx docmp new DOMDocument docmp
  • 如何在没有DLL的情况下编译SDL程序并运行它

    是否可以将SDL库程序编译为exec并在没有 sdl dll 的情况下运行它 例如 假设我编写了 sdl 程序 它可以工作 但问题是要在 Windows 上运行该程序 我需要在同一文件夹或系统文件夹中包含 sdl dll 是否可以编译它 以
  • Spring基于注解的DI vs xml配置?

    最近 在我们的团队中 我们开始讨论在代码中使用 spring 注释来定义 spring 依赖项 目前我们正在使用 context xml 来定义我们的依赖项 您能给我一些关于这两种方法的线索吗 什么时候使用一种方法更好 编辑 我知道这对于一
  • 具有综合和继承属性的深度递归 qi 语法(解析器)

    我使用spirit qi 语法来构造并返回非平凡对象作为其合成属性 问题是我希望语法递归地相互依赖 使用递归很简单rules 但我想要递归grammars 这是一些示例代码 请注意 循环引用 的注释 显然 如果我取消注释这些行 则无法编译