BNF 可以处理远期消费吗?

2024-04-29

最近我发现了 python 模块pyparsing,一个通过编写来解析数据的绝佳工具grammar,而不是解析器。我对上下文无关语法的概念很陌生,所以请纠正这个问题中的任何错误假设。

Pyparsing 可以实现 BNF (巴科斯-诺尔范式 http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form) 上下文无关语法。这个文法可以是递归的,但是它能有前瞻功能吗?自从我偶然发现这个问题以来,我一直想知道这个问题的答案这个问题 https://stackoverflow.com/questions/9898984/parsing-xdot-draw-attributes-with-pyparsing。让我给你举一个具体的例子。考虑字符串:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

让语法看起来像这样:

<number> :: __<digit>__
<block>  :: <number>(x) (<number> <number> <number> .... x times)

即读取第一个数字令牌,将其另存为x然后消费下一个x数字并将它们分组在一起。解析后的行应如下所示:

 [[1, 2], [3, 4, 5, 6], [7, 8, 9, 10, 11, 12, 13, 14], [15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]]

我写了一个简单的 python MWEnot使用 pyparsing 所以很清楚我想要做什么:

A = range(1,31)

B, sub_b = [], []
consume  = 0

for a in A:
    if consume: 
        sub_b.append(a)
        consume -= 1
    else:
        if sub_b: B.append(sub_b)
        sub_b = [a,]
        consume = a
B.append(sub_b)
print B

两个(相关的)问题:这可以用 BNF 上下文无关语法来完成吗?如果是/否我该怎么做pyparsing?


在上下文无关语法中,或者在常规语法中,不存在参数化大小这样的东西。像你这样的数字参数consume不是CFG模型的一部分,可以证明用不同的方式得到效果是不可能的。您可以为任何内容编写作品fixed但是,您可以为长度为 1、长度 2、长度 3 等的块编写产生式:

<block3> :: <number> <number> <number>

或者,类似地,将长度作为前缀甚至后缀进行匹配:

<block3a> :: 3 <number> <number> <number>
<block3b> :: <number> <number> <number> 3

因此,要做你想做的事,你只需要一个包含此类规则的语法,对于所有N你可能需要。

给定的 CFG 将仅包含有限数量的此类产品。从数学上来说,编写一个可以处理无限参数化大小的 CFG(以 BNF 或任何其他形式)是不可能的,无论是作为前缀还是作为后缀。在实践中,您也许可以根据需要使用新作品动态更新您的 CFG。例如,读取一个数字N并创建一个规则blockN对于您的语法(如果尚不存在)。但没有single可以捕获无界参数化大小的 CFG。

Edit,因为您还询问了上下文相关语法:那仍然不行。问题在于整数运算的使用,而不是语法的类。Any乔姆斯基层次结构上的形式语言是根据有限数量的符号(标记)来定义的,并且由于整数有无限多个,因此不能为它们分配不同的含义(请注意,您的解析过程依赖于整数算术)。

如果您要将长度预处理为包含尽可能多的星星的序列(* * * 4 7 10),CFG 解析器很简单:

<group> :: * <group> <number>
<group> :: * <number>

这就是所谓的a^n b^n语言。您还可以使用表示“十”等的符号。但是如果没有预处理,唯一的解决方案(以及您的程序或图灵机在实践中所做的)就是解释语法中的数字符号。例如,将“21”解析为十十一。我怀疑这可以在 CFG 中完成(问题是处理任意长的数字,而没有针对数百万、数十亿等的单独规则),但我不太确定。不管怎样,它只是作为一种学术练习才有趣,因为使用实整数要容易得多。我确信人们已经研究了带有整数的形式语言的属性,但我不能对此说什么。

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

BNF 可以处理远期消费吗? 的相关文章

随机推荐

  • 如何避免动态图中的“堆指针意大利面条”?

    一般问题 假设您正在编写一个由图组成的系统 以及可以根据相邻节点的配置激活的图重写规则 也就是说 您有一个在运行时不可预测地增长 收缩的动态图 如果你天真地使用malloc 新节点将被分配在内存中的随机位置 经过足够的时间 你的堆将变成一个
  • Lombok 插件与 2018.1 Intellij Idea 不兼容

    现在我看到 Intellij Idea 更新窗口的概念是 发现插件与新版本不兼容 Lombok 插件 有没有办法解决这个问题 或者我应该等到 lombok 插件团队解决兼容性问题 以下是适合我的解决方案 更新intellij idea 我使
  • 使用 Facebook 登录 Angularfire 未收到扩展权限

    在升级到 Angularfire 0 9 之前我已经完美地工作了 我想从 Facebook 请求用户的电子邮件地址 Facebook 已允许我向我的用户索取此信息 我正在使用下面的代码登录 Facebook 一切都完美地接受它不要求用户的电
  • AngularJS 条件 ng-disabled 不会重新启用

    给定一个有条件禁用的文本输入字段 使用ng disabled truthy scope variable AngularJS 禁用该字段第一次范围变量被伪造 但不会在后续更改中启用它 结果 该字段保持禁用状态 我只能假设出了问题 但控制台日
  • 由于使用 Bulma 和 Buefy (nuxt-buefy) 时 PostCSS 出现问题,无法构建 Nuxt

    使用以下配置 一切正常npm run dev 但是当我们这样做时npm run build 有一个错误 assets scss main scss 中的错误 node modules nuxt postcss8 node modules c
  • 解释暴力算法[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何从下到上显示垂直进度条

    我需要帮助 当 window onload 时 我怎样才能制作进度条 它必须从下到上填充 在这段代码中它的工作原理相反 function move var elem document getElementById myBar var hei
  • 这个结构 (int) { 1 } 是如何调用的?

    构造如何 int 1 用C调用 猜测是 匿名常量 但这在谷歌上没有显示出任何帮助 作为旁注 您可以使用此构造来告诉 ioctl 您想要使用值为 1 的变量 ioctl int 1 它被称为 复合文字 http drdobbs com 184
  • R Plotly 为条形图设置自定义颜色

    我有一个plotly我的 Shiny 应用程序中的条形图 我想在生成的条形图中设置每列的特定颜色 Here s some reproducible data df data frame Month c Jan Feb Mar Apr May
  • Obj-C 中的错误:预期标识符或“(”

    我正在尝试制作一个带有按钮 得分计数器和计时器的简单应用程序 但出现了一些错误 import
  • 将文本传递给可能包含单引号的 JavaScript 函数

    我有一个动态创建的链接 如下所示 a href Edit a 使用编辑功能 然后获取传入的值并将其放入雅虎富文本编辑器中 除非传递的文本中有单引号 否则这种方法效果很好 明显的问题是链接看起来像这样 a href Edit a 对我能做什么
  • dispatch_time 和dispatch_walltime 之间有什么区别?在什么情况下最好使用其中之一?

    我知道dispatch time是根据设备时钟的时间 如果设备进入睡眠状态 时钟也会睡眠 另一方面dipatch walltime是根据挂钟的时间 它永远不会睡觉 我的问题是 在不同情况下使用其中一种或另一种 在性能方面或其他方面有什么区别
  • 产生独特的价值

    我想创建一个C程序生成 0 到 999999 之间的数字 请记住生成的数字不应包含任何重复的数字 例如 123 是一个可接受的值 但不是 121 as the 1 被重复 我已经找到了其他程序代码来检查整数是否有重复的数字 检查整数是否有重
  • 如何调用 less.js 函数

    我什至不太确定如何问这个问题 LESS CSS框架包含几个操作颜色的函数 我想知道如何自己调用这些函数来修改颜色 问题是这些函数位于另一个函数内部并定义如下 function tree tree functions darken funct
  • 将多个堆栈导航器中常见的所有屏幕放在哪里? - 反应导航 v5

    以下是我的应用程序导航器的层次结构 appNavigator 底部选项卡导航器 feed 堆栈导航器 后详细信息屏幕 页面详细信息屏幕 个人资料详情屏幕 其他屏幕 通知 堆栈导航器 个人资料详情屏幕 页面详细信息屏幕 发布详情屏幕 其他屏幕
  • 根据列标题将数据从一个工作簿转移到另一个工作簿

    我下面的代码将列值从一个特定工作簿 Activeworkbook 列 O AH 和 I 转置到另一个工作簿 loader file xls 列 A B C 它非常适合我的需求 Sub PullTrackerInfo Pull info fr
  • 如何使用开放的XML SDK基于C#中每行的列读取xlsx?

    我正在尝试使用 open xml sdk 读取一些 xlsx 文件 但我真的很难找到任何好的示例 我想要做的是读取整个 XLSX 文件并循环所有行并从我指定的列中提取单元格值 单元格文本 就像下面这样 GetCellText rowId C
  • updatepanel (JavaScript) 回发后,jQuery 可排序不起作用

    我对 jQuery 的可排序功能有疑问 当我的页面使用更新面板进行回发时 动态表的排序不再起作用 当按下图像按钮时会触发回发 当按下图像按钮时 会出现一个新行 其中有一个子表 我尝试了这 3 个 JavaScript 代码 但它们似乎都是第
  • 比较 std::functions 是否相等?

    如何比较两个 C 11std functions with operator 并返回true如果两者都说functions 引用同一个函数指针吗 你实际上可以让它工作 target template
  • BNF 可以处理远期消费吗?

    最近我发现了 python 模块pyparsing 一个通过编写来解析数据的绝佳工具grammar 而不是解析器 我对上下文无关语法的概念很陌生 所以请纠正这个问题中的任何错误假设 Pyparsing 可以实现 BNF 巴科斯 诺尔范式 h