DCC063
Linguagens Formais
e Autômatos
Uma palavra pertence ou não a uma linguagem?
É uma das principais questões relacionadas com o
estudo de Linguagens Formais
“Dispositivo” de reconhecimento
pode ser especificado como um
◼ modelo de autômato ou
◼ algoritmo implementável em computador (CYK)
em qualquer caso, é importante determinar
◼ "quantidade de recursos" necessários
◼ por exemplo: tempo e espaço
Algoritmos de reconhecimento (LLC)
Análise sintática
Algoritmos de reconhecimento
construídos a partir de uma GLC
Algoritmos de reconhecimento CYK
reconhecedores que usam Autômato com Pilha
muito simples
em geral, ineficientes
tempo de processamento é proporcional a k|w| (w
-entrada; k depende do autômato)
não são recomendáveis para entradas de tamanhos
consideráveis
Algoritmos de reconhecimento (LLC)
Análise sintática
Algoritmos de reconhecimento CYK
Algoritmo de Cocke-Younger-Kasamai (CYK)
É construído sobre um GLC na FNC.
Gera bottom-up todas as árvores de derivação da
entrada em tempo proporcional a |w|3, onde w é
a cadeia a ser analisada (reconhecida).
Baseado na técnica de programação dinâmica.
Constrói uma tabela de derivação, onde cada
célula representa uma raiz que pode gerar a correspondente subárvore.
Algoritmos de reconhecimento (LLC)
Análise sintática
Algoritmos de reconhecimento CYK
Suponha:
G = (N, T, P, S) uma GLC na FNC onde
T = {a1, a2, ..., an}
W = a1a2...an a entrada a ser analisada
Algoritmos de reconhecimento (LLC)
Análise sintática
Algoritmos de reconhecimento CYK
O algoritmo CYK é composto pelas seguintes
etapas, onde Vrs representa as células de uma
tabela de derivação:
Algoritmos de reconhecimento (LLC)
Análise sintática
6
a1 a2 ... an
s
r
Conjunto de raízes para as árvores de derivação da
Algoritmos de reconhecimento CYK
a) Var. que geram diretamente terminais, A→ a : para r de 1 até n faça
Vr1 = {A | A → ar P}
b) Produções que geram 2 variáveis (A → BC)
para s de 2 até n faça
para r de 1 até n + 1 –s faça Vrs = ;
para k de 1 até s – 1 faça
Vrs = Vrs {A | A → BCP, BVrk, CV(r+k)(s-k)}
Algoritmos de reconhecimento (LLC)
Análise sintática
Algoritmos de reconhecimento CYK
Exemplo1. Dada a gramática livre de contexto G: S → AA | AS | b
A → SA | AS | a
e a cadeia
w = abaab
Utilizar o algoritmo CYK para verificar se a cadeia w L(G).
Algoritmos de reconhecimento (LLC)
Análise sintática
Algoritmos de reconhecimento CYK
Exemplo1. Construir a tabela:
Algoritmos de reconhecimento (LLC)
Análise sintática
9
S → AA | AS | b A → SA | AS | a
w = abaab
a b a a b
s
Algoritmos de reconhecimento CYK
Exemplo1. Etapa (a):
Algoritmos de reconhecimento (LLC)
Análise sintática
10
S → AA | AS | b A → SA | AS | a
w = abaab
A S A A S
Algoritmos de reconhecimento CYK
Exemplo1. Etapa (b):
Algoritmos de reconhecimento (LLC)
Análise sintática
11
S → AA | AS | b A → SA | AS | a
w = abaab
A S A A S
Algoritmos de reconhecimento CYK
Exemplo1. Etapa (b):
Algoritmos de reconhecimento (LLC)
Análise sintática
12
S → AA | AS | b A → SA | AS | a
w = abaab
S,A
A S A A S
Algoritmos de reconhecimento CYK
Exemplo1. Etapa (b):
Algoritmos de reconhecimento (LLC)
Análise sintática
13
S → AA | AS | b A → SA | AS | a
w = abaab
S,A A
A S A A S
Algoritmos de reconhecimento CYK
Exemplo1. Etapa (b):
Algoritmos de reconhecimento (LLC)
Análise sintática
14
S → AA | AS | b A → SA | AS | a
w = abaab
S,A A S
A S A A S
Algoritmos de reconhecimento CYK
Exemplo1. Etapa (b):
Algoritmos de reconhecimento (LLC)
Análise sintática
15
S → AA | AS | b A → SA | AS | a
w = abaab
S,A A S S,A
A S A A S
Algoritmos de reconhecimento CYK
Exemplo1. Etapa (b):
Algoritmos de reconhecimento (LLC)
Análise sintática
16
S → AA | AS | b A → SA | AS | a
w = abaab
S,A A S S,A
A S A A S
Algoritmos de reconhecimento CYK
Exemplo1. Etapa (b):
Algoritmos de reconhecimento (LLC)
Análise sintática
17
S → AA | AS | b A → SA | AS | a
w = abaab S
S,A A S S,A
A S A A S
Algoritmos de reconhecimento CYK
Exemplo1. Etapa (b):
Algoritmos de reconhecimento (LLC)
Análise sintática
18
S → AA | AS | b A → SA | AS | a
w = abaab S,A
S,A A S S,A
A S A A S
Algoritmos de reconhecimento CYK
Exemplo1. Etapa (b):
Algoritmos de reconhecimento (LLC)
Análise sintática
19
S → AA | AS | b A → SA | AS | a
w = abaab S,A
S,A A S S,A
A S A A S
Algoritmos de reconhecimento CYK
Exemplo1. Etapa (b):
Algoritmos de reconhecimento (LLC)
Análise sintática
20
S → AA | AS | b A → SA | AS | a
w = abaab
S,A S
S,A A S S,A
A S A A S
Algoritmos de reconhecimento CYK
Exemplo1. Etapa (b):
Algoritmos de reconhecimento (LLC)
Análise sintática
21
S → AA | AS | b A → SA | AS | a
w = abaab
S,A S S,A
S,A A S S,A
A S A A S
Algoritmos de reconhecimento CYK
Exemplo1. Etapa (b):
Algoritmos de reconhecimento (LLC)
Análise sintática
22
S → AA | AS | b A → SA | AS | a
w = abaab
S,A S S,A
S,A A S S,A
A S A A S
Algoritmos de reconhecimento CYK
Exemplo1. Etapa (b):
Algoritmos de reconhecimento (LLC)
Análise sintática
23
S → AA | AS | b A → SA | AS | a
w = abaab
S,A S S,A
S,A A S S,A
A S A A S
Algoritmos de reconhecimento CYK
Exemplo1. Etapa (b):
Algoritmos de reconhecimento (LLC)
Análise sintática
24
S → AA | AS | b A → SA | AS | a
w = abaab S,A
S,A S S,A
S,A A S S,A
A S A A S
Algoritmos de reconhecimento CYK
Exemplo1. Finalmente obtemos:
Como S está no topo da tabela, então wL(G)!
Algoritmos de reconhecimento (LLC)
Análise sintática
25
S,A
S,A S,A
S,A S S,A
S,A A S S,A
A S A A S
Algoritmos de reconhecimento CYK
Exemplo 2. Seja L(G) a linguagem gerada pela
gramática livre de contexto G:
S → AB | XB T → AB | XB X →AT
A → a B →b
Utilizar o algoritmo CYK para verificar se a cadeia w L(G), onde:
w = aaabb wL(G) w = aaabbb wL(G)
Algoritmos de reconhecimento (LLC)
Análise sintática
Algoritmos de reconhecimento CYK
Exercícios. Utilizar o algoritmo CYK para verificar
se a cadeia w L(G), onde: :
a) S → AB | b w = aabaa A → a
B →SA
b) S → SF | a w = aaabbabaaaabba A → CG | SS | CS
C → b F →AS G →CA
Algoritmos de reconhecimento (LLC)
Análise sintática
Algoritmos de reconhecimento CYK
c) S → AB | BC w = bbab A → BA | a
B →CC | b C → AB | a
d) L(G) = {w | w (a,b)+ e |w|
a = |w|b }
S → aB | bA w = abaabb A → a | aS | bAA
B →b | bS | aBB
Algoritmos de reconhecimento (LLC)
Análise sintática
Determinismo Não-determinismo
LLC Determinística (LLCD)
Um AP é determinístico quando cada uma de suas
configurações apresenta, no máximo, uma configuração que pode sucedê-la.
LLCD são aquelas LLC aceitas por autômatos de
pilha determinísticos (APD).
Exemplos (LLCD e LLC):
Ld = {wcwR | w(a | b)*} → LLCD
Ln = {wwR | w(a | b)*} → LLCN
Algoritmos de reconhecimento (LLC)
Análise sintática
Determinismo Não-determinismo
É possível criar um APD para a linguagem
L = a* {anbn | n1} ?
Não. Não há como manter a quantidade de a´s
até achar um b e ao mesmo tempo reconhecer apenas a´s. (L não tem a propriedade do prefixo)
Mas L é LLCD.
Devemos, para mostrar este fato, alterar
ligeiramente o critério de aceitação do AP.
Algoritmos de reconhecimento (LLC)
Análise sintática
Determinismo Não-determinismo
Diz-se que um LLC L tem a propriedade do
prefixo se não existem duas cadeias diferentes x
e y em L tais que x é um prefixo de y.
Dizemos que uma LLC é determinística se ela for
reconhecida por um APD que tem a capacidade extra de localizar o final da cadeia de entrada.
Formalmente, diz-se que um LLC L* é
determinística se L$ = L(M) para algum APD M.
Onde $ é um novo símbolo e $.
Algoritmos de reconhecimento (LLC)
Análise sintática
Determinismo Não-determinismo
Toda LLCD definida desta forma também é uma
LLC.
Através desta definição é possível criar um APD
M para a linguagem L$ = (a* {anbn | n1})$
Algoritmos de reconhecimento (LLC)
Análise sintática
32
Estado Entrada Topo da pilha transições
q1 a (q1, a)
q1 b a (q2, ) q1 $ (q3, )
q2 b a (q2, )
q2 $ (q2, )
Determinismo Não-determinismo
Questão: toda LLC não seria determinística?
Teorema: A classe das LLCD é fechada em
relação à operação de complementação
Por exemplo, considere a linguagem (LLC):
E seu complemento (é uma LLC?)
Observe que anbncnL
Algoritmos de reconhecimento (LLC)
Análise sintática
Algoritmos de reconhecimento (LLC)
Análise sintática
Determinismo Não-determinismo
Corolário. A classe de LLCD está propriamente
contida na classe de LLC.
Assim, o não determinismo é mais poderoso do
que o determinismo no âmbito dos AP´s.
Algoritmos de reconhecimento (LLC)
Análise sintática
35
Ling. Regular
Análise Sintática Descendente Baseada em AP
Como vimos, nem todas as LLC podem ser aceita
por um APD
Vamos considerar algumas linguagens que não
estão sujeitas a esta restrição.
Isto é, iremos estudar LLC´s que podem ser
convertidas em um APD.
Algoritmos de reconhecimento (LLC)
Análise sintática
Análise Sintática Descendente Baseada em AP
Considere a linguagem L = {anbn | n0} gerada
pela GLC G:
S → aSb |
Seja M1 um AP tal que L(M1) = L(G) :
Algoritmos de reconhecimento (LLC)
Análise sintática
37
Estado Entrada Topo da pilha transições
p q, S
q S q, aSb
q,
q a a q,
Análise Sintática Descendente Baseada em AP
O AP M1 é não determinístico
Contudo, a linguagem L é determinística.
Portanto, é possível modificar M1 para torná-lo um APD M2 que aceita L$.
Qual das duas transições aplicar
depende do próximo símbolo de entrada (lookahead)
Algoritmos de reconhecimento (LLC)
Análise sintática
38
Estado Entrada Topo da pilha transições
q S q, aSb
Análise Sintática Descendente Baseada em AP
Estratégia:
Se esse símbolo for um a, então deve-se substituir S
por aSb na pilha
Se esse símbolo for um b, então deves substituir S
por na pilha (remover S)
M2 consome antecipadamente um símbolo da
entrada (lookahead) e incorpora essa
informação em seu estado.
Algoritmos de reconhecimento (LLC)
Análise sintática
Análise Sintática Descendente Baseada em AP
M2 = ({p, q, qa, qb, q$}, {a,b}, {a, b, S}, 2, p, {q$})
Algoritmos de reconhecimento (LLC)
Análise sintática
40
# Estado Entrada Topo da pilha
transições
1 p q , S
2 q a qa ,
3 qa a q ,
4 q b qb ,
5 qb b q ,
6 q $ q$ ,
7 qa S qa , aSb
Análise Sintática Descendente Baseada em AP
M1 e M2 na forma de diagrama
Algoritmos de reconhecimento (LLC)
Análise sintática
41
p q q$
qa
qb
(, , S)
(, a, ) (a, , ) (, S, aSb)
(b, , ) (, b, )
(, S, ) ($, , )
q p (, , S)
(, S, aSb)
(, S, )
(a, a, )
(b, b, )
Análise Sintática Descendente Baseada em AP
A partir do estado q, M2 lê um símbolo de
entrada e, sem alterar a pilha, transita para: qa, qb ou q$. M2 é determinístico e aceita ab$ como segue:
Algoritmos de reconhecimento (LLC)
Análise sintática
Análise Sintática Descendente Baseada em AP
Algoritmos de reconhecimento (LLC)
Análise sintática
43
Estado Entrada ainda
não lida Pilha
Transição utilizada
Passo Regra de G
p ab$
-0
q ab$ S 1
1
qa b$ aSb 7
3 S → aSb
q b$ Sb 3
4
qb $ Sb 4
5
qb $ b 8
6 S →
q $ 5
7
q$ 6
8
qa b$ S 2
Análise Sintática Descendente Baseada em AP
Dispositivo como M2 são conhecidos como
analisadores sintáticos. (produz a arvóre
sintática).
Em particular, M2 é um analisador sintático
descendente. Raiz → folha, esquerda → direta:
Algoritmos de reconhecimento (LLC)
Análise sintática
44
S
a S b
passo 3
passo 6
Parte já constuída da árvore de análise
sintática
Parte da árvore ainda a ser constuída S
Análise Sintática Descendente Baseada em AP
Nem todas as LLC têm um APD que podem ser
derivados a partir da técnica do lookahead.
Algumas LLC sequer são determinística
Algumas LLC não se mostram diretamente
compatíveis com a análise sintática por
lookahead.
Fazendo algumas modificações na gramática,
pode-se torná-las compatíveis.
A classe de LLC compatível com esta técnica são
conhecidas como LL(1).
Algoritmos de reconhecimento (LLC)
Análise sintática
Análise Sintática Descendente Baseada em AP
Considere a gramática (expressões aritméticas) E → E + T | T
T → T * F | F
F → (E) | id | id(E)
O AP (não determinístico) para esta gramática é:
Algoritmos de reconhecimento (LLC)
Análise sintática
46
(0) (p, , ) → (q, E)
(1) (q, , E) → (q, E + T)
(2) (q, , E) → (q, T)
(3) (q, , T) → (q, T * F)
(4) (q, , T) → (q, F)
(5) (q, , F) → (q, (E)) (6) (q, , F) → (q, id) (7) (q, , F) → (q, id(E))
Análise Sintática Descendente Baseada em AP
O não determinismo está nas transições: 1-2, 3-4
e 5-6-7
Agravante: a escolha da transição correta não é
possível consultando o símbolo seguinte da entrada (lookahead).
Transições 5, 6 e 7:
A transição 5 pode ser descartada (começa com ‘(‘) Transições 6 e 7, ambas começam com id.
Algoritmos de reconhecimento (LLC)
Análise sintática
Análise Sintática Descendente Baseada em AP
Transições 5, 6 e 7.
Basta fatorar estas duas transições, obtem-se:
F → (E) | idA A → (E) |
Assim, substitui-se as transições 6 e 7 por
(5’) (q, , F) → (q, idA) (6’) (q, , A) → (q, ) (8’) (q, , A) → (q, (E))
Algoritmos de reconhecimento (LLC)
Análise sintática
Análise Sintática Descendente Baseada em AP
Transições 1 e 2: Se o entrada for id e o topo da
pilha for E, o AP pode executar:
a transição 2, substituindo E por T (entrada id); ou
a transição 1, substituindo E por E+T e depois E por
T (entrada id + id); ou
a transição 1 duas vezes, e depois a transição 2 uma
vez. (entrada id + id + id);
e assim por diante.
O problema é que a gramática é recursiva à
esquerda.
Algoritmos de reconhecimento (LLC)
Análise sintática
Análise Sintática Descendente Baseada em AP
Retirando a recursão à esquerda obtemos G’: E → TE’
E’ → +TE’ | T → FT’
T’ → *FT’ | F → (E) | idA A → (E) |
Podemos obter um APD consultando
antecipadamente o próximo símbolo da entrada.
Algoritmos de reconhecimento (LLC)
Análise sintática
Análise Sintática Descendente Baseada em AP
Podemos então construir o seguinte APD M4 que
aceita L(G)$:
Algoritmos de reconhecimento (LLC)
Análise sintática
51
(p, , ) → (q, E)
(q, a, ) → (qa, ) para cada a{$} (qa, , a) → (q, ) para cada a
(qa, , E) → (qa, TE’) para cada a{$} (q+, , E’) → (q+, +TE’)
(qa, , E’) → (qa, ) para cada a{ ), $} (qa, , T) → (qa, FT’) para cada a{$}
(q*, , T’) → (q*, *FT’)
(qa, , T’) → (qa, ) para cada a{+,),$} (q(, , F) → (q(, (E))
(qid, , F) → (qid, idA) (q(, , A) → (q(, (E))
Análise Sintática Descendente Baseada em AP
Pode-se seguir as seguintes regras para
construir um analisador descendente (APD):
eliminar a recursão à esquerda;
fatorar a gramática (nem sempre é possível);
examinar a gramática resultante quanto a aplicação
da antecipação do símbolo da entrada para todas as produções que têm o mesmo lado esquerdo.
As gramáticas que exibem esta propriedade são
ditas LL(1).
Algoritmos de reconhecimento (LLC)
Análise sintática
Análise Sintática Descendente Baseada em AP
AP GLC na FNG: seja G = (N, T, P, S) uma GLC
na FNG, L(G). Então é possível definir um
APND M = ({p, q}, , , , p, {q}) tal que L(G)=
L(M) onde:
= T;
= N
=
Análise Sintática Descendente Baseada em AP
AP GLC na FNG: Exemplo. Considere a
gramática das expressões aritméticas na FNG:
E → (EX | id | (EXY | idY | (EXZ | idZ | (EXYZ | idYZ
F → (EX | id
T → (EX | id | (EXY | idY
Y → *F | *FY
Z → +T | +TZ
X → )
Algoritmos de reconhecimento (LLC)
Análise sintática
Análise Sintática Descendente Baseada em AP
Aplicando as regras de construção, obtemos a
seguinte função de transição :
(p, , ) → (q, E) (q, (, F) → (q, EX) (q, id, F) → (q, )
(q, (, T) → (q, EX), (q, EXY) (q, id, T) → (q, ), (q, Y)
(q, (, E) → (q, EX), (q, EXY), (q, EXZ), (q, EXYZ) (q, id, E) → (q, ), (q, Y), (q, Z), (q, YZ) (q, *, Y) → (q, F), (q, FY)
(q, +, Z) → (q, T), (q, TZ) (q, ), X) → (q, )
Algoritmos de reconhecimento (LLC)
Análise sintática
Análise Sintática Descendente Baseada em AP
Esta gramática não tem recursão à esquerda.
Para construir um APD para esta linguagem,
basta:
fatorá-la (possivelmente não ficará mais na FNG);
aplicar a técnica do lookahead (se possível).
Não usar a forma de conversão de GLC na FNG
para AP não determinístico (como visto acima).
Algoritmos de reconhecimento (LLC)
Análise sintática
Análise Sintática Descendente Baseada em AP
Nem toda LLC determinística é LL(k)
A classe de LLC determinística é conhecida por
LR(k).
A classe de LLC determinísticas é não-ambígua.
Algoritmos de reconhecimento (LLC)
Análise sintática
57
Ling. Regular Não-ambígua
LR
LL LLC
Análise Sintática Descendente Baseada em AP
Exemplos
Algoritmos de reconhecimento (LLC)
Análise sintática
58
Determinísticas:
Não determinísticas:
LL: {anbn | n 0}
LR: {a2nb2nc | n 0} {a2n+1b2n+1d | n 0}
Não ambígua: {wwR | w {a, b}* } Inerentemente ambígua