Uma expressão regular (ER) descreve uma linguagem regular de forma compacta usando só três operações: união (α∣β), concatenação (αβ) e repetição / fecho de Kleene (α∗). Precedência: ∗ antes de concatenação, concatenação antes de ∣. ER, gramática regular e autômato finito descrevem a mesma classe de linguagens.
Esquema “informal” e sucinto para representar linguagens regulares.
Formalismo denotacional (a ER representa a linguagem) e gerador (dá para produzir as sentenças a partir dela). Ver os três tipos de formalismo em aula 01.
C/C++, Java, Perl, Python e outras suportam ERs nativamente ou por biblioteca.
Slide 4: definição
Base:
∅, ε e cada símbolo a∈Vt são ERs.
Indução: se α e β são ERs, então também são ERs:
α∣β (união)
αβ (concatenação)
α∗ (repetição, zero ou mais vezes)
Detalhe no slide 4
O slide escreve ”α e β∈Vt são ERs, então…”. O correto é “se α e β são ERs” (quaisquer ERs, não apenas símbolos do alfabeto). Senão não daria para montar (ab)∗, por exemplo, já que ab não é um símbolo de Vt.
Precedência: repetição > concatenação > união.
ER
Lida como
Linguagem
ab∗
a(b∗)
a, ab, abb, …
(ab)∗
ε, ab, abab, …
a∣bc
a∣(bc)
a, bc
(a∣b)c
ac, bc
Slide 5: extensões e notação alternativa
Extensão
Definição
Leitura
α+
αα∗
uma ou mais vezes
α?
α∣ε
opcional
αn
αα…α (n vezes)
exatamente n
Notação alternativa (o professor avisa que não usa no curso): α∣β=α+β=α∪β, e α∗={α}.
Cuidado ao ler outros materiais
Muitos livros escrevem união como +, então a+b lá significa a∣b aqui, e não “um ou mais”. E a notação {α} para ER é diferente de L(α)={α}, que é um conjunto com uma palavra. O balão do slide 5 chama a atenção exatamente para isso.
Slide 6: que linguagem uma ER representa
L(∅)=∅
L(a)={a}, para a∈Vt
L(αβ)=L(α)L(β) (concatenação de linguagens: toda palavra de uma seguida de toda palavra da outra)
L(α∣β)=L(α)∪L(β) (o slide escreve com ∣, mas a operação entre conjuntos é a união ∪)
L(α∗)=L(α)∗
Falta no slide, mas faz parte da definição: L(ε)={ε}.
Slide 7: exemplo resolvido
Linguagem de α(α∣β)∗:
L(α(α∣β)∗)=L(α)(L(α)∪L(β))∗={α}{α,β}∗
Ou seja, todas as palavras sobre {α,β} que começam com α.
Slide 8: representações que valem decorar
ER
Linguagem
Conferido
αβ
{αβ}
α∣β
{α,β}
α(α∣β)∗
{α,αα,αβ,ααα,…}
α∗βα∗βα∗
palavras com exatamente doisβ
0∗10∗(10∗10∗)∗
palavras com número ímpar de 1
sim, até tamanho 10
1∗(101)∗1∗
slide diz: palavras sem 00
não confere, ver abaixo
A última linha do slide 8 não confere
Testei por programa todas as palavras até tamanho 10. A ER 1∗(101)∗1∗ realmente não gera nenhuma palavra com 00, mas também deixa de fora muitas palavras sem 00: 0, 01, 10, 010, 011, 110…
Uma ER que gera exatamente as palavras sem 00: (1∣01)∗(0∣ε)
Intuição: todo 0 precisa ser seguido de 1 (bloco 01), exceto possivelmente um 0 no final. Conferida por programa até tamanho 10.
Pode ser que os expoentes do slide estejam em posições que a exportação do PDF deslocou. Vale confirmar com o professor.
Leitura de 0∗10∗(10∗10∗)∗: o trecho 0∗10∗ garante um 1; cada repetição de (10∗10∗) acrescenta dois. Então o total é sempre ímpar, e os 0∗ permitem zeros em qualquer lugar.
Slides 9 e 10: ER e elementos léxicos
É aqui que a teoria encontra o compilador. O analisador léxico reconhece:
Elemento
Descrição
ER
Letra
L={A,…,Z,a,…,z}
L
Dígito
D={0,…,9}
D
Identificador
letra seguida de zero ou mais letras ou dígitos
I=L(L∣D)∗
Número inteiro
0 sozinho, ou um dígito de 1 a 9, opcionalmente com - antes, seguido de dígitos
N=0∣(−?(1∣2∣⋯∣9)D∗)
Repare que N não aceita -0 nem 007. Os elementos léxicos formam uma linguagem dentro da linguagem de programação.
Complemento: as mesmas ERs em JavaScript/TypeScript
Diferenças da notação da aula: [1-9] é a união 1∣2∣…∣9; ? é o opcional; ^ e $ exigem casar a palavra inteira. As regex de programação têm recursos extras (retrovisores como \1, lookahead) que ultrapassam as linguagens regulares da teoria.
Slide 11: equivalência entre ERs
α=β se, e somente se, L(α)=L(β).
Identidade
Por quê
∅α=α∅=∅
concatenar com “nenhuma palavra” não produz palavra
Como ler o octeto do IPv4, com d1=0..9, d2=0..4, d3=0..5:
(1?d1)?d1 cobre 0 a 199 (um dígito; dois dígitos; ou 1 + dois dígitos).
2d2d1 cobre 200 a 249.
25d3 cobre 250 a 255.
Conferi por programa: aceita 192.168.0.1 e 255.255.255.255, rejeita 256.1.1.1 e 300.1.1.1. Aceita também formas com zero à esquerda como 01, o que alguns validadores rejeitariam.
Limitação do exemplo de endereço
A ER de endereço exige exatamente www, um nome, 3 letras e 2 letras. Ela casa www.exemplo.com.br, mas não exemplo.com nem www.exemplo.org. É um exemplo didático, não um validador completo.
Slides 13 e 14: exercícios
Slide 13, parte 1: ∈ ou ∉
Lembre: {a}∗{b}2 é a linguagem de a∗bb.
Afirmação
Resposta
Por quê
ab em {a}∗{b}2
∉
precisa terminar em bb
ba em {b}∗{a}
∈
b1a
ab em ({a}∗{b})2
∉
precisa de dois b
ab2 = abb em ({a}∗{b})2
∈
ab · b (segundo bloco com zero a)
Slide 13, parte 2: em relação a (a ba)*
Truque: (a∗ba∗)∗ é {ε} mais toda palavra que tem pelo menos um b. Cada b “puxa” os a vizinhos para o seu bloco.
Palavra
Resposta
a2ba10
∈
ab10
∈
b10a
∈
ab2ab3
∈
Todas pertencem (conferido por programa). A única forma de não pertencer seria uma palavra não vazia sem nenhum b, como aaa.
Slide 14: ERs sobre {a, b}
Todas conferidas por programa contra a definição, até tamanho 12.
Contêm aa e bb: um aparece antes do outro, então une as duas ordens. (a∣b)∗aa(a∣b)∗bb(a∣b)∗∣(a∣b)∗bb(a∣b)∗aa(a∣b)∗
Não contêm aba: entre dois blocos de a, os b precisam vir em grupos de pelo menos dois. Só no fim pode sobrar um b sozinho. b∗(a+bb+)∗(a+b?)?
Contêm aa exatamente uma vez (contando ocorrências sobrepostas, então aaa tem duas): antes do aa, nada de aa e não pode terminar em a; depois, nada de aa e não pode começar com a. (b∣ab)∗aa(b∣ba)∗
Slide 14: ERs sobre {a, b, c}
Contêm aa, bb e cc: união das 6 ordens possíveis. Com Σ=(a∣b∣c): Σ∗aaΣ∗bbΣ∗ccΣ∗∣Σ∗aaΣ∗ccΣ∗bbΣ∗∣…(6 permutac¸o˜es)
“Se contêm b, ele é logo seguido pelo último c”: interpretei como: pode haver no máximo um b; se houver, o símbolo seguinte é c, e depois dele não aparece mais nenhum c. (a∣c)∗∣(a∣c)∗bca∗
O enunciado é ambíguo; se o professor quis outra leitura, a ER muda.
Comprimento 3:(a∣b∣c)(a∣b∣c)(a∣b∣c), ou (a∣b∣c)3.
Slide 14: verdadeiro ou falso
baa ∈ a∗b∗a∗b∗: verdadeiro (a0b1a2b0).
abcd ∈ (a(cd)∗b)∗: falso. Cada bloco é a, depois cd repetido, depois b. Em abcd, o primeiro bloco fecha em ab e sobra cd, que não começa com a.
Aprofundamento com os livros
Páginas das edições da sua pasta: Menezes 3ª edição (2000) e Ramos, José Neto e Vega (Bookman).
A notação dos livros usa + para união
Os dois livros escrevem a união como r+s (o Ramos aceita também r∣s). É a “notação alternativa” que o slide 5 avisa que o curso não usa. Na hora de ler:
Slides
Menezes (Def. 2.12, p. 50)
Ramos (p. 147 e 148)
a∣b
a+b
a∣b ou a+b
a+
aa∗ (ele não define + para ER)
x+=xx∗
A precedência é a mesma nos três: repetição, depois concatenação, depois união.
O Ramos conta que a notação de expressões regulares foi criada por Kleene na década de 1950 como forma mais compacta de escrever conjuntos regulares (p. 147). Um conjunto regular é definido quase igual: ∅, {ε} e {a} são regulares, e união, concatenação e fecho de regulares são regulares (p. 145 e 146).
Tabela de ERs do Menezes (Exemplo 12, p. 51)
Com a notação do curso (conferi cada linha por programa, até tamanho 12):
ER
Linguagem
aa
só a palavra aa
ba∗
começa com b, seguido de zero ou mais a
(a∣b)∗
todas as palavras sobre {a,b}
(a∣b)∗aa(a∣b)∗
contém aa
a∗ba∗ba∗
exatamente dois b (igual ao slide 8)
(a∣b)∗(aa∣bb)
termina com aa ou bb
(b∣ab)∗(ε∣a)
não tem dois a seguidos
A última é a “irmã” da correção que eu fiz para o slide 8: trocando a↔0 e b↔1, é a mesma ideia de (1∣01)∗(0∣ε).
Exemplos práticos do Ramos (Exemplos 3.4 e 3.6, p. 146 a 148)
Com D=(0∣1∣⋯∣9):
Objeto
ER
Detalhe
Naturais
DD∗
aceita zeros à esquerda
Reais sem sinal
DD∗.D∗∣D∗.DD∗
aceita .315 e 47., mas não aceita . sozinho
Ponto flutuante
(+∣−∣ε)(DD∗.D∗∣D∗.DD∗)E(+∣−∣ε)DD∗
exemplo: -211.56E+3
O truque dos reais é bom de lembrar: a união de “dígitos antes do ponto obrigatórios” com “dígitos depois do ponto obrigatórios” garante que pelo menos um lado tem dígito. Conferi que DD∗.D∗∣D∗.DD∗ não aceita ..
Linguagens sobre {a,b,c,d} do Exemplo 3.6 do Ramos, reescritas na notação do curso:
pelo menos um a: (a∣b∣c∣d)∗a(a∣b∣c∣d)∗
exatamente dois a: (b∣c∣d)∗a(b∣c∣d)∗a(b∣c∣d)∗
número par de a: ((b∣c∣d)∗a(b∣c∣d)∗a)∗(b∣c∣d)∗ (cada volta do fecho consome dois a; o final cobre o resto, inclusive palavras sem nenhum a)
começa com a e termina com b ou c: a(a∣b∣c∣d)∗(b∣c)
Duas ERs diferentes, mesma linguagem
O Ramos mostra (Exemplo 3.8, p. 148) que ERs com cara muito diferente podem ser equivalentes. Conferi por programa: a∣aaaa∗ e (aa)∗a(aaa)∗ geram exatamente as cadeias de a com comprimento diferente de 0 e de 2. Para provar equivalência sem programa, compare os comprimentos: 2i+1+3j cobre 1, 3, 4, 5, 6, … e nunca 0 ou 2.
Leis algébricas (Ramos, p. 148 e 149)
O Ramos organiza as identidades do slide 11 por propriedade, o que ajuda a lembrar:
Propriedade
União
Concatenação
Associativa
(α∣β)∣γ=α∣(β∣γ)
(αβ)γ=α(βγ)
Comutativa
α∣β=β∣α
não vale
Elemento neutro
∅
ε
Distributiva
α(β∣γ)=αβ∣αγ e (β∣γ)α=βα∣γα
E ∅ “anula” a concatenação: α∅=∅α=∅. O Menezes pede para provar várias dessas propriedades no exercício 2.13 (p. 81 e 82).
ER vira autômato e autômato vira ER
Os dois livros provam que ER e autômato finito descrevem a mesma classe de linguagens:
ER para autômato (Menezes Teorema 2.13, p. 51 a 54; Ramos Algoritmo 3.16, p. 207 a 210): por indução no número de operadores. Monta-se um autômato pequeno para ∅, ε e cada símbolo, e depois “encaixa” os pedaços com transições vazias (ε) para união, concatenação e fecho. O Menezes alerta (p. 53 e 54) que pular os estados novos de início e fim, “unificando” estados, pode gerar autômatos que aceitam palavras a mais.
Autômato para ER (Menezes Teorema 2.14, p. 55, enunciado sem prova; Ramos Algoritmo 3.17, p. 211 a 216): elimina-se um estado de cada vez, trocando os rótulos das setas por ERs.
Exercícios extras do Menezes (seção 2.10, p. 80 e 81)
2.6: descreva em palavras as linguagens destas ERs (convertidas para a notação do curso)
Minhas respostas, todas conferidas por programa até tamanho 12:
a) (aa∣b)∗(a∣bb): o começo (aa∣b)∗ só tem blocos de a de tamanho par, e a palavra termina com a ou com bb. Resultado: se a palavra termina em a, o último bloco de a é ímpar e todos os outros são pares; se termina em b, termina com bb e todos os blocos de a são pares.
b) (b∣ab)∗(ε∣a): palavras sem dois a seguidos.
c) (aa∣bb∣(ab∣ba)(aa∣bb)∗(ab∣ba))∗: palavras com número par de a e par de b. É a versão em ER do AFD de paridade do slide 14 da aula 04.
2.4 c) ER para palavras sem aba
É o mesmo exercício do slide 14 desta aula. A resposta está lá: b∗(a+bb+)∗(a+b?)?.
Para aprofundar nos livros
Onde ler (páginas das edições da sua pasta)
Menezes (3ª ed.): 2.5 Expressão Regular, p. 50 a 55; exercícios 2.4, 2.6 a 2.8 e 2.13, p. 80 a 82.
Ramos, José Neto e Vega: 3.2 Conjuntos e Expressões Regulares, p. 145 a 150; 3.6 Conjuntos Regulares e Autômatos Finitos, p. 206 a 216.