Lark é um kit de ferramentas de análise para Python, desenvolvido com foco em ergonomia, desempenho e modularidade.
O Lark pode analisar todas as linguagens livres de contexto. Simplificando, significa que ele é capaz de analisar quase todas as linguagens de programação existentes e, até certo ponto, a maioria das linguagens naturais também.
Para quem é?
Iniciantes : Lark é muito amigável para experimentação. Ele pode analisar qualquer gramática que você usar, não importa quão complicada ou ambígua, e fazê-lo com eficiência. Ele também constrói uma árvore de análise anotada para você, usando apenas a gramática e uma entrada, e fornece ferramentas convenientes e flexíveis para processar essa árvore de análise.
Especialistas : O Lark implementa Earley(SPPF) e LALR(1) e vários lexers diferentes, para que você possa equilibrar potência e velocidade, de acordo com suas necessidades. Ele também oferece uma variedade de recursos e utilitários sofisticados.
O que isso pode fazer?
E muitos mais recursos. Leia mais adiante e descubra!
Mais importante ainda, o Lark economizará seu tempo e evitará que você tenha dores de cabeça ao analisar.
$ pip install lark --upgrade
Lark não tem dependências.
O Lark fornece destaque de sintaxe para seus arquivos gramaticais (*.lark):
Estas são implementações do Lark em outras linguagens. Eles aceitam gramáticas do Lark e fornecem utilitários semelhantes.
Aqui está um pequeno programa para analisar "Hello, World!" (Ou qualquer outra frase semelhante):
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!" ) )
E a saída é:
Tree ( start , [ Token ( WORD , 'Hello' ), Token ( WORD , 'World' )])
Observe que a pontuação não aparece na árvore resultante. Ele é automaticamente filtrado pelo Lark.
Lark é ótimo em lidar com ambigüidades. Aqui está o resultado da análise da frase "moscas da fruta como bananas":
Leia o código aqui e veja mais exemplos aqui.
Veja a lista completa de recursos aqui
Lark é rápido e leve (quanto menor, melhor)
Confira o tutorial JSON para mais detalhes de como foi feita a comparação.
Para benchmarks completos de terceiros, verifique o repositório Python Parsing Benchmarks.
Biblioteca | Algoritmo | Gramática | Constrói árvore? | Suporta ambigüidade? | Pode lidar com todos os CFG? | Rastreamento de linha/coluna | Gera autônomo |
---|---|---|---|---|---|---|---|
Cotovia | Earley/LALR(1) | EBNF | Sim! | Sim! | Sim! | Sim! | Sim! (somente LALR) |
DOBRA | LALR(1) | BNF | Não | Não | Não | Não | Não |
PyParsing | PEG | Combinadores | Não | Não | Não* | Não | Não |
Salsinha | PEG | EBNF | Não | Não | Não* | Não | Não |
Parcimonioso | PEG | EBNF | Sim | Não | Não* | Não | Não |
ANTLR | LL(*) | EBNF | Sim | Não | Sim? | Sim | Não |
(* PEGs não podem lidar com gramáticas não determinísticas. Além disso, de acordo com a Wikipedia, permanece sem resposta se os PEGs podem realmente analisar todos os CFGs determinísticos )
Lista completa
Lark usa a licença do MIT.
(A ferramenta autônoma está em MPL2)
Lark aceita solicitações pull. Veja Como desenvolver o Lark
Muito obrigado a todos que contribuíram até agora:
Se você gosta do Lark e quer nos ver crescer, considere nos patrocinar!
Perguntas sobre código são melhor feitas no gitter ou nos problemas.
Para qualquer outra coisa, posso ser contatado por e-mail em erezshin at gmail com.
-Erez