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

javascript - PEG.js 获取 ( 和 ) 之间的任何文本;

我试图在最后用分号捕捉一些文本。

例子:(in here there can be 'anything' !"#¤);); any character is possible);

我试过这个:

但似乎 (.*) 将包括最后一个 ); 前 ”);” 确实,我得到了错误:

预期的 ”);” 或找到输入结尾以外的任何字符

问题是文本可以包含“);” 所以我想要最外面的);决定线路何时结束。

这个正则表达式\((.*)\);做我想要的,但我怎么能在 PEG.js 中做同样的事情呢?我不想在结果中包含外括号和分号。

如果您知道自己在做什么,这似乎应该很容易 =P

0 投票
1 回答
146 浏览

regex - PEG.js 帮助 - 可选的自由文本,后跟键值对

我编写了以下解析器(粘贴到http://pegjs.org/online并且它可以工作):

它解析这个键值对字符串:location=USA; application<>app; count>5 到这个: [ { "key": "location", "op": "=", "value": "USA" }, { "key": "application", "op": "<>", "value": "app" }, { "key": "count", "op": ">", "value": "5" } ]

问题是我也想启用自由文本搜索,它在键值对之前输入,例如: this:free text foobar; location=USA; application<>app; count>5 并得到这个: [ { "key": "fullText", "op": "=", "value": "free text foobar" }, { "key": "location", "op": "=", "value": "USA" }, { "key": "application", "op": "<>", "value": "app" }, { "key": "count", "op": ">", "value": "5" } ]

解析器应该识别出第一部分不是键值对(根据“Pair”规则)并将其作为“fullText”对象插入。

根据我在文档中阅读的内容,基本上“表达式”规则应该这样做 - A / B 表示如果 A 没有通过,则尝试 B。在第二种情况下,“Paris”失败,因为“free text foobar”没有通过 Pairs 规则,但它只是抛出异常而不是继续。

恭喜幸存到这里的人,我做错了什么?:) 谢谢

0 投票
1 回答
41 浏览

parsing - 如何解析在解析期间定义的类型名称

我正在使用 pegjs 定义允许定义新类型的语法。然后我如何识别它们定义之后的那些类型?我有一个定义内置类型的产品,例如

但是最后一个我该怎么办?在源代码中定义之前,我不知道哪些可能的字符串是类型名称。

在同时存在词法分析器和解析器的传统解析方式中,解析器会将类型名称添加到表中,并且词法分析器将使用该表来确定是否为特定令牌返回 TYPE_NAME 或 IDENTIFIER。但是 pegjs 没有这种分离。

0 投票
1 回答
619 浏览

javascript - PEGjs 中的条件语法规则

我正在尝试实现一个解析基本算术表达式的简单 DSL。这需要在浏览器中完成,所以我使用 PEGjs 来生成解析器。

表达式中的术语可以是数字(整数或实数)、变量(变量是传递给解析器的上下文对象的属性)、条件或通过点符号访问的属性。

我希望条件看起来像这样condition?value,如果condition为真,则该术语等同于value。两侧的变量?也可以是点符号访问的对象的属性,例如 this object.property1?object.property2

因此,如果向解析器传递了一个像这样的对象:

表达方式:

500 + depth + material.include?edge.face + material.thickness应等于624.5

我一直在使用 PEGjs 在线编辑器。我尝试了很多不同的方法,但我似乎无法确定条件。其他一切都有效。以下是相关规则:

我在 PEGjs github repo 中查看了 javascript 的示例语法,条件规则看起来很像我在这里得到的,但我仍然无法让它工作。

像我在 PEGjs 规则中描述的那样,实现条件语句的正确方法是什么?

0 投票
2 回答
1929 浏览

parsing - 预期任何字符,但找到输入结尾

我的输入是一个递归结构,看起来像这样(注意空白的第二行):

xxx @{} yyy @{ zzz @{} wwww }
 

我看到的语法应该是这样的:

但我得到的是

第 2 行第 1 列:应为“@{”、“}”或除输入结尾之外的任何字符。

我究竟做错了什么?

0 投票
1 回答
57 浏览

peg - 两个语句的元素用 peg.js 相互引用

像这样定义块

想要实现 {float a =3;a*3+1;} return 10 我不知道如何在“decl”和“exp_stat”这两个语句中引用 id。谁能分享一个例子?

0 投票
1 回答
112 浏览

parsing - 这个 peg 语法有什么问题?

以下语法(来自 RFC 2396):

无法解析:

为什么?

0 投票
1 回答
404 浏览

javascript - 如何为 pegJS 定义递归规则

所以,我正在尝试使用PegJS为一种简单的语言定义解析器。

该语言纯粹由无限深的函数调用组成,它们用逗号分隔,例如:

这是我的语法:

然而它不是递归的:

输入:b(r(6))

错误:Line 1, column 4: Expected ")" or [0-9a-z,A-Z] but "(" found.

我得到了左右递归的想法,但我不知道如何让它无限地递归调用规则。

0 投票
1 回答
107 浏览

peg - 无法解析 Peg.js 解析器中的分隔符

我正在学习如何使用 peg.js 编写解析器并遇到了一个独特的问题。我;用作分隔符来对键值对中的字符串进行分类。

示例:如果要解析的字符串是name=prabesh;city=Bangalore. 我的解析器目前将name其作为键和prabesh值,city作为键和bangalore值。

问题是如果分隔符是字符串的一部分怎么办?

例如:city=bangalore;address=#12/1;santacruz

你怎么能解析它?

方法:搜索连续;的,即从第一次=搜索连续;的,然后将介于=和最后的文本;视为一个值。

这种方法的问题是,如果值本身有一个,=那么解析器将无法正确解析它。

例如,这会失败:token=crbz23;4=134;

有什么建议么?

0 投票
1 回答
640 浏览

javascript - 将正则表达式转换为 PegJs 语法

我是 PEGjs 的新手,我正在尝试编写一个 PEGjs 语法,将 RegEx 转换(\s*[\(])|(\s*[\)])|(\"[^\(\)]+?\")|([^\(\)\s]+)为语法。

基本上我想做的是转换测试输入

(App= smtp AND "SPort" != 25) OR (App= pop3 AND "SPort" != 110) OR (App = imap AND "SPort" != 143) AND (App= imap OR "SPort" != 143)

为如下的json格式

我已经编写了一些复杂的 javascript 代码来将示例输入转换为 JSON 格式显示,但是代码有点复杂并且不容易长期维护,所以我想尝试一下语法解析器。由于我是语法世界的新手,我寻求一些帮助或指导来实现上述语法,以便我可以根据需要进行增强/编写?

您可以在此处查看正则表达式的输出

编辑

Javascript解决方案: