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

javascript - 由于评估先前规则的错误,解析器无法匹配后续规则

例子:

如果输入是abc()我收到错误:

但是,如果 start 定义如下,则不会出现问题:

对于较早的情况,名称规则不应该不匹配并因此进入调用规则吗?否则如何管理这样的事情?

有关工作示例,请参阅操场

0 投票
2 回答
666 浏览

parsing - 如何最好地解析 PEG 语法中的逗号分隔列表

我正在尝试解析逗号分隔的列表。为了简化,我只是使用数字。这些表达式将是有效的:

(1, 4, 3)

()

(4)

我可以想到两种方法来做到这一点,我想知道为什么失败的例子不起作用。我相信这是一个正确的 BNF,但我不能让它像 PEG 一样工作。谁能准确地解释为什么?我试图更好地理解 PEG 解析逻辑。

我在这里使用在线浏览器解析器生成器进行测试: https ://pegjs.org/online

这不起作用:

(实际上,它解析得很好,并且喜欢 () 或 (1) 但不识别 (1, 2)

但这确实有效:

这是为什么?(这里是语法新手)

0 投票
1 回答
156 浏览

peg - 使用 PEG.js 生成的解析器美化代码

我想为自定义程序语言创建一个格式化程序/linter,并且正在阅读它,但似乎我错过了一些东西。

正在看/玩,PEG.js似乎它会完成工作。我写了一个小解析器,运行时 - 它正确返回语法树(AST

而现在的主要问题是:如何使用生成的解析器来创建(例如)一个///VSCode等。将美化/格式化代码的扩展名?AtomCodeMirror

一般来说,这是正确的方法吗?(使用解析器或需要为每个工具编写特定的解析器)

0 投票
1 回答
112 浏览

javascript - Pegjs 保留关键字

我有一个支持这个的语法:
AND,OR,NOT,(和),“,”

我需要能够解析的几个样本:

  • a1 或 a2
  • a1 a2(同上)
  • a1 和 a2
  • “a1”和“a2”
  • a1 或 a2 不是 a3
  • a1 a2 OR "a3" NOT(a1 AND a2 'a6')

考虑到 a1、a2 等是真实的用户输入,几乎可以包括以下任何内容:

  • 123
  • 特斯拉-S
  • 折纸

我遇到的问题是,其中一个词没有引号,并且以一些保留关键字开头,例如:

  • 折纸
  • 仙女座

在这种情况下,此解析器考虑:

  • 或关键字 + igami 文字
  • 和关键字 + romede 文本

这就是我遇到的问题。

我已经尝试了两天的各种解决方案,在stackoverflow(和官方文档)上找到:

(和许多其他)试图找到具有这些约束的解决方案:

  • 不能保证关键字前后有空格,例如“a1 AND(a2 OR a3)”有效(“AND”和“(”)之间没有空格,“(a1 AND a2)OR a3”= > 关键字之前/之后可以有空格和/或“(”/“)”(但是当我尝试这样做时,我打破了括号规则)
  • 一个词只有在它是保留部分的一部分时才不是一个词:"AND"i / "OR"i / "NOT"i / "(" / ")" / "'" / '"' / " " =>其中任何一个都不是一个词,其他任何一个都是,就像 ando 是一个词,而不是一个关键字。

这是我想出的代码:

问题示例:你好折纸

给出当前语法:

应该给出(它认为折纸是一个完整的世界,而不是 or + igami):

当前解析器中的 Origami 被拆分为 OR + igami,而它应该考虑整个单词 origami...

0 投票
1 回答
121 浏览

javascript - PegJS 成员表达式解析

我目前正在制作一种编程语言,并使用 PegJS 进行解析。这是我的语法:

有谁知道为什么我的成员表达式解析会遇到这种奇怪的怪癖?

one.two.three()工作得很好。

one().two.three也可以正常工作。

one.two().three也有效。

也是如此one[2].three.four()

one = two[3]().four不起作用。它说:

Line 1, column 15: Expected "*", "+", "-", "/", "/*", "DIV", "MOD", "^", "array", "break", "continue", "do", "false", "for", "function", "global", "if", "none", "return", "switch", "true", "while", comment, end of input, end of line, identifier, number, string, or whitespace but "." found.

有任何想法吗?它会以这种方式表现似乎有点奇怪。

0 投票
1 回答
169 浏览

javascript - 是否可以创建一个简单的解析器并创建一个 javascript 文件,然后使用该解析器调用该文件?

我正在尝试创建一个解析器,一个文件。我正在尝试使用创建的这个文件由解析器解析。步骤是:

  1. 添加 pegjs

  2. 使用var parserFile创建解析器

  3. 使用var makeFile创建文件

  4. 添加 contentFile、nameFile 和 var contentFile、nameFile在此处:var makeFile

  5. 在var makeFile中使用解析器和var parserFile

  • 未捕获的 SyntaxError:意外的标记 ')'

  • 第 1 行,第 1 列:应为“。” 但找到了“2”。

0 投票
1 回答
42 浏览

pegjs - PEGJS 不会在解析器文件中生成“module.exports”

exportVar:...我尝试使用下面的代码生成解析器文件,但是尽管我已包含在选项中,但最终结果文件 parser.js 不包含导出行。

我想在文件顶部手动添加它吗?

0 投票
0 回答
197 浏览

javascript - PEG js:如何在 peg js 语法规则表达式中匹配单引号内的字符串?

我正在编写一个 peg js 语法来将逻辑查询文字解析为 json 格式,但面临在条件值中选择多值词的问题。像(city = 'a' OR city = 'b')可以正常工作,但(city = 'a b' OR city = 'b')不起作用,因为它对于第一个条件具有多字值。我有一个正则表达式'((?:''|[^'])*)' 可以匹配单引号值中的字符串,但 PEG js 解析器无法解析它。

任何人都可以帮助我实现这一目标吗?下面是我的语法:在线编译器:https ://pegjs.org/online 输入:(city = 'a b' OR city = 'b')语法:

0 投票
1 回答
161 浏览

javascript - 如何使用 PEG.js 创建一个简单的解析器

我想解析的语法如下:

我正在学习如何使用 PEG,这是我迄今为止为当前语法开发的内容:

我遇到了一些无限循环的问题。当前代码产生此错误:

上述简单语法的正确实现是什么?

0 投票
1 回答
114 浏览

javascript - Peg.JS:简单的 if..then..else 实现

我正在尝试为简单的 if..then..else 语句和简单语句实现语法。

它应该能够解析如下语句:

该文档以一个决定(如果……那么……否则)开始,然后是一个简单的陈述。

到目前为止,我的语法如下所示:

这将返回一个输出:

1、and数组中为什么会有多余的空字符串和then数组else?我应该怎么做才能删除它们?

  1. 为什么我的语法在决定后没有阅读简单的陈述?我应该怎么做才能让它读取和解析整个文档?

编辑:我想我知道为什么我要得到这些数组。我更改了语法以删除里面的重复indented_statements