微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 Lark 解析获取下一个可能的标记

如何解决使用 Lark 解析获取下一个可能的标记

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

例如,如果我有语法。

?start: NAME "=" possible_values
possible_values: "apple" | "banana" | "orange"

然后我输入字符串“my_variable ="

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

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

解决方法

实际上是的,在最新版本 (0.11.3) 中添加。

它被称为 InteractiveParser/Lark.parse_interactive 它目前只适用于 parser='lalr' 并且界面可能会更改到版本 1.0。

可以这样使用:

from lark import Lark

parser = Lark(r"""
?start: NAME "=" possible_values
possible_values: "apple" | "banana" | "orange"
NAME: /\w+/
%ignore /\s+/
""",parser="lalr")

interactive = parser.parse_interactive("my_variable = ")

# feeds the text given to above into the parsers. This is not done automatically.
interactive.exhaust_lexer()


# returns the names of the Terminals that are currently accepted.
print(interactive.accepts())

请注意,accepts 会返回一个终端名称列表,这些列表最有用,但也可能是自动生成的,而且不太有用(类似于 __ANON_0)。实际定义可通过 parser.terminals 访问,这是一个列表,您必须从中提取正确的定义:

term_name = "BANANA"

term_def = next(t for t in parser.terminals if t.name==term_name)

print(term_def.name)
print(term_def.pattern)

这是关于 InteractiveParser

的文档

(为了将来更快地得到答案,请在 gitter 上发布指向您的 SO 问题的链接)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。