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

php - PEG-php解析if语句

再会。刚开始用PEG。我熟悉wp:peg 和其他一些理论,但仍然无法理解它在内部是如何工作的。

我的任务是解析表达式

is 语句的主体只包含打印操作符,没有其他内容,但条件复杂。

我的想法:

但我相信这个任务有更好的解决方案:) 你能帮我吗?谢谢。

0 投票
3 回答
888 浏览

parsing - 在递归下降解析器中实现“cut”

我正在用 Python 实现一个 PEG 解析器生成器,到目前为止我已经取得了成功,除了“剪切”功能,任何知道 Prolog 的人都必须知道。

这个想法是,在!解析了 cut ( ) 符号之后,不应在同一级别尝试其他选项。

表示在(看到之后,解析必须成功,否则不尝试第二个选项就失败。

我正在使用 Python 的(非常有效的)异常系统来强制回溯,所以我尝试了一个特殊的FailedCut异常来中止封闭的选择,但这没有用。

任何有关如何在其他解析器生成器中实现此功能的指针都会有所帮助。

也许我遇到的问题是缺乏地方性。为规则的左侧部分生成的代码类似于:

然后,为choice( |) 运算符生成的代码如果捕获到a 将跳过以下选择FailedCut。我所说的缺乏局部性的意思是,捕捉到的选择FailedCut可能在电话中很深,因此产生的效果很难辨别。

我可以让为选择生成的代码提防它们,而不是让为序列生成的代码尝试通知封闭选择cut 。与 Prolog 不同,这将使削减的范围非常本地化,但对于我在 PEG 解析器中想要的东西来说已经足够了,即在看到某个标记序列后提交一个选项,因此错误报告是指该位置在源中,而不是到另一个可能有其他选项的位置。

我突然想到,如果为规则/谓词生成的代码捕获FailedCut并将其转换为正常FailedParse异常,那么剪切将具有正确的范围。

关于@false的问题,这是我想要工作的完整示例:

在该语法中,word可以通过namedor到达term,但我希望解析器在named看到:.

解决方案

公平地说,到目前为止,我已经在https://bitbucket.org/apalala/grako/上发表了我的作品。

在最终解决方案中,序列包含在此上下文管理器中:

选择函数中的选项包含在以下内容中:

这迫使退出选择而不是返回尝试下一个选项。

削减本身是这样实施的:

完整的源代码可以在Bitbucket上找到。

0 投票
1 回答
86 浏览

ruby - BBCode Treetop 解析器和智能标签关闭?

我写了一个最有效的树顶语法文件。对于像我这样的标签,[b]我想将它们传递到一个函数中,该函数具有为该论坛配置的 BBCodes 的哈希值。如果允许粗体,它将返回 HTML,否则它将忽略 BB 代码。

这不适用于嵌套标签。例如,[b][i]Bold and italics[/i][/b]将无法正确处理,因为它们与 . 的第一个结束标记匹配[/i]

我怎样才能做到这一点,当它找到一个标签时,它会在负头中寻找结束标签?

我宁愿不必为每种 BBCode 写出所有规则,因为这是一个动态系统,论坛管理员可以在其中打开/关闭某些标签。

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/

0 投票
1 回答
1060 浏览

parsing - 在没有左手递归的情况下解析布尔表达式

我正在尝试匹配这个

  • f(some_thing)是一个函数调用,它是一个表达式
  • ==是一个布尔运算符
  • 'something else'是一个字符串,也是一个表达式

所以布尔表达式应该是

问题是如果没有左递归,我无法弄清楚如何做到这一点这些是我的规则

使用语法符号,我有

因为我的语法是 EOE 我不知道如何使用左手算法

其中 e 为空,b 为终端

0 投票
0 回答
1103 浏览

python - 在 Python 中使用 PEG 解析重要的空白(特别是 Parsley)

我正在创建一种支持重要空格的语法(最像 Python 或 yaml 的“Z”lisp 变体,但相同的想法)

我遇到了这篇关于如何在 pegasus 中进行重要的空白解析的文章,这是 C# 的 PEG 解析器

但是我在将其转换为欧芹方面不太成功,看起来 Pegasus 中的#STATE# 变量以某种方式跟随回溯。

这是我最接近简单解析器的方法,如果我使用indentwith look ahead 的版本,它就无法解析孩子,如果我使用没有的版本,它就无法解析兄弟姐妹。

如果这是欧芹的限制并且我需要使用 PyPEG 或 Parsimonious 或其他东西,我对此持开放态度,但看起来如果内部缩进变量可以跟随 PEG 内部回溯,这一切都会奏效。

0 投票
2 回答
489 浏览

node.js - PEGjs:如果浮点规则失败,则回退(回溯?)到字符串

我有一条atom规则,它首先尝试将所有内容解析为数字或带引号的字符串,如果失败,则将其视为字符串。

一切都很好解析,除了一个特殊的情况是这个非常具体的字符串:

DUD 123abc

无法解析Expected " ", "." or [0-9] but "a" found.错误。

我的期望:它应该成功解析并将字符串“123abc”作为字符串原子返回。您可以在下面的语法内容中看到我的几个不成功的尝试被注释掉了。

任何帮助/提示/指针/建议表示赞赏!


你可以在网上的 PEG.js 版本上试试语法。我正在使用节点 v0.8.23 和 pegjs 0.7.0

正确解析的数字:

  • `123
  • `0
  • `0。
  • `1。
  • `.23
  • `0.23
  • `1.23
  • `0.000
  • . <--- 作为字符串,不是数字,也不是错误

我想123abc被解析为字符串,这可能吗?


这是我的整个语法文件:

0 投票
2 回答
91 浏览

parsing - PEG 解析器:“可选”和“一个或多个”规则是否必要?

PEG 解析器的 Wikipedia 文章定义了以下组合子:

所有这些组合器真的有必要吗?在我看来, Optional 和 One-Or-More 可以很容易地实现为

我这样说是对的,还是有什么基本的东西要求这两种形式是独立的原子?我正在构建自己的 PEG 解析器,跳过这两个(或根据其他组合器定义它们)会很方便,但我想确保我没有遗漏任何重要的东西。