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 onde T(M) = { Defina M = (K, , , qo, F), onde: K = { = {a, b) qo = F = [qo] a b a qo,q1 ------b qo q2 q3 --}

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). + 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 <> a, b, c 4 4 4 4

Vetor de Estados Finais


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, 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 + 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 ... $ Entrada

Pilha

X W Y Z $

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

S 5

S 4 R 2 R 4 S 6 R 2 R 4 R 6 S 7 R 4 R 6 H A LT R 2 R 4

S 5 S 5 S 5

S 4 R 6 S 4 S 4 S 11 R 1 R 3 R 5 S 6 R 1 R 3 R 5 S 7 R 3 R 5 R 1 R 3 R 5 R 6

2 9

3 3 10

ACTION Exerccio: Efetuar a anlise sinttica das sentenas: x = id * id y = (id +) id * id Construo da Tabela de Parsing SLR(1) Definices Gerais:

GOTO

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