Você está na página 1de 52

Universidade Federal de Santa Catarina

Centro Tecnolgico
Departamento de Informtica e de Estatstica

LINGUAGENS FORMAIS E COMPILADORES


(Prof. Olinto Jos Varela Furtado)

Captulo I Introduo
I.1 - Introduo a Compiladores
I.2 - Introduo a Teoria da Computao
I.3 - Introduo a Teoria das Linguagens Formais

I.1 Introduo a Compiladores


I.2 - Introduo a Teoria da Computao
O Que Teoria da Computao?
A Teoria da Computao pode ser vista como um guia (um roteiro) que nos orienta no
sentido de informar o que pode e o que no pode ser efetivamente computvel, explicando
porque, de que forma e com que complexidade. Neste sentido, a Teoria da Computao
classifica os problemas computacionais em trs classes:
a) Problemas Indecidveis (ou impossveis de serem solucionados);
b) Problemas Intratveis (possveis com recursos ilimitados, porm impossveis com
recursos limitados);
c) Problemas Tratveis (possveis de serem solucionadas com recursos limitados).
Esta classificao engloba problemas de toda a natureza, envolvendo desde problemas
clssicos que fundamentam a teoria da computao at problemas (ou instncias de
problemas) prticos da cincia da computao, tais como:
1 Existe programa para solucionar um determinado problema?
2 Qual o poder de expresso de um determinado modelo de especificao?
3 Dado um programa qualquer, ele sempre tem parada garantida?
4 Dois programas P1 e P2 so equivalentes entre si?
5 Uma determinada soluo a melhor soluo para um dado problema?
6 Qual o significado de um determinado programa?
7 Dado um programa qualquer, este programa est correto?
Esta lista poderia ser expandida e detalhada, contudo, seu objetivo enfatizar a
abrangncia da teoria da computao. Dos tpicos aqui listados, complexidade (5), semntica
(6) e correo/construo (7), costumam ser tratados como disciplinas especficas e
independentes, enquanto que os demais se classificam como problemas bsicos da teoria da
computao. Todos os problemas computacionais podem ser tratados (estudados) sob a tica
da Teoria das Linguagens Formais e Autmatos.
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 1

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.

I.2.1 - Conceitos e Propsitos Fundamentais da Teoria da Computao


Com o objetivo de melhor fundamentar as questes cobertas pela teoria da computao
e de identificar claramente a possibilidade de reduzir tais questes a problemas pertinentes a
Teoria das Linguagens Formais, apresentaremos nesta seo alguns conceitos fundamentais e
comentamos alguns dos principais propsitos que sustentam a teoria da computao.

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

Conjuntos Recursivos e Conjuntos Recursivamente Enumerveis


Um conjunto dito Recursivamente Enumervel se ele pode ser representado
(solucionado) por uma procedure, e Recursivo se ele pode ser representado (solucionado) por
um algoritmo. Como procedures e algoritmos podem ser definidos formalmente atravs de
vrios modelos (gramticas e autmatos, por exemplo), podemos tambm definir conjuntos
recursivos e recursivamente enumerveis em funo de tais modelos.
Problemas Decidveis e Indecidveis X Algoritmos e Procedures
Um problema decidvel (tratvel ou no) se e somente se ele resolvvel por um
algoritmo, para qualquer entrada pertencente ao seu domnio; caso contrrio ele um
problema indecidvel.
A partir das definies acima, podemos notar claramente a relao entre problemas
decidveis e indecidveis com conjuntos recursivos e recursivamente enumerveis; ou seja, um
problema decidvel se o conjunto de solues das diversas instncias deste problema um
conjunto recursivo, e indecidvel caso tal conjunto seja recursivamente enumervel. Assim
sendo, torna-se evidente que a questo da decidibilidade pode ser tratada formalmente atravs
dos modelos que compem a Teoria das Linguagens e Autmatos.
A classe dos problemas indecidveis significativamente representada pelo HALTING
PROBLEM (problema da parada) que consiste em: Dado uma procedure Z e uma entrada
X, decidir (determinar) se Z termina quando aplicado a X. A indecidibilidade deste problema
extremamente til para demonstrar a indecidibilidade de outros problemas atravs da
reduo destes para o halting problem .
Propsitos da Teoria da Computao
At aqui definimos procedures e algoritmos de maneira intuitiva e informal. Contudo
eles podem ser definidos rigorosamente (precisamente) atravs de vrios formalismos
conhecidos como propsitos (ou princpios) da Teoria da Computao. Tais formalismos tem
sido explorados largamente na Cincia da Computao, onde servem como modelos na
soluo de diversos problemas prticos. Dentre os formalismos mais importantes, podemos
citar:
a) Mquinas de Turing (Turing, 1936);
b) Gramticas (Chomsky, 1959);
c) Algoritmos de Markov (Markov, 1951);
d) Lambda Calculus (Church, 1941);
e) Sistemas Post e Sistemas de Produo (Emil Post, 1936);
f) Funes Recursivas (Kleene, 1936).
Um ponto importante a ressaltar aqui, que toda procedure (ou algoritmo) descrita por
algum destes formalismos, pode tambm ser descrita atravs de qualquer um dos demais; fato
este que sugere a equivalncia entre os formalismos.
A aceitao destes formalismos dentro da teoria da computao , em grande parte,
decorrente da hiptese (conhecida como Tese de Church) de que todo processo computvel
passvel de ser descrito por uma procedure pode ser realizado por uma Mquina de Turing.
Esta tese, apesar de no ter sido provada formalmente, tambm no foi contradita e continua
sendo universalmente aceita. Conseqentemente podemos afirmar que Mquinas de Turing
constituem o formalismo mais genrico para a representao de procedure e que qualquer
outro formalismo ser significativo se for considerado equivalente s mquinas de Turing. A
demonstrao formal da equivalncia entre os diversos formalismos citados e mquinas de
Turing, refora a tese de Church.
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 3

I.3 Introduo a Teoria das Linguagens Formais


O que a Teoria das Linguagens Formais?
Para respondermos esta questo precisamos primeiro responder o que Linguagem
Formal, e para isto precisamos antes responder o que Linguagem.
Inicialmente, de maneira bastante informal, podemos definir uma linguagem como
sendo uma forma de comunicao. Elaborando um pouco mais esta definio, podemos
definir uma linguagem como sendo um conjunto de elementos (smbolos) e um conjunto de
mtodos (regras) para combinar estes elementos, usado e entendido por uma determinada
comunidade.
Exemplos: 1 - Linguagens Naturais (ou idiomticas)
2 - Linguagens de Programao, de Controle, de Consulta
3 Protocolos de Comunicao
Contudo, apesar de intuitiva, esta definio no nos permite responder satisfatoriamente
as duas primeiras questes; precisamos antes dar um sentido formal para a definio de
linguagem. Faremos isto nas duas prximas sees.

I.3.1 Conceitos Bsicos


Alfabeto (ou vocabulrio): um conjunto finito, no vazio, de smbolos (elementos).
Representaremos um alfabeto por.
Exemplos: V = {a, b, c,...,z }
V = {0, 1}
V = {a, e, i, o ,u}
Sentenas: Uma sentena sobre um alfabeto V, uma seqncia (ou cadeia) finita de
smbolos do alfabeto.
Exemplo de sentenas sobre V = { a , b }: a, b, aa, ab, bb, aaa, aab, aba, baa, ...
Tamanho de uma sentena: Seja w uma sentena .
O tamanho da sentena w, denotado por |w|, definido pelo nmero de smbolos
(elementos do alfabeto) que compem w.
Exemplos: Seja V = { a , b , c }
se x = aba, ento |x| = 3
se x = c, ento |x| = 1
Sentena vazia: uma sentena constituda de nenhum smbolo; isto , uma sentena
de tamanho 0 (zero).
Observaes: - Representaremos a sentena vazia por (psolon).
- Por definio, || = 0
Potncia de uma sentena: Seja w uma sentena . A n-sima potncia de w,
representada por wn, significa w repetido n vezes.
Exemplos: se x = ab, ento x3 = ababab
Para x, x0 =
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 4

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

Teoria das Linguagens Formais e dos Autmatos


Entende-se por Teoria das Linguagens Formais e dos Autmatos o estudo de modelos
matemticos que possibilitam a especificao e o reconhecimento de linguagens (no sentido
amplo da palavra), suas classificaes, estruturas, propriedades, caractersticas e interrelacionamentos.
A importncia desta Teoria na Cincia da Computao dupla: Ela tanto apia outros
aspectos tericos da Cincia da Computao (decidibilidade, computabilidade, complexidade
computacional, por exemplo), como fundamenta diversas aplicaes computacionais tais
como processamento de linguagens, reconhecimento de padres, modelagem de sistemas.

___________________________________________________________________________
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

II.2 Definio Formal de Gramtica


Formalmente definimos uma gramtica G como sendo um qudrupla (sistema formal
constitudo de quatro elementos) G = (Vn, Vt, P, S) onde:
Vn um conjunto finito de smbolos denominados no-terminais. Estes smbolos
tambm so denominados meta variveis, ou seja, so os smbolos utilizados na descrio da
linguagem.
Vt um conjunto finito de smbolos denominados terminais. So os smbolos da
linguagem propriamente ditos, ou seja os smbolos que podem ser usados na formao das
sentenas da linguagem.
Convenes: Vn Vt = e Vn Vt = V
P um conjunto finito de pares ( , ) denominado produes (ou regras gramaticais
ou regras de sintaxe). Uma produo representada por :: = , onde V*VnV*
V*, e significa que definido por , ou ainda que produz ou equivalentemente que
produzido (gerado) a partir de .
S o smbolo inicial da gramtica; deve pertencer a Vn. O smbolo inicial de uma
gramtica o no-terminal a partir do qual as sentenas de uma linguagem sero geradas.
Exemplo: Formalizando o subconjunto da gramtica da lngua portuguesa, apresentado
na seo anterior, teramos:
Gportugues = (Vn, Vt, P, S), onde:
Vn = { <sentena> , <sujeito> , <predicado> , <substantivo> ,
<artigo> , <adjetivo> , <predicado> , <verbo> , <objeto> }
Vt = { joo, maria , cachorro, livro , po, o , a , pequeno, bom , bela , morde , le , olha }
P = o conjunto das regras gramaticais apresentado
S = <sentena>
Fazendo uma analogia entre o exemplo intuitivo e a noo formal de gramtica,
constatamos que:
Vn so as categorias sintticas ou gramaticais;
Vt so as palavras utilizadas como smbolos da linguagem;
P so as regras sintticas (ou gramaticais);
S - a categoria gramatical que sintetiza o que ser produzido (gerado) pela gramtica.
Notao a ser utilizada neste curso:
::= -
VN Letras de A a T e palavras escritas com letras maisculas
Vt Letras de a a t, palavras escritas com letras minsculas, dgitos e caracteres especiais
Vt* - u, v, x, y, w, z
{VN Vt} U, V, X, Y, W, Z
{VN Vt}* - , , , , ... , ( exceto )

II.3 Derivao e Reduo


So operaes de substituio que formalizam a utilizao de gramticas, sendo que:
Derivao: a operao que consiste em substituir em string (ou parte dele) por outro, de
acordo com as produes das gramticas em questo, no sentido smbolo inicial sentena;
Reduo: a operao que consiste na substituio de um string (ou parte dele) por outro, de
acordo com as produes da gramtica, no sentido sentena smbolo inicial.
Observao: derivao a operao adequada para gerao de sentenas; enquanto que a
operao de reduo adequada ao reconhecimento de sentenas.
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 8

Noo Formal de Derivao e Reduo


Seja G = (Vn, Vt, P, S) uma gramtica .
Seja (Vn Vt)*.
Derivao / reduo em um passo (ou direta): dizemos que deriva em um passo (ou
deriva diretamente) , se e somente se P; indicamos por .
Neste caso, dizemos ainda que reduz-se a em um passo (ou diretamente);
denotamos por .
Derivao / reduo em zero ou mais passos: Por extenso, dizemos que deriva em
zero ou mais passos (ou simplesmente deriva) , se existirem seqncias 1, 2, ..., n tais
que: 1 2 ... n ; esta forma de derivao denotada por
* .
Analogamente reduz-se a em zero ou mais passos (ou simplesmente reduz-se);
* .
indicamos por
Derivao / reduo em um ou mais passos: Por outro lado, se tivermos certeza de que
pelo menos um passo foi necessrio para chegar em a partir de (ou vice-versa), ento
teremos uma nova forma de derivao (reduo) denominada derivao (reduo) em um ou
+ ).
+ (ou por
mais passos; indicaremos por:
* em 0 (zero) passos, ento = .
Observao: - Se
- Quando vrias gramticas estiverem sendo usadas simultaneamente, devemos
usar o nome da gramtica sob a seta de derivao (reduo) para no causar dvidas.

II.4 Sentena, Forma Sentencial e Linguagem


Sentena uma seqncia s de terminais produzida (gerada) a partir do smbolo
+ x, ento x uma sentena
inicial de uma gramtica; isto , se G = (Vn, Vt, P, S) S
pertencente linguagem representada por G.
Forma Sentencial uma seqncia qualquer (composta por terminais e noterminais) produzida (gerada) a partir do smbolo inicial de uma gramtica; isto ,
se G = (Vn, Vt, P, S) S ento , , ,, so formas
sentenciais de G.
Linguagem Formalmente definimos a linguagem gerada por G = (Vn, Vt, P, S),
+ x}; ou seja, uma linguagem
denotada por L(G), como sendo: L(G) = {x | x Vt* S
definida pelo conjunto de sentenas que podem ser derivadas a partir do smbolo inicial da
gramtica que a representa.
Gramticas Equivalentes Duas gramticas G1 e G2 so equivalentes entre si, se e
somente se L(G1) = L(G2).
Formalmente: G1 G2 L(G1) = L(G2).
Exemplos:

___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 9

II.5 Tipos de Gramticas


(Classificao ou hierarquia de CHOMSKY)
Gramtica Tipo 0:
(ou gramtica sem restries)
G = (Vn, Vt, P, S), onde:
P = { | V*VnV* V*}
Gramtica Tipo 1:
(ou Gramtica Sensvel ao Contexto G.S.C.)
G = (Vn, Vt, P, S), onde:
P = { || ||, V*VnV* V+}
Gramtica Tipo 2:
(ou Gramtica Livre de Contexto G.L.C.)
G = (Vn, Vt, P, S), onde:
P = {A A Vn V+
Gramtica Tipo 3:
(ou Gramtica Regular G.R.)
G = (Vn, Vt, P, S), onde:
P = {A a X | A Vn, a Vt X {Vn {}}}
Observao: As linguagens representadas (geradas) por G.S.C., G.L.C. e G.R. so
denominadas, respectivamente, Linguagens Sensveis ao Contexto (L.S.C.) Linguagens
Livres de Contexto (L.L.C.) e Linguagens Regulares (L.R.).

II.6 Sentena Vazia


Introduo: A motivao para o estudo de gramticas foi necessidade de se encontrar
representaes finitas para as linguagens.
Logicamente, se uma linguagem L possui uma descrio finita, ento L1 = L {},
tambm dever possuir uma descrio finita.
Pela definio dada, as G.S.C., G.L.C. e G.R. no aceitam produes da forma S ;
logo, segundo essa definio, (a sentena vazia) no pode pertencer as L.S.C., L.L.C. ou
L.R.. Entretanto, a razo destas definies no a sentena vazia em si, mas sim o fato de que
a produo que possibilita a derivao da sentena vazia, pode inviabilizar a prova formal da
existncia de algoritmos associados a estas gramticas.
Redefinio de G.S.C. G.L.C. e G.R.
Em funo do exposto acima, vamos redefinir G.S.C., G.L.C. e G.R., permitindo que a
produo S P, se e somente se:
1 S for o smbolo inicial da gramtica;
2 S no aparecer no lado direito de nenhuma produo da gramtica em questo.

___________________________________________________________________________
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.

II.7 Recursividade das G.S.C.


Definio: Uma gramtica G RECURSIVA se existe um algoritmo que determine
para qualquer seqncia w, se w ou no gerada por G.
Teorema II.2: Se G = (Vn, Vt, P, S) uma G.S.C., ento G RECURSIVA.
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 11

Prova: (* atravs de algoritmo *)


Seja G = (Vn, Vt, P, S) uma G.S.C. | S P;
Seja w uma seqncia |w| = n;
* em M passos.
Seja TM o conjunto de formas sentenciais | || N S
Algoritmo II.1:
1 To = { S }
2M1
3 TM TM-1 { | , onde TM-1 || n}
4 Se TM = TM-1
ento fim
seno M M+1;
calcule novo TM (volte ao passo 3).
Concluso: Como em uma G.S.C. as formas sentenciais no so decrescentes de
tamanho (|| ||), e como o nmero de sentenas de tamanho n finito (no mximo Kn onde
K o nmero de smbolos de Vt), sempre existir um M | TM = TM-1 o algoritmo II.1
sempre determinar para qualquer w, se w ou no gerado por G.

___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 12

Captulo III Autmatos Finitos e Conjuntos Regulares


III.1 A.F.D
III.2 A.F.N.D.
III.3 Transformao de A.F.N.D. para A.F.D.
III.4 Relao Entre G.R. e A.F.
III.5 Minimizao de Autmatos Finitos
III.6 Conjuntos Regulares e Expresses Regulares
III.7 Implementao de Autmatos Finitos
III.8 Propriedades e Problemas de Deciso sobre Conjuntos Regulares
III.9 Aplicaes de A.F. e E.R.

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

Autmatos Finitos so reconhecedores de linguagens regulares;


Entende-se por reconhecedor de uma linguagem L, um dispositivo que tomando uma
seqncia w como entrada, respondem SIM se w L e NO em caso contrario.
Tipos de Autmatos Finitos:
Autmato Finito Determinstico (A.F.D.)
Autmato Finito No Determinstico(A.F.N.D.)

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

Significado Lgico de um Estado


Logicamente um estado uma situao particular no processo de reconhecimento de
uma sentena.
Sentenas Aceitas por M
Uma seqncia x aceita (reconhecida) por um A.F. M = (K, , qo, F),
(qo, x) = p | p F.
Linguagem Aceita por M
o conjunto de todas as sentenas aceitas por M. Formalmente, definimos por:
T(M) = {x | (qo, x) = p p F}
OBS.: Todo conjunto aceito por um Autmato Finito um Conjunto Regular.

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

III.3 Transformao de A.F.N.D. para A.F.D.


Teorema 3.1: Se L um conjunto aceito por um A.F.N.D., ento um A.F.D. que aceita L
Prova: Seja M = (K, , , qo, F) um A.F.N.D..
Construa um A.F.D. M = (K, , , qo, F) como segue:
1 K = {(k)} - isto , cada estado de M ser um subconjunto de estados de M.
2 qo = [qo] - ou seja, qo ser o (k) composto apenas por q0.
obs.: representaremos um estado q K por [q].
3 F = {(K) | (K) F }
4 Para cada (K) K
definimos ((K),a) = (K),
onde (K) = {p | para algum q (K), (q, a) = p};
ou seja, se (K) = [q1, q2, ..., qr] K e se
(q1,a) = p1, p2, ..., pj
(q2,a) = pj+1, pj+2, ..., pk
:
: :
:
(qr, a) = pi, pi+1, ..., pn so as transies de M,
ento (K) = [p1, ..., pj, pj+1, ..., pr, pi, ..., pn] ser um estado de M,
e M conter a transio: ((K),a) = (K).
Para concluir a prova do teorema, basta, mostrar que T(M) = T(M).
Exemplo:
Seja M um A.F.N.D. definido por:

qo
q1
q2
*q3

a
qo,q1
-------

b
qo
q2
q3
---

onde T(M) = {

Defina M = (K, , , qo, F), onde:


K = {
= {a, b)
qo =
F =

T(M) = {

[qo]

___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 15

III.4 Relao entre G.R. e A.F.


Teorema 3.2: Se G = (Vn, Vt, P, S) uma G.R.,
ento um A.F. M = (K, , , qo, F) | T(M) = L(G).
Prova: a Mostrar que M existe
b Mostrar que T(M) = L(G)
a) Defina M, como segue:
1 K = Vn {A}, onde A um smbolo novo
2 - = Vt
3 qo = S
4 F = {A, S} se S P
{A} se S P
5 Construa de acordo com as regras a, b e c.
a) Para cada produo da forma B a P, crie a transio (B, a) = A
b) Para cada produo da forma B a C P crie a transio (B, a) = C
c) Para todo a Vt, (A, a) = - (indefinido)

b) Para mostrar que T(M) = L(G), devemos mostrar


que : 1 L(G) T(M)
2 T(M) L(G)
1 L(G) T(M)
Mostrar que L(G) est contido em T(M), significa mostrar que se x L(G) ento T(M)
contm x, ou seja, M aceita x.
Seja x = a1a2...an L(G).
+ x
Se x L(G), ento S
+ x da forma
Como G uma G.R., a derivao S
S a1A1 a1a2A2 ... a1a2...na-1An-1 a1a2...an
Logo,
S a1A1, A1 a2A2, ... An-1 an so produes de G.
Assim sendo, por definio, M consistir das seguitnes transies:
(S,a1) = A1, (A1,a2) = A2, ... (An-1, an) = A
Portanto, como x = a1a2...an, (S, x) = A A F,
conclui-se que T(M) contm x.
Mas, e se L(G) ???
Se L(G) porque S P
Neste caso, por definio, S F e, portanto, T(M) contm .
Logo, L(G) T(M).

___________________________________________________________________________
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

contudo, usando o teorema 2.1 podemos encontrar uma G.R. G1 | L(G1)


= L(G) U {} e portanto, L(G1) ser igual a T(M)
Seno, T(M) e L(G) = T(M).
b) Para mostrar que L(G) = T(M), devemos mostrar
que: 1 T(M) L(G)
2 L(G) T(M)
Isto pode ser feito de maneira anloga a demonstrao do teorema 3.2.

III.5 Minimizao de Autmatos Finitos


Definio: Um A.F.D. M = (K, , , qo, F) mnimo se:
1 No possui estados inacessveis;
2 No possui estados mortos;
3 No possui estados equivalentes.
Estados Inacessveis:
Um estado q K inacessvel (ou inalcanvel) quando no existe w1 tal que a partir
de qo, q seja alcanado; ou seja, no existe w1 | (qo, w1) = q, onde w1 uma sentena ou
parte dela.

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.

Classes de Equivalncia (CE):


Um conjunto de estados q1, q2, ..., qj est em uma mesma CE se (q1, a), (q2, a), ...,
(qj, a), para cada a , resultam respectivamente nos estados qi, qi+1, ..., qn, e estes
pertencem a uma mesma CE.

Algoritmo para Construo das Classes de Equivalncia


1 Crie, se necessrio, um estado para representar as indefinies;
2 Divida K em duas CE, uma contendo F e outra contendo K-F;
3 Divida as CE existentes, formando novas CE (de acordo com a definio lei de
formao das CE), at que nenhuma nova CE seja formada.

___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 18

Algoritmo para construo do A.F. Mnimo


Entrada: Um A.F.D. M = (K, , , qo, F);
Sada: Um A.F.D. Mnimo M = (K, , , qo, F) | M M;
Mtodo:
1 Elimine os estados Inacessveis;
2 Elimine os estados Mortos;
3 Construa todas as possveis Classes de equivalncia de M.
4 Construa M, como segue:
a) K - o conjunto de CE obtidas;
b) qo - a CE que contem qo;
c) F - o conjunto das CE que contenham pelo menos um elemento
F; ou seja : {[q] | p F em [q], onde [q] uma CE};
d) - ([p], a) = [q] (p1, a) = q1 uma transio de M p1 e q1 so
elementos de [p] e [q] respectivamente.
Exemplo: Minimize o A.F.D. definido pela seguinte tabela de transio:

*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

III.6 Conjuntos Regulares e Expresses Regulares


Conjuntos Regulares (C.R.)
Um C.R. pode ser definido de quatro maneiras equivalentes:
1 (* definio matemtica (primitiva) *)
Seja um alfabeto qualquer.
Definimos um C.R. sobre , como segue:
a um C.R. sobre ;
b {} um C.R. sobre ;
c {a}, para todo a , um C.R. sobre ;
d Se P e Q so C.R. sobre , ento:
1PQ
(unio),
2 P.Q (ou PQ) (concatenao),
3P*
(fechamento).
Tambm so C.R. sobre ;
e Nada mais C.R.
Portanto, um subconjunto de * uma C.R. se e somente se ele : , {}, {a}, ou
pode ser obtido a partir destes atravs de um nmero finito de aplicao das operaes de
Unio, Concatenao e Fechamento.
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 19

2 C.R. so as linguagens geradas por Gramticas Regulares.


3 C.R. so as linguagens reconhecidas por Autmatos Finitos.
4 C.R. so os conjuntos denotados (representados) por Expresses Regulares.

Expresses Regulares (E.R.)


As E.R. sobre um alfabeto e os C.R. que elas denotam, so definidos como segue:
1 uma E.R. e denota o C.R. ;
2 uma E.R. e denota o C.R. {};
3 a para todo a , uma E.R. e denota o C.R. {a};
4 Se p e q so E.R. denotando os C.R. P e Q respectivamente, ento:
a (p | q) uma E.R. denotando o C.R. P Q;
b (p.q) ou (pq) uma E.R. denotando o C.R. PQ;
c (p)* uma E.R. denotando o C.R. P*;
5 Nada mais E.R..
Observaes:
1 Os parnteses podem ser eliminados; neste caso, para evitar ambigidades, considera-se a
seguinte ordem de precedncia: 1) * 2) . 3) |
2 Para simplificar E.R., podemos utilizar as seguintes abreviaturas:
p+ = pp*
p? = p |
pq = p(qp)*
Relao entre E.R. e C.R.
1 Para todo C.R. pelo menos uma E.R. que o denota;
2 Para toda E.R. possvel construir o C.R. que ela denota;
3 Duas E.R. so equivalentes se elas denotam o mesmo C.R..

III.7 - Implementao de Autmatos Finitos


Existem duas formas bsicas para implementao de A.F.:
-

Implementao Especfica

Implementao Geral (ou genrica);

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

(* um exemplo de uma implementao especfica para o AF dado *)


inicio
q0: leia CAR
se CAR = a
ento va-para q0
seno se CAR b
ento va-para qerro
fim se
fim se
q1: leia CAR
se CAR = b
ento va-para q1
seno se CAR c
ento va-para qerro
fim se
fim se
q2: leia CAR
se CAR = $
ento escreva Sequncia Reconhecida pare
seno se CAR = c
ento va-para q2
seno se CAR = a
ento va-para q0
fim se
fim se
fim se
q erro: enquanto CAR $ faa
leia CAR
fim enquanto
escreva Sequncia no Reconhecida
fim
Implementao GERAL
Esta forma de implementao de A.F. requer uma tabela de transies e um vetor de
estados finais e, logicamente, consiste na elaborao de um procedimento genrico para
interpretar a tabela de transies em funo da seqncia de entrada a ser analisada.
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 21

Exemplo: Para o A.F. dado anteriormente, teramos:


Tabela de Transies
(q0)
(q1)
(q2)
(qerro)

TAB
1
2
3
4

a
1
4
1
4

b
2
2
4
4

c
4
3
3
4

Vetor de Estados Finais


<> a, b, c
4
4
4
4

VE F
1
2
3
4

0
0
1
0

Observao: VEF [EST] = 0 EST F


VEF [EST] = 1 EST F
Procedimento
Inicio
(* inicializao de TAB e VEF *)
leia EST, CAR (* estado inicial, prximo caracter *)
enquanto CAR $ faa
EST:= TAB[EST, CAR]
leia CAR
fim enquanto
se VEF [EST] = 1
ento escreva sequncia reconhecida
seno escreva sequncia no reconhecida
fim se
fim
Observaes:
- A escolha entre uma e outra forma de implementao depende da aplicao;
- Os exemplos de implementao apresentados so ilustrativos, na prtica qualquer
implementao deve ser adaptada segundo seus objetivos. Vale, portanto a filosofia de
implementao.

___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 22

III.8 Principais Propriedades e Problemas de Deciso sobre Conjuntos


(Linguagens) Regulares
Propriedades Bsicas de C.R.
A classe dos C.R. fechada sobre as operaes de UNIO, CONCATENAO,
COMPLEMENTO, e INTERSECO, isto :
1 UNIO:
Se L1 e L2 so C.R., ento
L1 L2 = {x | x L1 x L2} tambm um C.R.
2 CONCATENAO:
Se L1 e L2 so C.R., ento
L1L2 = {xy | x L1 y L2} tambm um C.R.
3 COMPLEMENTO:
Se L1 * um C.R., ento
* - L1 tambm um C.R.
4 INTERSECO:
Se L1 e L2 so C.R., ento
L1 L2 = {x | x L1 x L2} tambm um C.R.
Problemas de Deciso sobre C.R.
Os problemas de deciso sobre C.R. podem ser formulados e demonstrados atravs de
qualquer um dos modelos usados para expressar tais conjuntos. Usaremos aqui o modelo de
Autmatos finitos em funo de sua grande fora de expresso e tambm por sua
aplicabilidade:
1 MEMBERSHIP
Dado um AF M = (K, , , q0, F) e um string x *.
X aceito por M? ou seja, x T(M)?
2 EMPTINESS
Dado um AF M = (K, , , q0, F), T(M) = ?
3 FINITENESS
Dado um AF M = (K, , , q0, F), T(M) finita?
4 CONTAINMENT
Dados dois AFs M1 e M2, T(M1) T(M2)?
5 EQUIVALENCE
Dados dois AFs M1 e M2, T(M1) = T(M2)?
6 INTERSECTION
Dados dois AFs M1 e M2, T(M1) T(M2) = ?
Todos os problemas acima apresentados so problemas decidveis.

___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 23

III.9 Aplicaes de A.F. e E.R.


Apesar da simplicidade destas ferramentas, existe uma grande variedade de software
cuja especificao e/ou implementao pode ser bastante simplificada se realizada em termos
de A.F. e E.R., resultando em softwares mais eficientes. Dentre as diversas aplicaes que
fazem uso de A.F. e E.R. podemos citar:
a) Analisador Lxico: Os tokens (smbolos bsicos) de uma linguagem de programao
geralmente podem ser especificados eficientemente atravs de E.R., as quais podem
ser automaticamente convertidas para A.F.D. equivalentes, cuja implementao (o
analisador lxico propriamente dito) trivial.
Isto permite inclusive, a gerao automtica de um analisador lxico a partir da
especificao formal dos tokens de uma linguagem de programao.
b) Editores de Texto: As operaes de busca e substituio de cadeias de caracteres em
um texto, podem ser eficientemente realizadas, se a cadeia for expressa em termos
de E.R. e a operao realizada em termos de um A.F. usufruindo da possibilidade da
converso automtica de E.R. para A.F., de forma transparente ao usurio.
c) Alm das aplicaes acima (tidas como as principais) podemos tambm destacar o
uso destas ferramentas nas seguintes reas:
c.1) Protocolos de comunicao
c.2) Projeto (modelagem) de sistemas operacionais
c.3) Path Expression
c.4) Problemas especfico tais como: segurana de arquivos, desorientao em
sistemas de hipertexto, modelagem de redes neurais, compresso de dados, etc...

___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 24

Captulo IV Gramticas Livres de Contexto e Autmatos de Pilha


IV.1 rvore de Derivao (A.D.) ou rvore Sinttica (A.S)
IV.2 Limite de uma rvore de Derivao
IV.3 Derivao mais a Esquerda e mais a Direita
IV.4 Gramticas Ambguas
IV.5 Transformaes (Simplificaes) em G.L.C.
IV.5.1 Eliminao de Smbolos Inteis
IV.5.2 Transformao de G.L.C. em G.L.C. - Livre
IV.5.3 Eliminao (Remoo) de Produes Simples
IV.5.4 Fatorao de G.L.C.
IV.5.5 Eliminao de Recurso a Esquerda
IV.6 Tipos Especiais de G.L.C
IV.7 Autmatos de Pilha (PDA)
IV.8 Equivalncia entre PDA e G.L.C.
IV.9 Propriedades e Problemas de Deciso das LLC
IV.10 Aplicaes

Introduo: Dentre os quatro tipos de gramticas estudadas, as G.L.C. so as mais


importantes na rea de compiladores e linguagens de programao, pelo fato de especificarem
eficientemente as construes sintticas usuais.
As Vrias Definies de G.L.C.
Inicialmente definimos uma G.L.C. como sendo G = (Vn, Vt, P, S), onde P = {A |
A Vn (Vn Vt)+}.
Posteriormente estendemos esta definio permitindo a existncia da produo S ,
desde que S fosse o smbolo inicial de G e no aparecesse no lado direito de nenhuma das
produes de P. As gramticas assim definidas denominam-se G.L.C. - LIVRES.
Agora, redefiniremos (em definitivo) as G.L.C. permitindo a existncia de produes da
forma A para A Vn.
Formalmente, passamos a definir uma G.L.C. G como sendo G = (Vn, Vt, P, S), onde
P = {A | A Vn (Vn Vt)*}, ou seja, agora pode ser .

IV.1 rvore de Derivao (A.D.) ou rvore Sinttica (A.S.)


um mtodo estruturado para representar as derivaes de uma G.L.C..
Definio:
Seja G = (Vn, Vt, P, S) uma G.L.C..
Uma rvore uma rvore de Derivao de G, se:
a) Todos os nodos da rvore forem rotulados com smbolos pertencentes Vn
Vt;
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 25

b) O nodo raiz da rvore for rotulado com S, o smbolo inicial de G;


c) Todo nodo com descendentes (alm dele prprio) possuir como rtulo um
smbolo Vn;
d) Para todo nodo n (rotulado por A) com descendentes diretos n1, n2, ..., nk
(rotulados, respectivamente, por A1, A2, ..., Ak) existir uma produo
A A1 A2 ... Ak em P
Exemplos:

IV.2 Limite de uma rvore de Derivao


O limite de uma A.D. o string obtido pela concatenao (da esquerda para a direita)
das folhas da rvore; ou seja, a forma sentencial cuja derivao esta sendo representada pela
A.D.
Lema 4.1: Se D uma A.D. com limite em G ento S .
Lema 4.2: Para toda derivao de em G, uma A.D. com limite .

IV.3 Derivao mais a Esquerda e mais a Direita


Seja a derivao S .
Considerando que obtido de pela substituio de um No-Terminal de , temos
que:
a) Se o smbolo substitudo foi o mais da esquerda, ento esta uma derivao mais
esquerda;
b) Se o smbolo substitudo foi o mais da direita, ento esta uma derivao mais direita;
Observao: Se obtido por uma derivao mais a esquerda ou mais a direita dizemos que
uma forma sentencial Esquerda ou Direita, respectivamente.

IV.4 Gramtica Ambgua


Definio: Uma G.L.C. G = (Vn, Vt, P, S) ambgua se para algum x L(G) existe
mais de uma A.D..
De outra forma, G ambgua se existir algum x L(G), tal que x possua mais de uma
Derivao mais a Esquerda ou mais de uma Derivao mais a Direita.
Exemplos:

___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 26

IV.5 Transformaes (Simplificaes) em G.L.C.


IV.5.1 Eliminao de Smbolos Inteis
Definio: Um smbolo X Vn Vt intil em uma G.L.C. G = (Vn, Vt, P, S), se no
existe em G uma derivao da forma:
* wXy
* wxy
S
*
onde w, x, y, Vt , S Vn X Vn Vt; ou seja, um smbolo intil se ele infrtil (no
gera string s de terminais) ou inalcanvel (no aparece em nenhuma forma sentencial de G).
Algoritmo IV.1
Objetivo Encontrar o conjunto de No Terminais Frteis.
Entrada Uma G.L.C. G = (Vn, Vt, P, S).
Sada NF Conjunto de No-Terminais Frteis.
Mtodo:
Construa conjuntos N0, N1, ..., como segue:
i0
Ni
repita
i i +1
Ni Ni-1 {A | A P (Ni-1 Vt)*}
at Ni = Ni-1
NF Ni
Fim
Observaes: Uma variante do algoritmo IV.1 pode ser usada para verificar se L(G) vazia:
basta verificar se S (o smbolo inicial de G) NF.
Exemplo:

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

Construa G = (Vn, Vt, P, S), como segue:


a) Vn Vi Vn
b) Vt Vi Vt
c) P conjunto de produes de P, que envolvam apenas smbolos de Vi
d) S S
Fim
Exemplo:

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:

IV.5.2 Transformaes de G.L.C. em G.L.C. - Livre


Toda G.L.C. pode ser transformada em uma G.L.C. - Livre, atravs do seguinte
algoritmo:
Algoritmo IV.4:
Objetivo: Transformar uma G.L.C. em uma G.L.C. - LIVRE equivalente
Entrada: Uma G.L.C. G = (Vn, Vt, P, S).
Sada: Uma G.L.C. - Livre G = (Vn, Vt, P, S) | L(G) = L(G).
Mtodo:
* }.
1 Construa Ne = {A | A Vn A
2 Construa P como segue:
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 28

a) Inclua em P todas as produes de P, com exceo daquelas da forma A .


b) Para cada produo de P da forma:
A B | B Ne , V*
inclua em P a produo A
OBS: caso exista mais de um no terminal pertencente a Ne no lado direito de
uma produo, faa todas as combinaes entre esses no terminais.
c) Se S Ne, adicione a P as seguintes produes:
S S e S incluindo S em N (N = N {S})
caso contrrio, faa N = N e S = S.
3 A gramtica transformada ser: G = (Vn, Vt, P, S).
Fim.
Exemplos:
1) S a S b | c |
2) S AB
A aA |
B bB |
IV.5.3 Eliminao (Remoo) de Produes Simples
Definio: Produes Simples so produes da forma A B, onde A e B Vn.
As produes simples de uma G.L.C. podem se removidas atravs do seguinte algoritmo:
Algoritmo IV.5:
Entrada: Uma G.L.C. - Livre G = (Vn, Vt, P, S).
Sada: Uma G.L.C. - Livre G = (Vn, Vt, P, S) sem produes simples | L(G) = L(G).
Mtodo:
* B}
1 Para todo A Vn, construa NA = {B | A
2 Construa P como segue:
se B P e no uma produo simples,
ento adicione a P as produes da forma:
A , para todo A | B NA
3 Faa G = (Vn, Vt, P, S).
Fim.
Exemplos:
1) S FGH
FG|a
G dG | H | b
Hc
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 29

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:

IV.5.5 Eliminao de Recurso a Esquerda


Definies:
a) Um No-Terminal A em uma G.L.C. G = (Vn, Vt, P, S) recursivo
+ A , para V*.
se A
b) Uma Gramtica com pelo menos um NT recursivo a Esquerda ou a Direita,
uma Gramtica Recursiva a Esquerda ou a Direita, respectivamente.
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 30

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

IV.6 TIPOS ESPECIAIS DE G.L.C


Gramtica Prpria:
Uma G.L.C. Prpria, se:
No possui Ciclos;
- Livre;
No possui Smbolos Inteis.
Gramtica Sem Ciclos:
G = (Vn, Vt, P, S) uma G.L.C. Sem Ciclos (ou Livre de Ciclos) se no existe em G
nenhuma derivao da forma A A, para A Vn.
Gramtica Reduzida:
Uma G.L.C. G = (Vn, Vt, P, S) uma G.L.C. Reduzida se:
L(G) no vazia;
Se A P, A ;
G no possui Smbolos Inteis.
Gramtica de Operadores:
Uma G.L.C. G = (Vn, Vt, P, S) de Operadores, se ela no possui produes cujo lado direito
contenha NT consecutivos.
Gramtica Unicamente Inversvel:
Uma G.L.C. Reduzida Unicamente Inversvel se ela no possui produes com lados
direitos iguais.
Gramtica Linear:
Uma G.L.C. G = (Vn, Vt, P, S) Linear se todas as suas produes forem da forma
A x B w | x, onde A, B Vn x, w Vt*.
Forma Normal de Chomsky (F.N.C.):
Uma G.L.C. est na F.N.G. se ela - LIVRE e todas as suas produes (exceto,
possivelmente, S ) so da forma:
A BC, com A, B e C Vn ou
A a, com A Vn a Vt.
Forma Normal de Greibach (F.N.G.):
Uma G.L.C. est na F.N.G. se ela - LIVRE e todas as suas produes (exceto,
possivelmente, S ) so da forma:
A a | a Vt, Vn* A Vn.

Principais Notacoes De G.L.C.:


BNF (Backus Naur Form) : Notao utilizada na especificao formal da sintaxe de
Linguagens de Programao.
Exemplos: 1) <S> :: = a <S> |
2) <E> :: = E + id | id
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 32

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

IV.7 Autmatos de Pilha (PDA)


Um autmato de pilha, tambm denominado Push Down Automata, um dispositivo
no-determinstico reconhecedor de Linguagens Livres de Contexto (L.L.C.), que possui a
seguinte estrutura geral:
a1

a2

...

an

Entrada

Z1
Z2

...
Controle Finito
Zn

Pilha

Formalmente, um autmato de pilha (PDA) um sistema definido por:


P = (K, , , , qo, Zo, F), onde

K um conjunto finito de Estados


o alfabeto finito de Entrada
o alfabeto finito de Pilha
uma Funo De Mapeamento, definida por:
(K x ( {}) x ) {K x *}

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

Significado O PDA P no estado q, tendo a na entrada e Z no topo da pilha, deve entrar


no estado pi (para qualquer i de 1 a m), substituindo Z por i na pilha e avanando um
smbolo de entrada (ou seja, reconhecendo o smbolo a).
1 Movimento independente da entrada ( -move)
(q, , Z) = {(p1, 1), (p2, 2), ..., (pm, m)} onde:
a sentena vazia
q, p1, p2, ..., pm k
Z
i *, para i i m
Significado O PDA P no estado q, independente do smbolo de entrada e com Z no
topo da pilha, pode entrar no estado pi (i i m) e substituir Z por i na pilha, sem avanar o
cabeote de leitura da entrada (ou seja, sem reconhecer nenhum smbolo da entrada).
Descrio Instantnea (ou Configurao) de um PDA
A descrio instantnea de um PDA dada por (q, w, ), onde:
q K, representa o estado atual (corrente);
w *, a poro da entrada ainda no analisada;
*, o contedo (corrente) da pilha.
Os movimentos efetuados por um PDA so denotados por uma seqncia de
configuraes, de forma que:
Se (q, aw, Z) uma configurao e
se P contm a transio (q, a, Z) (q, a), onde:
q, q K
a {}
w *
Z (ou Z )
*
ento a aplicao (o uso) desta transio deixar P na seguinte configurao:
(q, w, )
Tal movimento denotado por:
(q, w, )

(q, aw, Z)

Linguagem Aceita por um PDA


A Linguagem aceita por um PDA pode ser definida de duas maneiras, conforme o
modo como efetuado o reconhecimento das sentenas:
1 Linguagem Aceita por Estado Final (T(P))
T(P) = {w | (q0, w, Z0)

(p, , ), onde p F *}

___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 35

2 Linguagem Aceita Por Pilha Vazia (N(P))


N(P) = {w | (q0, w, Z0)

(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:

Representao Grfica de um PDA


Um PDA tambm pode ser representado por um grafo de transies, similar aquele
utilizado na representao de A.F.. A diferena bsica est no rtulo das arestas, os quais
devero indicar alm do smbolo de entrada, o smbolo do topo da pilha e a seqncia de
smbolos que dever substituir o smbolo do topo da pilha, isto , o rtulo deve ser da forma:
(a, Z) , onde a
Z
*.
Exemplo:

___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 36

Autmato de Pilha Determinstico


Um PDA P = (K, , , , q0, Z0, F) determinstico se:
1 Para cada q K e Z , sempre que (q, , Z) ento
(q, a, Z) = para todo a .
2 Para q K, Z e a , existe no mximo uma transio envolvendo (q, a, Z)
A condio (1) evita a possibilidade de uma escolha entre um movimento independente
da entrada ( - move) e um movimento envolvendo um smbolo da entrada, enquanto que a
condio (2) evita uma escolha mltipla em funo do smbolo corrente da entrada.
Exemplos:

IV.8 Equivalncia Entre PDA e G.L.C.


Teorema: Se L uma L.L.C., ento existe um PDA P | P aceita L.
A equivalncia entre PDA e G.L.C. provada pela demonstrao de que:
1 sempre possvel construir a partir de uma G.L.C. G um PDA P que aceite L(G) por
pilha vazia (e portanto, em funo da equivalncia, aceita tambm por estado final);
2 sempre possvel construir uma G.L.C. G a partir de um PDA P de forma que
ambos aceitam a mesma linguagem. A prova deste teorema pode ser encontrada na
bibliografia indicada ([HOP 79], por exemplo).
Exemplo:

___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 37

IV.9 Propriedades e Problemas de Deciso das LLC


Nesta seo apresentaremos as principais propriedades e os problemas de deciso
bsicos relativos a LLC, com o objetivo de despertar o interesse por tais aspectos e ilustrar
algumas questes prticas. O assunto pode ser encontrado de forma mais ampla e profunda na
bibliografia indicada.

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

Captulo V Anlise Sinttica


V.1 Definies Preliminares
V.2 Classes de Analisadores
V.2.1 Analisadores Descendentes (Top-down)
V.2.2 Analisadores Ascententes (Botom-up)

V.1 Definies preliminares


Parser (Analisador Sinttico) um algoritmo que recebendo como entrada uma
sentena x, emite como sada:
1 O Parse de x, se x pertence linguagem; ou
2 Erro Sinttico, caso x no pertena linguagem.
Parsing (Analise Sinttica) o efeito da execuo do Parser.
Parse Seja G = (Vn, Vt, P, S) uma G.L.C. com as produes de P numeradas de 1 a p
+ x.
e uma derivao S
O Parse de x em G, a seqncia formada pelo nmero das produes
+ x . Mais especificamente:
utilizadasna derivao S
1 Parse Ascendente (Botton-up) a seqncia invertida dos nmeros das
+ dir x.
produes utilizadas na derivao mais a direita de x em G (S
2 Parse Descedente (Top-down) a seqncia dos nmeros das produes
+ esq x.
utilizadas na derivao mais a esquerda de x em G ( S
Exemplos:

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

V.2 Classes de Analisadores


Existem duas classes fundamentais de analisadores sintticos, definidos em funo da
estratgia utilizada na anlise:
Analisadores Descendentes (Top-down)
Consistem em uma tentativa de chegar-se a sentena a partir do smbolo inicial de G,
olhando a sentena ou parte dela para decidir que produo dever ser usada na derivao.
Analisadores Ascendentes (Bottom-up)
Consistem em uma tentativa de chegar-se ao smbolo inicial de G a partir da sentena a
ser analisada, olhando a sentena ou parte dela para decidir que produo dever ser usada na
reduo.

V.2.1 Analisadores Descendentes (Top-Down)


A idia geral desta classe de analisadores resume-se a uma tentativa de construir a
derivao mais esquerda da sentena de entrada, ou equivalentemente, uma tentativa de
construir a A.D. da sentena a partir do smbolo inicial da gramtica em questo. Estes
analisadores podem ser implementados com (analisadores no-deterministicos) ou sem backtrack (analisadores deterrminsticos):
a) A utilizao de back-track permite que um conjunto maior de G.L.C.(incluindo
gramticas ambguas) possa ser analisado, entretanto apresenta vrias desvantagens (todas
decorrentes do No-Determinismo), dentre as quais podemos destacar:
1 Maior tempo necessrio para a anlise;
2 Dificuldade na recuperao de erros;
3 Problemas na anlise semntica e gerao de cdigo.
Os analisadores descendentes no-determinsticos (dentre os quais destaca-se a tcnica
da Fora bruta), nada mais so do que implementaes diretas da idia geral dessa classe de
analisadores, ou seja: consistem em uma tentativa de construo (explicita) da rvore de
derivao da sentena em anlise, a partir do smbolo inicial da gramtica. O uso do
mecanismo de back-track faz-se necessrio em funo da possvel presena de nodeterminismo neste processo.
b) As implementaes sem back-track apesar de limitarem a classe de gramticas que
podem ser analisadas como veremos adiante tornam-se mais vantajosas pelo fato de serem
tcnicas determinsticas e superarem as deficincias praticas das implementaes com backtrack. Assim sendo, enfatizaremos neste curso as tcnicas determinsticas (ou seja, as tcnicas
que no fazem uso do mecanismo de back-track).
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 42

Analisadores Descendentes sem Back-Track


Para que um G.L.C. possa ser analisada deterministicamente por estes analisadores, ela
deve satisfazer as seguintes condies:
a) No possuir Recurso Esquerda;
b) Estar Fatorada, isto , se A 1 | 2 | ... | n so as A-produes de uma
determinada G.L.C. ento
First(1) ... First(n) = ;
* , First(A) Follow(A) = .
c) Para todo A Vn | A

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

O algoritmo do parser preditivo tem como funo determinar a partir de X (o elemento


do topo da pilha) e de a (o prximo smbolo da entrada) a ao a ser executada, a qual poder
ser:
a) Se X = a = $ o analisador anuncia o final da anlise.
b) Se X = a $ o analisador retira X do topo da pilha e a da entrada. Esta ao
corresponde ao reconhecimento sinttico de a.
c) Se X Vt e X a situao de erro (* X era o smbolo esperado *). Neste
caso, devem ser ativados os procedimentos de recuperao de erro (caso existam) ou a anlise
sinttica deve ser encerrada, diagnosticando o erro encontrado.
d) Se X Vn o analisador consulta a tabela de parsing M(X,a), a qual poder
conter o nmero de uma produo ou um indicativo de erro:
- Se M(X,a) contm o nmero de uma produo, e esta produo , digamos. X
UVW, ento X que est no topo da pilha deve ser substitudo por WVU (com U no topo);
- Se M(X, a) contm um indicativo de erro, ento o analisador deve diagnosticar o erro
encontrado e ativar os procedimentos de recuperao de erros (em implementaes sem
recuperao de erros a anlise encerrada).
Observaes: O termo Preditivo deve-se ao fato de que a pilha sempre contm a descrio do
restante da sentena (se ela estiver correta); isto , prev a parte da sentena que deve estar na
entrada para que a sentena esteja correta.
Algoritmo de Anlise Sinttica Parser Preditivo
repita
(* X topo da pilha *)
(* a prximo smbolo da entrada *)
se x terminal ou $
ento se X = a
ento retira X do topo da pilha
retira a da entrada
seno erro( )
seno (* X no terminal *)
se M(X, a) = X Y1 Y2 ... Yk
ento retira X da pilha
coloca Yk Yk-1 ... Y2 Y1 na pilha
(* deixando Y1 sempre no topo *)
seno erro( )
at X = $ (* pilha vazia, anlise concluda *)
Construo da Tabela de Parsing do Parser Preditivo
Idia Geral se A P a First(), ento, se A est no topo da pilha e a o
prximo smbolo da entrada, devemos expandir (derivar) A, usando a produo A . Mas,
* !? note que nunca aparecer na entrada neste caso, se a Follow(A)
e se = ou
expandimos (derivamos) A atravs da produo A .
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 45

Algoritmo para Construo da Tabela de Parsing


1.Para cada produo A P, execute os passos 2 e 3.
2.Para todo a First(), exceto ,
coloque o nmero da produo A em M(A, a).
3.Se First(), coloque o nmero da produo A em M(A, b), para todo b
Follow(A).
4.As posies de M que ficarem indefinidas, representaro as situaes de erro.
Consideraes Gerais
A tabela de parsing dos parsers preditivos deve possuir a propriedade de que, em cada
entrada da tabela M exista no mximo uma produo (seu nmero); isto viabiliza a anlise
determinstica da sentena de entrada.
Para que esta propriedade se verifique, a gramtica considerada dever satisfazer as
seguintes condies:
1 No possuir recurso esquerda;
2 Estar fatorada;
* , First(A) Follow(A) =
3 Para todo A Vn | A
As G.L.C. que satisfazem estas condies so denominadas G.L.C. LL(K) isto
G.L.C. que podem ser analisadas deterministicamente da esquerda para a direita (Left-toright) e o analisador construir uma derivao mais esquerda (Leftmost derivation), sendo
necessrio a cada passo o conhecimento de K smbolos de lookahead (smbolos de entrada
que podem ser vistos para que uma ao seja determinada).
Somente G.L.C. LL(K) podem ser analisadas pelos analisadores preditivos (as demais
causam conflitos na construo da tabela de parsing ou fazem com que o analisador entre
loop); por isso, os analisadores preditivos so tambm denominados analisadores LL(K) na
prtica usa-se K = 1, obtendo-se desta forma Analisadores LL(1) para G.L.C. LL(1).

V.2.2 Analisadores Ascendentes


A formulao dos algoritmos de anlise sinttica ascendente baseia-se em um algoritmo
primitivo denominado Algoritmo Geral Shift-Reduce (Avana-Reduz). Este algoritmo
utiliza:
a) Uma Pilha Sinttica (inicialmente vazia);
b) Um Buffer de Entrada (contendo a sentena a ser analisada);
c) Uma G.L.C. (com as produes numeradas de 1 a p);
d) Um procedimento de anlise sinttica, o qual consiste em transferir (Shiftar) os
smbolos da entrada (um a um) para a pilha at que o contedo da pilha (ou parte dele)
coincida com o lado direito de uma produo. Quando isto ocorrer, o lado direito da produo
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 46

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

Algoritmo da Anlise Sinttica LR


Consiste em determinar Sm (o estado do topo da pilha) e ai (o prximo smbolo da
entrada) e, com base nessas informaes, consultar a tabela de parsing para decidir a prxima
ao a ser efetuada e efetu-la. Esta ao poder ser:
1 Shift S
2 Reduce R
3 Erro
4 Halt (ou Accept)
Significado e Procedimentos Associados s Aes
a) Halt: Fim de anlise;
Procedimento A anlise sinttica deve ser encerrada.
b) Erro: Indica a ocorrncia de um erro sinttico.
Procedimento As rotinas de recuperao, se existirem, devero ser
ativadas para que a situao de erro seja contornada e a anlise possa
continuar; seno, a anlise deve ser encerrada.
c) Shift S Significa o reconhecimento sinttico do smbolo da entrada.
Procedimento O smbolo da entrada deve ser retirado e o estado S,
indicado na tabela de Parsing, dever ser empilhado.
d) Reduce R Significa que uma reduo pela produo nmero R deve ser efetuada.
Procedimento Devero ser retirados pa pilha sinttica tantos estados
quantos forem os smbolos do lado direito da produo R, e o smbolo do lado esquerdo dessa
produo dever ser tratado como um smbolo de entrada na prxima ao do analisador.
Observaes: O processo de determinar e efetuar as aes sintticas dever ser repetido at
que a ao Halt seja encontrada ou, para as implementaes sem recuperao de erros, um
erro seja detectado.
Tabela de Parsing LR
A tabela de parsing dos analisadores LR dividida em duas partes:
a) Tabela Action contm as transies (Shift, Reduce, Erro e Halt) com os smbolos
terminais.
b) Tabela Goto contm as transies (Goto e Erro) com os smbolos no-terminais (Um
Goto um Shift especial sobre um smbolo no-terminal).
Implementao: Normalmente utiliza-se Matriz ou Lista. No caso de matriz como
normalmente as tabelas de parsing so bastante esparsas utilizam-se tcnicas de
compactao de tabelas.
Configurao de um Analisador LR
um par, cujo 1 elemento o contedo da pilha sinttica e o segundo a entrada a ser
analisada. Por exemplo, a configurao:
(S0X1 S1X2 S2 ... Sm, ai ai+1 ai+2 ... an$)
tem o seguinte significado: os primeiros i-1 smbolos da entrada j foram analisados e a
prxima ao a ser efetuada ser determinada pelo estado Sm (topo da pilha) e por ai (prximo
smbolo da entrada).
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 49

Observaes: X1, X2, ..., XM s existem logicamente.


Gramticas LR: Uma G.L.C. LR se cada sentena que ela gera pode ser analisada
deterministicamente da esquerda para a direita por um analisador LR.
Pertencem a classe das gramticas LR, todas as G.L.C. para as quais possvel construir
a tabela de parsing LR sem que hajam conflitos (isto , em cada posio da tabela haver no
mximo uma ao registrada).
Gramticas LR(K): Idem a definio anterior, considerando-se K smbolos de Lookahead.
Na pratica usa-se K = 1.
Observaes: G.L.C. analisveis por analisadores SLR(1), LALR(1) e LR(1) so tambm
denominadas, respectivamente, gramticas SLR(1), LALR(1) e LR(1).
Exemplo: Para a G.L.C.:
0: E E $
1, 2: E E + T | T
3, 4: T T * F | F
5, 6: F (E) | id
A tabela SLR(1) correspondente seria:
Id
(
)
+
*
$
E
T
F

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

Exerccio: Efetuar a anlise sinttica das sentenas:


x = id * id
y = (id +) id * id
Construo da Tabela de Parsing SLR(1)
Definices Gerais:
a) Item LR(0): Um item LR(0) (ou simplesmente item) em uma Gramtica G uma
produo de G com uma marca (fisicamente representada por um ponto) em uma posio de
seu lado direito. Denota-se um item por um par de inteiros [i, j], onde i o no da produo e j
a posio em que se encontra o ponto.
Exemplo:
___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 50

Observao: Um item [i, j] tem o seguinte significado: As informaes disponveis indicam


que a produo i est sendo utilizada e que os primeiros j smbolos de seu lado direito j
foram analisados.
b) Item Completo: Item em que a marca est aps o ltimo smbolo do lado direito da
produo.
c) Estado: uma coleo de informaes sobre o progresso (situao) da anlise sinttica
em um determinado momento. composto por um conjunto de itens.
Observaes: A coleo de estados criada para uma G.L.C. (denominada Coleo LR(0)) a
base para a construo da tabela de parsing SLR(1).
d) Ncleo de um Estado: Conjunto de itens que deu origem ao estado.

Algoritmo para Construo da Coleo Lr(0):


a) Inicializao
1 Numere as produes de G de 1 a p;
2 Aumente G com a produo S S$; S passar a ser o smbolo inicial de G e $
ser usado como marca de final de sentena)
3 Defina o ncleo do estado inicial (estado 0), como sendo o item [0, 0], onde a
produo no 0 a produo includa.
b) Construo dos Estados
1 Faa o Fechamento do ncleo;
2 Faa o Fechamento dos itens criados em a;
3 Determine o ncleo dos Estados Sucessores;
4 Repita a, b e c para todos os ncleos criados, at que nenhum Estado Sucessor
novo seja criado e que todos os estados estejam completos (isto , todos os itens
fechados).
Fechamento Se um determinado item contm a marca na frente de um no-terminal A,
o fechamento deste item ser o prprio item + o conjunto de itens [i, o] existentes, onde i o
nmero de uma produo cujo lado esquerdo o no-terminal A. Se a marca precede um
smbolo terminal ou se o item completo, o fechamento ser o prprio item.
Estados Sucessores So os estados alcanados atravs da movimentao da marca sobre
um determinado smbolo. O ncleo do estado sucessor ser formado pelo conjunto de itens
resultantes da movimentao acima referida. Observao: No existe estado sucessor relativo
ao item [0, 1] ( S S, $), uma vez que este item indica o final da anlise.
Algoritmo para Construo da Tabela de Parsing SLR(1)
a)

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

c) Para cada estado i com itens completos, faa:


Para cada item completo, faa:
Coloque REDUCE N na interseco da linha correspondente ao estado i com as
colunas correspondentes a smbolos follow(A); onde N o nmero da produo
envolvida no item completo em questo e A o smbolo do lado esquerdo desta
produo.
d) Coloque HALT na interseco da linha referente ao estado que contenha o item [0, 1],
na coluna do smbolo $.
e) As posies que ficarem vazias aps a execuo dos passos b, c e d, representaro as
situaes de erro.
Condio SLR(1): A condio para que a tabela construda pelo algoritmo acima seja
SLR(1), que no existam estados Inadequados (estados com conflitos Shift-Reduce e/ou
Reduce-Reduce); isto equivale a dizer que cada posio da tabela dever conter no mximo
uma ao.
Propriedade das Tabelas LR
Para que um analisador LR aceite qualquer sentena correta e detecte pelo menos um
erro em cada sentena incorreta, a tabela de parsing deve possuir as seguintes propriedades:
a) Condio De Erro: Nunca ser encontrada para sentenas sintaticamente corretas.
b) Cada Shift dever especificar um nico estado, o qual depender do smbolo da
entrada.
c) Cada Reduce s realizado quando os estados do topo da pilha (os smbolos que
eles representam) forem exatamente os smbolos do lado direito de alguma produo
de G, isto , um handle da gramtica.
d) Halt s ser encontrado quando a anlise estiver completa.
Exerccios: Construa a tabela de Parsing SLR(1) para as seguintes G.L.C.:
1EE+T|T
TT*F|F
F (E) | id
2 C if E then C else C
| if E then C
| com
E exp
3 B AB
B or AB |
A CA
A and CA |
C exp | (B) | not C

___________________________________________________________________________
UFSC-CTC-INE
Linguagens Formais e Compiladores
pg. 52

Você também pode gostar