问题标签 [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.
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"
javascript - 使用 PEG Parser 进行 BBCode 解析:pegjs 或……什么?
我有一个 bbcode -> html 转换器,它响应文本区域中的更改事件。目前,这是使用一系列正则表达式来完成的,并且存在许多病理情况。我一直想在这个语法上磨砺铅笔,但不想进入牦牛剃须。但是......最近我开始意识到pegjs,这似乎是 PEG 解析器生成的一个非常完整的实现。我已经指定了大部分语法,但现在我想知道这是否适合使用成熟的解析器。
我的具体问题是:
由于我的应用程序依赖于将我可以翻译的内容转换为 HTML 并将其余部分保留为原始文本,因此使用可能因语法错误而失败的解析器实现 bbcode 是否有意义?例如:
[url=/foo/bar]click me![/url]
一旦输入关闭标签上的右括号,肯定会成功。但是在此期间用户会看到什么?使用正则表达式,我可以忽略不匹配的内容并将其视为普通文本以进行预览。使用正式语法,我不知道这是否可能,因为我依赖于从解析树创建 HTML,而解析失败的是……什么?我不清楚应该在哪里进行转换。在正式的基于 lex/yacc 的解析器中,我会有头文件和表示节点类型的符号。在 pegjs 中,我得到带有节点文本的嵌套数组。我可以将翻译后的代码作为 pegjs 生成的解析器的一个动作发出,但将解析器和发射器结合起来似乎是一种代码味道。但是,如果我打电话
PEG.parse.parse()
,我会得到这样的结果:
给出如下语法:
当然,我是在缩写语法,但你明白了。因此,如果您注意到,数组数组中没有上下文信息可以告诉我我拥有什么样的节点,即使解析器已经完成了这项工作,我也不得不再次进行字符串比较。我希望可以在解析期间定义回调并使用操作来运行它们,但是 Web 上关于如何做到这一点的信息很少。
我在吠叫错误的树吗?我应该回到正则表达式扫描并忘记解析吗?
谢谢
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
.
欢迎任何想法!我这里已经用完了...
parsing - 如何用 peg 语法解析这个?
我正在尝试使用pegjs制作解析器。我需要解析类似的东西:
我无法编写从 to 捕获文本的"START"
规则"END"
。
javascript - PEG.js 输入结束问题
我正在尝试为 PEG.js 编写一个简单的语法,它可以匹配如下内容:
所以基本上这些是一些用分号分隔的文本。我的简化语法如下所示:
问题是,如果我在输入中输入分号以外的任何内容,我会得到:
如何解决这个问题?我读过 PEG.js 无法匹配输入的结尾。
javascript - 如何将一个简单的语法转换为在 PEG.js 中有效的东西(预期为“a”但找到了“a”)
我刚开始玩 PEG.js 并且遇到了语法问题(大大简化了调试):
此语法无法解析bdd
。
这是 PEG 无法做到的事情,还是我可以将我的语法转换成可以解析它的东西?
PS如果我尝试解析(错误地建议?)bda
我得到无意义的错误:
parsing - 消除此 PEG.js 语法的左递归
(注意:我读过其他类似的问题,但我无法弄清楚)。
我写了这个语法:
有了这个输入
它返回
而且我要
我认为这个左递归规则可以给我类似的东西,但是 PEG.js 不支持左递归。
在这种情况下如何消除左递归?
PS:您可以在在线 PEG.js 演示中进行测试
peg - 我如何干燥这个 PEGjs 规则?
以下工作对于我正在尝试做的事情很好,但它显然是非常重复的。它应该与以下示例匹配:
- #id.class1.class2 attr="asdsa"
- .class1.class2 attr="asdsad"
- attr="asds"
使用起来很诱人
但是如果所有三个组件都不存在,我不希望它匹配。如何指定 3 个可选组件的规则,但必须至少存在一个?
syntax-highlighting - 从 PEG.js 语法生成 TextMate 语言语法
是否有将 PEG.js 语法转换为TextMate语法的工具?
我正在构建我自己的语言,并希望在我首选的编辑器 TextMate 中为它突出显示语法。我的语言语法是用PEG.js 构建的。根据此用例的 TextMate 文档,我必须以与 PEG.js 不兼容的形式编写 TextMate 语法。
我开始编写一个新的 TextMate 语法,但我很快注意到翻译整个语法,甚至是与可接受的语法突出显示相关的子集都需要相当长的时间。由于我非常懒惰并且不想做所有这些乏味的工作,所以我考虑过自动化这项任务。
谁能给我任何线索如何自动化或至少加速从 PEG.js 语法生成 TextMate 语法?
javascript - 如何为这个文本文件编写一个简单的 pegjs 语法?
我只想将此文本文件分割成行并对行进行分类。如果该行以“Qty”开头,则下一行是订单项目,直到该行以“GST”开头。
如果该行以“总金额”开头,那么这是总金额行。
请告诉我如何使用 PegJS http://pegjs.majda.cz/