-
TRRE: Expressões regulares transdutivas
-
Resumo
- É uma extensão de expressões regulares para edição de texto e ferramentas de linha de comando semelhantes ao
grep.
- Como é um protótipo, não deve ser usado em ambientes reais.
-
Introdução
- Expressões regulares são ferramentas úteis para buscar padrões em texto.
- Como isso parece pouco natural para edição de texto, esta extensão é proposta.
- É chamada de expressão regular transdutiva ou
trre.
- Usa o símbolo
: para definir transformações.
a:b é a forma mais simples, substituindo a por b.
- Foi criada uma ferramenta de linha de comando chamada
trre para demonstrar o conceito.
-
Exemplos
-
Básico
- Alterar
cat para dog:
$ echo 'cat' | trre 'c:da:ot:g'
dog
- Substitui todas as correspondências de uma string, como no
sed:
$ echo 'Mary had a little lamb.' | trre '(lamb):(cat)'
Mary had a little cat.
- Remoção:
$ echo 'xor' | trre '(x:)or'
or
- Inserção:
$ echo 'or' | trre '(:x)or'
xor
-
Expressões regulares por meio de transdução
-
Transformação por intervalo
-
Gerador
-
Especificação da linguagem
- O
trre é definido como um par casamento-de-padrão:geração-de-padrão.
casamento-de-padrão pode ser uma string ou uma expressão regular.
geração-de-padrão normalmente é uma string, mas também pode ser regex.
-
Por que funciona
- O
trre constrói um autômato especial chamado transdutor finito de estados (FST).
- Um FST processa pares de entrada e saída.
-
Escolhas de projeto e questões em aberto
- São necessárias várias decisões, como associatividade de
:, precedência e épsilon implícito.
-
Modos e ganância
- O
trre suporta dois modos:
- Modo de varredura (padrão): aplica transformações em sequência.
- Modo de correspondência: verifica a string inteira em relação à expressão.
-
Determinização
- O processo de converter um autômato não determinístico em um determinístico é importante.
-
Desempenho
- A versão NFT (não determinística) é um pouco mais lenta que o
sed.
- Em tarefas complexas, o
trre_dft (versão determinística) pode ter desempenho melhor que o sed.
-
TODO
- Completar o conjunto de recursos ERE, suporte completo a Unicode, tratamento eficiente de intervalos etc.
-
Referências
- Inspirado em artigos de Russ Cox e em trabalhos de Cyril Allauzen e Mehryar Mohri.
1 comentários
Comentários do Hacker News
Legal, espero ver a evolução deste projeto
cat:dogseja interpretado comoca(t:d)ogem vez de(cat):(dog)Recomenda XFST (Xerox Finite-State Transducer)
Recomenda a Rosie Pattern Language como alternativa às expressões regulares padrão
Compartilha a experiência de ter escrito um artigo sobre transdutores de estados finitos em 1997
:tenha ligação mais forte do queabAcha que isso não é suficiente para fazer substituição estrutural
Questiona a afirmação de que expressões regulares são pouco naturais para edição de texto
Elogia o código C por estar muito limpo
theory.pdfno README está quebrado e precisa ser corrigidoQuestiona o conselho de não usar
*ou+Acha estranho o primeiro exemplo
echo 'cat' | trre 'c:da:ot:g'parece esquisitoQuestiona se os exemplos são realmente saídas do programa
echo 'cat dog' | trre 'c:bat|d:hog'parece estranho