问题标签 [peg]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
70 浏览

parsing - 是否可以使用多个解析器并保留行号?

大约一个月前,我问了一个半相关的问题: PEG 语法中的多遍解析是否常见?我试图弄清楚编写几个语法以逐步解析某些文本的输入是否是一个好主意。对于我的宠物项目,一个音乐编程语言 (MPL) 解析器,我编写了 3 个单独的语法:

  1. 获取源文件的全部内容并去掉注释。

  2. 获取源文件(已删除注释)并按仪器分隔。这导致成对的乐器名称/定义和由所述乐器“播放”的“音乐代码”。

  3. 实际上解析音乐代码(每个乐器一个文本字符串)并为每个乐器返回一个音乐“事件”的解析树。

回答我上一个问题的人表示,这是一种合理的方法,如果您的解析器生成器工具无法自动/简单地执行此操作,则通过评论删除是合理的。他能看到统一语法的唯一潜在原因是是否有性能要求,但在我的情况下没有。

不过,考虑到这一点,我想知道异常处理的后果。理想情况下,当我的解析器抛出异常时,我希望它能够识别原始源文件中的正确行号并显示一条错误消息来标识解析错误。我选择的解析器生成工具Instaparse有很好的错误消息,可以识别行号和列号,如下所示:

问题是这些错误是在每次传递的基础上抛出的。如果我有一个用于从源文件中删除注释的初始语法,则不保留原始行号,进入下一个通道。我真的希望不是这样,但在我看来,保留正确行号的唯一方法是将所有内容统一为一个非常复杂的语法。有没有解决的办法?是否有一些模式可以编写多个连续的语法并仍然保留原始输入的行号?

0 投票
1 回答
321 浏览

python - 在西班牙语语法中将字符串文本解析为 num

我需要编写一个 Python 程序来将字符串文本中的西班牙数字转换为数字:

输入:

所需的输出:

我写了一些代码,但我意识到我正在重新发明轮子,只是一个解析器。所以,我需要使用一个词法/语法分析器模块。但是我以前从未使用过词法/语法解析器,首先需要编写 BNF 或 PEG 表示法(我还没有决定我将使用哪个解析器模块,这是我能找到的最简单的。)

这对我来说很难,西班牙语的数字语法与英语完全不同。

我的做法:

我担心这是讲西班牙语的人的问题。

0 投票
1 回答
955 浏览

glob - 文件路径通配符 (glob) 的 BNF 语法定义

我正在寻找一些用 BFN 规则描述的广泛扩展的方言(比如https://github.com/vmeurisse/wildmatch + globstar **)。

任何格式或语言。OMeta 或 PEG 会很棒。

0 投票
2 回答
176 浏览

parsing - 解析特殊情况

如果我理解正确,解析会将一系列符号变成一棵树。我的问题是,是否可以使用一些标准程序(LR、LL、PEG、..?)来解析以下两个示例,或者是否有必要手动编写专门的解析器?

  1. Python 源代码,即空格缩进的块

我想我在某处读到解析器跟踪前导空格的数量,并假装用大括号替换它们来分隔块。是因为标准解析技术不够强大还是出于性能原因而从根本上需要它?

  1. PNG图像格式,块以标头和块大小开头,之后是块的内容

内容可能包含类似于某些标头的字节,因此有必要“知道”接下来的 x 个字节不会被“解析”,即应该跳过它们。比如说,如何用 PEG 来表达这一点?换句话说,“右括号”由内容的长度表示。

0 投票
1 回答
134 浏览

ruby - 使用 Citrus 解析表达式语法的堆栈级别太深

我正在尝试使用类似于 Treetop 的 Citrus for Ruby 中的语法来处理最终将成为布尔逻辑的内容。我遇到了递归问题,但我不清楚具体原因。这是我要处理的文本(最后应该有一个换行符):

这是我的 Citrus 语法(旨在处理更高级的东西):

重要的事情在规则expr和规则or_expr中。我已经改变了or_expr,所以它匹配除了评论之外的所有内容。如果我坚持当前的expr规则,我会得到堆栈溢出。但是如果我切换它,它就没有 or_expr 和 gtor_expr 之间的选择它工作正常。

我对“选择”的理解是它将尝试按顺序评估它们。如果第一个选择失败,那么它将尝试第二个。在这种情况下,第一个选择显然能够成功,那么如果我包含一个永远不应该采用的第二个选择,为什么会出现堆栈溢出呢?

0 投票
2 回答
734 浏览

python - grako 的规则优先级问题

我正在重做我最初在 Perl 上构建的迷你语言(请参阅github 上的 Chessa#),但是当我应用语义时遇到了许多问题。

这是语法

我遇到的问题是,d当运算符和任何后续字母数字字符串之间不存在空格时,运算符被拉入标识符规则。虽然语法本身是 LL(2),但我不明白问题出在哪里。

例如,4d6停止解析器,因为它被解释为4 d6,其中d6是标识符。应该发生的是它被解释为4 d 6,d是一个运算符。在 LL 解析器中,情况确实如此。

一种可能的解决方案是禁止d从标识符开始,但这将禁止诸如这样drop命名的函数。

0 投票
0 回答
125 浏览

python - 列表中的浮点数会因“无可用选项”错误而停止解析器

鉴于此语法

这个语义对象

no available options...当遇到包含非整数元素的列表(浮点数或列表;变量很好,不过)时,我的解析器会因错误而停止。

例子:

  • drop(4d6, 1)
  • [1.5, 2, 3]

有趣的是,drop([1, 2, 4, 2], 1)行为正确并输出[2, 4, 2].

0 投票
1 回答
84 浏览

javascript - 使用 peg.js 进行反向引用

给定输入[tag] Content [inner-tag] Inner [/inner-tag][/tag],我将如何验证是否存在[/tag]匹配的关闭[tag]

现在我的规则检查下一个立即标记是否与最后一个开始标记匹配:

这适用于[tag] Content [/tag]但不适用于上面的嵌套输入。

您如何使用 peg.js 处理这样的内部递归?

0 投票
1 回答
495 浏览

javascript - 使用 peg.js 解析 XML 单节点

给定输入<outer> Content <inner> Inner <single/> </inner> </outer>

我将如何编写语法来解析<single>节点以及具有匹配关闭节点的节点?

这是我目前的语法,取自这里

这仅适用于具有关闭节点的节点。

我认为问题在于文本规则。所以我一直在尝试改变它以包含一个负面的前瞻,比如:

但这还没有取得任何成功。

有任何想法吗?

0 投票
2 回答
736 浏览

lua - 创建递归 LPeg 模式

在普通的 PEG(解析表达式语法)中,这是一个有效的语法:

但是,如果我尝试使用 LPeg 编写此规则,则该规则的递归性质将失败:

尽管在这个简单的示例中我可以重写规则以不使用递归,但我有一些现有的语法我不想重写。

如何在 LPeg 中编写自引用规则?