具有综合和继承属性的深度递归 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 语法(解析器) 的相关文章

  • Qt - QProcess 不工作

    我尝试启动 Internet Explorer 所以我使用下面的代码 QProcess process new QProcess this QString temp C Program Files Internet Explorer iex
  • 为什么这个 Web api 控制器不并发?

    我有一个 Web API 控制器 里面有以下方法 public string Tester Thread Sleep 2000 return OK 当我调用它 10 次 使用 Fiddler 时 我预计所有 10 次调用都会在大约 2 秒后
  • C# 方法重载决策不选择具体的泛型覆盖

    这个完整的 C 程序说明了这个问题 public abstract class Executor
  • 使用 CMake 时如何导出 Emscripten 中的 C 函数

    In 本教程 https emscripten org docs porting connecting cpp and javascript Interacting with code html interacting with code
  • 将类对象放置在向量中?

    我注意到我可以将一个类放置在一个向量中 这是我的程序 我收到以下错误 out blackjack exe blackjack obj blackjack obj error LNK2019 unresolved external symbo
  • Rx.NET 中是否有一个Subject 实现,其功能类似于BehaviourSubject,但仅在值发生更改时才发出?

    有没有Subject https learn microsoft com en us previous versions dotnet reactive extensions hh229699 v vs 103 Rx NET 中的实现在功能
  • 转换 const void*

    我有一个函数返回一个const void 我想用它的信息作为char 我可以将它投射为 C 风格的罚款 char variable但是当我尝试使用reinterpret cast like reinterpret cast
  • 如何在类文件中使用 Url.Action() ?

    如何在 MVC 项目的类文件中使用 Url Action Like namespace 3harf public class myFunction public static void CheckUserAdminPanelPermissi
  • java中如何重新初始化int数组

    class PassingRefByVal static void Change int pArray pArray 0 888 This change affects the original element pArray new int
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • RestSharp获取序列化输出

    我正在寻找一种方法来访问 AddBody 调用的序列化结果 我正在使用内置的 RestSharp 序列化器 例子 class Foo public string FooField void SendRecord var f new Foo
  • 不同 C++ 文件中的相同类名

    如果两个 C 文件具有相同名称的类的不同定义 那么当它们被编译和链接时 即使没有警告也会抛出一些东西 例如 a cc class Student public std string foo return A void foo a Stude
  • 如何使用 x64 运行 cl?

    我遇到了和这里同样的问题致命错误 C1034 windows h 未设置包含路径 https stackoverflow com questions 931652 fatal error c1034 windows h no include
  • 从 C# 使用 Odbc 调用 Oracle 包函数

    我在 Oracle 包中定义了一个函数 CREATE OR REPLACE PACKAGE BODY TESTUSER TESTPKG as FUNCTION testfunc n IN NUMBER RETURN NUMBER as be
  • 在 C 中使用枚举而不是 #defines 作为编译时常量是否合理?

    在 C 工作了一段时间后 我将回到 C 开发领域 我已经意识到 在不必要的时候应该避免使用宏 以便让编译器在编译时为您做更多的工作 因此 对于常量值 在 C 中我将使用静态 const 变量或 C 11 枚举类来实现良好的作用域 在 C 中
  • C++ - 多维数组

    处理多维数组时 是否可以为数组分配两种不同的变量类型 例如你有数组int example i j 有可能吗i and j是两种完全不同的变量类型 例如 int 和 string 听起来您正在寻找 std vector
  • 将函数参数类型提取为参数包

    这是一个后续问题 解包 元组以调用匹配的函数指针 https stackoverflow com questions 7858817 unpacking a tuple to call a matching function pointer
  • 如何在 C# 中创建异步方法?

    我读过的每一篇博客文章都会告诉您如何在 C 中使用异步方法 但由于某些奇怪的原因 从未解释如何构建您自己的异步方法来使用 所以我现在有这段代码使用我的方法 private async void button1 Click object se
  • WPF DataGrid / ListView 绑定到数组 mvvm

    我们假设你有 N 个整数的数组 表示行数的整数值 在模型中 该整数绑定到视图中的 ComboBox Q1 如何将数组 或数组的各个项目 绑定到 DataGrid 或 ListView 控件 以便 当您更改 ComboBox 值时 只有那么多
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的

随机推荐

  • 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 这是一些示例代码 请注意 循环引用 的注释 显然 如果我取消注释这些行 则无法编译