问题标签 [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 回答
558 浏览

parsing - 是否有支持左递归的基于 PEG 的解析器生成器?

对于许多建立在递归下降解析基础上的解析器生成器来说,左递归似乎是一个大问题。我正在寻找一个支持它的基于 PEG 的解析器生成器 - 使用任何语言。

0 投票
1 回答
381 浏览

python - 空产品对 PEG 的作用是什么?

空生产规则

在 lex-yacc LR 自底向上解析器生成器(例如 PLY)中很有用。

在什么情况下应该在 PEG 解析器中使用 Empty 产生式,例如 pyparsing ?

0 投票
1 回答
97 浏览

python - 正则表达式中替代项的描述是否错误?

关于PEG的维基百科文章指出:

上下文无关文法和解析表达式文法的根本区别在于 PEG 的选择运算符是有序的。如果第一个备选方案成功,则第二个备选方案将被忽略。因此,有序选择不是可交换的,这与上下文无关文法和正则表达式中的无序选择不同。

但是这个问题已经发现,如果替代品是彼此的子串;那么正则表达式的行为不符合unordered choice. wiki 在大多数情况下是正确的,但没有处理这种边缘条件。我的评估是否正确?

0 投票
2 回答
2480 浏览

javascript - CFG / PEG 用于代码完成?

我想知道是否可以直接使用 CFG 或 PEG 语法作为代码完成的基础而无需修改。我听说代码完成在 IDE 中有时会被操纵和按摩,甚至是硬编码,以使其性能更好。

我想在一个小型 DSL 上完成代码,所以我完全理解语法不能帮助具有库函数等知识的代码完成系统。

据我所知,解析器本身至少需要提供一个系统来查询它接下来的期望。

特别是我对使用peg.jsjison的 javascript 代码完成解决方案感兴趣

0 投票
3 回答
236 浏览

ruby - 使用 PEG 问题制作 BBcode 解析器

我正在使用 PEG(Ruby 的柑橘实现)制作 bbcode 解析器,但我一直在解析这个[b]sometext[anothertext[/b]

有代码

问题在于text我不知道怎么说的规则,该文本可以包含除 \r、\n、open_tag 或 close_tag 之外的所有内容。使用此实现,由于排除 [ 和 ],它在示例中失败(那是错误的)

所以最后的问题是如何做规则,它可以匹配除 \r、\n 或 open_tag 或 close_tag 的完全匹配之外的任何内容

如果您有另一个 PEG 实施的解决方案,也可以在那里提供。我可以切换:)

0 投票
1 回答
1044 浏览

parsing - 使用 LPEG(Lua 解析器表达式语法),如 boost::spirit

所以我在玩lpeg来代替boost Spirit语法,我必须说boost::spirit比lpeg优雅自然得多。然而,由于当前 C++ 编译器技术的限制和 C++ 中的 TMP 问题,它是一个婊子。在这种情况下,类型机制是你的敌人而不是你的朋友。另一方面,Lpeg 虽然丑陋和基本导致更高的生产力。

无论如何,我离题了,我的 lpeg 语法的一部分如下所示:

此语法(虽然不完整)与以下内容匹配namespace foo {}。我想实现以下语义(这是使用 boost spirit 时的常见用例)。

  1. 为命名空间规则创建一个局部变量。
  2. namespace IDENTIFIER {当已匹配时,将命名空间数据结构添加到此局部变量。
  3. 将新创建的命名空间数据结构传递给NAMESPACE_BODYAST,以进一步构建 AST... 以此类推。

我确信这个用例是可以实现的。没有例子表明它。我对语言或库的了解不足以弄清楚如何去做。有人可以显示它的语法。

编辑:在尝试了几天与 lpeg 共舞并开始踩脚之后,我决定回归精神 :D 很明显 lpeg 是用 lua 函数编织的,而且这种编织是非常自由的-form(而精神有明确的非常有据可查的语义)。我只是还没有正确的 lua 心智模型。

0 投票
1 回答
193 浏览

ruby - 树梢中最简单的规则不起作用

我有一个只有两条规则的树顶语法:

我正在尝试解析简单的字符串(“A”和“5”)。如果我将该规则放在第一位,则“5”被识别为 Num,如果我将该规则放在第二位,则返回 nil。同样,如果我将该规则放在第一位,“A”将被识别为 ID,如果我将该规则放在第二位,则返回 nil。我无法理解这两个规则如何以任何方式重叠。这让我疯狂!

关于树梢或正则表达式,我有什么遗漏或不了解的吗?在此先感谢您的帮助。

0 投票
1 回答
5971 浏览

javascript - 使用 PEG.js 忽略空格

我想用我的语法忽略空格新行,因此PEG.js输出中缺少它们。此外,括号内的文字应在新数组中返回。

语法

测试用例

输出

我想要的输出

0 投票
1 回答
139 浏览

treetop - Treetop(PEG)语法中使用的省略号(空字符串)是什么?

Treetop网站给出了以下我看不懂的解释

省略号 一个空字符串匹配任何位置并且不消耗任何输入。当您希望将单个符号视为序列的一部分时,它很有用,例如,当使用共享代码处理备用规则时。

规则 alts ( foo bar / baz '' ) { def value elements.map{|e| e.text_value } 结束 } 结束

何时将符号视为序列的一部分有用?任何人都可以提供一个有意义的例子吗?

0 投票
1 回答
428 浏览

parsing - LPeg 语法怪异

我的 Lua 应用程序的一部分是搜索栏,我试图让它理解布尔表达式。我正在使用 LPeg,但当前的语法给出了一个奇怪的结果:

它只解析第一个令牌,我无法弄清楚它为什么这样做。据我所知,由于!.起始非终端的末尾,部分匹配是不可能的。我怎样才能解决这个问题?