Em 19 de março, foi lançada uma biblioteca C++ Lug, que implementa um linguagem orientada a objetos para expressar analisadores sintáticos na forma de gramáticas estendidas de expressões sintáticas, e é distribuída sob a licença MIT.
Recursos da biblioteca:
- Uma sintaxe natural, semelhante às linguagens de geradores externos de analisadores, com suporte para atributos e ações semânticas.
- Possibilidade de trabalhar com gramáticas dependentes de contexto com tabelas de símbolos, condições e predições sintáticas.
- Os analisadores gerados são compilados em bytecode e executados em uma máquina virtual de análise sintática.
- Clara separação entre regras sintáticas e léxicas com a possibilidade de ajustar a omissão implícita de espaços em branco.
- Suporte para recursão esquerda direta e indireta, com níveis de precedência para diferenciar subexpressões com recursões mistas à esquerda e à direita.
- Suporte completo para a análise de texto no formato UTF-8, incluindo o nível 1 e conformidade parcial com o nível 2 do padrão técnico UTS #18 Expressões Regulares Unicode.
- Tratamento de erros e recuperação com falhas marcadas, regras de recuperação e manipuladores de erros.
- Rastreamento automático de números de linhas e colunas, largura ajustável e alinhamento de tabulação.
- Biblioteca somente de cabeçalho, utilizando apenas a biblioteca padrão e capacidades do padrão C++17. Compatível futuramente com os padrões C++20 e C++23.
- Tamanho relativamente pequeno da biblioteca, visando manter o número total de linhas em todos os arquivos de cabeçalho abaixo de 6000 linhas de código conciso.
Lista de mudanças:
- Diretivas de coleções e atributos de objetos implementadas. Nova diretiva collect[e] sintetiza uma sequência ou container associativo do tipo C, composto por elementos coletados de atributos herdados ou sintetizados na expressão e. Da mesma forma, novas diretivas synthesize[e], synthesize_shared[e] e synthesize_unique[e] foram introduzidas para a síntese de objetos, ponteiros compartilhados e ponteiros únicos, respectivamente, construídos a partir de atributos de componentes na expressão e.
- Foi implementada a diretiva synthesize_collect, que combina as diretivas collect e synthesize para melhorar a legibilidade do código e reduzir o número de modelos ao construir estruturas de dados complexas a partir de elementos analisados. Isso é especialmente útil para criar coleções aninhadas, como arrays de objetos ou containers associativos com tipos de valores complexos.
- Foi adicionado a classe modelo lug::recursive_wrapper para lidar com dependências cíclicas em árvores de sintaxe abstrata, particularmente aquelas que utilizam std::variant.
- Foi implementado o suporte ao padrão Unicode 16.0.0 e adicionado suporte para ferramentas de construção no CMakeLists.txt.
- Foi otimizada a correspondência de intervalo e conjunto de caracteres ASCII, resultando em um aumento significativo de desempenho em operações comuns de processamento de texto. Foram adicionados métodos rápidos especializados para processar apenas caracteres ASCII, que são significativamente mais rápidos do que o código de processamento Unicode.
- Foram implementados os opcodes test para otimizar erros e opcodes repeat para otimizar a omissão de caracteres em branco. Essas otimizações serão completamente integradas na próxima versão após as transformações planejadas na árvore de expressões.
- Melhorou-se o processamento de fontes de entrada com melhor bufferização e relatórios de erro para std::istream, além de aprimorar o suporte ao modo interativo, que processa corretamente a entrada linha por linha para sessões de terminal ou para gramáticas orientadas linearmente.
- O suporte a std::istream foi movido para um arquivo de cabeçalho separado <lug/iostream.hpp>. Isso reduz o tempo de compilação e minimiza as dependências de cabeçalhos para projetos que não requerem funcionalidades de entrada/saída de fluxo.
- A lógica de fixação do parser foi reformulada por meio da inserção de instruções em lug::basic_parser para melhor se adequar às mudanças na arquitetura da pilha de quadros, introduzidas na versão 0.4.0, o que melhorou a organização do código e o desempenho.
- Um problema no exemplo do parser foi corrigido. BASIC, quando as funções de usuário (por exemplo, FNA(X)) falhavam durante a avaliação. Isso foi causado por alterações na versão 0.4.0, que redefiniam lug::environment durante operações de análise sintática aninhadas. Uma nova função lug::environment::should_reset_on_parse foi adicionada para garantir um controle mais sutil sobre esse comportamento, permitindo que o ambiente fosse mantido durante operações de análise aninhadas quando necessário.
- Uma infraestrutura abrangente de teste de exemplos de programas foi adicionada.
- A hierarquia de diretórios de include foi reestruturada.
- Para garantir maior compatibilidade no GitHub CI, suporte adicional para compiladores foi adicionado (GCC 9/10/11/12, Clang 14/15/16/17).
- Analisadores estáticos Clang e MSVC foram adicionados ao GitHub CI.
- Address Sanitizer (ASan), Undefined Behavior Sanitizer (UBSan) e Memory Sanitizer (MSan) foram adicionados ao GitHub CI.
- A integração clang-tidy foi adicionada ao GitHub CI.
- O uso do Ubuntu 20.04 foi removido do GitHub CI.
Fonte: linux.org.ru
