Lark — это набор инструментов для синтаксического анализа Python, созданный с упором на эргономику, производительность и модульность.
Lark может анализировать все контекстно-свободные языки. Проще говоря, это означает, что он способен анализировать практически любой язык программирования, а также, в некоторой степени, большинство естественных языков.
Для кого это?
Начинающие : Жаворонок очень дружелюбен к экспериментам. Он может анализировать любую грамматику, которую вы ему бросите, независимо от того, насколько она сложна или неоднозначна, и делает это эффективно. Он также создает для вас аннотированное дерево синтаксического анализа, используя только грамматику и входные данные, и предоставляет вам удобные и гибкие инструменты для обработки этого дерева синтаксического анализа.
Эксперты : Lark реализует как Earley(SPPF), так и LALR(1), а также несколько различных лексеров, поэтому вы можете выбирать между мощностью и скоростью в соответствии с вашими требованиями. Он также предоставляет множество сложных функций и утилит.
Что он может сделать?
И многие другие функции. Читайте дальше и узнайте!
Самое главное, что Lark сэкономит вам время и избавит вас от головной боли при синтаксическом анализе.
$ pip install lark --upgrade
У Ларка нет зависимостей.
Lark обеспечивает подсветку синтаксиса для своих файлов грамматики (*.lark):
Это реализации Lark на других языках. Они принимают грамматики Lark и предоставляют аналогичные утилиты.
Вот небольшая программа для анализа "Hello, World!" (Или любая другая подобная фраза):
from lark import Lark
l = Lark ( '''start: WORD "," WORD "!"
%import common.WORD // imports from terminal library
%ignore " " // Disregard spaces in text
''' )
print ( l . parse ( "Hello, World!" ) )
И результат:
Tree ( start , [ Token ( WORD , 'Hello' ), Token ( WORD , 'World' )])
Обратите внимание, что в полученном дереве не отображаются знаки препинания. Ларк автоматически отфильтровывает их.
Ларк отлично справляется с двусмысленностью. Вот результат разбора фразы «дрозофилы как бананы»:
Прочтите код здесь и посмотрите больше примеров здесь.
Полный список функций смотрите здесь
Жаворонок быстрый и легкий (чем ниже, тем лучше)
Ознакомьтесь с руководством по JSON для получения более подробной информации о том, как было проведено сравнение.
Подробные сторонние тесты можно найти в репозитории Python Parsing Benchmarks.
Библиотека | Алгоритм | Грамматика | Строит дерево? | Поддерживает двусмысленность? | Сможет ли обрабатывать любые CFG? | Отслеживание строк/столбцов | Создает автономный |
---|---|---|---|---|---|---|---|
Жаворонок | Эрли/ЛАЛР(1) | ЕБНФ | Да! | Да! | Да! | Да! | Да! (только ЛАЛР) |
ПЛИ | ЛАЛР(1) | БНФ | Нет | Нет | Нет | Нет | Нет |
ПиПарсинг | ПЭГ | Комбинаторы | Нет | Нет | Нет* | Нет | Нет |
Петрушка | ПЭГ | ЕБНФ | Нет | Нет | Нет* | Нет | Нет |
Скромный | ПЭГ | ЕБНФ | Да | Нет | Нет* | Нет | Нет |
АНТЛР | ЛЛ(*) | ЕБНФ | Да | Нет | Да? | Да | Нет |
(* PEG не могут обрабатывать недетерминированные грамматики. Кроме того, согласно Википедии, остается без ответа, действительно ли PEG могут анализировать все детерминированные CFG )
Полный список
Ларк использует лицензию MIT.
(Автономный инструмент находится под MPL2)
Lark принимает запросы на включение. См. Как разработать Lark
Большое спасибо всем, кто внес свой вклад:
Если вам нравится Lark и вы хотите, чтобы мы росли, рассмотрите возможность спонсировать нас!
Вопросы по коду лучше всего задавать на gitter или в вопросах.
По всем остальным вопросам со мной можно связаться по электронной почте erezshin на gmail com.
-- Эрез