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

python - 使用 LALR 从单词列表中解析可选关键字的语法规则

我有这样的字串:

  • “ABC Some other stuff”(通常开头有一个短字母组合)
  • “一些其他的东西”(有时没有什么有趣的)
  • “HFG 54 Some other stuff and even more”(有时有一个有趣的数字)
  • “HFG 54 ZZ Some other stuff and even more”(有时在数字后面有 ZZ)
  • “HFG-54 ZZ 一些其他的东西,甚至更多”(有时会有破折号)
  • “ZT SOME OTHER STUFF”(其余部分也可以大写)
  • "(ZT) Some other stuff" (部分可以在括号中)
  • “68 Some other stuff”(只能是数字)
  • “其他一些东西 DFG”(可以在最后)

我制定了一些规则来解析它,并且使用 larks Early-parser 可以正常工作。现在我想用 Lalr-Parser 试一试,但特殊词无法识别。我对大写字母组合和数字感兴趣。我有一个可能的字母组合列表。数字总是两位数。字符串的其余部分可以是任何东西。

我正在使用云雀。这是我的解析器:

我如何必须更改规则才能使用 lalr-parser 来解析它?

尝试一下:

我明白了

但我想要

因为"HFG 54 Some other stuff and even more"我得到一个错误:

但我想要:

实际上,字符串更长,看起来像这样“有趣的东西,我已经解析了 ABC 一些其他的东西”,我已经解析了字符串开头的东西,而且效果很好。


从评论看来,这是不可能的,因为我在这里没有上下文无关的语言,而且显然 larl 只能做 cfg 语言。如果有人添加并回答快速解释这两者的地方,我会很高兴。

0 投票
0 回答
62 浏览

python - 如何匹配 Lark 中的开始和结束标签?

我正在尝试使用LarkWordPress 短代码创建一个解析器。该语言中的自闭合标签与标准的开始标签没有区别,即使在完全有效的语法中也会造成相当多的歧义。我已经让它大部分工作了,但正在努力匹配开始和结束标签。

以下示例包含一个自闭合标签 [a] 和一个带有纯文本内容的标签 [b][/b]:

我的语言定义的相关部分如下所示:

我希望为开始/结束标记变体使用模板会做类似于正则表达式组逻辑的事情,例如"[" (name) attrs "]" value "[/" $1 "]",但这似乎只是被解压缩到"[" shortcode_name attribute_list "]" value "[/" shortcode_name "]"中,导致上述文本被解析为:

是否有一个选项告诉 Lark 开始标签中的名称值应该与结束标签中的名称值相同?

0 投票
1 回答
108 浏览

python - 初学者问题:“在第 2 行 col 1 int "i" 10" Lark 中没有为 'i' 定义终端

我对 lark 很陌生,正在尝试创建一个简单的解析器,但我对一个看似简单的问题感到厌烦,为什么在第 2 行 col 1 int "i" 10" 处没有为 'i' 定义终端?这是我的语法:

和文本输入:

我是新手,不知道为什么这不起作用,任何提示都可以使用

此外,还有一个较小的第二个问题是有没有办法摆脱“i”和“s”周围的引号,因为当我删除它们时,它们不再成为转义字符串。

0 投票
2 回答
96 浏览

python - let e1 in e2 的明确语法

我试图创建一个 let 语法我的想法是这样的

这个想法是解析这样的表达式let A = B in Clet A in B两者都混合let f = let x in x + 1 in f(1)。我也想支持括号来消除歧义let A = (let b in b + 1) in A(1) + 1

我正在使用 lark,带有 LALR 解析器,但我在语法上苦苦挣扎,无法为此定义明确的语法

我试过了

但我有很多减少减少错误

我不知道如何定义这个语法,这个想法很简单let : "let" ID ("=" let)? "in" let | atom有什么想法吗?

0 投票
1 回答
54 浏览

ebnf - 如何使用 Lark EBNF 拆分规则?

我正在编写解析 PlantUML 状态图的语法,并且有以下疑问:

我有:

但不得不改为:

因为,对于我的应用程序,我不需要也不关心使用哪种类型的箭头;知道那里有一个箭头来形成过渡就足够了。

问题是:有没有办法transition在解析树中不出现箭头类型的情况下将规则拆分为其他更易于管理的规则?

完整文件位于https://github.com/thomedes/PlantUML-Lark-EBNF。随意评论/批评。想在这里学习

0 投票
1 回答
55 浏览

python - 从 lark-parser 返回的 AST 中删除正则表达式终端

我有兴趣使用. 解析网站爬虫lark的典型输出。以下是基于我自己的 github 网站的一些示例输出示例:

我正在使用以下语法:

调用pretty生成的树会导致以下结果:

这看起来没问题,但我不想bar我的树中包含终端。我怎样才能做到这一点?我浏览了文档并尝试在前面bar加上下划线和/或问号,但由于某种原因,这无济于事......

0 投票
1 回答
54 浏览

python - 有没有办法让终端匹配除特定关键字之外的每个名称?

我正在使用 lark 来解析一些文本,并且需要一种方法来匹配NAME其中没有某些关键字的内容。我在终端中列出了关键字我只是不确定如何制作我需要使用它的终端。

这是我格式化关键字的方式

对此的所有帮助表示赞赏!

0 投票
0 回答
70 浏览

lark-parser - 如何在 Lark 中实现前瞻?

我目前正在研究使用 Lark 编写 Python 3.8 语法所做的工作,我想知道如何使用 Python 3.9 语法规范来完成这项工作,这对我来说看起来有点简单。请注意,我不确定下面描述的方法是否正确。

在 Python 3.9 语法规范中,我们有使用负前瞻的规则,如下所示:

我尝试使用正则表达式来定义这种负前瞻,如下所示:

但它会产生以下异常:LexError: Lexer does not allow zero-width terminals.有没有办法用 Lark 定义前瞻?

0 投票
1 回答
193 浏览

python-3.x - 如何从 lark-parser 树中获取变量名列表?

我正在使用 python 3.8.5 和 lark-parser 0.11.2。我有一个关于访客的问题。

我有一个满足我需要的语法,Lark 工作得很好。我有一种情况,在某些情况下,我想评估返回的解析树并对其进行扫描以获取出现在树中的变量名称列表,该列表可能为空。

一个示例表达式是:

表达式的解析树是:

我想我会写一个访问者类,它会扫描树中的变量并将它们存储在一个内部列表中:

我正在尝试将其用作:

我遇到的问题fv = FindVariables()是执行 时出现TypeError异常:

如果我将上面的调用更改为:

该语句运行但fv不“看到” variable_list

我可能滥用了访客类。有没有最好/更好的方法来解决这个问题?

0 投票
1 回答
71 浏览

parsing - Lark : 如何只挑选一些图案

我想从文本文件中只提取一些结构化模式。

例如,在下面的文本中:

我只想隔离'foo FUNC1;'。

我试图将云雀解析器与以下解析器一起使用

但是“任何东西”这个代号涵盖了所有内容。有没有办法让它不贪心?这样令牌'foo'可以捕获给定的模式?