A Library de modelo gramatical de expressão de análise (PEGTL) é uma biblioteca de combinador de cabeçalho somente C ++ de dependência de dependência zero para criar analisadores de acordo com uma gramática de expressão de análise (PEG).
Durante o desenvolvimento de uma nova versão principal, o ramo principal pode passar por mudanças incompatíveis. Para uma experiência estável, faça o download do lançamento mais recente, em vez de usar a filial principal.
Para perguntas e sugestões sobre o PEGTL, Histórias de sucesso ou falhas e qualquer outro tipo de feedback, sinta -se à vontade para abrir uma discussão, um problema ou uma solicitação de tração ou entre em contato com os autores do taocpp(at)icemx.net .
As gramáticas são escritas como código C ++ regular, criado com programação de modelos (não a meta-programação de modelo), ou seja, instanciações de modelo aninhadas que correspondem naturalmente à definição indutiva de PEGs (e outras abordagens de parser-combinador).
Um conjunto abrangente de regras do analisador que pode ser combinado e estendido pelo usuário é incluído, assim como os mecanismos para depurar gramáticas e anexar ações definidas pelo usuário às regras gramaticais. Aqui está um exemplo de como uma regra gramatical de expressão de análise é implementada como classe C ++ com o PEGTL.
// PEG rule for integers consisting of a non-empty
// sequence of digits with an optional sign:
// sign ::= '+' / '-'
// integer ::= sign? digit+
// The same parsing rule implemented with the PEGTL:
using namespace tao ::pegtl ;
struct sign : one< ' + ' , ' - ' > {};
struct integer : seq< opt< sign >, plus< digit > > {};Os pinos são superficialmente semelhantes às gramáticas livres de contexto (CFGs), no entanto, a natureza mais determinística dos pinos dá origem a algumas diferenças muito importantes. A análise gramatical incluída encontra vários erros típicos em pinos, incluindo a recursão esquerda.
O PEGTL foi projetado para ser "enxuto e mau", a biblioteca principal consiste em aproximadamente 6000 linhas de código. A ênfase está na simplicidade e na eficiência, preferindo uma abordagem simples bem ajustada a otimizações complicadas.
O PEGTL está preocupado principalmente em analisar combinadores e regras gramaticais e com o usuário da biblioteca (a possibilidade de) controle total sobre todos os outros aspectos de uma corrida de análise. Se/quais ações são tomadas e se/quais estruturas de dados são criadas durante uma execução de análise, depende inteiramente do usuário.
Estão incluídos alguns exemplos para a situação típica, como sequências de fuga inquilibradas em cordas, construção de uma estrutura de dados JSON genérica e avaliação on-the-fly de expressões aritméticas.
Através do uso de especializações de programação e modelo de modelo, é possível escrever uma gramática uma vez e usá -la de várias maneiras com ações diferentes (semânticas) em diferentes (ou mesmas) execuções de análise.
Com o formalismo do PEG, a separação nos estágios de Lexer e analisador geralmente é descartada - tudo é feito em uma única gramática. As regras são expressas em C ++ como instanciações de modelo e é tarefa do compilador otimizar as gramáticas de PEGTL.
Cada compromisso é testado automaticamente com várias arquiteturas, sistemas operacionais, compiladores e versões.
Cada compromisso é verificado com os desinfetantes do GCC e Clang, o analisador estático de Clang e clang-tidy . Além disso, usamos o CodeQL para digitalizar problemas (de segurança).
A cobertura do código é medida automaticamente e os testes de unidade cobrem 100% do código da biblioteca principal (para versões).
Os lançamentos são feitos de acordo com a versão semântica. Alterações incompatíveis de API só podem ocorrer entre as principais versões.
Em apreciação de todas as contribuições, aqui estão as pessoas que contribuíram diretamente para o PEGTL e/ou seu desenvolvimento.
O PEGTL faz parte da arte de C ++.
Copyright (C) 2007-2023 Daniel Frey e Dr. Colin Hirsch
O PEGTL é um software de código aberto certificado. Está licenciado nos termos da licença de software Boost, versão 1.0 reproduzida aqui.
Boost Software License - Versão 1.0 - 17 de agosto de 2003
A permissão é concedida, gratuita, a qualquer pessoa ou organização que obtenha uma cópia do software e a documentação que o acompanha coberto por esta licença (o "software") para usar, reproduzir, exibir, distribuir, executar e transmitir o software e preparar os trabalhos derivados do software e permitir que terceiros a quem o software é fornecido a fazer assim, para fazer isso, todos os itens de software e permitirão terceiros a quem o software é fornecido para fazer isso para fazer o que é fornecido para fazer o software, e permitir que os terceiros sejam fornecidos para o software, e para a manutenção do software, e a seguir, é possível que o software seja fornecido para fazer isso, para que o software seja fornecido para fazer o software, e permitir que terceiros sejam fornecidos para o software, e para a manutenção do software, e a seguir, é possível que o software seja fornecido para fazer isso, para que o software seja fornecido para fazer o que se mobili.
Os avisos de direitos autorais no software e toda essa afirmação, incluindo a concessão de licença acima, essa restrição e o seguinte aviso, devem ser incluídos em todas as cópias do software, no todo ou em parte, e todos os trabalhos derivados do software, a menos que essas cópias ou obras derivadas estejam exclusivamente na forma de código de objeto de máquina gerado por um processador de linguagem de fonte.
O software é fornecido "como está", sem garantia de qualquer tipo, expresso ou implícito, incluindo, entre outros, as garantias de comercialização, aptidão para uma finalidade, título e não violação específicos. Em nenhum caso os detentores de direitos autorais ou qualquer pessoa que distribua o software seja responsável por quaisquer danos ou outro passivo, seja em contrato, delito ou de outra forma, decorrente de, fora ou em conexão com o software ou o uso ou outras negociações no software.