问题标签 [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.
parsing - 解析器不会停止解析任意换行符和空格
所以,我正在尝试在 pegjs 中编写一个非常基本的 Lisp 解析器,只要 Lisp 代码在语法上有效并且适合一行,我就会让它吐出相同的代码。
我希望扩展解析器以能够接受插入任何地方的任何换行符以及代码中的额外空格。
因此,只要所有内容都在一行上,这里的代码就可以工作:
然后,在我尝试允许换行符和空格时,我尝试将“元组”的规则更改为
但是这种变化会导致 pegjs 进入一个无限循环,虽然规则的添加看起来是非递归的。
注意:如果不清楚我要做什么,我正在编写一个语法,这样 pegjs 会吐出一个解析器
并吐出与字符串相同的代码或只是
要么对我有用。
我目前的工作语法是采取
和输出
虽然在每个“令牌”或“元组”之后只允许一个换行符是微不足道的,但我希望接受以下作为合法代码:
javascript - 如何匹配以“?”开头的标记 在 pegjs
我必须使用 pegjs 匹配这样的令牌:
我原以为这会起作用:
当我解析源代码时,我得到了错误:
目的 ?没有方法“加入”
这是因为str
变量不是匹配标记的数组......知道应该怎么做吗?
javascript - PEGJS:如何通过语法
引用PEGJS 教程:
要生成解析器,请调用 PEG.buildParser 方法并将您的语法作为参数传递:
我的语法有点复杂:
我应该传递给PEG.buildParser
我的语法的起始规则,即additive
,但我做错了。如果我写
PEG.buildParser(additive)
或PEG.buildParser(start)
,FireBug 说
SyntaxError: Expected "=" or string but end of input found
;如果我写PEG.buildParser(start = additive)
,我会得到GrammarError: Referenced rule "additive" does not exist
;通过我的语法的正确方法是什么?
javascript - PEG.js:如何使用提示?
我正在使用 PEG.js 创建一个 C++ 解析器,并且我需要能够使用cin
. 使用匹配后的JS,当我使用时prompt()
,(替代)在线版本会抛出“解析错误:提示未定义”的错误。我正在尝试使用初始化程序来创建一个要复制的函数prompt
(可能没有优化,我只是尝试将其作为解决方案)。但是,当我这样做时,它仍然给我错误。我也尝试过使用window.prompt
,但同样,它不起作用。这是我正在做的一个例子:
然后在解析器测试领域:
谢谢你的关注。我试过用谷歌搜索这个和搜索这个,但我没有找到任何结果。
此外,这里是主要代码段,用于任何人需要的所有(当前)额外信息。我对此也有一些问题,但在发布另一个问题之前,我会尝试自己解决这些问题。
javascript - 使用 require 和 module.exports 导入 PEGJS 解析器
我正在尝试在多个不同的文件中使用 PEGJS 解析器。我使用方法 var Parser = require("./Parser");
但是,当我尝试使用 Parser.parse 解析某些内容时,我无法这样做,因为 Parser 是未定义的。
我怎样才能解决这个问题?它以前一直在工作,但我对语法做了一些更改,不得不重新生成解析器。
我在运行它时得到的确切错误是 Uncaught TypeError: Cannot read property 'parse' of undefined
我尝试导入的基本代码如下。
我正在尝试导入此功能并将其与
node.js - 回溯如何在 peg.js 中工作(示例)?
我定义了以下最小的 Peg.js 语法:
您可以在沙盒中尝试。
我本来希望匹配“A1”和“A123”(根据我对回溯如何工作的概念)。但事实并非如此:语法识别“A1”但不识别“A123”。
注意:我不是在寻找相关问题“如何将简单的语法转换为适用于 PEG.js 的东西”中的“颠倒你的术语的顺序”的建议(预期为“a”,但找到了“a”)。相反,我希望了解我所看到的行为,以及为什么 Peg.js 的回溯不适用于这种情况。有关为什么颠倒我的术语顺序没有帮助的解释,请参阅下面更现实的示例。
举一个更现实的例子,考虑单位解析。语法应该识别带有可选前缀的公制单位(如“m”、“mol”),如“mm”、“mmol”,以及非公制单位,如“yr”、“week”或“mo”。
以下 Peg.js 语法无法识别“mol”,因为它在使用“mo”时会出错,并且不会回溯。(更改术语的顺序无济于事;或者更确切地说,会导致“mo”以牺牲“mol”或“mmol”为代价而被识别。)
我可以在 Antlr 中成功地做类似的事情:
parsing - 解析表达式语法:检测下一个标记?
我从 PEG 开始PEG.js
。
有些事情我无法理解......我确信它很简单,但它让我在试图理解这个概念时感到头疼......
考虑这个两规则语法:
我希望能够通过这个解析器“将 foo 放入 bar”。并导致put("foo","bar")
评估。
但是 PEG.js 给了我错误Expected " into " or any character but end of input found.
name
如果规则的正则表达式比规则更具体,我想我可以解决这个问题,.*
但为什么必须这样?解析器不能足够聪明地向前看并看到“ into”即将出现,以及“。” 在最后?
我怎样才能实现我正在寻找的东西?这可能是“自下而上”和“自上而下”语法之间的区别吗?
编辑:正则表达式按/put (.*) into (.*)/g
我想要的方式工作——如果我通过它"put foo into bar"
,它会给我$1="foo"
and $2="bar"
。我只是在问我是否可以使用 PEGjs 或 Jison 获得相同的功能(在决定令牌边界的位置之前考虑整个字符串)。
peg - Peg左递归删除
我有这个 pegjs 语法。如何删除左递归?
javascript - 检测_vars_with_underscores_;为什么这不起作用?
我正在尝试编写一个 PEGjs 规则来转换
至
我的语法是
这适用于
和
但出现了问题
例子。
我不太明白为什么会出现这种情况,并且希望能解释一下它为什么会这样。(我什至不需要解决这个问题,当然;最大的问题是我对 PEGjs 语法的心智模型是有缺陷的。)