问题标签 [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 获取 ( 和 ) 之间的任何文本;
我试图在最后用分号捕捉一些文本。
例子:(in here there can be 'anything' !"#¤);); any character is possible);
我试过这个:
但似乎 (.*) 将包括最后一个 ); 前 ”);” 确实,我得到了错误:
预期的 ”);” 或找到输入结尾以外的任何字符
问题是文本可以包含“);” 所以我想要最外面的);决定线路何时结束。
这个正则表达式\((.*)\);
做我想要的,但我怎么能在 PEG.js 中做同样的事情呢?我不想在结果中包含外括号和分号。
如果您知道自己在做什么,这似乎应该很容易 =P
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 规则,但它只是抛出异常而不是继续。
恭喜幸存到这里的人,我做错了什么?:) 谢谢
parsing - 如何解析在解析期间定义的类型名称
我正在使用 pegjs 定义允许定义新类型的语法。然后我如何识别它们定义之后的那些类型?我有一个定义内置类型的产品,例如
但是最后一个我该怎么办?在源代码中定义之前,我不知道哪些可能的字符串是类型名称。
在同时存在词法分析器和解析器的传统解析方式中,解析器会将类型名称添加到表中,并且词法分析器将使用该表来确定是否为特定令牌返回 TYPE_NAME 或 IDENTIFIER。但是 pegjs 没有这种分离。
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 规则中描述的那样,实现条件语句的正确方法是什么?
parsing - 预期任何字符,但找到输入结尾
我的输入是一个递归结构,看起来像这样(注意空白的第二行):
xxx @{} yyy @{ zzz @{} wwww }
我看到的语法应该是这样的:
但我得到的是
第 2 行第 1 列:应为“@{”、“}”或除输入结尾之外的任何字符。
我究竟做错了什么?
peg - 两个语句的元素用 peg.js 相互引用
像这样定义块
想要实现 {float a =3;a*3+1;} return 10 我不知道如何在“decl”和“exp_stat”这两个语句中引用 id。谁能分享一个例子?
parsing - 这个 peg 语法有什么问题?
以下语法(来自 RFC 2396):
无法解析:
为什么?
javascript - 如何为 pegJS 定义递归规则
所以,我正在尝试使用PegJS为一种简单的语言定义解析器。
该语言纯粹由无限深的函数调用组成,它们用逗号分隔,例如:
这是我的语法:
然而它不是递归的:
输入:b(r(6))
错误:Line 1, column 4: Expected ")" or [0-9a-z,A-Z] but "(" found.
我得到了左右递归的想法,但我不知道如何让它无限地递归调用规则。
peg - 无法解析 Peg.js 解析器中的分隔符
我正在学习如何使用 peg.js 编写解析器并遇到了一个独特的问题。我;
用作分隔符来对键值对中的字符串进行分类。
示例:如果要解析的字符串是name=prabesh;city=Bangalore
. 我的解析器目前将name
其作为键和prabesh
值,city
作为键和bangalore
值。
问题是如果分隔符是字符串的一部分怎么办?
例如:city=bangalore;address=#12/1;santacruz
你怎么能解析它?
方法:搜索连续;
的,即从第一次=
搜索连续;
的,然后将介于=
和最后的文本;
视为一个值。
这种方法的问题是,如果值本身有一个,=
那么解析器将无法正确解析它。
例如,这会失败:token=crbz23;4=134;
有什么建议么?
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解决方案: