Escolar Documentos
Profissional Documentos
Cultura Documentos
Centro Tecnolgico
Departamento de Informtica e de Estatstica
Captulo I Introduo
I.1 - Introduo a Compiladores
I.2 - Introduo a Teoria da Computao
I.3 - Introduo a Teoria das Linguagens Formais
Segundo esta tica, a teoria da computao pode ser vista como um conjunto de
modelos formais (juntamente com suas propriedades) que fundamentam a cincia da
computao. Tais modelos incluem Autmatos (Finitos, de Pilha e Mquinas de Turing) e
Gramticas, enquanto que as propriedades de interesse envolvem questes de decidibilidade,
Inter-relacionamento entre modelos (abrangncia, equivalncia, etc...) e complexidade
computacional.
Nesta apostila, abordaremos a Teoria da Computao segundo a tica da Teoria das
Linguagens Formais e Autmatos.
Procedures e Algortmos
O conceito de algoritmo fundamental dentro da cincia da computao e pode ser
definido formalmente segundo vrios propsitos da teoria da computao (como ser visto no
final desta seo) ou informalmente em funo da definio de procedure (como veremos a
seguir).
Procedure: m conjunto finito de passos (instrues), os quais podem ser executados
mecanicamente em uma quantidade fixa de tempo e com uma quantidade fixa de esforo. Um
bom exemplo de uma procedure um programa de computador escrito em linguagem de
mquina, pois tal programa possui um nmero finito de passos, todos executveis
mecanicamente com uma quantidade fixa de recursos.
Algoritmo: uma procedure que sempre pra; ou seja, uma procedure cuja execuo chegar
ao final, independentemente de quais sejam suas entradas. Adicionalmente, dizemos que uma
procedure termina para uma determinada entrada, se existe um nmero finito t, tal que aps a
execuo de t instrues (no necessariamente distintas), ou no existem mais instrues a
serem executadas, ou a ltima instruo executada foi uma instruo halt.
Exemplos:
1 Dado um nmero inteiro positivo I, determinar se I ou no um nmero primo.
2 Dado um inteiro I, determinar se existe um nmero perfeito maior que I (obs: um nmero
perfeito se a soma de seus divisores (exceto ele mesmo) igual ao prprio nmero).
3 Dado um programa escrito em uma determinada linguagem de programao, determinar
se esse programa est sintaticamente correto. Este problema uma instncia do seguinte
problema genrico: dada uma cadeia de caracteres x determinar se essa cadeia gerada por
uma Gramtica Livre de Contexto (ou reconhecida por um Autmato de Pilha).
4 Dado um programa qualquer, determinar se existe alguma entrada para a qual o programa
entrar em loop.
Os problemas enunciados nos exemplos 1 e 3 possuem representao algortmica
enquanto que os problemas dos exemplos 2 e 4 s so representveis via procedures.
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 2
Fechamento de um Alfabeto
Seja V um alfabeto .
- O fechamento reflexivo (ou simplesmente fechamento) de V, representado por V*,
dado pelo conjunto de todas as possveis seqncias que podem ser formadas a partir
de V, inclusive a sentena vazia.
- O fechamento transitivo (ou fechamento positivo) de V, representado por V+, dado
por V* - { }.
Exemplos: Seja V = { 0, 1 }, temos que:
V* = {, 0, 1, 00, 01, 11, 000,...}
V+ = {0, 1, 00 ,01, 11, 000,...}
I.3.2 Linguagens e suas Representaes
Linguagem: Uma linguagem L sobre um alfabeto V, um subconjunto de V*; isto ,
L V
Representaes de Linguagens: O estudo de linguagens est intimamente relacionado
ao estudo das formas de representao dessas linguagens. O problema de representao de
uma linguagem, por sua vez, est relacionado com o fato dela ser finita ou infinita:
- Linguagem Finita: uma Linguagem que pode ser representada por enumerao.
Exemplo: A linguagem definida como sendo o conjunto dos inteiros positivos pares maiores
que 0 e menores que 20, pode ser representado por: L = {2, 4, 6, 8, 10, 12, 14, 16, 18}.
- Linguagem Infinita: Neste caso, na impossibilidade de usarmos enumerao,
precisamos encontrar uma representao finita para estas linguagens.
Exemplo: A linguagem definida como sendo o conjunto dos inteiros pares poderia ser
representada por V ={2, 4, 6, 8, 10,...} que, que apesar de intuitiva, no finita e nem precisa.
As representaes finitas de linguagens classificam-se em Reconhecedores e Sistemas
Geradores:
Reconhecedores So dispositivos formais que nos permitem verificar se uma
determinada sentena pertence ou no a uma determinada linguagem ( uma representao
das sentenas de uma linguagem sob o ponto de vista do reconhecimento de tais sentenas).
Esses dispositivos denominam-se autmatos; autmatos finitos, autmatos de pilha e
mquinas de turing, por exemplo, podem ser destacados como importantes classes de
autmatos.
Sistemas Geradores So dispositivos formais dotados de mecanismos que permitem a
gerao sistemtica das sentenas de uma linguagem (representao sob o ponto de vista da
gerao das sentenas de uma linguagem). Os principais sistemas geradores disponveis so as
gramticas, dentre as quais, por exemplo, podemos destacar as gramticas de CHOMSKY.
Observaes: Todo reconhecedor e todo sistema gerador pode ser representado por
algortmos e/ou procedures.
Linguagens Formais: So linguagens que podem ser representadas de maneira finita e
precisa atravs de sistemas com sustentao matemtica (dispositivos formais ou modelos
matemticos).
Linguagem Recursiva: Uma linguagem recursiva se existe um algoritmo capaz de
reconhecer ou gerar as sentenas que compem essa linguagem.
Linguagem Recursivamente Enumervel: toda a linguagem cujas sentenas podem
ser reconhecidas ou geradas por procedures.
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 5
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 6
CAPTULO II GRAMTICAS
II.1 Motivao
II.2 Definio Formal
II.3 Derivao e Reduo
II.4 Sentenas, Forma Sentencial e Linguagem
II.5 Tipos de Gramticas (Hierarquia de Chomsky)
II.6 Sentena Vazia
II.7 Recursividade das G.S.C.
II.1 Motivao
Sabemos que uma linguagem qualquer conjunto ou subconjunto de sentenas sobre
um alfabeto, ou seja: dado um alfabeto V, uma linguagem L sobre esse alfabeto, um
subconjunto de V* L V*.
Assim sendo, devemos nos preocupar em definir que subconjunto esse.
A finalidade de uma gramtica definir o subconjunto de V* que forma (define) uma
determinada linguagem. Uma gramtica define uma estrutura sobre um alfabeto de forma a
permitir que apenas determinadas combinaes sejam vlidas, isto , sejam consideradas
sentenas (definindo assim a linguagem que ela representa).
O que Gramtica?
Uma gramtica, de maneira informal, pode ser definida como sendo:
a) Um sistema gerador de linguagens;
b) Um sistema de reescrita;
c) Uma maneira finita de descrever (representar) uma linguagem;
d) Um dispositivo formal usado para especificar de maneira finita e precisa uma
linguagem potencialmente infinita.
Exemplo intuitivo de uma Gramtica:
(um subconjunto da gramtica da lngua portuguesa)
<sentena> :: = <sujeito> <predicado>
<sujeito> :: = <substantivo>
| <artigo> <substantivo>
| <artigo> <adjetivo> <substantivo>
<predicado> :: = <verbo> <objeto>
<substantivo> :: = joo | Maria | cachorro | livro | po
<artigo>
:: = o | a
<adjetivo> :: = pequeno | bom | bela
<verbo> :: = morde | le | olha
<objeto> :: = <substantivo>
| <artigo> <substantivo>
| <artigo> <adjetivo> <substantivo>
Notao utilizada:
< ......... > : categoria sinttica ou gramatical;
::=
: definido por
|
: ou (alternativa)
::=
: regra de sintaxe (ou regra gramatical ou regra de produo)
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 7
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 9
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 10
Observao: Note que segundo esta redefinio, a produo S s poder ser usada uma
vez: exatamente na derivao de (a sentena vazia).
Lema II.1: Se G = (Vn, Vt, P, S) uma G.S.C., ento G1 S.C. | L(G1) = L(G) o
smbolo inicial de G1 no aparea no lado direito de nenhuma produo de G1.
Prova: Seja G = (Vn, Vt, P, S) uma G.S.C.;
Seja S1 = (Vn Vt);
Seja G1 = (Vn {S G1}, Vt, P1, S1), onde:
P G1 = {S G1 | S G1 S P} P S G1 ser o smbolo
inicial de G1.
Para completar a prova, necessrio mostrar que L(G1) = L(G):
L(G1) = L(G) 1 - L(G) L(G1)
2 - L(G1) L(G)
+ w
1 Seja w L(G) S
+
se S w
* w
ento S
se S
ento S P e, por definio, S1 P1
+ w L(G) L(G1)
Logo, S1 w S1
+ w
2 Seja w L(G1) S1
+ w
se S1
* w
ento S1
se S1
ento S1 P1 e, para que esta produo exista, necessrio que P
contenha a produo S , portanto:
+ w L(G ) L(G)
* w S
S
1
Concluso: De 1 e 2, tem-se que L(G1) = L(G).
OBS.: 1 O lema II.1 vale tambm para G.L.C. e G.R..
2 Se G S.C., L.C. ou Regular, ento G1 ser respectivamente S.C., L.C. ou
Regular.
Teorema II.1: Se L S.C., L.C. ou REGULAR, ento L1 = L {} e L2 = L {}
sero respectivamente S.C., L.C. ou Regular.
Prova: Imediata a partir da redefinio de gramticas e do LEMA II.1.
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 12
Geradores X Reconhecedores
Gramticas Tipo 0
Gramticas S.C.
Gramticas L.C.
Gramticas Regulares
Mquinas de Turing
Autmatos Limitados Lineares
Autmatos de Pilha
Autmatos Finitos
III.1 A.F.D.
Formalmente definimos um A.F.D. como sendo um sistema formal M = (K, , , qo, F),
onde:
K um conjunto finito no vazio de Estados;
um Alfabeto, finito, de entrada;
Funo de Mapeamento (ou funo de transio)
definida em: K x K
qo K, o Estado Inicial
F K, o conjunto de Estados Finais
Interpretao de
A interpretao de uma transio (q, a) = p, onde q p K a , a seguinte: se o
Controle de M esta no estado q e o prximo smbolo de entrada a, ento a deve ser
reconhecido e o controle passar para o estado p.
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 13
Diagrama de Transio
Um diagrama de transio para um A.F. M um grafo direcionado e rotulado, onde os
vrtices representam os estados e fisicamente so representados por crculos (sendo que o
estado inicial possui uma seta com rtulo Inicio e os estados finais so representados por
crculos duplos), e as arestas representam as transies (sendo que, entre dois estados p e
q, existir uma aresta direcionada de p para q, com rtulo a (a ) (p, a) = q
em M.
Tabela de Transies
uma representao tabular de um A.F..
Nesta tabela as linhas representam os estados (o inicial indicado por uma seta e os
finais por asteriscos), as colunas representam os smbolos de entrada e o contedo da posio
(q, a) ser igual a p se existir (q, a) = p, seno ser indefinido.
III.2 A.F.N.D.
Um A.F.N.D. um sistema formal M = (K, , , qo, F), onde:
K, qo, F possuem a mesma definio dos A.F.D.
uma funo de mapeamento, definido em K x = (K); sendo que (K) um
subconjunto de K; isto eqivale a dizer que (q, a) = p1, p2, ...,pn. A interpretao de
que M no estado q, com o smbolo a na entrada pode ir tanto para o estado p1 como
para o estado p2, ..., como para o estado pn.
A.F.D.
A.F.N.D.
Vantagem
Implementao Trivial
Representao mais natural de
algumas LR
Desvantagem
No natural na representao de
algumas L.R.
Implementao complexa
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 14
qo
q1
q2
*q3
a
qo,q1
-------
b
qo
q2
q3
---
onde T(M) = {
T(M) = {
[qo]
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 15
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 16
2 T(M) L(G)
Mostrar que T(M) est contido em L(G), significa mostrar que, se T(M) contm x, ento
x L(G).
Seja x = a1a2...an uma seqncia aceita por M.
Se M aceita x, ento uma seqncia de estados S, A1, A2, ..., An-1, A |
(S, a1) = A1,
(A1, a2) = A2
:
(An-1, an) = A, onde S o estado inicial e A um estado final.
por definio, para que essas transies existam, G dever possuir as seguintes
produes:
S a1A1, A1 a2A2, ... An-1 an
e, se essas produes existem, ento
S a1A1 a1a2A2 ... a1a2...na-1An-1 a1a2... an uma derivao em G;
+ x, ento x L(G)
logo, como x = a1a2...an S
Mas, e se T(M) ?!?
Neste caso, por definio, S F;
e se S F porque S P,
logo L(G).
Assim, T(M) L(G).
Concluso: De 1 e 2, temos que T(M) = L(G)
Teorema 3.3: Se M = (K, , , qo, F) um A F., ento uma G.R. G = (Vn, Vt, P, S)
| L(G) = T(M).
Prova: a Mostrar que G existe
b Mostrar que L(G) = T(M)
a) Seja M = (K, , , qo, F) um A.F.D..
Construa uma G.R. G = (Vn, Vt, P, S), como segue:
1 Vn = K
2 Vt =
3 S = qo
4 Defina P, como segue:
a) Se (B, a) = C ento adicione B aC em P
b) Se (B, a) = C C F ento adicione B a em P
c) Se qo F,
ento T(M).
Neste caso, L(G) = T(M) {},
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 17
Estados mortos:
Um estado q K morto se ele F w1 | (q, w1) = p, onde p F w1 uma
sentena ou parte dela, ou seja, q morto se ele no final e a partir dele nenhum estado final
pode ser alcanado.
Estados Equivalentes:
Um conjunto de estados q1, q2, ..., qj so equivalentes entre s, se eles pertencem a uma
mesma classe de equivalncia.
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 18
*A
B
C
* D
E
F
*G
H
a
G
F
C
A
E
B
G
H
b
B
E
G
H
A
C
F
D
Implementao Especfica
Implementao Especfica
Consiste em representar cada estado do A.F. atravs de um conjunto de instrues, ou
seja, consiste em, literalmente, programar cada estado do A.F..
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 20
Exemplo:
TAB
q1
q2
q3
q4
a
1
4
1
4
b
2
2
4
4
c
4
3
3
4
TAB
1
2
3
4
a
1
4
1
4
b
2
2
4
4
c
4
3
3
4
VE F
1
2
3
4
0
0
1
0
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 22
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 23
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 24
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 26
Algoritmo IV.2:
Objetivo: Eliminar smbolos Inalcanveis.
Entrada: Uma G.L.C. G = (Vn, Vt, P, S).
Sada: Uma G.L.C. G = (Vn, Vt, P, S) na qual todos os smbolos (Vn Vt) sejam
alcanveis.
Mtodo:
Construa conjuntos V0, V1, ..., como segue:
i 0 ; Vi {S}
repita
i i +1
Vi Vi-1 {X | A X P, A Vi-1 e (Vn Vt)*}
at Vi = Vi-1
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 27
Algoritmo IV.3
Objetivo: Eliminar smbolos inteis.
Entrada: Uma G.L.C. G = (Vn, Vt, P, S).
Sada: Uma G.L.C. G = (Vn, Vt, P, S) | L(G) = L(G) e nenhum smbolo de G seja intil.
Mtodo:
1 Aplique o algoritmo IV.1 para obter NF;
2 Construa G1 = (Vn NF, Vt, P1, S), onde P1 contm apenas produes envolvendo
smbolos pertencentes NF Vt;
3 Aplique o ALG IV.2 em G1, para obter G1 = (Vn, Vt, P, S);
Fim
Exemplo:
2) S a B c D e
BbB|E|F
DdD|F|d
EeE|e
FfF|f
IV.5.4 Fatorao de G.L.C.
Uma G.L.C. est fatorada se ela determinstica; isto , no possui A produes cujo
lado direito inicie com o mesmo conjunto de smbolos ou com smbolos que geram (derivam)
seqncias que iniciem com o mesmo conjunto de smbolos.
Exemplos:
Processo de Fatorao
Para fatorar uma G.L.C. alteramos as produes envolvidas no no-determinismo, da
seguinte maneira:
a) As produes com No-Determinismo Direto da forma:
A |
Devem ser substitudas por:
A A
A |
b) O No-Determinismo Indireto retirado atravs de sua transformao em um
no-determinismo Direto (via derivaes sucessivas), o qual eliminado como
previsto no item a.
Exemplos:
Recurso a Esquerda
a) Direta (ou Imediata) : Uma G.L.C. G = (Vn, Vt, P, S) possui recurso a
esquerda direta, se p contm pelo menos uma produo da forma A A.
b) Indireta : Uma G.L.C. G = (Vn, Vt, P, S) possui recurso a esquerda indireta, se
existe em G uma derivao da forma:
* A.
A ...
Eliminao de Recurses a Esquerda Imediata
Sejam as seguintes A - produes de G:
A A1 | A2 | ... | An | 1 | 2 | ... | m
Obs.: onde nenhum i comea com A.
Substitua estas produes pelas seguintes:
A 1A' | 2A' | ... | mA
A 1A | 2A | ... | nA |
Observaes: onde A um novo no-terminal.
Processo para Eliminar Recurses a Esquerda (diretas e indiretas)
Entrada: Uma G.L.C. Prpria G = (Vn, Vt, P, S).
Sada: Uma GLC G = (Vn, Vt, P, S) | L(G) = L(G) G no possui Recurso a Esquerda.
Mtodo:
1 Ordene os no-terminais de G em uma ordem qualquer (digamos: A1, A2, ..., An);
2 Para i = 1, n faa
Para j = 1, i 1 faa
Substitua as produes da forma
Ai Aj
por produes da forma
Ai 1 | 2 | ... | k
onde 1, 2, ..., k so os lados direitos das
Aj produes (Aj 1 | 2 | ... | k)
fim para
Elimine as rec. esq. Diretas das Ai produes
fim para
3 Fim.
Exemplos:
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 31
BNFE (BNF Extended) : Equivalente a BNF, permite uma especificao mais compacta da
sintaxe de uma Linguagem de Programao.
Exemplos: 1) <S> :: = {a}
2) <E> :: = id {+ id}
RRP : uma notao de G.L.C. onde os lados direito das produes so especificados atravs
de E.R. envolvendo Vt e Vn de uma gramtica.
Exemplos:
1) <S> :: = a*
2) <E> :: = id +
Diagrama Sinttico : uma notao grfica de G.L.C..
Exemplos: 1) <S> :
a
2) <E> :
id
+
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 33
a2
...
an
Entrada
Z1
Z2
...
Controle Finito
Zn
Pilha
q0 K, o Estado Inicial de P
Z0 , o Smbolo Inicial da Pilha
F K, o conjunto de Estados Finais.
Movimentos de um PDA
Os movimento de um PDA so determinados com base nas seguintes informaes:
prximo smbolo da entrada,
smbolo do topo da pilha
estado corrente
Existem dois tipos de movimentos:
1 Movimento dependente da entrada (a-move)
(q, a, Z) = {(p1, 1), (p2, 2), ..., (pm, m)} onde:
a
q, p1, p2, ..., pm K
Z
i *, para i i m
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 34
(q, aw, Z)
(p, , ), onde p F *}
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 35
(p, , ), para p K}
Observao: Linguagens aceitas por estados finais e por pilha vazia constituem a mesma
classe de linguagens, pois para toda linguagem aceita por um PDA P1 por pilha vazia, existe
um PDA P2 que reconhece essa linguagem por estado final e vice-versa.
Exemplos:
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 36
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 37
Propriedades
A classe das LLC fechada sobre as seguintes operaes:
a) Unio
Se L1 e L2 so LLC, ento
L1 L2 tambm uma LLC.
b) Concatenao
Se L1 e L2 so LLC, ento
L1L2 tambm uma LLC.
c) Fechamento
Se L uma LLC, ento L* e L+ tambm so LLC.
d) Interseco Com Conjunto Regular
Se L1 LLC e L2 um CR, ento
L1 L2 uma LLC
Observaes: 1 As LLC no so fechadas sobre as operaes de Interseco e
Complemento.
2 A principal aplicao das propriedades de LLC a demonstrao de
que determinadas linguagens no so LLC.
Problemas de Deciso
1 Membership
Dada uma G.L.C. G = (Vn, Vt, P, S) e um string x, x L(G)?
Observao: Isto pode ser demonstrado pelo algoritmo do Teorema II.2 (CAP.II) atravs de
uma derivao de no mximo 2*|x|-1 passos.
2 Emptiness
Dada uma G.L.C. G = (Vn, Vt, P, S), L(G) = ?
Observao: Este problema pode ser resolvido pelo algoritmo que determina o conjunto de
NT frteis de G, bastando testar se o smbolo inicial de G frtil.
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 38
3 Finiteness
Dada uma G.L.C. G = (Vn, Vt, P, S), L(G) Finita?
Observao: Este problema pode ser resolvido com auxlio dos conceitos de Smbolos Inteis
e No-Terminais Recursivos.
4 Containment
Dadas duas G.L.C. G1 e G2, L(G1) L(G2)?
5 Equivalence
Dadas duas G.L.C. G1 e G2, L(G1) = L(G2)?
6 Intersseco
Dadas duas G.L.C. G1 e G2, L(G1) L(G2) = ?
7 Ambigidade
Dada uma G.L.C. G = (Vn, Vt, P, S), G ambgua?
Observaes: Os problemas 1, 2 e 3 so decidveis, os demais so indecidveis.
IV.10 Aplicaes
As LLC so de grande importncia prtica, notadamente nas seguintes aplicaes:
1 Definio (especificao) de linguagens de programao;
2 Na formalizao da noo de parsing e conseqentemente na implementao de parsers;
3 Esquemas de traduo dirigidos pela sintaxe (Transducers);
4 Processamento de strings de modo geral.
Dentre essas aplicaes, as duas primeiras so fundamentais para a rea de
compiladores, pois graas possibilidade de formalizao das LLC (via G.L.C. e PDA) foi
possvel construir uma teoria geral de parsing que levou a proposio de diversas e eficientes
tcnicas (algoritmos) de anlise sinttica. Tcnicas estas que, por serem baseadas em aspectos
formais, possibilitam a gerao automtica de parsers (analisadores sintticos).
Deve-se salientar que G.L.C. constituem um modelo apropriado para especificao de
linguagens de programao e quaisquer outras linguagens que no possuam dependncia de
contexto, enquanto que um PDA um modelo natural de um parser.
Ainda na construo de compiladores (e no processo de traduo, em geral) G.L.C. e
PDA tm sido bastante utilizados por outros dispositivos (formais ou semiformais)
empregados na implementao de analisadores semnticos (gramticas de atributo, por
exemplo) e como base para esquemas de traduo dirigidos pela sintaxe.
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 39
Conjunto First
Definio: Seja uma seqncia qualquer gerada por G. Definimos como sendo
first() o conjunto de smbolos terminais que iniciam ou seqncias derivadas (direta ou
indiretamente) de .
* , ento first().
Observaes: Se = ou
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 40
Algoritmo V.1:
Para calcular first(X) para todo X Vn Vt, aplicamos as seguintes regras:
a) Se X Vt, ento first(X) = {X};
b) Se X Vn X a P, ento coloque a em first(X); da mesma forma,
se X P, coloque em first(X);
c) Se X Y1 Y2 ... Yk P, ento, para todo i | Y1 Y2 ... Yi-1 Vn first(Yj),
para j = i, i-1, contenha , adicione first(Yi) {} em first(X).
Em outras palavras:
1 Coloque first(Y1), exceto , em first(X);
2 Se first(Y1) ento coloque first(Y2), exceto em first(X);
3 Se first(Y2) ento ....
.....
at Yk.
4 Finalmente, se para todo i (de 1 a k) first(Yi) contm ,
ento adicione em first(X).
Conjunto Follow
Definio: Definimos Follow(A), para todo A Vn, como sendo o conjunto de
smbolos terminais que podem aparecer imediatamente aps A em alguma forma sentencial
de G.
Algoritmo V.2:
Para todo A Vn, aplique as regras abaixo, at que Follow(A) esteja completo (isto ,
no sofra nenhuma alterao):
1 Coloque $ (a marca de final de sentena) em Follow(S), onde S o Smbolo Inicial
da gramtica em questo;
2 Se a B P ,
ento adicione First(), exceto , em Follow(B);
3 Se A B (ou A B, onde First()) P,
ento adicione Follow(A) em Follow(B).
Exemplos e Exerccios:
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 41
Tcnicas de Implementao
Descendente Recursivo: Esta tcnica consiste basicamente na construo de um conjunto
de procedimentos (normalmente recursivos), um para cada smbolo no terminal da gramtica
em questo.
A principal desvantagem desta tcnica que ela no geral, ou seja, os procedimentos
so especficos para cada gramtica; alm disso, o tempo de anlise maior (se comparado
com a tcnica que veremos a seguir) e existe a necessidade de uma linguagem que permita
recursividade para sua implementao.
Por outro lado, a principal vantagem desta tcnica, a simplicidade de implementao e
a facilidade para inserir as diferentes funes do processo de compilao, diretamente nos
procedimentos que realizam a anlise sinttica de cada no-terminal da gramtica; contudo
esta vantagem verifica-se apenas para gramticas/linguagens pequenas e simples.
Outro inconveniente desta tcnica a dificuldade para validao do analisador
construdo, uma vez que os procedimentos no esto livres de erros de programao e ou
erros decorrentes da no adequao da gramtica para esta classe de analisadores (por
exemplo, a presena de ambigidade ou recurses esquerda indiretas, no percebidas pelo
projetista).
Exemplo:
O Parser Descendente Recursivo da Gramtica
G: E TE
E + TE |
T (E) | id
seria composto pelos seguintes procedimentos:
(* Programa Principal *)
begin
scanner (simb);
E (simb);
end;
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 43
procedure E (simb);
begin
T (simb);
Elinha (simb);
end;
procedure Elinha (simb);
begin
if simb = +
then begin
scanner (simb);
T (simb);
Elinha (simb);
end;
end;
procedure T (simb);
begin
...
end;
PARSER PREDITIVO (LL)
uma maneira eficiente de implementar um parser descendente recursivo (por isso,
tambm denominado parser descendente recursivo tabular).
Um parser preditivo consiste de:
1 Entrada contendo a sentena (programa) a ser analisada.
2 Pilha usada para simular a recursividade, ela prev a parte da entrada que est
para ser analisada ( inicializada com $ e o smbolo inicial da gramtica em questo).
3 Tabela de Parsing (ou tabela de anlise sinttica) Contm as aes a serem
efetuadas. uma matriz M(A, a), onde A Vn a Vt.
4 Algoritmo de anlise sinttica.
Estrutura de um Parser Preditivo
a b c ...
Pilha
X
W
Y
Z
$
$
Entrada
Algoritmo
Tabela de Parsing
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 44
deve ser substitudo pelo (reduzido ao) lado esquerdo da produo em questo. Este processo
deve ser repetido ate que toda a sentena de entrada tenha sido analisada.
Observaes: 1 As redues so prioritrias em relao ao shifts.
2 Se ao final do processo a Entrada estiver vazia e a pilha sinttica contiver
apenas o smbolo inicial de G, ento a sentena analisada estar sintaticamente correta.
Deficincias do Algoritmo Shift-Reduce
Embora esta tcnica de anlise sinttica possa ser aplicada a qualquer GLC (esta sua
grande vantagem), ela apresenta vrias deficincias que inviabilizam seu uso na prtica. So
elas:
1 Requer muito tempo para analise;
2 S detecta erro sinttico aps consumir toda a sentena a ser analisada e, alm disso,
no identifica o ponto onde ocorreu o erro.
3 Pode rejeitar sentenas corretas pelo fato de que nem sempre que o lado direito de
uma produo aparece na pilha a ao correta uma reduo, fato este que caracteriza o NoDeterminismo do mtodo.
O problema do no-determinismo pode ser contornado atravs do uso da tcnica de
Back-Tracking; contudo, o uso desta tcnica inviabiliza o mtodo na pratica (em funo da
complexidade de tempo e espao).
Na prtica, as tcnicas de anlise sinttica ascendente usuais superam as deficincias da
tcnica Shift-Reduce com Back-Tracking (apesar de fundamentarem-se nela), apresentando
as seguintes caractersticas:
1 Tempo de anlise diretamente proporcional ao tamanho da sentena;
2 Deteco de erros sintticos no momento da ocorrncia;
3 So tcnicas Determinsticas, isto , em qualquer situao, haver sempre uma
nica ao a ser efetuada.
Contudo, estas caractersticas tem um custo associado: a imposio de restries s
GLC, para que as mesmas possam ser analisadas deterministicamente. Uma restrio comum
todas as tcnicas deterministicas, a exigncia de que a GLC no seja ambgua.
Principais Tcnicas de Anlise Sinttica Ascendente
A classe de analisadores ascendentes determinsticos composta por uma srie de
tcnicas, dentres as quais destacam-se grandemente duas famlias de tcnicas:
1 Analisadores de Precedncia (Simples, estendida e de operadores) - Estes
analisadores baseiam-se no algoritmo Shift-Reduce, acrescido de relaes de precedncia
entre os smbolos da gramtica; relaes estas que definem, de forma determinstica a ao a
ser efetuada em uma dada situao.
2 - Analisadores LR - Esta famlia de analisadores tambm baseia-se nas operaes
shift e reduce (, na verdade, uma evoluo natural do algoritmo geral shift-reduce). A
diferena fundamental que estas operaes (shift e reduce) so realizados sempre
deterministicamente, com base no estado corrente da anlise e nas propriedades estruturais da
gramtica em questo.
Alm de teoricamente importante, a famlia LR (especialmente as tcnicas SLR(1) e
LALR(1)) a mais utilizada na implementao de analisadores sintticos, e por isso ser
estudada de forma mais detalhada neste curso.
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 47
Analisadores LR
Introduo A famlia dos analisadores LR formada por uma srie de tcnicas onde
as principais so: LR(0), SLR(1), LALR(1) e LR(1), em ordem crescente no sentido de fora
(abrangncia de G.L.C.) e complexidade de implementao.
Os analisadores LR so assim denominados pelo fato de analisarem a sentena de
entrada da esquerda para a direita (Left-to-right) e construrem uma derivao mais direita
(Rightmost derivation) na ordem inversa.
Sob o ponto de vista lgico, um analisador LR consiste de duas partes: Um algoritmo de
anlise sinttica (padro para todas as tcnicas da famlia e independente da gramtica) e uma
Tabela de Parsing (construda de forma especifica para cada tcnica e para cada gramtica).
As principais razes da grande importncia desta famlia de analisadores na teoria de
parsing e conseqentemente no desenvolvimento de compiladores so:
1 Analisam praticamente todas as construes sintticas de linguagem de programao
que podem ser representadas de forma no ambgua por G.L.C..
2 So mais gerais que os outros analisadores ascendentes e que a maioria dos
descendentes sem back-track.
3 Possuem a propriedade de deteco imediata de erros sintticos.
4 O tempo de anlise proporcional ao tamanho da sentena a ser analisada.
Em contrapartida, podemos destacar como ponto negativo dos analisadores LR, a
complexidade de construo da tabela de parsing bem como o espao requerido para seu
armazenamento (especialmente as tcnicas mais abrangentes).
Composio dos Analisadores LR
Um analisador LR compe-se se:
a) Algoritmo de Anlise Sinttica padro para todas as tcnicas da famlia.
b) Tabela de Anlise Sinttica (ou tabela de parsing) especfica para cada tcnica e
para cada gramtica.
d) Pilha de Estados (ou pilha sinttica) conter um histrico da anlise efetuada;
inicializada com o estado inicial da anlise sinttica.
e) Entrada conter a sentena a ser analisada, seguida por $ (a marca de final de
sentena).
f) Uma G.L.C. com as produes numeradas de 1 a p.
Estrutura Geral de um Analisador LR
a1 a2 .....................an $
Entrada
Sm
.
.
.
S1
S0
Algoritmo
de
Anlise
Sinttica
Tabela
de
Parsing
Pilha
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 48
0
1
2
3
4
5
6
7
8
9
10
11
S5
S4
R2
R4
S5
S7
R4
R6
R6
S6
R1
R3
R5
S7
R3
R5
ACTION
3
10
R6
S4
S4
S11
R1
R3
R5
HALT
R2
R4
S4
R6
S5
S5
S6
R2
R4
R1
R3
R5
GOTO
Crie uma linha para cada estado e uma coluna para cada smbolo {Vn Vt {$}}.
b) Coloque SHIFT (ou GOTO) nos estados que deram origem a estados sucessores (nas
colunas referentes aos smbolos sobre os quais houve a movimentao da marca).
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 51
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 52