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 inter-
relacionamentos.

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
mais passos; indicaremos por: + (ou por + ).
Observao: - Se * em 0 (zero) passos, ento = .
- 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
inicial de uma gramtica; isto , se G = (Vn, Vt, P, S) S
+ x, ento x uma sentena
pertencente linguagem representada por G.
Forma Sentencial uma seqncia qualquer (composta por terminais e no-
terminais) 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),
denotada por L(G), como sendo: L(G) = {x | x Vt* S + x}; ou seja, uma linguagem
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)

1 Seja w L(G) S + w
+
se S w
ento S * w
se S
ento S P e, por definio, S1 P1

+ w L(G) L(G1)
Logo, S1 w S1

2 Seja w L(G1) S1 + w
se S1 + w
ento S1 * w
se S1
ento S1 P1 e, para que esta produo exista, necessrio que P
contenha a produo S , portanto:
S * w S + w L(G ) L(G)
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;
Seja TM o conjunto de formas sentenciais | || N S
* em M passos.

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 Mquinas de Turing
Gramticas S.C. Autmatos Limitados Lineares
Gramticas L.C. Autmatos de Pilha
Gramticas Regulares 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.

Vantagem Desvantagem
A.F.D. Implementao Trivial No natural na representao de
algumas L.R.
A.F.N.D. Representao mais natural de Implementao complexa
algumas LR

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

a b
qo qo,q1 qo
q1 --- q2
q2 --- q3
*q3 --- ---

onde T(M) = { }

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

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

T(M) = { }

___________________________________________________________________________
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).
Se x L(G), ento S + x
Como G uma G.R., a derivao S + x da forma
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;

logo, como x = a1a2...an S


+ x, ento x L(G)

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
*A G B
B F E
C C G
* D A H
E E A
F B C
*G G F
H H 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 a b c
q1 1 2 4
q2 4 2 3
q3 1 4 3
q4 4 4 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 Vetor de Estados Finais

TAB a b c <> a, b, c VE F
(q0) 1 1 2 4 4 1 0
(q1) 2 4 2 3 4 2 0
(q2) 3 1 4 3 4 3 1
(qerro) 4 4 4 4 4 4 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:
S* wXy * wxy
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:
1 Para todo A Vn, construa NA = {B | A * B}
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, aw, Z) (q, w, )

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


e uma derivao S + x.
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 .
Observaes: Se = ou
* , ento first().

___________________________________________________________________________
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 back-
track (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 no-
determinismo 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 back-
track. 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) = ;

c) Para todo A Vn | A
* , First(A) Follow(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 ... $
Entrada

X Algoritmo
W
Y
Z Tabela de Parsing
Pilha $

___________________________________________________________________________
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;
3 Para todo A Vn | A * , First(A) Follow(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-to-
right) 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 No-
Determinismo 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
. Algoritmo
. de Tabela
. Anlise de
S1 Sinttica Parsing
S0
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 S5 S4 1 2 3
1 S6 HALT
2 R2 R2 S7 R2
3 R4 R4 R4 R4
4 S5 S4 8 2 3
5 R6 R6 R6 R6
6 S5 S4 9 3
7 S5 S4 10
8 S11 S6
9 R1 R1 S7 R1
10 R3 R3 R3 R3
11 R5 R5 R5 R5
ACTION 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