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

python - 如何设置可以处理歧义的语法

我正在尝试创建一个语法来解析我设计的一些类似 Excel 的公式,其中字符串开头的特殊字符表示不同的来源。例如,$可以表示一个字符串,因此“ $This is text”在程序中会被视为字符串输入,并且&可以表示函数,因此&foo()可以被视为对内部函数的调用foo

我面临的问题是如何正确构建语法。例如,这是作为 MWE 的简化版本:

所以,使用这个语法,像: $This is a string, &foo(), &foo(#arg1), &foo($arg1,,#arg2)and&foo(!w1,w2,w3,,!w4,w5,w6)这样的东西都会按预期进行解析。但是,如果我想为我的simple终端增加更多的灵活性,那么我需要开始摆弄SINGLESTR不方便的令牌定义。

我试过什么

我无法超越的部分是,如果我想要一个包含括号的字符串(它们是 的文字func),那么在我目前的情况下我无法处理它们。

  • 如果我在 中添加括号SINGLESTR,那么我会得到Expected STARTSYMBOL,因为它与定义混淆了,func它认为应该传递一个函数参数,这是有道理的。
  • 如果我重新定义语法以仅为函数保留 & 符号并在 中添加括号SINGLESTR,那么我可以解析带括号的字符串,但我尝试解析的每个函数都会给出Expected LPAR.

我的意图是任何以 a 开头的东西$都会被解析为一个SINGLESTR标记,然后我可以解析像&foo($first arg (has) parentheses,,$second arg).

目前,我的解决方案是在我的字符串中使用 LEFTPAR 和 RIGHTPAR 之类的“转义”词,并且在处理树时我已经编写了辅助函数来将它们更改为括号。因此,$This is a LEFTPARtestRIGHTPAR生成正确的树,当我处理它时,它会被转换为This is a (test).

提出一个一般性问题:我能否以这样一种方式定义我的语法,即某些语法特殊的字符在某些情况下被视为正常字符而在任何其他情况下被视为特殊字符?


编辑 1

根据jbndlr我修改语法以创建基于开始符号的单独模式的评论:

这(有点)属于我的第二个测试用例。我可以解析所有simple类型的字符串(可以包含括号的 TEXT、MD 或 DB 标记)和空函数;例如,&foo()&foo(&bar())正确解析。在我将参数放入函数中的那一刻(无论哪种类型),我都会得到一个UnexpectedEOF Error: Expected ampersand, RPAR or ARGSEP. 作为概念证明,如果我在上面的新语法中从 SINGLESTR 的定义中删除括号,那么一切正常,但我又回到了原点。

0 投票
2 回答
459 浏览

python - Lark 中的布尔表达式解析器无法解析“a OR b OR c”

这个 Lark 解析器是基于这个问题和这个网站的,但是解析时失败了a OR b OR c

网站建议:

这似乎与另一个问题一致。我的实现和测试用例......

运行它:

我哪里出错了?我的转换是term { OR term }错误term | term OR term的吗?

0 投票
1 回答
564 浏览

python - Lark Parser: No terminal defined for ':' (Seeming bias against colon character ":")

I have the following rule (taken from SMTP - RFC5321):

When I try to parse this line:

I get the following error:

What's unusual is that if I simply change the ":" for "_", it somehow works:

What also works is a line not including that part [ a_d_l ":" ] (which is optional as indicated by [])

I already tried to define a terminal rule for the colon but this did not work either:

Minimal reproducible example:

As requested in the comments.

0 投票
1 回答
607 浏览

python-3.x - Lark:解析特殊字符

我从Lark解析特殊字符的问题开始并陷入困境。

我有语法给出的表达式。例如,这些是有效的表达式:Car{_}, Apple3{3+}, Dog{a_7}, r2d2{A3*}, A{+}... 更正式地说,它们的形式为:name{feature}where

  • name: CNAME
  • feature: (DIGIT|LETTER|"+"|"-"|"*"|"_")+

常量的定义可以在这里找到。

问题是生成的树中不存在特殊字符(参见下面的示例)。我已经看到了这个答案,但它对我没有帮助。我试图放在!特殊字符之前,转义它们。我还启用了keep_all_tokens,但这是不希望的,因为那时字符{}存在于树中。任何想法如何解决这个问题?谢谢你。

输出如下所示:

代替

0 投票
1 回答
111 浏览

context-free-grammar - 匹配 Lark 中的子串

如何使用Lark正确匹配子字符串?

我的意图(可能/不建议使用 Lark 或任何 CFG)是仅匹配和解析字符串的重要部分,而忽略其余部分。例如:

  • 从“约翰”,我想将“约翰”解析为one_person.
  • 从“昨天约翰睡觉”开始,我想将“约翰”解析为one_person并忽略其余部分。
  • 从“约翰和玛丽”开始,我想将“约翰和玛丽”解析为two_people.
  • 从“昨天约翰和玛丽接吻。”,我想将“约翰和玛丽”解析为two_people并忽略其余部分。

这是我的代码:

有用:

  • 当重要部分周围没有任何内容时,例如“John”或“John and Mary”。
  • 或者当重要部分只有一侧有不重要的东西时,例如“约翰睡了”或“约翰和玛丽亲吻了”。

但是当不重要的东西围绕着重要的东西时,它就不起作用了,例如“昨天约翰和玛丽接吻了”。在这个例子中,我希望得到:

但我得到:

也就是说,Lark 不仅将输入视为模棱两可,而且第二次解析也失败了,因为两个终端(“John”和“and”)被消耗了两次。

0 投票
2 回答
595 浏览

parser-generator - 如何用 Lark 解析 C++ 注释?

如何编写规则以单独或在其他代码之后解析 C++ 注释?

我尝试了很多组合,最新的一种是:

0 投票
1 回答
158 浏览

python - 我怎样才能使这个语法明确?

我正在尝试为一种简单的语言编写解析器:

当我运行它时,我收到以下错误:

我知道发生这种情况是因为,如果我们想象解析器是在没有错误的情况下构建的,然后写入parser.parse('foo'),两者arithmetic_exprboolean_expr都是“正确的”派生。此外,如您所见,我使用的是 LALR,它是一种严格确定性的算法,无法处理歧义。

所以我的问题是,我怎样才能使这个语法明确?我似乎找不到解决方案。

0 投票
1 回答
277 浏览

python - 在百灵蟒中检索令牌

所以我在 python 中使用 Lark 库来解析一些文本,我面临两个问题。我在文档中进行了搜索,但找不到从树中检索令牌的方法,第二个是我期待一棵具有多个令牌的树,但不是它,而是嵌套树,其中每棵树只有一个令牌。

这是我的代码:

我得到的结果:

我期待的结果:

0 投票
1 回答
1058 浏览

python - 云雀语法:转义字符串正则表达式如何工作?

Lark 解析器预定义了一些常见的终端,包括一个字符串。定义如下:

我明白_STRING_INNER。我也明白ESCAPED_STRING是怎么组成的。但我真的不明白的是_STRING_ESC_INNER

如果我正确阅读了正则表达式,它只是说,每当我找到两个连续的文字反斜杠时,它们之前一定不能有另一个文字反斜杠?

如何将这两者组合成一个正则表达式?

并且不要求语法只允许字符串数据中的转义双引号吗?

0 投票
1 回答
218 浏览

python - 如何优化 Lark 解析器的语法

我的目标是创建一个可用于解析 DBC 文件的解析器。文件格式的语法在此处给出

为了实现这一点,我选择了基于优秀 JSON 解析器教程的 Lark 解析器。

我根据上面的链接文档创建了一个语法文件并启动了独立的解析器生成器脚本。不幸的是,它在 30 分钟后仍在运行,并且该过程现在消耗 7.5 Gb 的内存。这当然是不可接受的。

我该怎么做才能成功生成解析器代码?