Na sexta-feira, 2 de agosto, foi lançado o re2c — um gerador livre de analisadores lexicais para as linguagens C e C++. Lembramos que o re2c foi escrito em 1993 por Peter Bambiulis como um gerador experimental de muito rápidos analisadores lexicais, que se distingue de outros geradores pela velocidade do código gerado e por uma interface de usuário incomumente flexível que permite integrar analisadores de forma fácil e eficaz em uma base de código existente. Desde então, o projeto é desenvolvido pela comunidade e continua a ser um espaço para experimentos e pesquisas na área de gramáticas formais e autômatos finitos.
As principais novidades na versão 1.2:
Adicionada uma nova (simplificada) forma de verificação do fim dos dados de entrada
(ingl. "EOF rule").
Para isso, foi adicionada a configuração re2c:eof,
que permite escolher o símbolo terminal,
e uma regra especial $, que é acionada se o lexer
conseguir alcançar com sucesso o fim dos dados de entrada.
Historicamente, o re2c oferece várias opções para verificar o
fim dos dados de entrada, variando em termos de limitação, eficiência e simplicidade
de aplicação. O novo método visa simplificar a escrita do código, mantendo-se
efetivo e amplamente aplicável. Os métodos antigos
continuam a funcionar e podem ser preferidos em alguns casos.Adicionada a possibilidade de incluir arquivos externos usando a diretiva
/*!include:re2c "file.re" */, где file.re
este é o nome do arquivo incluído. O re2c procura arquivos no diretório do arquivo incluído,
bem como na lista de caminhos definidos pela opção -I.
Os arquivos incluídos podem incluir outros arquivos.
O re2c fornece arquivos "padrão" no diretório include/
do projeto — supõe-se que lá acumularão definições úteis
de expressões regulares, algo no espírito de uma biblioteca padrão.
Até agora, a pedido dos usuários, foi adicionado um arquivo com definições de categorias Unicode.Adicionada a capacidade de gerar arquivos de cabeçalho com conteúdo arbitrário usando as opções -t —type-header (ou as configurações correspondentes) e as novas diretivas /*!header:re2c:on*/ e
quando o re2c deve gerar definições de variáveis, estruturas e macros,
usadas em outras unidades de tradução.
/*!header:re2c:off*/. Это может быть полезно в случаях,
O re2c agora entende literais UTF8 e classes de caracteres em expressões regulares.
Por padrão, o re2c analisa expressões como "∀x ∃y" como.O re2c agora entende literais UTF8 e classes de caracteres em expressões regulares.
Por padrão, o re2c analisará expressões como "∀x ∃y" como.
sequência de símbolos ASCII de 1 bit e2 88 80 78 20 e2 88 83 79
(códigos hexadecimais), e os usuários precisam escapar símbolos Unicode manualmente:
"u2200x u2203y". Isso é muito inconveniente e inesperado para muitos
usuários (como evidenciam os relatórios de bugs constantes). Portanto, agora
re2c oferece a opção —input-encoding ,
que permite alterar o comportamento e analisar "∀x ∃y" como
2200 78 20 2203 79.Re2c agora permite usar blocos re2c normais no modo -r —reuse.
Isso é conveniente se o arquivo de entrada contém muitos blocos, e apenas parte deles
precisa ser reutilizada.Foi adicionada a possibilidade de definir o formato de avisos e mensagens de erro
usando a nova opção —location-format . O formato GNU é exibido
como filename:line:column:, e o formato MSVC — como filename(line,column).
Essa possibilidade pode ser útil para amantes de IDE.
Uma opção —verbose também foi adicionada, que exibe uma mensagem curta de sucesso em caso de êxito.O modo 'compatibilidade' com flex foi aprimorado — alguns erros de análise e
prioridade incorreta de operadores foram corrigidos em casos raros.
Historicamente, a opção -F —flex-support permite escrever código
misturando o estilo flex e o estilo re2c, o que dificulta um pouco a análise sintática.
O modo de compatibilidade com flex é raramente usado em código novo,
mas re2c continua a suportá-lo para compatibilidade retroativa.O operador de subtração de classes de caracteres / agora é aplicado
antes da expansão da codificação, permitindo seu uso em mais casos,
quando se utiliza uma codificação de comprimento variável (como UTF8).O arquivo de saída agora é criado de forma atômica: re2c primeiro cria um arquivo temporário
e escreve o resultado nele, e depois renomeia o arquivo temporário para o arquivo de saída
em uma única operação.A documentação foi reescrita e ampliada; novas
e sobre formas de verificação do final dos dados de entrada.
A nova documentação foi organizada em um
manual abrangente de uma página
com exemplos (os mesmos códigos-fonte são visualizados na manpage e na documentação online).
Foram feitos esforços modestos para melhorar a legibilidade do site em telefones.Do ponto de vista dos desenvolvedores, re2c ganhou um sistema de
depuração mais completo. O código de depuração agora está desativado em versões de lançamento e
pode ser ativado através da opção de configuração —enable-debug.
Esta versão levou muito tempo — quase um ano inteiro.
A maior parte do tempo, como sempre, foi dedicada ao desenvolvimento da base teórica e à redação
artigo «Extração Eficiente de Submatches POSIX em NFA».
Os algoritmos descritos no artigo estão implementados na biblioteca experimental libre2c
(a construção da biblioteca e dos benchmarks está desativada por padrão e pode ser ativada pela opção de configuração
—enable-libs). A biblioteca não foi concebida como uma concorrente dos já existentes
projetos como RE2, mas sim como uma plataforma de pesquisa para o desenvolvimento de novos
algoritmos (que podem ser utilizados posteriormente no re2c ou em outros projetos).
Isso também é conveniente para testes, benchmarks e criação de bindings para outras linguagens.
Agradecimentos dos desenvolvedores do re2c a todos que ajudaram para que esta versão se concretizasse,
e de maneira geral à comunidade por ideias, relatórios de bugs, patches, espírito de equipe, etc. ;]
Fonte: linux.org.ru
