首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

PEG语法和解析器生成器的局限性?

Parsing Expression Grammar(PEG)是一种用于描述语法的形式化方法,广泛用于解析器生成器中。尽管 PEG 语法和解析器生成器有许多优点,但它们也存在一些局限性。以下是 PEG 语法和解析器生成器的一些主要局限性:

1. 左递归问题

PEG 语法不支持直接的左递归规则。左递归是指一个规则在其自身的最左侧调用。例如:

代码语言:javascript
复制
A <- A 'a' / 'b'

这种规则会导致无限递归,从而使解析器无法正常工作。解决左递归问题通常需要重写语法规则,使其不再左递归。

2. 回溯和性能

PEG 解析器使用回溯来处理选择(/)操作符,这可能导致性能问题,特别是在存在大量选择的情况下。虽然 PEG 解析器通常会进行一些优化,但在某些复杂语法中,回溯仍然可能导致解析速度变慢。

3. 语法歧义

PEG 语法通过优先选择第一个匹配的规则来解决歧义,这意味着它们是确定性的。然而,这种方法有时会导致意外的解析结果,因为它不会尝试找到所有可能的解析树。例如:

代码语言:javascript
复制
S <- 'a' 'b' / 'a' 'b' 'c'

在这种情况下,输入 'ab' 将匹配第一个规则,而不会尝试匹配更长的第二个规则。

4. 错误报告和恢复

PEG 解析器通常在遇到语法错误时会立即停止解析,并报告错误位置。然而,PEG 解析器在错误恢复方面通常不如其他解析方法(如 LR 解析器)强大。这使得 PEG 解析器在处理语法错误和提供有用的错误信息方面可能不够理想。

5. 复杂语法的可读性和维护性

对于非常复杂的语法,PEG 规则可能变得难以阅读和维护。虽然 PEG 语法通常比上下文无关文法(CFG)更简洁,但在处理复杂的语言特性时,规则的数量和复杂性可能会迅速增加,从而影响可读性和维护性。

6. 递归下降解析器的局限性

大多数 PEG 解析器生成器生成递归下降解析器,这意味着它们在处理非常深的递归时可能会遇到栈溢出问题。虽然现代解析器生成器通常会进行优化以减少这种风险,但在某些情况下,深度递归仍然可能导致问题。

7. 语义动作的集成

在某些 PEG 解析器生成器中,集成语义动作(即在解析过程中执行的代码)可能不如其他解析方法(如 Yacc/Bison)方便。这可能会影响解析器的灵活性和功能。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Python 之父解析器系列之七:PEG 解析器语法

最简单方法是给生成器传递一个标志,该标志表示“这是元语法”,然后让生成器在生成程序顶部引入额外 import 语句。...:-) 我们还必须将它添加到辅助解析器中。既然语法不仅仅是一系列规则,那么让我们添加一个 Grammar 对象,其中包含属性 metas rules。...呜呼,这没用,因为 OP 也匹配花括号,但由于 PEG 解析器是贪婪,它会吞掉结束括号,我们就永远看不到动作结束。...我不知道这是否是其它 PEG 解析器标准配置——当我考虑如何解决右括号(甚至嵌套符号)识别问题时,立马就想到了这个方法。它似乎运作良好,我认为这符合 PEG 解析一般哲学。...有了这些东西,元语法可以由辅助解析器解析,并且生成器可以将它转换为新解析器,由此解析自己。更重要是,新解析器仍然可以解析相同语法

1.4K60

Python 之父解析器系列之五:左递归 PEG 语法

基本问题在于:使用递归下降解析器时,左递归会因堆栈溢出而导致程序终止。 【这是我 PEG 系列第 5 部分。...这通常可以使用更强大 PEG 特性来解决,例如分组迭代,我们可以将上述规则重写为: expr: term ('+' term)* 实际上,这正是 Python 当前语法在 pgen 解析器生成器写法...所以让我们坚持干,并展示一些真实代码。 首先,解析器生成器必须检测哪些规则是左递归。这是图论中一个已解决问题。...我们现在对生成器进行一个小小修改,对于左递归规则,我们替换成 @memoize_left_rec ,然后我们在memoize_left_rec 装饰器中变魔术。生成器其余部分支持代码无需更改!...到此,今天故事结束了:我们已经成功地在 PEG(-ish)解析器中驯服了左递归。

81730

Python 之父解析器系列之六:给 PEG 语法添加动作

这对于新解析器来说是件好事,但对于我来说却是个不小挑战:需要一定时间精力,而我对解析器知识极为欠缺,也造成了翻译过程不顺畅。...对于在这一系列博客文章中开发简化版解析器生成器,下面是我们采用做法。...一般而言,动作语法如下: rule: item item item { action 1 } | item item { action 2 } 因为它会使语法变得冗长,所以解析器生成器通常支持跨行分割规则...在 PEG 解析器中,因为有无限回溯,我们有其它选择: 延迟所有动作,直到解析完所有内容。这对我目的没有用,因为我想在解析期间构造一个 AST。...当一个备选项中多次出现相同规则名称时,我们该怎么办?对同一备选项中出现规则,解析器生成器会给出唯一名称,即在随后出现规则上添加 1、2 等等。

55120

Python之父发文,将重构现有核心解析器

语法分析生成器(parser generator)(那个语法分析生成器,被称为“pgen”,是我为 Python 写下第一段代码)。...我现在感兴趣于 PEG,原因是对 pgen 局限性感到有些恼火了。...但问题是,如果你这样写语法解析器不会起作用,pgen 将会罢工。 其中一个原因是某些规则(如 expr term)是左递归,而 pgen 还不足以聪明地解析。...虽然 PEG 这个术语主要指的是语法符号,但是以 PEG 语法生成解析器是可以无限回溯递归下降(recursive-descent)解析器,“packrat parsing”通过记忆每个位置所匹配规则...编译器都是复杂,CPython 也不例外:虽然 pgen-驱动解析器输出是一个解析树,但是这个解析树并不直接用作代码生成器输入:它首先会被转换成抽象语法树(AST),然后再被编译成字节码。

99610

Python 之父新发文,将替换现有解析器

语法分析生成器(parser generator)(那个语法分析生成器,被称为“pgen”,是我为 Python 写下第一段代码)。...我现在感兴趣于 PEG,原因是对 pgen 局限性感到有些恼火了。...但问题是,如果你这样写语法解析器不会起作用,pgen 将会罢工。 其中一个原因是某些规则(如 expr term)是左递归,而 pgen 还不足以聪明地解析。...虽然 PEG 这个术语主要指的是语法符号,但是以 PEG 语法生成解析器是可以无限回溯递归下降(recursive-descent)解析器,“packrat parsing”通过记忆每个位置所匹配规则...编译器都是复杂,CPython 也不例外:虽然 pgen-驱动解析器输出是一个解析树,但是这个解析树并不直接用作代码生成器输入:它首先会被转换成抽象语法树(AST),然后再被编译成字节码。

1.1K30

​Python 之父解析器系列之三:生成一个 PEG 解析器

我已经在本系列第二篇文章中简述了解析器基础结构,并展示了一个简单手写解析器,根据承诺,我们将转向从语法中生成解析器。我还将展示如何使用@memoize装饰器,以实现packrat 解析。...【这是 PEG 系列第 3 篇。参见第1篇、第2篇】 上篇文章我们以一个手写解析器结束。给语法加上一些限制的话,我们很容易从语法中自动生成这样解析器。(我们稍后会解除那些限制。)...: item+ item: NAME | STRING 用个花哨叫法,这是我们第一个元语法语法语法),而我们解析器生成器将是一个元编译器(编译器是一个程序,将其它程序从一种语言转译为另一种语言...(Hack:通过检查第一个字符是否为引号,我们可以区分出NAMESTRING) 至于规则,我用了一个简单 Rule 类,所以整个语法就是一些 Rule 对象。...我仍然在抓头发中(译注:极度发愁),如何以最佳方式将协同工作标记生成器缓冲、解析器记忆缓存作出可视化。或许我会设法生成动画 ASCII 作品,而不仅仅是跟踪日志输出。

73420

Python 之父再发文:构建一个 PEG 解析器

本文主要介绍了构建一个 PEG 解析器大体思路,并介绍了一些基本语法规则。...结果可能不是一个很棒通用型 PEG 解析器生成器——这类生成器已经有很多了(例如 TatSu,写于 Python,生成 Python 代码)——但这是一个学习 PEG 好办法,推进了我目标,即用由...PEG 语法构建解析器替换 CPython 解析器。...NAME NUMBER 等常量可从标准库 token 库中导入。(这能令我们快速地进入 Python 标记过程;但如果想要构建一个更加通用 PEG 解析器,则应该探索一些其它方法。)...不管怎样,下面是未来一些主题: 根据语法生成解析代码 packrat 解析(记忆法) EBNF 特性,如(x | y)、[x y …]、x* 、x+ tracing (用于调试解析器语法PEG

1.3K20

Python 之父撰文回忆:为什么要创造 pgen 解析器

花下猫语:近日,Python 之父在 Medium 上开通了博客,并发布了一篇关于 PEG 解析器文章(参见我翻 全文译文)。据我所知,他有自己博客,为什么还会跑去 Medium 上写文呢?...---- David Beazley 在 US PyCon 2018 上演讲,关于语法分析生成器(parser generators),提醒了我应该写一下关于它历史。...我曾在大学里用过 Yacc,从“龙书”中熟悉了它工作原理,但是出于某些原因,我并不喜欢它;IIRC 关于 LALR(1) 语法局限性,我很难解释清楚。...此外,我认为缩进格式很难教给词法分析器生成器。 (译注:1、这里生成器并非 Python 语法生成器,而是指用来生成分析器工具。...参阅 https://github.com/python/cpython/pull/11814 (译注:感觉可以帮 Guido 再加一条“更新”了,目前他正在研究 PEG 解析器,将会作为 pgen 替代

1.3K30

Python 之父解析器系列之四:可视化 PEG 解析

上周我展示了一个简单 PEG 解析器生成器。本周我将展示生成解析器在解析程序时实际执行操作。...【这是我 PEG 系列第 4 部分。见第1部分,第2部分,第3部分,第5部分 】(译注:对应译文,第1篇、第2篇、第3篇、第5篇待译 ) 让我们来看看可视化已取得进展。...前四个条目对应于尚未返回解析方法,每一行显示了语法一行。带下划线条目会引起下一次调用。...下周我将进一步开发解析器,很可能会添加我对左递归语法规则实现。(它们很棒!) 致谢:录制时所用ttygif(Ilia Choly 开发) ttyrec(Matthew Jording 开发)。...本文内容、示例代码图片授权协议:CC BY-NC-SA 4.0 英文原文:https://medium.com/@gvanrossum_83706/visualizing-peg-parsing-93a36f259423

67610

基于解析器组合子语法解析器(上)

基于解析器组合子语法解析器(上) 1.语法来源 语法,在语言学中是指任意自然语言中句子、短语以及词汇等语法单位语法结构与语法意义规律,本质上即音义结合体之间结合规律。...2.如何解析语法 2.1 解析语法运作 语法解析运作,是将输入原始文本按照给定语法规则,在一定上下文环境中,通过扫描匹配,将原始文本转换为具有特定语义结构化数据。...2.2 解析语法方案 市面上语法解析方案已经非常成熟,从手写递归下降分析到自动生成解析代码 Yacc、ANTLR 生成器等等。另外可使用算法也非常丰富,包括 LL、LR 以及其各种衍生变体。...在实际使用中,由于 Yacc、ANTLR 等生成器使用自己特有的语法来描述目标语言语法规则,在调试与维护中难免有诸多不便。...4.词法解析器语法解析器 4.1 目标语言定义 在实现词法解析器之前,首先来定义一下需要解析目标语言——MiniLambda(随便起了一个名字),其是一个由表达式构成,包含数字、函数条件判断简单语言

2.6K50

手摸手实现一个编译器(上)

认识 PEG.js PEG.js 是一个简单 JavaScript 解析器生成器,可以生成具有出色错误报告快速解析器。...我们先在解读具体语法词法解析前,先来了解一下输出编译器参数: --allowed-start-rules 默认值以 Grammer 第一条规则作为起始解析。...语法语义 下面我们来解读一下官方算术解析,从而认识语法语义一些表达式使用。...函数体内有四个可以调用函数: text:匹配表达式文本内容; expected:使解析器抛出异常,支持两个参数,分别是对当前位置预期内容描述可选位置信息; error:同样是使解析器抛出异常,...总结 先是了解完解释器编译器定义以及它们区别,让我们知道了 PEG.js 是一个 JavaScript 解析器生成器

71510

Python 3.9 有哪些新特性

字典合并(Dictionary Unions) 我最喜欢新特性之一,其具有优美的语法。如果我们有两个字典ab需要合并,那么我们现在使用合并运算符。...(比如列表或生成器)来用新键值对更新字典: a = {'a': 'one', 'b': 'two'} b = ((i, i**2) for i in range(3)) a |= b print(a...Python先前使用主要是基于LL(1)语法,而该语法又可以由LL(1)解析器进行解析,该解析器自上而下、从左到右地解析代码,并且仅预读一个token。...LL(1)在Python语法中产生了局限性(没有可行workarounds)。...基于PEG解析器将为Python开发者提供更大灵活性——我们将从Python 3.10开始注意到这一点。 这就是我们可以期待即将到来Python 3.9一切。

1.2K2610

【swupdate文档 四】SWUpdate:使用默认解析器语法标记

SWUpdate:使用默认解析器语法标记 介绍 SWUpdate使用库“libconfig”作为镜像描述默认解析器。...但是,可以扩展SWUpdate并添加一个自己解析器, 以支持不同于libconfig语法语言。 在examples目录中,有一个用Lua编写,支持解析XML形式 描述文件解析器。...使用默认解析器,则sw-description遵循libconfig手册中描述语法规则。...通过识别哪个是正在运行设备,解析器返回一个表, 其中包含必须安装镜像及其关联处理程序。 读取交付镜像时,SWUpdate将忽略解析器处理列表之外所有镜像。...特定于板子设置优先于默认作用域设置。 软件集合操作模式 软件集合操作模式扩展了描述文件语法, 以提供对之前介绍所有配置标记叠加分组。

3.2K20

Python 3.9 也要来了?

01 字典合并 这是我最喜欢新特性,该特性用法非常优雅。如果你想对两个字典 a b 进行合并,我们就可以使用合并操作。...("ld") [Out]: "Hello wor" 05 新解析器 开发者不容易察觉到新语法解析器带来变化,但是它有可能成为 Python 演变中一个重要转变。...Python 目前主要使用一种基于 LL (1)语法,而这种语法可以通过 LL (1)解析器进行解析——该解析器从上到下、从左到右地解析代码,只需要从词法分析器中取出一个 token 就可以正确地解析下去...LL(1) 给 Python 语法造成了很多限制。某个相关话题 提到了下面代码无法用当前解析器进行解析(会造成 SyntaxError)。...新解析器基于 PEG, 它将给 Python 开发者提供更大灵活性,从 Python 3.10 开始[2]我们将能够感受到这一点。 上面讲解了 Python 3.9 版本几个重要特性。

52620

Python3.9正式版即将发布,来看看新特性

01 字典合并 这是我最喜欢新特性,该特性用法非常优雅。如果你想对两个字典 a b 进行合并,我们就可以使用合并操作。...("ld") [Out]: "Hello wor" 01 新解析器 开发者不容易察觉到新语法解析器带来变化,但是它有可能成为 Python 演变中一个重要转变。...Python 目前主要使用一种基于 LL (1)语法,而这种语法可以通过 LL (1)解析器进行解析——该解析器从上到下、从左到右地解析代码,只需要从词法分析器中取出一个 token 就可以正确地解析下去...LL(1) 给 Python 语法造成了很多限制。某个相关话题 提到了下面代码无法用当前解析器进行解析(会造成 SyntaxError)。...新解析器基于 PEG, 它将给 Python 开发者提供更大灵活性,从 Python 3.10 开始[2]我们将能够感受到这一点。 上面讲解了 Python 3.9 版本几个重要特性。

68210

Python3.9 正式版即将发布,看看新特性

01 字典合并 这是我最喜欢新特性,该特性用法非常优雅。如果你想对两个字典 a b 进行合并,我们就可以使用合并操作。...("ld") [Out]: "Hello wor" 01 新解析器 开发者不容易察觉到新语法解析器带来变化,但是它有可能成为 Python 演变中一个重要转变。...Python 目前主要使用一种基于 LL (1)语法,而这种语法可以通过 LL (1)解析器进行解析——该解析器从上到下、从左到右地解析代码,只需要从词法分析器中取出一个 token 就可以正确地解析下去...LL(1) 给 Python 语法造成了很多限制。某个相关话题 提到了下面代码无法用当前解析器进行解析(会造成 SyntaxError)。...新解析器基于 PEG, 它将给 Python 开发者提供更大灵活性,从 Python 3.10 开始[2]我们将能够感受到这一点。 上面讲解了 Python 3.9 版本几个重要特性。

44730

再探 Parser Parser Combinator

最近无意间看到了 Guido van Rossum 大神文章 [1],讲他探索 PEG 解析器历程(Python 3.9 已经实现了新 PEG parser [2])。...于是,这个周末,我花了一个晚上,尝试了用 Rust 下 PEG 解析器 — pest 重新实现了 policy 表达式解析器部分,为了更好地对比 pest Rust 下另外一个神器 nom 效果...PEG - Parsing Expression Grammar,是一种分析性形式文法,在 2004 年推出。它语法 CFG - Context Free Grammar 很类似。...我们之前用 BNF 工具(比如 Flex/Bison)用于撰写解析 CFG。PEG CFG 主要区别是:PEG 会在语法歧义发生时总选择第一个匹配项,而 CFG 则是未定义。...因为一般手写解析器是一件非常枯燥且容易出错行为,所以会有符合 PEG/CFG 比较抽象语言产生,专门用于描述语法,而用这种语言写出来代码最后会被编译成解析器代码,所以叫 Parser Generator

2.3K10

PEP 380--子生成器语法

本文介绍了子生成器语法,即 yield from 语法。其它与生成器相关 PEP 有 3 篇,翻译结果附在了本文末尾。...该迭代器会遍历到耗尽,在此期间,它直接向包含 yield from 表达式调用者生成器(即“委托生成器”)生成接收值。...在合理可行情况下,这种复合而成生成器行为应该跟原始非分离生成器完全相同,包括调用 __next __() 、send()、throw() close() 。...语法 所提出特定语法被选中,像它含义所暗示,并没有引入任何新关键词,且清晰地突出了它与普通 yield 不同。 优化 当存在一长串生成器时,使用专门语法就为优化提供了可能性。...这意味着其它不包含 yield 表达式语法可能会更合适,但到目前为止,还没有提出可接受替代方案。被拒绝替代品包括 call、delegate gcall。

81510
领券