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

javascript - PEGjs:在定义算术函数时请求帮助/指南

我正在学习 PEGjs 语法,我请求以下帮助或指导:

我有这样的功能,PRODUCT(), SUM(), DIVIDE()

PRODUCT 可以将 number /PRODUCT()/SUM()/DIVIDE() 作为参数(任何数字,但逗号分隔)

同样,SUM 可以采用以逗号分隔的任意数量的参数。

DIVIDE 将采用两个参数(必须有 2 个),数字或其他函数

有人可以帮助或指导我如何实现吗?

到目前为止我的规则

上述规则仅支持两个数字的乘积/总和。我怎样才能实现上述目标?

在此先感谢 Manjunath Reddy

0 投票
3 回答
825 浏览

javascript - 配置 Karma 以使用 requirejs 加载 pegjs

尝试使用 PegJS 和 requirejs 测试项目。我有几个源文件,实现为通过 require API 加载的 AMD 模块(定义)。目录结构下方:

我编写了一个parser.js模块来加载 PegJS 语法文件并使用 PegJS 创建一个 peg 解析器:

这适用于使用节点在命令行上执行的 main.js。现在我想使用 karma、jasmine 和 PhantomJS 来测试我的项目。我有一个像这样的karma.conf.js

还有一个名为test-main.js的需要引导文件,它是这样配置的:

现在,当我启动我的测试(grunt karma)时,我得到了这个错误:

因此,我尝试以 karma.conf.js 的方式将pegjs包含在 Karma 加载的文件中:

当我这样做时,我仍然得到一个错误:

查看 pegjs 模块,确实有一个 arrays.js 文件:

因此也尝试包含数组:

我得到:

因为:

因此,除了加载 npm 模块,我尝试以这种方式加载 bower 模块:

你又来了:

还尝试不在业力生成的网页中包含 pegjs:

但它失败了:

试图将 bower_component 文件夹放在 js 文件夹中,但没有成功。

所以我不知道要从这里去......在谷歌或这里找不到任何相关的东西。使用 karma 来 requirejs/pegjs 似乎是一个特定的问题......欢迎任何想法。

更新以下丹的回答:

所以我在parser.js中从同步要求切换到异步要求:

尝试在karma.conf.js中包含 pegjs bower 组件:

或不包括它:

但总是得到同样的错误:

是的,该文件存在:

UPDATE2:终于理解并找到了一个可以接受的解决方案。

0 投票
2 回答
2506 浏览

javascript - 允许在 PEG.js 语法定义中使用引号和 unicode

如何在 PEG.js 语法定义中允许单引号和双引号以及 unicode 字符?更具体地说,我希望能够捕获可以包含单引号和双引号(很可能必须是 \ 转义)和所有 unicode 字符的字符串。

目前我有以下内容:

_ name:$(PROP_ASCII+) CHAR_SQ val:$(PROP_ASCII_INNER*) CHAR_SQ

这将捕获类似

key'value'

PROP_ASCII* 定义为

PROP_ASCII = [!-&(-<>-~] PROP_ASCII_INNER = [ -&(-~]

因此,如果 value 包含标准 ASCII 字符且不包含单引号,则此方法工作得很好而且花花公子......但我想支持我上面描述的内容,所以这样的事情将成为可能:

key'somé\'value\'☂'

想法?

0 投票
2 回答
596 浏览

javascript - pegjs 正则表达式匹配单词直到找到单词集合中的单词

我正在为一个项目使用 pegjs 解析器生成器,我很难创建一个应该匹配所有单词的语法,直到它不应该匹配的单词集合。作为字符串“门是黄色的”中的一个示例,我希望能够匹配直到 is 的所有单词,告诉 pegjs 解析器从单词 is 开始解析。我想让解析器中断的单词集合是“is”、“has”和“of”。

目前的语法规则如下:

如何创建阻止解析器包含我的单词集合的前瞻性?

0 投票
2 回答
303 浏览

peg - 使用 PEG.js 进行简单的搜索/替换

我试图了解如何使用 PEG.js 在文本中进行简单的搜索/替换。当然这不是解析器的预期用途,但无论如何我很好奇这些语言背后的逻辑以产生一些搜索/替换。

我遇到的问题是很难正面定义某些定义的补充。一个例子:假设我想搜索和替换类似这样的语法:

很难积极地描述whatever_is_not_my_syntaxPEG.js 中的my_syntax内容,而不会!expression[^characters].

你能帮助我吗?如果有任何关于这个主题的书籍或参考书目,我将不胜感激。先感谢您。

0 投票
0 回答
233 浏览

javascript - 是否可以将 PEG.js 与令牌数组而不是字符串一起使用?

我有以下类将代表不同类型的数据:

然后我构造输入数组:

然后我为 PEG.js 构建了一个语法:

我知道我可以使用带有字符串作为输入的 PEG.js(例如fasfa)。但我看不出有办法使用我自己的令牌输入流。有可能吗?


更新

最初的问题可以概括为“我需要一种方法来一次构建一个工具栏”。目前我有 3 种类型的块:Append、Squash 和 Final。

几个例子:

我认为可以将这个问题视为某种语言问题。那就是我有一个令牌输入流,我需要将其转换为其他东西(例如某个对象)。

0 投票
2 回答
380 浏览

parsing - 以任意顺序接受三个可选元素的 PEG 语法

假设我们有三个元素a bc

一个有效的表达式使用这三个元素(和可选的空格)。

  1. 这三个元素中的至少一个必须存在。
  2. 所有三个元素都是可选的(只要存在其他两个元素中的至少一个,请参见 1)。
  3. 这三个元素的提供顺序并不重要。

有没有一种惯用的方式来编写满足这三个要求的 PEG 语法?

我在http://pegjs.org/online上使用 peg.js并解决了 (1) (lookahead) 和 (2),但 (3) 让我无法理解。有什么建议么?

0 投票
1 回答
33 浏览

javascript - 语法匹配函数规则的次数超过了要求的次数

这是我使用的语法。匹配规则 'Func' 后的操作对输入字符串 if(diff("col")) 调用了 12 次,而不是 2 次。

调试我意识到在解析 Eq 规则时变量 peg$currPos 被设置了。我无法理解确切的行为

0 投票
1 回答
211 浏览

javascript - 测试 PEG.js 中的所有替代模式

我想使用 PEG.js 来识别几种不同格式的数字:

如果在替代序列中较早存在部分匹配,则 PEG.js 不会寻找替代。大多数数字以整数开头,如果不是,则以实数开头。我该如何重写它以便单独测试每个替代方案?(我对将规则组合成更少的规则不感兴趣。)

0 投票
1 回答
200 浏览

parsing - 如何使用 pegjs 语法仅解析评论?

我写了一个 pegjs 语法,它可以解析任何类型的 js/c 风格的注释。但是,它并不能很好地工作,因为我只设法捕获了评论本身,而忽略了其他所有内容。我应该如何更改此语法以仅从任何类型的输入中解析注释?

语法:

输入:

错误