问题标签 [pegjs]

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 投票
3 回答
7207 浏览

javascript - 使用 PEG.js 的简单解析问题

我试图通过将简单的语法输入到PEG.js playground中来围绕 PEG 。

示例 1:

  • 输入:"abcdef1234567ghijklmn8901opqrs"
  • 期望的输出:["abcdef", "1234567", "ghijklmn", "8901", "opqrs"]

  • 实际输出:["abcdef", ["1234567", ["ghijklmn", ["8901", ["opqrs", ""]]]]]

这个例子非常有效,但我可以让 PEG.js 不将结果数组嵌套到一百万级吗?我认为诀窍是使用concat()而不是join()某处,但我找不到那个地方。

示例 2:

与示例 1 相同的问题和代码,但将 Characters 规则更改为以下内容,我预计这会产生相同的结果。

结果输出是:

为什么我得到所有这些空匹配?

示例 3:

最后一个问题。这根本行不通。我怎样才能让它工作?对于奖励积分,任何关于效率的指示?例如,如果可能的话,我应该避免递归吗?

我也很感激一个好的 PEG 教程的链接。我已阅读(http://www.codeproject.com/KB/recipes/grammar_support_1.aspx),但如您所见,我需要更多帮助...

  • 输入: 'abcdefghijklmnop"qrstuvwxyz"abcdefg'
  • 期望的输出:["abcdefghijklmnop", "qrstuvwxyz", "abcdefg"]
  • 实际输出:"abcdefghijklmnop\"qrstuvwxyz\"abcdefg"
0 投票
3 回答
1460 浏览

javascript - 使用 PEG Parser 进行 BBCode 解析:pegjs 或……什么?

我有一个 bbcode -> html 转换器,它响应文本区域中的更改事件。目前,这是使用一系列正则表达式来完成的,并且存在许多病理情况。我一直想在这个语法上磨砺铅笔,但不想进入牦牛剃须。但是......最近我开始意识到pegjs,这似乎是 PEG 解析器生成的一个非常完整的实现。我已经指定了大部分语法,但现在我想知道这是否适合使用成熟的解析器。

我的具体问题是:

  1. 由于我的应用程序依赖于将我可以翻译的内容转换为 HTML 并将其余部分保留为原始文本,因此使用可能因语法错误而失败的解析器实现 bbcode 是否有意义?例如:[url=/foo/bar]click me![/url]一旦输入关闭标签上的右括号,肯定会成功。但是在此期间用户会看到什么?使用正则表达式,我可以忽略不匹配的内容并将其视为普通文本以进行预览。使用正式语法,我不知道这是否可能,因为我依赖于从解析树创建 HTML,而解析失败的是……什么?

  2. 我不清楚应该在哪里进行转换。在正式的基于 lex/yacc 的解析器中,我会有头文件和表示节点类型的符号。在 pegjs 中,我得到带有节点文本的嵌套数组。我可以将翻译后的代码作为 pegjs 生成的解析器的一个动作发出,但将解析器和发射器结合起来似乎是一种代码味道。但是,如果我打电话PEG.parse.parse(),我会得到这样的结果:

p>

给出如下语法:

当然,我是在缩写语法,但你明白了。因此,如果您注意到,数组数组中没有上下文信息可以告诉我我拥有什么样的节点,即使解析器已经完成了这项工作,我也不得不再次进行字符串比较。我希望可以在解析期间定义回调并使用操作来运行它们,但是 Web 上关于如何做到这一点的信息很少。

我在吠叫错误的树吗?我应该回到正则表达式扫描并忘记解析吗?

谢谢

0 投票
1 回答
415 浏览

javascript - 如何使用 Rhino 构建 PEG.js 0.7.0 解析器(Java SE 6 ScriptEngine API)

我一直在使用 PEG.js 版本 0.6.1 成功地使用 Maven 插件(即从 Java 代码调用 PEG.js)构建解析器,但现在在尝试升级到新版本时,它失败并显示错误消息:

sun.org.mozilla.javascript.internal.EcmaError: SyntaxError: missing ; before statement (#3213(eval)#1) in #3213(eval) at line number 1

在调试时,我注意到来自 PEG.buildParser() 函数调用的解析器看起来在语法上是错误的,而从浏览器调用它时当然不会发生这种情况。

我是这样称呼它的:

其中,grammarSource在我的测试用例中,是网站中用作示例的基本语法,而PEGJS_LIB = peg-0.7.0.js.

欢迎任何想法!我这里已经用完了...

0 投票
1 回答
1151 浏览

parsing - 如何用 peg 语法解析这个?

我正在尝试使用pegjs制作解析器。我需要解析类似的东西:

我无法编写从 to 捕获文本的"START"规则"END"

0 投票
1 回答
3043 浏览

javascript - PEG.js 输入结束问题

我正在尝试为 PEG.js 编写一个简单的语法,它可以匹配如下内容:

所以基本上这些是一些用分号分隔的文本。我的简化语法如下所示:

问题是,如果我在输入中输入分号以外的任何内容,我会得到:

如何解决这个问题?我读过 PEG.js 无法匹配输入的结尾。

0 投票
2 回答
536 浏览

javascript - 如何将一个简单的语法转换为在 PEG.js 中有效的东西(预期为“a”但找到了“a”)

我刚开始玩 PEG.js 并且遇到了语法问题(大大简化了调试):

我正在使用https://pegjs.org/online

此语法无法解析bdd

这是 PEG 无法做到的事情,还是我可以将我的语法转换成可以解析它的东西?

PS如果我尝试解析(错误地建议?)bda我得到无意义的错误:

0 投票
3 回答
2731 浏览

parsing - 消除此 PEG.js 语法的左递归

(注意:我读过其他类似的问题但我无法弄清楚)。

我写了这个语法:

有了这个输入

它返回

而且我要

我认为这个左递归规则可以给我类似的东西,但是 PEG.js 不支持左递归。

在这种情况下如何消除左递归?

PS:您可以在在线 PEG.js 演示中进行测试

0 投票
2 回答
337 浏览

peg - 我如何干燥这个 PEGjs 规则?

以下工作对于我正在尝试做的事情很好,但它显然是非常重复的。它应该与以下示例匹配:

  • #id.class1.class2 attr="asdsa"
  • .class1.class2 attr="asdsad"
  • attr="asds"

使用起来很诱人

但是如果所有三个组件都不存在,我不希望它匹配。如何指定 3 个可选组件的规则,但必须至少存在一个?

0 投票
1 回答
1568 浏览

syntax-highlighting - 从 PEG.js 语法生成 TextMate 语言语法

是否有将 PEG.js 语法转换为TextMate语法的工具?

我正在构建我自己的语言,并希望在我首选的编辑器 TextMate 中为它突出显示语法。我的语言语法是用PEG.js 构建的。根据此用例的 TextMate 文档,我必须以与 PEG.js 不兼容的形式编写 TextMate 语法。

我开始编写一个新的 TextMate 语法,但我很快注意到翻译整个语法,甚至是与可接受的语法突出显示相关的子集都需要相当长的时间。由于我非常懒惰并且不想做所有这些乏味的工作,所以我考虑过自动化这项任务。

谁能给我任何线索如何自动化或至少加速从 PEG.js 语法生成 TextMate 语法?

0 投票
3 回答
1091 浏览

javascript - 如何为这个文本文件编写一个简单的 pegjs 语法?

我只想将此文本文件分割成行并对行进行分类。如果该行以“Qty”开头,则下一行是订单项目,直到该行以“GST”开头。

如果该行以“总金额”开头,那么这是总金额行。

请告诉我如何使用 PegJS http://pegjs.majda.cz/