Получение следующих возможных жетонов с помощью парсинга жаворонка

#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)