问题标签 [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 投票
2 回答
280 浏览

ruby - Parslet 中是否提供反向引用?

有没有一种方法可以反向引用 parslet 中的前一个字符串,类似于\1典型正则表达式中的功能?

我想提取块中的字符,例如:

其中“Marker”是一个已知的字符串,但“SomeName”是先验未知的,所以我相信我需要类似的东西:

我不知道如何使用 Parslet 和/或 Ruby 语言编写 backreference_to_name 规则

0 投票
1 回答
104 浏览

c++ - 使用 Boost Spirit 提取未定界的字符串和整数

我正在尝试使用 Boost Spirit将字符串转换"ABC10DEF20"为数组。["ABC", 10, "DEF", 20]我不确定“未定界”是否是正确的术语,但我想通过整数和非整数的边界来分解它,而不是用空格或其他定界字符来分割它。

我想出了如下代码:

对于输入"ABC10DEF20",这会导致[ 65, 66, 67, 10, 68, 69, 70, 20 ](没有字符串,只有字符串部分的整数和 ASCII 组件存储在整数中)。对于"10"[ 10 ]按预期得到的输入。

0 投票
1 回答
286 浏览

javascript - 返回键,具有动态键名的值对象

在 PEG.js 我有以下规则

如果它解析[hello] world它会导致:

{"key": "world"}.

我希望它返回

{"hello": "world"}.

这可能吗?如何确保对象键接受动态值。

0 投票
1 回答
77 浏览

regex - 通过训练示例进行字符串解析

我处于需要编写大量解析规则的位置(换句话说,一个将字符串转换为另一个字符串或结构化数据的函数),虽然我认为我会为此使用 PEG,但它会是只需提供一个例句列表及其正确的解析,我就更容易写,而且在我看来,这在技术上似乎微不足道,但我很困惑。

我玩过 PEGjs(一个解析表达式语法工具)和正则表达式。就我的目的而言,这些需求似乎非常基本,远低于 PEG 和正则表达式提供的所有功能。

这是我要解析的示例:

如您所见,我想提供数百个例句,每个例句都配有正确的解析,并让计算机编写必要的函数来解析所有符合该模式的句子。

我有点难以理解这一点,所以我问所有的黑客:

  1. 如果我只提供输入句子的许多不同变体,是否只需要非常简单的逻辑(即没有机器学习、没有 PEG 和没有正则表达式),这不是真的吗?
  2. 一些机器学习工具(贝叶斯?)可以使这成为一项简单的任务吗?(在我的应用程序中,我不需要 100% 的确定性来解析句子;歧义是可以的,特别是如果我可以呈现歧义供用户解决)
  3. 有哪些工具(库)或逻辑(请使用伪代码!)非常适合此类问题,或者只是说明其性质?
0 投票
1 回答
168 浏览

parsing - PEG 语法未按预期工作

我正在研究一种 PEG 语法,该语法采用音乐编程语言中的代码并创建音乐事件的解析树(音符、和弦、音量/速度变化等)。我的 MPL 的一个特点是它支持语音,即同时发生的不同事件序列。我很难让我的Instaparse语法正确地解析它……我想要的是一个voices由一个或多个voices 组成的标签,每个标签都包含一个语音定义(例如V1:),然后是任意数量的事件。voices标签应该以(这V0:意味着分裂的声音结束,我们回到只有一个声音,或“声音零”)或文件的结尾。

这是我正在进行的语法的摘录(为了清楚起见,我省略了 , 等的定义note) :chord

给定以下代码:

运行解析器会给出以下输出:

这正是我想要的。标签结束的V0:信号voices,最后 5 个音符在part标签内独立。

但是,当我将 更改为V0V2,我得到了这个:

出于某种原因,voice1 标签或其voice-events标签没有像预期的那样终止,第二个标签作为第一个标签的voice一部分被吞没。我也不希望有第二个标签;2 应该在主标签内。voicevoice-eventsvoicesvoicevoices

我想要的是这样的:

我无法弄清楚我做错了什么,但我认为这与我如何定义voice标签和/或voice-events标签有关。这可能与我如何使用负前瞻有关,我认为我还没有完全理解。谁能弄清楚我如何修复我的语法?

谢谢!:)

解决了!

谢谢,@丹尼尔尼尔!我已经重新编写了我的语法,这正是我想要的方式:

最大的变化在于我定义part和的方式event;之前,我将这些术语定义voices为一个事件,因此任何后续voice的 s 都被消耗并归入前一个voicesevent中。通过voices退出 an 的定义event并重新定义part为可变数量的voices分组或events,我消除了歧义并让语法按照我想要的方式运行。

之后,其中的eventsa被正确分组,但是当我需要它们都在同一个分组中时voice,我仍然遇到每个声音都在其自己的单独标签中的问题。我通过指定标签以 a或文件结尾 ( ) 来解决此问题,换句话说,更具体地说明了我希望标签使用多少代码。voicesvoicesvoices"V0:"\zvoices

这个故事的寓意是,如果你正在编写一个 PEG 语法并且你遇到了问题,你可能需要让你的定义不那么模棱两可!我最终也完全没有使用否定前瞻,我认为这对简化/消除我的语法有很大帮助。

0 投票
1 回答
201 浏览

parsing - 解析器不会停止解析任意换行符和空格

所以,我正在尝试在 pegjs 中编写一个非常基本的 Lisp 解析器,只要 Lisp 代码在语法上有效并且适合一行,我就会让它吐出相同的代码。

我希望扩展解析器以能够接受插入任何地方的任何换行符以及代码中的额外空格。

因此,只要所有内容都在一行上,这里的代码就可以工作:

然后,在我尝试允许换行符和空格时,我尝试将“元组”的规则更改为

但是这种变化会导致 pegjs 进入一个无限循环,虽然规则的添加看起来是非递归的。

注意:如果不清楚我要做什么,我正在编写一个语法,这样 pegjs 会吐出一个解析器

并吐出与字符串相同的代码或只是

要么对我有用。

我目前的工作语法是采取

和输出

虽然在每个“令牌”或“元组”之后只允许一个换行符是微不足道的,但我希望接受以下作为合法代码:

0 投票
1 回答
173 浏览

python - python 3.4下的Parsley解析器不起作用

我是 Python 的新手,但我想解析一些文本文件(VCard *.vcf),我偶然发现了 Allen Short 的 Parsley。但是它似乎在新的 Python3.4 下不起作用,有工作版本吗?我有来自pypi.python.org的版本 顺便说一句:Parsley 的名字不好,因为许多其他项目都使用这个名字......自述文件中有一个例子......

运行后返回:

编辑 2014.06.12 我找到了解决方案,pip 安装了旧版本的 Parsley。github上有 ?fork 在 Python 3.X 下工作https://github.com/vsajip/parsley

0 投票
1 回答
81 浏览

c++ - 如何阻止我的简单加法语法在 Boost Spirit 中提前终止?

我很难制作玩具语法来解析 Boost Spirit 中所需的附加工作。

这是我的语法和代码:

语法.h:

语法.cpp:

输出:

似乎double_消耗了3,然后没有可以解析的规则+ 5。但是,如果我将表达式规则更改为

然后我的程序进入无限递归。

有什么办法解决这个问题?我知道在示例中更常见的是使用 Kleene 星来处理二进制组合的任意列表(沿线expression *('+' >> expression))。这是使用解析表达式语法的必要性吗?如果是,请解释原因。

0 投票
1 回答
233 浏览

regex - peg/leg - 用于表达式解析的 PEG 规范的一些奇怪行为

最近我在学习解析表达式语法。在网上搜索了一些关于它的资料后,我终于坐下来弄脏了手。我想用 PEG 实现 Kernighan 和 Pike 的 The Unix Programming Environment 中的 hoc 程序。就此而言,我选择了 PEG 解析器生成器peg/leg,因为它具有良好的文档和大量示例。我以示例中的 dc.peg 作为起点,并在 phoc 版本 1 中实现了对一元减号的支持。

现在,当我为一元减去以下产生式时,生成的解析器无法识别 ((-9)), ((-9)*3)/4, (8-(-2)*5)/2-(2+ 2)等。

但是,如果我将 SGNValue 更改为以下表达式,则这些表达式完全匹配。

有人可以向我解释上述生产规则有什么问题吗?

我还在这篇文章中附加了 phoc1.peg 文件。

感谢和问候桑塔努

0 投票
0 回答
166 浏览

python - 在python中解析位数组

我在我的一个项目中使用位数组来存储位(从具有“0”和“1”的文件中读取,以及所需的时间信息。文件也可以没有必要的字段,如注释等)。现在我想解析这些位。我在阅读文件时过滤掉了文件中所有不必要的东西。所以我需要一个可以解析位(位数组)的解析器。

目前,我正在使用简约解析器来解析字符串(即“0”和“1”),但似乎这个解析器只是将字符串作为输入。这是所有解析器的情况吗?或者我可以编写可以匹配python位数组/位字符串或列表或任何其他非字符串数据结构的语法规则吗?

因此,如果我想解析位(位数组),最好的方法是什么?

例子:

我在文件中有一个字符串“011000111100011010”。由于字符串中的“0”是一个字符,因此它在内存中占用 8 位。由于它浪费内存(因为我只需要一点来存储 0)我打算将这些位存储在位数组中。

说,我想匹配一个帧(长度为 18 位),它们可以表示如下

那么如何编写一个可以匹配这些位的简单语法规则。

这就是我使用简约的方法。(这里我认为“0”作为一个字符)

这只是一个例子,实际上场景要复杂得多。甚至文件大小也太大(~1GB)。所以我正在寻找一个可以存储位(不是字符)的数据结构和一个可以在 python 中解析位(不是字符)的解析器