问题标签 [lark-parser]

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

python - 在不为数据格式编写解析器的情况下,我应该如何继续解析表格数据的字段?

我们有很多来自供应商的列表,其中包含不同格式的产品数据,并且在每个列表中都有许多不同的方法来描述产品一个简短的示例列表:

产品类别 描述
一个 11,3*3/3 蓝色
一个 11.5x4 黄木
特殊 11.5x4 黄色木材
规格 11,3*3/3 蓝色

您可以看到列表本身是非常不同的。通常只有一列具有多种不同格式的描述。我们仅针对该字段的内容创建并运行解析器,以将数据转换为结构化形式。解析器通常从不同的可能变体开始:

这些例子不是最好的,但我认为这足以理解我们所做的事情。稍后我们可以轻松地从解析的树中构建一个漂亮的列表,每个人都很高兴。

但是现在我们遇到了一些变体依赖于另一列中的另一个字段的问题。例如,我想添加另一个这样的规则:

我想让它尽可能简单,不想增加太多逻辑。我也不想每次都在这个简短的翻译文件中完全解析 csv/excel/tab_seperated/txt。我的一个想法是将每一行转换为由特定符号连接的长字符串,因此解析后的字符串如下所示:

然后用户只需设置此分隔符并可以像这样正常传递它:

但这对我来说似乎真的很hacky和容易出错,我想知道是否有更好的解决方案。有一个更好的方法吗?我没有看到漂亮而优雅的解决方案吗?

0 投票
0 回答
44 浏览

python - 限制 LARK 中递归语法的深度

我正在使用Lark来解析语法:

首先,有没有一种方法可以鼓励 Lark 以 BFS 方式解析,更喜欢浅解析树而不是深解析树?

其次,有一种方法可以限制语法递归的最大深度。显然,我可以用正则表达式指定一个标记的数量,token{from, to}但我可以用递归做类似的事情,说一堆 np 只能是 x 长吗?

0 投票
2 回答
273 浏览

python - Python Lark 解析器:我安装的所有版本似乎都没有 .pretty() 打印方法

问题:

具体错误:

  • AttributeError:类型对象'Lark'没有属性'pretty'

设置:

Python 版本 = 3.8.1

在 Mac Bug Sur 上的 Miniconda 3 中

安装 0.11.2-pyh44b312d_0

安装 0.11.3-pyhd8ed1ab_0

编辑:注意我的目标:

这里的目标不仅仅是解析 JSON;我只是碰巧正在使用一个 JSON 示例来尝试和学习。我想为我在工作中处理的一些数据编写自己的语法。

编辑:为什么我相信漂亮的印刷品应该存在:

这是一个使用 .pretty() 函数的示例,甚至包括输出。但我似乎找不到任何包含 .pretty() 的内容(至少通过 conda):http: //github.com/lark-parser/lark/blob/master/docs/json_tutorial.md

0 投票
1 回答
114 浏览

lark-parser - 如何在语法中添加一点上下文?

我的任务是解析(和转换)一种计算机语言的代码,它的规则有点奇怪,至少我是这样看的。准确地说,编译器将新行(以及分号)视为语句分隔符,但除此之外(例如在语句内部),它会将它们视为间隔符(空格)。

例如,这段代码:

证明等价于:

我不知道如何在 EBNF 中,或者特别是在 Lark EBNF 方言中表达这样的规则。我的意思是一种明智的方式。我可能可以在所有语句中定义所有可能的换行位置,但这会很麻烦且容易出错。

我希望找到一种根据上下文处理换行符的方法。有没有一种经过验证的方法,最好是在 Python/Lark 域中?如果我必须为此修改解析器,那么我应该从哪里开始呢?

或者,如果我特别误解了这种语言或机器语言解析中的某些内容,或者我对问题的陈述是错误的,我也很乐意接受教育。

(正如您可能猜到的那样,所讨论的语言具有经过充分验证的实现,但没有正式定义的语法。此外,它是 Squirrel,尽管它很重要。)

0 投票
1 回答
139 浏览

python - 通过 Lark 解析获取下一个可能的令牌

我想知道是否有一种方法可以通过 Lark 解析获取给定字符串和给定语法的下一个可能标记。

例如,如果我有语法。

我输入字符串“my_variable =”

下一个可能的标记是"apple", "banana" or "orange".

是否有任何内置功能可以帮助我实现这一目标?

0 投票
0 回答
52 浏览

python - Lark 连载

我正在使用 python lark 来解析特定领域的语言,但我还没有制作使用 lalr 解析所需质量的语法文件。因此,解析一个简单文件需要 3 秒以上。有没有一种简单的方法来序列化解析的 lark 文件,这样我就可以将它存储在一个文件中并重新打开它,而无需重新解析文本。

有什么比用泡菜更好的吗?

0 投票
1 回答
103 浏览

python - 为什么我们需要指定标准的 Lark 词法分析器才能捕获评论终端?

我正在开发一个基于 Lark 的项目,我需要能够“捕获”正在解析的代码中的注释。

但是,在没有明确指定标准词法分析器的情况下使用标准词法分析器时它不起作用。

我从Lark 食谱中获取了第二个示例,并将其修改为使用默认解析器并解析类似 C++ 的单行注释:

如果我没有lexer='standard'结果是一个空列表。

'standard'但是,当没有明确指定时,它不应该已经在使用词法分析器吗?这是我的代码中的错误,还是 Lark 中可能存在的错误?


进一步的实验似乎表明它要么是 要么'dynamic''dynamic_complete'默认情况下使用(lexer未指定)。

0 投票
0 回答
62 浏览

python - 如何使用“动态”词法分析器在基于 Lark 的解析器中“捕获”终端

这是我之前的一个后续问题:为什么我们需要指定标准的 Lark 词法分析器才能捕获评论终端?

我需要在基于 Lark 的解析器解析的 DSL 中“捕捉”并保存注释。使用词法分析器时似乎效果很好'standard',但是语法无法解析 DSL 的其余部分。

取而代之的是'dynamic'or'dynamic_complete'需要使用,但是评论似乎无法被“抓住”。

我一直在使用Larks 自己的测试配方中的第二个示例的变体:

该程序会将注释打印为空列表 ( []),否则将忽略它们。

还有其他方法可以“捕获”和保存需要忽略的终端吗?

0 投票
2 回答
110 浏览

python - Lark 匹配自定义分隔符多行字符串

我正在尝试使用 lark 从 perl 文件中提取一些信息。为此,我需要对语句是什么有一个基本的了解。我遇到的问题是“Here Document”字符串。我会将它们描述为带有自定义分隔符的多行字符串,例如:

在写下这个问题时,我想出了一个使用带有反向引用/命名引用的正则表达式的解决方案。由于我找不到任何类似的问题,我决定发布问题并自己回答。

如果有人知道任何其他方法(例如跨多个 Lark 规则使用反向引用的方法),请告诉我!

0 投票
0 回答
57 浏览

python - Python LARK:文本混乱中的终端字符

我正在尝试使用 Python Lark 解析数据库中计划的输出。这是我的语法:

不是世界上最好的语法,但它适用于简单的事情。问题是,有时文本内有括号和括号,这并不重要。如果我将它们添加到正则表达式文本规则中,它会弄乱 op 规则。有没有一种简单的方法来解决这个问题,还是我必须添加关于文本的复杂规则?