使用 lark 解析获取下一个可能的标记
Getting next possible tokens with lark parsing
我想知道是否有办法通过 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
returns 终端名称列表,这些名称大多有用,但可能是自动生成的,但用处不大(类似于 __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)
上的文档
(为了将来能更快得到答案,post 对 gitter 上的 SO 问题 link)
我想知道是否有办法通过 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
returns 终端名称列表,这些名称大多有用,但可能是自动生成的,但用处不大(类似于 __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)
上的文档
(为了将来能更快得到答案,post 对 gitter 上的 SO 问题 link)