Você está na página 1de 9

Universidade Estadual Vale do Acaraú - UVA

Curso: Ciências da Computação


Disciplina: Linguagens Formais e Autômatos
Professor: Cláudio Carvalho

Expressões Regulares - ERs

1 Introdução

Na aritmética, é possível utilizar operações para construir expressões tais como:


(2 + 3) × 4. Similarmente, no estudo das linguagens formais, é possível utilizar operações
regulares para construir expressões que descrevem linguagens, chamadas de expressões
regulares. Exemplo: (0 + 1)0 .

Toda linguagem regular pode ser descrita por uma expressão regular. Trata-se
de um formalismo denotacional ou funcional. Uma Expressão Regular é denida a partir
de conjuntos básicos (as linguagens) e operações de concatenação e união. São adequadas
para a comunicação homem × homem e, principalmente, homem × máquina.

Nas expressões aritméticas, cujos operandos são números, o resultado também


é um número. Da mesma forma, nas expressões regulares, cujos operandos são linguagens,
o resultado é uma linguagem. No exemplo anterior, o valor da expressão regular é o
conjunto de palavras sobre {0, 1}, que têm tamanho maior que zero e não possuem 01
nem 11 como subpalavra.

As expressões regulares têm um papel importante nas aplicações da Ciência


da Computação. Por exemplo, em aplicações com texto, é possível procurar por cadeias
que satisfazem um determinado padrão.

2 Denição

Uma Expressão Regular sobre um alfabeto Σ é denida indutivamente como:

ˆ ∅ é uma ER e representa a linguagem vazia;


ˆ ε é uma ER e representa a linguagem {ε};
ˆ a, para algum a ∈ Σ, é uma ER e representa a linguagem {a};
ˆ Se r e s são ERs que representam, respectivamente, Lr e Ls . Então:

 r + s é uma ER e representa a linguagem Lr ∪ Ls ;


 rs é uma ER e representa a linguagem Lr ◦ Ls ;
 r∗ é uma ER e representa a linguagem L∗r .

1
A concatenação pode também ser representada por r ◦ s. A união de duas ex-
pressões r e s pode ser representada por r|s ou r∪s. Sipser (2012) e Lewis e Papadimitriou
(1998) utilizam o operador “ ∪ ”. Hopcroft, Ullman e Motwani (2006) e Menezes (2012)
utilizam o operador “ + ”. Em aplicações práticas como P HP , P ostgreSQL, Javascript
e C ++ , usa-se “|” para a união.

Não se deve confundir a expressão regular ∅ com a ε. A primeira representa


a linguagem vazia. A segunda representa uma linguagem contendo uma única palavra, a
. . r}.
palavra vazia. Por conveniência, consideraremos r+ = rr∗ e rk = r| .{z
k vezes

Assim como nas expressões aritméticas, os parênteses podem ser também omi-
tidos em uma expressão regular. Se isso acontecer, a avaliação é feita segundo a ordem
de precedência: concatenação sucessiva > concatenação > uniao. Por exemplo:

ˆ a + bc = a + (bc)
ˆ ab∗ = a(b∗ )

Utiliza-se L(r) para designar a linguagem representada por uma expressão


regular r. A seguir, temos alguns exemplos de expressões regulares e suas linguagens.

Expressão Regular Linguagem Representada


aa {aa}
ba∗ {w ∈ {a, b}+ | b é prexo, bb e ab não são subpalavras de w}
(a + b)∗ {a, b}∗
(a + b)∗ aa(a + b)∗ {w ∈ {a, b}+ | aa é subpalavra de w}
a∗ ba∗ ba∗ {w ∈ {a, b}∗ | w possui exatamente duas ocorrências de b}
(a + b)∗ (aa + bb) {w ∈ {a, b}+ | aa ou bb é suxo de w}
(a + ε)(b + ba)∗ {w ∈ {a, b}∗ | aa não é subpalavra de w}
(a + ba)∗ {w ∈ {a, b}∗ | toda ocorrência de b é seguida de pelo menos a}
a(a + b)∗ + (a + b)∗ b {w ∈ {a, b}+ | a é prexo de w, ou b é suxo de w}

Expressões regulares são amplamente utilizadas em compiladores de lingua-


gens de programação. Objetos básicos em uma linguagem de programação, chamados de
tokens , tais como nomes de variáveis e constantes, podem ser descritos com expressões
regulares. Por exemplo, um nome de que deve começar com letra e ser seguida de letra
ou número pode ser descrito pela expressão:

A(A + D)∗ , onde A = {a, . . . , z, A, . . . , Z} e D = {0, . . . , 9}.


De acordo com este exemplo, area1 e AreaTotal são nomes de variáveis válidos.
Já 1area não é um nome de variável válido.

Uma vez que a sintaxe de uma linguagem de programação tenha sido bem
descrita com linguagens regulares em termos dos seus tokens, sistemas automáticos podem
gerar o analisador léxico - parte de um compilador que é responsável pelo processamento
inicial do programa de entrada.

2
3 Propriedades

Sejam r, s e t expressões regulares. Observam-se as seguintes propriedades:

Axioma Descrição
r+s=s+r a união é comutativa
r + (s + t) = (r + s) + t a união é associativa
r(st) = (rs)t a concatenação é associativa
r(s + t) = rs + rt a concatenação é distributiva sobre a união
εr = rε = r ε é o elemento neutro da concatenação
r∅ = ∅ identidade
r+∅=r identidade
∅∗ = {ε}

4 Equivalência entre Expressões Regulares e Autômatos Finitos

Expressões regulares e autômatos nitos são equivalentes nos seus poderes des-
critivos. Como já foi visto no início da disciplina, são formalismos distintos para estudar
uma mesma classe de linguagens - as linguagens regulares. Para qualquer expressão regu-
lar, existe um autômato nito cuja linguagem é a descrita pela expressão, e vice-versa. Na
Seção 4.1 será mostrado como construir um Autômato Finito a partir de uma Expressão
Regular; e na Seção 4.2 será apresentado o processo inverso. Os processos a seguir estão
em Sipser (2012, p. 66-76).

4.1 De Expressão Regular para Autômato Finito

Se uma linguagem é descrita por uma expressão regular R, então é possível


construir um autômato nito M tal que L(M ) = L(R). Temos de considerar os seis
casos da denição formal de expressões regulares. Os casos a seguir tratam de expressões
regulares primitivas:

1. R = a, para algum a ∈ Σ. Temos que L(R) = {a}.


2. R = ε. Temos que L(R) = {ε}.
3. R = ∅. Temos que L(R) = ∅.

M1 M2 M3

3
Pela ilustração acima, observa-se que L(M1 ) = {a}, L(M2 ) = {ε} e L(M3 ) = ∅.
Para os casos de união, concatenação e concatenação sucessiva, podem ser utilizadas as
construções descritas para AFN-ε.

Como exemplo, vamos converter a expressão E1 = (ab + a)∗ passo a passo,


como mostra a Figura 2.
a
a

b b

ab a ε b

a ε b
ε
ab + a
ε
a

ε
a ε b

(ab + a)∗ ε ε
ε
a
ε

Figura 2  Exemplo de conversão de ER para AFN-ε

O autômato resultante desse processo pode ter muitos estados, como visto no
exemplo anterior. Para a expressão regular (ab + a)∗ , é suciente o autômato da Figura 3.
a
a
q0 q1
b

Figura 3  AF para L(E1 )

A linguagem representada pela expressão regular anterior pode ser descrita


como L(E1 ) = {w ∈ {a, b}∗ | toda ocorrência de b, em w, é precedida de a} = ou, sim-
plesmente, L(E1 ) = {a, ab}∗ .

4.2 De Autômato Finito para Expressão Regular

Se uma linguagem é aceita por um autômato nito, então ela pode ser descrita
por uma expressão regular (ER). Denimos um novo tipo de autômato nito, chamado

4
Autômato Finito Não Determinístico Generalizado - AFNG . Primeiro mostraremos como
converter AFN-ε s em AFNGs, e em seguida, como converter AFNGs para ERs.
0

Em um AFNG, na transição de um estado para outro, existe uma expressão


regular. Formalmente, os AFNGs são quíntuplas M = (Σ, Q, δ, qs , qf ), onde:

Σ: alfabeto.
Q: conjunto nito de estados.
δ : função de transição (δ : (Q − {qf }) × (Q − {qs }) → R, onde R é o conjunto de
todas as expressões regulares sobre Σ.
qs : estado inicial (qs ∈ Q).
qf : estado nal (qf ∈ Q).

Dado um AFN-ε M1 = (Σ, Q, δ1 , q0 , F ). É possível construir, a partir de M1 ,


um AFNG M2 = (Σ, Q ∪ {qs , qf }, δ2 , qs , qf ), adicionando-se movimentos vazios de qs para
q0 , e de todo estado q ∈ F para qf . Caso exista mais de uma transição entre dois estados
na mesma direção, substituímos todas por uma única transição em que a expressão é a
união dos símbolos no AFN-ε , como ilustrado na Figura 4. É requerido que um AFNG
sempre tenha uma forma especial que atenda às condições:

ˆ há transições (ainda que seja com a expressão ∅) de qs para todos os estados


q ∈ Q − {qs }, e não há transições com destino qs ;
ˆ há transições (ainda que seja com a expressão ∅) de todo estado q ∈ Q − {qf }
para qf , e não há transições com origem qf ;
ˆ exceto para os estados qs e qf , δ é denida para todo par (qi , qj ) ∈ Q × Q.
Lembre que há uma transição implícita de todo estado para ele mesmo com ε.

a,b a+b
p q p q

AFN-ε AFNG

Figura 4  Transição no AFN-ε x Transição no AFNG

Agora será mostrado o processo para obtenção de uma Expressão Regular a


partir de um AFNG. Suponha que o AFNG tem k estados. Como um desses estados é
inicial, e o outro nal, temos que k ≥ 2. Se k > 2, construímos um AFNG com um estado
a menos. Este passo deve se repetir no novo AFNG até que se chegue a apenas 2 estados.
Uma vez atingida essa condição, o AFNG terá apenas uma transição, que vai do estado
inicial (qs ) para o nal (qf ), com a ER experada. Todo esse processo está descrito pelo
Algoritmo 1 a seguir.

5
Algoritmo 1: Converte
Entrada: AFNG G = (Σ, Q, δ, qs , qf )
Saída: Expressão Regular
1 início
2 k ← |Q|
3 se k = 2 então
4 retorna δ(qs , qf )
5 m
6 senão
7 qrip ← um estado de Q − {qs , qf }
8 G0 ← G − {qrip }
9 para cada qi ∈ Q − {qf , qrip } faça
10 para cada qj ∈ Q − {qs , qrip } faça
11 R1 ← δ(qi , qrip )
12 R2 ← δ(qrip , qrip )
13 R3 ← δ(qrip , qj )
14 R4 ← δ(qi , qj )
15 δ 0 (qi , qj ) ← (R1 )(R2 )∗ (R3 ) + R4
16 m
17 m
18 retorna Converte(G0 )
19 m
20 m

O ponto chave do processo é a construção de um AFNG com um estado a


menos, quando k > 2. Isso é feito selecionando-se um estado (que será chamado de qrip ),
retirando-o da maquina, e reparando-a de forma a manter a linguagem reconhecida (ver
linhas 7 a 17 do Algoritmo 1). Qualquer q ∈ Q − {qs , qf } deve ser retirado.

R4

qi qj
(R1 )(R2 )∗ (R3 ) + R4

qi qj
R1 R3
depois
qrip R2

antes

Figura 5  Remoção de um estado do AFNG

Depois de remover o estado qrip , a máquina é reparada, alterando-se as ex-


pressões das transições restantes. Cada nova expressão compensa a falta de qrip . A
nova expressão entre um par de estados (qi , qj ) descreve as cadeias que poderiam levar a
máquina de qi a qj , direta ou indiretamente, via qrip , como ilustra a Figura 5.

6
Na gura Figura 6, um AFN-ε M com 2 estados é convertido em uma Expres-
são Regular equivalente. Em (a) temos um AFN-ε ; em (b) temos um AFNG obtido a
partir do AFN-ε ; em (c) temos o AFNG obtido após a remoção de q1 do AFNG anterior;
e em (d) o AFNG obtido após a remoção de q0 do AFNG anterior. Este último AFNG
possui apenas dois estados, com uma transição com a expressão r = a∗ b(a + b)∗ , cuja
linguagem representada é a mesma que é aceita pelo AFN-ε .

a a
a
q0 qs ε q0 qs
qs ε q0
b b a∗ b(a + b)∗

q1 qf q1 b(a + b)∗ qf
ε
qf
(d)
a,b a+b (c)
(a) (b)

Figura 6  Conversão de AFN-ε para ER

Sequências distintas de remoções de estados produzem expressões regulares


possivelmente distintas, porém equivalentes.

7
5 Exercícios

1. Descreva a linguagem representada por cada uma das expressões regulares a seguir:

a) E01 = ε + a(a + b)∗ b + b(a + b)∗ a


b) E02 = (b + ε)(a + ab + ba)∗ (b + ε)
c) E03 = (a + ε)(b + ab + ba + aba)∗
d) E04 = (a + b + ε)(ab + ba + aba + bab)∗
e) E05 = a + b + ε + a(a + b)∗ a + b(a + b)∗ b
f) E06 = (b + ε)((a + ba)(b + ε))∗

2. Proponha uma expressão regular para cada uma das linguagens a seguir:

a) L01 = {w ∈ {a, b}∗ | bba não é subpalavra de w}


b) L02 = {w ∈ {a, b}∗ | w tem tamanho múltiplo de 2}
c) L03 = {w ∈ {a, b}∗ | w tem tamanho ímpar}
d) L04 = a2m+1 b2n , m, n ∈ N
e) L05 = {w ∈ {a, b}∗ | a quantidade de a é par, e a de b é ímpar}
f) L06 = {w ∈ {a, b}∗ | |w| mod 3 6= 2}
g) L07 = {w ∈ {a, b}∗ | todo par de b's em w é separado por 2k símbolos, k ∈ N}
h) L08 = {w ∈ [0, 9]+ | w é um número decimal múltiplo de 5}
i) L09 = {w ∈ [0, 9]+ | w é um número decimal múltiplo de 4}
j) L10 = {w ∈ {a, b}∗ | |w| ≤ 4 e w é um palíndromo}

8
Referências

HOPCROFT, J. E.; ULLMAN, J. D.; MOTWANI, R. Introduction to Automata Theory,


Languages and Computation. 3. ed. Boston, MA, USA: Addison-Wesley Longman

Publishing Co., Inc., 2006.

LEWIS, H. R.; PAPADIMITRIOU, C. H. Elements of the Theory of Computation. 2. ed.


New Jersey: Prentice-Hall, 1998.

MENEZES, P. F. B. Linguagens Formais e Autômatos. 6. ed. Porto Alegre: Bookman,


2012. v. 3. (Série livros didáticos informática UFRGS, v. 3).

SIPSER, M. Introduction to the Theory of Computation. 3. ed. Boston: Cengage


Learning, 2012.

Você também pode gostar