问题标签 [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.
parsing - 解析嵌套的“if/else”语句
我正在研究该OpenSCAD
语言的 JavaScript 实现,为此目的,它是一种 C 类型的语言。
我已经能够成功解析各种if
和if/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
javascript - 为什么在使用 Moo 作为标记器/词法分析器时,nearley-unparse 不包括从编译的 Nearley 语法生成的示例字符串中的标记
我不确定这是否是Nearley.js 库、Moo 分词器/词法分析器或我自己的代码的问题。所以我可能需要将此作为问题提交给 Nearley 回购。所有引用的文件都可以在这个 Gist中找到。
我正在尝试编写一个 Nearley 语法,它将解析我的一门课程的家庭作业问题列表。问题在issues.txt中,如下所示:
仅以两行为例,整个文件更大。
我写的 Nearley 语法在problems-grammar.ne
这里,我还没有完全完成。我正在根据Nearley 文档中的这些说明使用 Moo 标记器/词法分析器。
我目前正在使用这里解释的命令来测试我的语法,nearley-unparse
这里使用这个命令,problems-grammar.js
Nearley 编译的解析器在哪里。
不幸的是,除了换行符之外,反解析器似乎没有正确地生成带有标记示例的语法。这是一个输出nearley-unparse
:
我想知道这是我的语法缺陷还是 Nearley/Moo 本身的缺陷。如果我的代码有问题,我该如何解决?
javascript - Nearley 语法在特定条件下多次识别相同的非终结符
给定以下近乎代码:
当我运行 nearley-test 来测试我编译的解析器时,我得到以下结果:
命令:
结果:
到目前为止一切顺利,下一个测试:
结果:
看起来它在没有注释的情况下识别了 X 命令两次,然后在注释中识别了一次。只有当评论中有空格时才会发生这种情况,这让我感到困惑......
现在,如果我在行尾使用包含空格的注释对其进行测试,我会得到:
结果:
所以似乎只有当我以包含空格的注释开始该行时才会发生错误,这很奇怪......
有谁知道我可以做些什么来获得更一致的行为?我的意思是,我能做些什么来让解析器在每次出现时识别命令和注释一次,而不管注释中的空格如何,也不管注释是在该行的其他项目之前还是之后?
parsing - Nearley 语法与终端和非终端一个接一个地匹配相同的文本位,产生错误的结果
语法菜鸟在这里。
我需要解析类似于 SymPy 接受的数学公式,并将它们转换为某种从左到右的语法树,使用 Nearley这个语法。
当我有一个表达式,比如a*sin(x)*y
wheresin
首先被识别为 a SY
,然后是 a时,就会出现问题FN
。如果我想能够解析变量(这就是SY
目的),我认为这是一种必要的邪恶。结果是这样的
更糟糕的是,当表达式为 时a*sin(x)^y
,我得到
我想这[Circular]
意味着某处存在某种邪恶的循环。
我怀疑我可以解决上面硬编码检查的第一个问题,如果两个“匹配”,则SY
用正确FN
的替换检查,但我宁愿避免这样的混乱。我不知道第二个发生了什么——尽管我已经为此做了一整天,而且我的头脑很可能是阴云密布。我今天一到办公室再调查一下。
有什么线索吗?
编辑:我设法用一个可怕的黑客“解决”了第一个问题(Fn
作为一个Symbol
同名的孩子)。循环问题依然存在。我正在调查,但我可能会发现另一个可怕的黑客。如果可能的话,我宁愿看到语法的修复而不是转换函数。
definition - Nearley 标记器与规则
根据网站,我对Near.js很陌生,我想知道与规则相比,标记器/词法分析器做了什么:
默认情况下,nearley 将输入拆分为字符流。这称为无扫描仪解析。标记器将输入拆分为称为标记的更大单元流。这发生在解析之前的单独阶段。例如,分词器可能会转换
512 + 10
为["512", "+", "10"]
:注意它是如何删除空格的,并将多位数字组合成一个数字。
那岂不是一样:
我不明白词法分析器的目的是什么。我看到在这种情况下规则总是可用的,并且不需要词法分析器。
javascript - Nearley Moo - 语法不适用于使用的 Moo 词法分析器
我将 nearley.js 语法(和解析器)与 moo.js 标记器一起使用。我的 Grammar.ne 文件如下:
将字符串“sin8”解析到解析器时,通过nearley-test grammar.js -i "sin8"
,我收到以下错误:
但是,注释@lexer lexer
使它起作用,并匹配“sin8”字符串。这个例子直接取自文档并且不起作用,所以我想知道我错在哪里。
javascript - 在 Nearley 中使用嵌套宏嵌套数据结果
问题
乍一看,如果没有一些严重的错误,宏就无法正确嵌套。
主要问题是从数据对象中检索宏的值会将这个值嵌套到一个列表中:
预期的结果是[ 'test' ]
。
一个快速的解决方法是返回 data[0][0],但这还不够,因为结果会嵌套在宏的每一层:
为了修复我们可以data => data[0][0]
用于每个宏的错误。然而,这绝对是丑陋的。
真正的解决方法是使用动态范围。由于我们不能(据我所知)创建没有参数的宏,让我们使用无用的参数:
这停止了之前发生的嵌套地狱——我们可以通过 500 个子宏并且仍然得到相同的结果。但是我们仍然需要为最终的 sub-macro 放置 data[0][0] b
,这会阻止我们b
单独使用宏 - 我们必须使用a
它才能工作。
我们正在寻找一种解决方案: - 允许单独使用最后一个宏 - 避免使用 data => data[0][0]
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
非常感谢您!
javascript - 如何修复“语法错误:意外的令牌:”
我试图让近乎工作,但我最终收到'SyntaxError:Unexpected token :'。
当我运行时会显示问题nearley-test -i "help" command.js
,我不完全确定它的原因是什么。由于我对 javascript 不太熟悉,而且这是一些旧的遗留代码,可能是某些东西在更高版本的 javascript/node 中停止工作?
错误:
代码:
引用的 CommandType 是:
任何帮助将不胜感激!
bnf - 如何为布尔搜索运算符编写明确的近利语法
上下文
我正在攀登Nearley学习曲线并尝试为搜索查询解析器编写语法。
目标
我想编写能够解析包含布尔运算符(例如AND
,,OR
)的查询字符串的语法NOT
。让我们将AND
这个问题用作一个简单的案例。
例如,语法应该将这些示例字符串识别为有效:
- 裤子
- 裤子和袜子
- 千斤顶
尝试
我天真的尝试看起来像这样:
问题
上面的语法尝试是模棱两可的,因为它.:+
会匹配任何字符串。我真正想要的是第一个条件匹配任何不包含AND
在其中的字符串。一旦出现“AND”,我只想输入第二个条件。
问题
我怎样才能检测到这两种不同的情况而不会出现语法不明确的情况?
我担心我错过了一些基本的东西;我可以想象大量的用例,我们希望任意文本被已知的操作符分割。