PIPES: Uma linguagem para processamento distribuído de eventos complexos
dnarj20130504
1. O que há de errado com
expressões regulares?
TL;DR: não são exatamente regulares e são mal implementadas
2. Disclaimer
O conteúdo desta apresentação é fortemente baseado
nos dois artigos vinculados abaixo:
http://nikic.github.io/2012/06/15/The-true-power-of-regular-expressions.html
http://swtch.com/~rsc/regexp/regexp1.html
Considere lê-los com calma, são muito bons.
5. Hierarquia de Chomsky
para gramáticas formais
IRRESTRITAS
SENSÍVEIS AO CONTEXTO
LIVRES DE CONTEXTO
REGULARES
6. Linguagem Regular
Linguagem vazia é regular.
Linguagem com uma string vazia é regular.
Linguagem com string de um caractere é regular.
A união de linguagens regulares é regular.
A concatenação de linguagens regulares é regular.
O fecho Kleene de linguagens regulares é regular.
Nada mais é regular.
11. Expressão Autômato Array
abc?d 'a', 'b', [1, 2], 'c', 'd'
abcd+ 'a', 'b', 'c', 'd', [1, -1]
(a?a)+b [1, 2], 'a', 'a', [1, -3], 'b'
a b c d
a b c d
a a b
12. Expressão Autômato Array
abc?d 'a', 'b', [1, 2], 'c', 'd'a b c d
0000: CONSUME 'a'
0001: CONSUME 'b'
0002: JUMP +1 OR +2
0003: CONSUME 'c'
0004: CONSUME 'd'
0005: YAY_MATCH!
22. a a b
aaaaaainput
Antes de cada caractere da
entrada, avança-se todos os
estados para os próximos que
requerem consumo (os
retângulos).
23. a a b
aaaaaainput
Depois de consumir o
caractere, lembrar de avançar
para o próximo estado que
consome. Ou próximos
estados, no caso.
24. a a b
aaaaaainput
Eventualmente dois estados,
durante a transição, irão
colidir num único estado,
eliminando assim o caráter
exponencial da avaliação.
25. Para uma entrada com n
caracteres, e um autômato
com m estados:
No máximo m estados são ativados
por caractere.
O(m×n)
41. Em suma
Match de expressões regulares pode ser feito em
tempo polinomial, mas normalmente não é.
Regexps na maior parte das linguagens não tem muito
a ver com expressões regulares stricto sensu.
PCRE consegue definir qualquer gramática livre de
contexto e algumas sensíveis a contexto também.
Match de backreferences é NP-completo.