问题标签 [nearley]

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 投票
0 回答
231 浏览

parsing - 解析嵌套的“if/else”语句

我正在研究该OpenSCAD语言的 JavaScript 实现,为此目的,它是一种 C 类型的语言。

我已经能够成功解析各种ifif/else语句:

但是,我遇到了一个特定的组合,它让我留下了“模棱两可的语法”——Nearley.js表示解析可能以多种方式发生:

尝试的解决方案 1:从少数不同的来源制作

尝试的解决方案 #2 选自https://github.com/vsl-lang/VSL/blob/develop/src/vsl/parser/parser.ne

尝试的解决方案3:仍然可以解析两种方式

有没有人成功地用 Earley 语法解析过这种语法?

提示?建议?哎呀,我什至会采取解决方案!

(整个包都可以在 github 上找到,但需要进行一些调整才能在其他机器上运行。) https://github.com/JeremyJStarcher/openscadtojs

0 投票
1 回答
340 浏览

javascript - 为什么在使用 Moo 作为标记器/词法分析器时,nearley-unparse 不包括从编译的 Nearley 语法生成的示例字符串中的标记

我不确定这是否是Nearley.js 库Moo 分词器/词法分析器或我自己的代码的问题。所以我可能需要将此作为问题提交给 Nearley 回购。所有引用的文件都可以在这个 Gist中找到。

我正在尝试编写一个 Nearley 语法,它将解析我的一门课程的家庭作业问题列表。问题在issues.txt中,如下所示:

仅以两行为例,整个文件更大。

我写的 Nearley 语法在problems-grammar.ne 这里,我还没有完全完成。我正在根据Nearley 文档中的这些说明使用 Moo 标记器/词法分析器。

我目前正在使用这里解释的命令来测试我的语法,nearley-unparse这里使用这个命令,problems-grammar.jsNearley 编译的解析器在哪里。

不幸的是,除了换行符之外,反解析器似乎没有正确地生成带有标记示例的语法。是一个输出nearley-unparse

我想知道这是我的语法缺陷还是 Nearley/Moo 本身的缺陷。如果我的代码有问题,我该如何解决?

0 投票
1 回答
460 浏览

javascript - Nearley 语法在特定条件下多次识别相同的非终结符

给定以下近乎代码:

当我运行 nearley-test 来测试我编译的解析器时,我得到以下结果:

命令:

结果:

到目前为止一切顺利,下一个测试:

结果:

看起来它在没有注释的情况下识别了 X 命令两次,然后在注释中识别了一次。只有当评论中有空格时才会发生这种情况,这让我感到困惑......

现在,如果我在行尾使用包含空格的注释对其进行测试,我会得到:

结果:

所以似乎只有当我以包含空格的注释开始该行时才会发生错误,这很奇怪......

有谁知道我可以做些什么来获得更一致的行为?我的意思是,我能做些什么来让解析器在每次出现时识别命令和注释一次,而不管注释中的空格如何,也不管注释是在该行的其他项目之前还是之后?

0 投票
0 回答
130 浏览

parsing - Nearley 语法与终端和非终端一个接一个地匹配相同的文本位,产生错误的结果

语法菜鸟在这里。

我需要解析类似于 SymPy 接受的数学公式,并将它们转换为某种从左到右的语法树,使用 Nearley这个语法

当我有一个表达式,比如a*sin(x)*ywheresin首先被识别为 a SY,然后是 a时,就会出现问题FN。如果我想能够解析变量(这就是SY目的),我认为这是一种必要的邪恶。结果是这样的

更糟糕的是,当表达式为 时a*sin(x)^y,我得到

我想这[Circular]意味着某处存在某种邪恶的循环。

我怀疑我可以解决上面硬编码检查的第一个问题,如果两个“匹配”,则SY用正确FN的替换检查,但我宁愿避免这样的混乱。我不知道第二个发生了什么——尽管我已经为此做了一整天,而且我的头脑很可能是阴云密布。我今天一到办公室再调查一下。

有什么线索吗?


编辑:我设法用一个可怕的黑客“解决”了第一个问题(Fn作为一个Symbol同名的孩子)。循环问题依然存在。我正在调查,但我可能会发现另一个可怕的黑客。如果可能的话,我宁愿看到语法的修复而不是转换函数。

0 投票
1 回答
311 浏览

definition - Nearley 标记器与规则

根据网站,我对Near.js很陌生,我想知道与规则相比,标记器/词法分析器做了什么:

默认情况下,nearley 将输入拆分为字符流。这称为无扫描仪解析。标记器将输入拆分为称为标记的更大单元流。这发生在解析之前的单独阶段。例如,分词器可能会转换512 + 10["512", "+", "10"]:注意它是如何删除空格的,并将多位数字组合成一个数字。

那岂不是一样:

我不明白词法分析器的目的是什么。我看到在这种情况下规则总是可用的,并且不需要词法分析器。

0 投票
2 回答
886 浏览

javascript - Nearley Moo - 语法不适用于使用的 Moo 词法分析器

我将 nearley.js 语法(和解析器)与 moo.js 标记器一起使用。我的 Grammar.ne 文件如下:

将字符串“sin8”解析到解析器时,通过nearley-test grammar.js -i "sin8",我收到以下错误:

但是,注释@lexer lexer使它起作用,并匹配“sin8”字符串。这个例子直接取自文档并且不起作用,所以我想知道我错在哪里。

0 投票
2 回答
133 浏览

javascript - 在 Nearley 中使用嵌套宏嵌套数据结果

问题

乍一看,如果没有一些严重的错误,宏就无法正确嵌套。

主要问题是从数据对象中检索宏的值会将这个值嵌套到一个列表中:

预期的结果是[ 'test' ]

一个快速的解决方法是返回 data[0][0],但这还不够,因为结果会嵌套在宏的每一层:

为了修复我们可以data => data[0][0]用于每个宏的错误。然而,这绝对是丑陋的。

真正的解决方法是使用动态范围。由于我们不能(据我所知)创建没有参数的宏,让我们使用无用的参数:

这停止了​​之前发生的嵌套地狱——我们可以通过 500 个子宏并且仍然得到相同的结果。但是我们仍然需要为最终的 sub-macro 放置 data[0][0] b,这会阻止我们b单独使用宏 - 我们必须使用a它才能工作。

我们正在寻找一种解决方案: - 允许单独使用最后一个宏 - 避免使用 data => data[0][0]

0 投票
1 回答
98 浏览

nearley - 为什么我的 Nearley 语法会导致循环?

我在玩 nearley.js,有些东西让我很困惑。作为测试,我正在尝试构建一个解析扑克等级的解析器。

现在,这个语法按预期工作:

但是,我更改| composition _ "," _ rank为第二个,| composition _ "," _ expression然后我结束了一个循环:

有人可以解释一下为什么会这样吗?代码可以在操场上快速测试: https ://omrelli.ug/nearley-playground/

我使用的测试字符串是:a, k, q, j, t, 9, 8, 7, 6, 5, 4, 3, 2

非常感谢您!

0 投票
1 回答
1289 浏览

javascript - 如何修复“语法错误:意外的令牌:”

我试图让近乎工作,但我最终收到'SyntaxError:Unexpected token :'。

当我运行时会显示问题nearley-test -i "help" command.js,我不完全确定它的原因是什么。由于我对 javascript 不太熟悉,而且这是一些旧的遗留代码,可能是某些东西在更高版本的 javascript/node 中停止工作?

错误:

代码:

引用的 CommandType 是:

任何帮助将不胜感激!

0 投票
1 回答
384 浏览

bnf - 如何为布尔搜索运算符编写明确的近利语法

上下文

我正在攀登Nearley学习曲线并尝试为搜索查询解析器编写语法。

目标

我想编写能够解析包含布尔运算符(例如AND,,OR)的查询字符串的语法NOT。让我们将AND这个问题用作一个简单的案例。

例如,语法应该将这些示例字符串识别为有效:

  • 裤子
  • 裤子和袜子
  • 千斤顶

尝试

我天真的尝试看起来像这样:

问题

上面的语法尝试是模棱两可的,因为它.:+会匹配任何字符串。我真正想要的是第一个条件匹配任何不包含AND在其中的字符串。一旦出现“AND”,我只想输入第二个条件。

问题

我怎样才能检测到这两种不同的情况而不会出现语法不明确的情况?

我担心我错过了一些基本的东西;我可以想象大量的用例,我们希望任意文本被已知的操作符分割。