消除解析器精神规则中的左递归 x3

2023-11-23

我目前陷入了一条规则,我试图使用 boostspirit x3 来解析。 这是我要解析的 EBNF(使用 Spirit 中的 % 运算符作为列表):

type ::= class_type | lambda_type

lambda_type ::= more_arg_lambda | one_arg_lambda

more_arg_lambda ::= "(", type%",", ")", "=>", type

one_arg_lambda ::= type, "=>", type  <- here is the left recursion

class_type ::= identifier%"::", ["<", type%",", ">"]

使用 boostspirit x3,我尝试解析为以下结构/变体:

typedef x3::variant<
        nil,
        x3::forward_ast<LambdaType>,
        x3::forward_ast<ClassType>
    > Type;

struct LambdaType {
        std::vector<Type> parameters_;
        Type return_type_;
    };
struct ClassType{
        std::vector<std::string> name_; 
        std::vector<Type> template_args_;
    };

我有一个我目前正在尝试的活生生的例子here,这不起作用,我还尝试更改变体解析器的顺序,这没有帮助,我得到无尽的递归,或者不是我期望(或希望)的行为。

有人可以帮我调试这个解析器吗?

我认为我在解析器中有某种​​类型的左递归,是否有机会避免这种情况,或者没有机会重写语法? 这个语法可以用 boost Spirit x3 解析吗?

EDIT:

我设法消除了这个语法中的左递归。 现在语法如下:

type ::= class_type | lambda_type

    lambda_type ::= more_arg_lambda | one_arg_lambda

    more_arg_lambda ::= "(", type%",", ")", "=>", type

    one_arg_lambda ::= class_type, "=>" type, A
                       | "(", type%",", ")", "=>", type, "=>", type, A

    class_type ::= identifier%"::", ["<", type%",", ">"]

    A::= "=>", type, A | eps

但现在有下一个问题,如何让 boostspirit x3 将这些规则解析为给定的结构?我无法想象是什么A or the one_arg_lambda解析器现在正在返回,one_arg_lambda解析器应该解析成LambdaType结构,但取决于什么A解析为现在不一定是这样。所以现在的问题是,如何获得一个非左递归解析器,它使用 boost-spirit-x3 将上面的语法解析为我的结构?

EDIT II:

我想=>是右结合的,所以foo => bar => baz => baham
means foo => (bar => (baz => bahama))


我解决了这个问题,而且解决方案非常简单。 诀窍是改变语法,所以我没有左递归,并且它很好地解析到我的结构中。

所以我改变了

type ::= class_type | lambda_type

lambda_type ::= more_arg_lambda | one_arg_lambda

more_arg_lambda ::= "(", type%",", ")", "=>", type

one_arg_lambda ::= type, "=>", type  <- here is the left recursion

class_type ::= identifier%"::", ["<", type%",", ">"]

to

type ::= class_type | lambda_type

lambda_type ::= more_arg_lambda | one_arg_lambda

more_arg_lambda ::= "(", type%",", ")", "=>", type

one_arg_lambda ::= class_type, "=>", type  <- here is the magic trick

class_type ::= identifier%"::", ["<", type%",", ">"]

第二个语法描述了完全相同的语言,但没有左递归,并且没有改变语法的结构。 这实际上是运气,显然并不适用于所有语法。

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

消除解析器精神规则中的左递归 x3 的相关文章

  • 使用 std::packaged_task/std::exception_ptr 时,线程清理程序报告数据争用

    我遇到了线程清理程序 TSan 的一些问题 抱怨某些生产代码中的数据争用 其中 std packaged task 通过将它们包装在 std function 中而移交给调度程序线程 对于这个问题 我简化了它在生产中的作用 同时触发 TSa
  • 在 C++ 中使用 matlab 结构(matlab 函数调用的返回值)(由 matlab 编译器生成的库)

    你好 我有一个相当简单的 matlab 函数 例如 function MYSTRUCT myfunc MYSTRUCT prop1 test MYSTRUCT prop2 foo MYSTRUCT prop3 42 end 我用 matla
  • 未提供参数时如何指定 C# System.Commandline 行为?

    在我的控制台应用程序中 当未提供控制台参数时 将执行我指定列表 在本例中为参数 3 的任何处理程序 调用该处理程序时 布尔参数设置为 false 但对我来说 根本不调用它更有意义 如何防止这种情况发生并显示帮助文本 using System
  • C中的malloc内存分配方案

    我在 C 中尝试使用 malloc 发现 malloc 在分配了一些内存后浪费了一些空间 下面是我用来测试 malloc 的一段代码 include
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 为什么 Google 测试会出现段错误?

    我是 Google Test 的新手 正在尝试提供的示例 我的问题是 当我引入失败并设置GTEST BREAK ON FAILURE 1 或使用命令行选项 GTest 将出现段错误 我正在考虑这个例子 https code google c
  • 在 C 中初始化变量

    我知道有时如果你不初始化int 如果打印整数 您将得到一个随机数 但将所有内容初始化为零似乎有点愚蠢 我问这个问题是因为我正在评论我的 C 项目 而且我对缩进非常直接 并且它可以完全编译 90 90 谢谢 Stackoverflow 但我想
  • 在一个平台上,对于所有数据类型,所有数据指针的大小是否相同? [复制]

    这个问题在这里已经有答案了 Are char int long 甚至long long 大小相同 在给定平台上 不能保证它们的大小相同 尽管在我有使用经验的平台上它们通常是相同的 C 2011 在线草稿 http www open std
  • 我可以使用 moq Mock 来模拟类而不是接口吗?

    正在经历https github com Moq moq4 wiki Quickstart https github com Moq moq4 wiki Quickstart 我看到它 Mock 一个接口 我的遗留代码中有一个没有接口的类
  • DbContext 和 ObjectContext 有什么区别

    From MSDN 表示工作单元和存储库模式的组合 使您能够查询数据库并将更改分组在一起 然后将这些更改作为一个单元写回存储 DbContext在概念上类似于ObjectContext 我虽然DbContext只处理与数据库的连接以及针对数
  • 如何检测表单的任何控件的变化?

    如何检测 C 中表单的任何控件的更改 由于我在一个表单上有许多控件 并且如果表单中的任何控件值发生更改 我需要禁用按钮 我正在寻找一些内置函数 事件处理程序 属性 并且不想为此创建自定义函数 不 我不知道任何时候都会触发任何事件any控制表
  • 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

    我有一个可在 32 位和 64 位处理器上运行的 C 应用程序 我试图枚举给定系统上所有进程的模块 当尝试从 64 位应用程序枚举 32 位进程模块时 这会出现问题 Windows 或 NET 禁止它 我认为如果我可以从应用程序内部重新启动
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • 如何禁用 fread() 中的缓冲?

    我正在使用 fread 和 fwrite 读取和写入套接字 我相信这些函数用于缓冲输入和输出 有什么方法可以在仍然使用这些功能的同时禁用缓冲吗 Edit 我正在构建一个远程桌面应用程序 远程客户端似乎 落后于服务器 我不知道可能是什么原因
  • 如何设置 log4net 每天将我的文件记录到不同的文件夹中?

    我想将每天的所有日志保存在名为 YYYYMMdd 的文件夹中 log4net 应该根据系统日期时间处理创建新文件夹 我如何设置它 我想将一天中的所有日志保存到 n 个 1MB 的文件中 我不想重写旧文件 但想真正拥有一天中的所有日志 我该如
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • 将 MQTTNet 服务器与 MQTT.js 客户端结合使用

    我已经启动了一个 MQTT 服务器 就像this https github com chkr1011 MQTTnet tree master例子 该代码托管在 ASP Net Core 2 0 应用程序中 但我尝试过控制台应用程序 但没有成
  • 调用堆栈中的“外部代码”是什么意思?

    我在 Visual Studio 中调用一个方法 并尝试通过检查调用堆栈来调试它 其中一些行标记为 外部代码 这到底是什么意思 方法来自 dll已被处决 外部代码 意味着该dll没有可用的调试信息 你能做的就是在Call Stack窗口中单
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的

随机推荐

  • v6 中可选参数的替代方法

    在 v5 中 我们可以添加尾随 路由可选参数 但与 v6 一样 对相同参数的支持已被删除 那么编写以下代码的替代方法是什么
  • 如何使用Log4Net实现日志文件自动归档

    我想以这样的方式配置 log4net 以便自动归档前一天的所有日志 是否有可能在 Log4Net 中自动存档以前的日志 我只想使用配置来执行此操作 而不使用任何第三方库 如 Sharplibzip 编写任何代码来创建存档 通过归档还要添加一
  • C# 正确格式化(缩进、对齐)C#

    我们有一个代码生成器munges给定数据库的模式 用于自动化我们内部的 n 层架构 输出是各种 C 部分类 每个文件一个 在处理所有字符串的代码中 我们尝试尽可能地控制缩进和格式 但当您在 Visual Studio 中打开文件时 格式总是
  • 逐行读取文件并分割值

    我需要读取一个txt文件 其组成如下 AA 1000 AA 320009 999999 AA 1011 AA 320303 111111 对于每个读取的行 我需要用 将其分割以到达第一回合 test 0 AA 1000 AA 320009
  • 调用 savechanges 时实体框架复制

    我首先使用entityframework 5代码 我有一个这样的模型 class Product public Product Fabrics new BindingList
  • 如何在Spring 3.0应用程序中配置Hibernate统计信息?

    我们如何配置以便在基于 Spring MVC 的 Web 应用程序中通过 JMX 获取 Hibernate 统计信息 有没有更好的方法来跟踪 Hibernate 性能 Set hibernate generate statistics to
  • Cakephp 2.0 使用电子邮件而不是用户名进行身份验证

    在我看来我有 在我的应用程序控制器中 public components array
  • ZF2中同一模块下的多个命名空间

    我在同一模块下配置多个命名空间 类时遇到问题 例如 我有一个名为 Account 的模块 其中我想包含所有与帐户相关的类 公司 accounts 用户 users 外部 api api 等 模块结构看起来像这样 Account Module
  • Base64 图像不显示在 RDLC 报告的渲染 PDF 上

    我正在尝试使用参数 CustomerSign 在 RDLC 报告中 我正在从报告中渲染 PDF 文件 并且看到 PDF 文件 我已配置图像属性如下 选择图像源 Database 使用该字段 Convert FromBase64String
  • 为什么 Objects.hash() 对于相同的输入返回不同的值?

    我运行了以下脚本 java 它给了我奇怪的结果 有谁可以帮忙解释一下吗 import java util Objects import org apache log4j Logger public class CacheTester pri
  • -D MACRO 和 #define MACRO 的优先级

    如果我有一个C文件 foo c 虽然我已经给出了 DMACRO 1作为编译的命令行选项 但是 如果在头文件中我也有 define MACRO 2 其中哪一个会优先 我正在假设您正在做什么 但是如果您想从命令行为该宏提供非默认值 请尝试对宏定
  • 多线程访问文件

    我们有一个多线程java程序 多个线程将写入一个文件 一个线程将从该文件中读取 我正在寻找一些设计想法 是否需要同步 文件通道理论上是线程安全的 来自javadoc 文件通道可供多个并发线程安全使用 这 close 方法可以随时调用 具体由
  • 读取套接字时Java中断线程[重复]

    这个问题在这里已经有答案了 可能的重复 如何立即终止阻塞在套接字IO操作上的线程 我有一个客户端在线程中运行 想要从 Java 中的套接字读取数据 但在阅读时 也许我想杀死线程 所以我interrupt它 但是套接字的读取方法会抛出异常吗I
  • 如何在 jQuery 中循环遍历数组?

    我正在尝试循环遍历一个数组 我有以下代码 var currnt image list 21 32 234 223 var substr currnt image list split array here 我正在尝试从数组中获取所有数据 有
  • C# - 捕获鼠标光标图像

    背景 我正在编写一个屏幕捕获应用程序 我的代码基于此项目 http www codeproject com KB cs DesktopCaptureWithMouse aspx display Print 请注意 代码还捕获了鼠标光标 这对
  • PHP iOS AES 加密

    我在尝试使用 AES 加密在 PHP 和我的 iOS 应用程序之间进行通信时遇到了问题 到目前为止 我已经考虑了两种实现方法 第一个是使用 OpenSSL 在 iOS 方面 我以模仿此处显示的代码的方式实现 http saju net in
  • 如果向下滚动经过它,则有一个 div 紧贴在屏幕顶部[重复]

    这个问题在这里已经有答案了 我有一个 div 当我的页面首次加载时 它距离顶部大约 100px 它包含页面的一些按钮等 当用户滚动经过它时 我希望 div 跟随 用户 因为它附加到屏幕顶部 当用户返回到页面顶部时 我希望它回到原来的位置 V
  • 如何使用 CSS 删除没有 html 标签的字符串

    我需要删除没有的字符串html tag 例如 div class A a href class link keep this a and i want to remove this div 我可以只使用 css 来做到这一点吗 也许你可以使
  • Eclipse + Maven + JavaServer Faces -> ClassNotFoundException:StartupServletContextListener

    Summary 当我尝试从 Eclipse 中 在 Tomcat 7 0 上 运行 JSF 2 0 应用程序时 出现以下异常 Problem SEVERE Error configuring application listener of
  • 消除解析器精神规则中的左递归 x3

    我目前陷入了一条规则 我试图使用 boostspirit x3 来解析 这是我要解析的 EBNF 使用 Spirit 中的 运算符作为列表 type class type lambda type lambda type more arg l