使用云雀解析获取下一个可能的代币



我想知道是否有办法通过 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 问题的链接)

最新更新