#python #lark-parser
Вопрос:
Я хотел знать, есть ли способ получить следующий возможный токен данной строки и заданной грамматики с помощью синтаксического анализа жаворонка.
Например, если у меня есть грамматика.
?start: NAME "=" possible_values
possible_values: "apple" | "banana" | "orange"
и я ввожу строку «my_variable =»
Следующими возможными жетонами были бы "apple", "banana" or "orange"
.
Есть ли какая-либо встроенная функциональность, которая может помочь мне достичь этого?
Ответ №1:
На самом деле да, добавлено в новейшей версии (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
(Для более быстрых ответов в будущем опубликуйте ссылку на свой вопрос SO на gitter)