问题标签 [parsimonious]

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 回答
775 浏览

python - 解析表达式语法中的转义字符串

我正在尝试使用 python 库parsimonious为小型语言实用程序编写语法,但我正在努力编写一个涵盖字符串的部分,尤其是带有转义引号和其他特殊字符的字符串。

我有以下内容:

escapedString好像还没有定义,但应该接受任何人们合理地期望编程语言中的字符串接受的东西。我想不出从哪里开始。有没有人有什么建议?

0 投票
1 回答
1214 浏览

python - parsimonious parser - error trying to parse assignment grammar

I'm using the Python Parsimonious Parser to try to build an interpreter for a simple language I'm designing. I watched this tutorial video which was very helpful, and now I'm slowly modifying the code to match my own rules. I'm stuck on an assignment rule originally defined as:

I modified the rule slightly with the following grammar:

I'd like the parser to evaluate SET a, 7 for example, the same as a = 7 and bind the value 7 to the name a. However, when I attempt to parse it, I get this error from the Parsimonious library:

I'm fairly new to parsing/lexing and am not entirely sure if I defined the rule correctly. Was hoping someone with more parsing/lexing experience can help me properly define the rule and explain where I went wrong. Also perhaps explain the Parsimonious error to me?

0 投票
3 回答
306 浏览

python - 解析二进制数字序列

如何在 python 中解析二进制数字序列。以下是我正在尝试做的一个例子。

我有一个二进制数字序列,例如

而且,我需要解析它并提取数据。

假设上面的序列包含start、id、data 和 end 字段

start 是 2 位字段,id 是 8 位字段,数据字段可以在 1 到 8192 位之间变化,end 是 4 位字段。

解析后我期望输出如下:

我在我的一个应用程序中使用它。我可以使用正则表达式解析序列,但问题是正则表达式必须由用户编写。因此,作为替代方案,我使用 BNF 语法,因为语法更具可读性。

我尝试使用 python 的简约pyparsing解析器来解决这个问题。但我无法找到可变长度字段的解决方案。

我写的可用于python的语法parsimonious如下:

由于数据字段是可变长度的,并且解析器是贪婪的,所以上述序列无法与上述语法匹配。解析器将结束字段位带入数据字段。

我只是将我的问题简化为上面的示例。

让我描述一下完整的问题。有 3 种数据包(我们称它们为 Token、Handshake 和 Data 数据包)。令牌和握手包是固定长度的,数据包是可变长度的。(上面的例子是数据包的例子)

输入由连续的比特流组成。每个数据包开始由“开始”模式标记,数据包结束由“结束”模式标记。这两者都是固定的位模式。

令牌包语法示例:

握手包语法示例:

顶级规则示例:

如果只有一种类型的数据包,那么切片将起作用。但是当我们开始解析时,我们不知道最终会匹配到哪个数据包。这就是为什么我想到使用语法的原因,因为这个问题与语言解析非常相似。

我们可以让切片方法在我们有 3 种不同的数据包类型要解析的情况下工作吗?

解决这个问题的最佳方法是什么?

提前致谢,

0 投票
0 回答
166 浏览

python - 在python中解析位数组

我在我的一个项目中使用位数组来存储位(从具有“0”和“1”的文件中读取,以及所需的时间信息。文件也可以没有必要的字段,如注释等)。现在我想解析这些位。我在阅读文件时过滤掉了文件中所有不必要的东西。所以我需要一个可以解析位(位数组)的解析器。

目前,我正在使用简约解析器来解析字符串(即“0”和“1”),但似乎这个解析器只是将字符串作为输入。这是所有解析器的情况吗?或者我可以编写可以匹配python位数组/位字符串或列表或任何其他非字符串数据结构的语法规则吗?

因此,如果我想解析位(位数组),最好的方法是什么?

例子:

我在文件中有一个字符串“011000111100011010”。由于字符串中的“0”是一个字符,因此它在内存中占用 8 位。由于它浪费内存(因为我只需要一点来存储 0)我打算将这些位存储在位数组中。

说,我想匹配一个帧(长度为 18 位),它们可以表示如下

那么如何编写一个可以匹配这些位的简单语法规则。

这就是我使用简约的方法。(这里我认为“0”作为一个字符)

这只是一个例子,实际上场景要复杂得多。甚至文件大小也太大(~1GB)。所以我正在寻找一个可以存储位(不是字符)的数据结构和一个可以在 python 中解析位(不是字符)的解析器

0 投票
1 回答
196 浏览

python - 简约的 OrderedDict

parsimonious用来解析一些csv. 我的问题是生成的输出没有按预期的顺序输出。例如,如果输入字符串是

那么我希望得到:

我得到的是:

对于我尝试的每个输入,这都是一个一致的问题:第一个标记是条目 OrderedDict 中的最后一项,但我不知道为什么。

这是我的代码:

0 投票
1 回答
1227 浏览

python - 为什么 Parsimonious 用 IncompleteParseError 拒绝我的输入?

我一直在尝试为我一直在设计的一种语言制定基本框架,并且我正在尝试使用Parsimonious为我进行解析。截至目前,我已经声明了以下语法:

当我尝试输出一个简单输入字符串的结果 AST 时,例如"{ do-something some-argument }"

Parsimonious 决定彻底拒绝它,然后给了我这个有点神秘的错误:

起初我认为这可能是与我的空格规则有关的问题_,但是在尝试在某些地方删除空格规则失败后,我仍然遇到了同样的错误。

我尝试过在线搜索,但我发现似乎与远程相关的只是这个问题,它对我没有任何帮助。

我的语法有问题吗?我没有以正确的方式解析输入吗?如果有人对此有可能的解决方案,将不胜感激。

0 投票
1 回答
57 浏览

python - 在自定义语法中修改变量的最有效方法?

我正在使用一个适当的驾驶模拟器,它在Scilab的定制版本中生成“场景”文件。我提供了一个 11,000 行长的“主”文件,我需要从中替换某些值以生成n 个版本的场景。

单亲的语法的一个最小示例是TASK这样的:

我需要用标准输入替换此脚本中的某些值。例如,有一个名称列表将替换LABEL父级别下的值TASK;并且必须用6 到 16 之间的随机数替换VALUE第一个父母。VARIABLE

我的第一个解决方案是基于 Python REGEX,如下所示(但对于我寻求更改的每个值):

有人建议我可以用 Parsimonious 之类的东西编写自定义语法,然后用 Mustache 重新生成输出。

如您所见,这也不是解决问题的有效方法。大家觉得有什么更好的解决方案?

0 投票
2 回答
347 浏览

python - 将模型文件读入 PySD 时理解解析错误

当我尝试使用 Python 的 PySD 包读取 Vensim 模型文件 (.mdl) 时收到以下错误消息。

我的代码是:

我收到的错误是:

我已经搜索了这个特定的错误,但我找不到很多关于“下标列表”匹配规则失败的信息。

我很欣赏任何见解。谢谢你。

0 投票
1 回答
156 浏览

python - pysd 库 ParseError

我正在使用一个名为pysdvensim文件转换为 Python 的库,但是当我尝试这样做时(库函数),我得到一个解析错误,但不明白它的含义。

这是我的日志。


0 投票
1 回答
285 浏览

python - 如何解析以相同字符开头的简约替代品

我正在使用parsimonious进行一些解析,但我无法弄清楚如何正确解析在无序中共享第一个字符的替代方案:

例如:

文本:

语法:

文本的第一行将正确解析,但第二行不会。看起来它匹配“>”然后因为看到“=”而被卡住。它从不匹配 ">=" 作为一个整体。我如何做到这一点而不必仔细指定这些?我尝试使用“&”进行前瞻匹配,但这似乎不起作用。