Sei sulla pagina 1di 120

Compiladores 1

Introduo

Objetivos:

A disciplina de Compiladores tem por objeti vo a i ntrod uo dos co nceitos e


estr ut ura f unciona l dos co mpiladores.

Ao concluir a disciplina o aluno de ver estar apto a :

q Distinguir as etapas re lati vas a um p rojeto de um compilador , bem como as


diferenas e xiste ntes e ntre a Compilao, Mo ntagem , Ligao e Interpre tao;
q Reconhecer os tipos de Gra mticas, Li ng uagens e Reconhecedores e xiste ntes;
q Reconhecer as funes e as aes desempenhadas por um A nalisador Lxico,
sendo capa z de imp leme nt -las;
q Reconhecer os tipos de Analisadores Sintticos, suas f unes e aes
desempenhadas, se ndo capa z de impleme nt-los ;
q Reconhecer as ati vidades desempenhadas por um A nalisador Sem ntico,
Gerador de Cdigo e O timizador de Cdigo;
q Projetar e imple me ntar um Compilador para uma mq uina abs trata , com um
conjunto de i nstr ues simples.

Em conc luso , a disciplina propicia ao aluno a aplicao de todos os co nceitos e


recursos est udados dura nte o curso, permiti ndo que ele possa analisar e implementar um
projeto com um maior nve l de comple xidade. Deste modo, espera-se contribuir para a
formao de um pro fissional com uma viso mais ampla, calada em conceitos
largame nte difundidos na Cincia da Comp utao e Enge nharia da Comp utao, no o
restringi ndo apenas impleme ntao e ma nute no de Sistemas de Informaes. A lm
disso, sendo, norma lme nte , estes co nceitos um pr- requisito para c ursos de ps-
graduao, espera -se estar co ntribui ndo para q ue o egresso possa co nti nuar se us
estudos a nve l de mestrado e do utorado.

Neste sentido, a disciplina vem somar contribuies para a formao de um


profissional q ue, no mercado, possa vir a p ropor e utili zar ambie ntes e p latafo rmas
operacionais, administ rar meios e rec ursos relacionados s ati vidades de processame nto
de dados, alm de dar subs dios para que ele possa ente nder para tra nsmitir e dif undir as
no vas tecno logias nas reas da informtica e das te lecom unicaes.
Compiladores 2
Introduo

Histr ico

Nos primeiros dias da computao, comp utadores eram prog ramados diretame nte ,
em ling uagem de mqui na. Os programadores , para impleme ntar um progra ma,
necessita vam combina r certas c ha ves e fios para que as tarefas fossem e xec utadas. As
dificuldades eram treme ndas , sendo que um progra ma le va dias para ser feito e
depurado.

A necessidade por um modo mais fcil de trabalho , al m de uma maior seg ura na
na confeco dos programas, le vou, na dcada de 50, ao surgimento dos primeiros
computado res a carto perf urado e as ling uagens de mo ntagem (Assembly) . Os
montadores facilita va m uito a vida dos programadores, mas uma li nguagem mais prxima
quele utili zado pelo home m seria mais ideal. Deste modo, surgiu por volta do final da
dcada de 50, as p rimeiras li ng uagens de alto nve l, como o Fort ra n e o Algol. Com elas
surgiram os primeiros co mpiladores para es tas ling uage ns.

Atualme nte e xistem um gra nde nmero de li nguage ns disponveis, se ndo


distribudas de nt re de q uat ro gra ndes paradigmas: Procedim ental ou Im perativas,
Funcional, Lgico e Orientado Objeto. A escolha de uma li ng uagem e de um paradigma
depende dos objetivos a serem atingidos. Ent reta nto , para fins comerciais e cient ficos,
norma lme nte se utili za li ng uagens dos paradigmas lgicos ou o rientado a objetos . Dentre
estas ling uage ns podemos citar: C, C++ , Pascal, Objec t Pascal, Delp hi, Visual Basic,
ent re outras. Para impleme ntao de intelig ncia artificial, norma lme nte so utilizadas
ling uagens dos paradigmas lgico e funcio nal. Nestes pa radigmas, as li nguage ns mais
conhecidas so: Pro log, Gdel, Isabe lle , Lisp e Sc heme.

Nesta disciplina iremos enfocar aspectos de compilao para ling uage ns


procedimentais. Os mesmos princ pios se aplicam para os paradigmas orie ntados
objeto, lgico e funciona l. Entre tanto, para estes so necessrios o acrscimo de algumas
funcio nalidades o u a co ns tr uo de mqui nas virt uais, o q ue foge do nosso escopo.
Compiladores 3
Introduo

Funcionamento dos Compilador es

Basicamente, um compilador C um programa de computador escrito em uma


linga ugem L, para uma mq ui na M , cuja fina lidade conve rter um p rograma Pf,
denominado p rogram a-fonte, escrito em uma ling uagem Lf, de nomi nada linguagem -fonte,
para uma mq uina M f, para um programa Po, de nominado prog ram a-objeto, em uma
ling uagem Lo, denomi nada linguagem -objeto, o qual ser executado em uma mq ui na M o.
Graficame nte ter amos:

Pf / L f P/ L Po / Lo
Mf M Mo

Figura 1: Esquema de traduo

O compilador C pode ser composto de vrias fases, deno minadas neste caso de
passos do com pilador. Em cada passo, usado uma linguagem -fonte e uma linguagem -
objeto, prprias desse passo, original. No primeiro passo temos a linguagem -fonte a ser
compilada, Lf, e no ltimo passo a linguagem -objeto final desejada, Lo. As o utras
ling uagens e nvo lvidas so denominadas linguagens-interm edirias. Graficamente
ter amos o mes mo q ue rep resentado pela Figura 2 .

Pf / L f PI1 / LI1 PIn / LIn Po / Lo


Mf MI1 MIn Mo

Figura 2: Esquema de traduo em vrios passos

Em alguns casos a linguagem -objeto gerada pelo compilador uma linguagem de


m ontagem (Assem bly), necessita ndo assim de um passo adicional, q ue m ontagem .
Neste caso , o p rograma respons ve l por esta tare fa de nomi nado m ontador (Assem bler).
A funo bsica deste programa a traduo do cdigo fonte Assem bly para linguagem
de m quina na qua l o prog rama ser e xec utado . A principal ca racter stica deste tipo de
tradutor q ue para cada instr uo Assem bly ser gerado uma nica inst ruo de
mqui na.

As etapas reali zadas pelo mo ntador so:

Substit uio dos m nem nicos e nco ntrados por i nstr ues de mq uina ;
Substit uio dos nomes simblicos ( nomes de vari veis e rt ulos de des vio)
para endereos de me mria;
Reser var espao de mem ria para o ar ma ze name nto das ins tr ues e dados;
Conve rter valores de co nsta ntes para cdigo bin rio; e
Examina r a co rreo de cada inst r uo
Em outros casos, o linguagem -objeto encontra-se em uma for ma inter mediria, no
podendo ser e xec utado diretame nte pela mq uina. E em outros casos, no se deseja
compilar o program a-fonte , mas e xecut- lo diretame nte . Nestes casos necessrio a
presena de um In terpre tador, o qua l simula uma mq uina virt ua l, possibilitando assim a
exec uo do prog rama sobre uma mqui na rea l.
Compiladores 4
Introduo
Basicamente, a interpretao se caracteriza por rea lizar as fases de compilao e
exec uo, de cada um dos comando e nco ntrados no programa. Na realidade o
interpretador l cada li nha do programa fo nte , e xtrai os coma ndos ne la presentes, verifica
a sua si nta xe , e os e xec uta diretame nte . No e xistem e tapas intermedirias. Caso uma
linha de prog rama se ja e xecutada mais de uma vez, e la de ver ser no vame nte
interpre tada. So e xemp los de ling uage ns i nterp retadas: Basic, Sm allTalk, Apl, etc.

Organizao de um Compilador

As fases de um compilador podem ser


Programa
classificadas em dois grupos: anlise e sntese. Fonte
Na fase de anlise, enco ntram -se as fases de
anlise lxica, anlise sinttica e anlise COMPILADOR
Anlise
sem ntica. J na fase de sntese e nco nt ram-se A Lxica
N
as fases de gerao de cdigo interm edirio, Tratamento
L de Erros
otim izao e gerao de cdigo. Adicionalme nte I A n l i s e
S Sinttica
as estas fases, existem ainda duas fases E
adicionais que interagem com todas as fases do Anlise
compilador: o gerenciam ento de tabelas e o Semntica

tratam ento de erros. A Figura 3 ilus tra todas


estas fases. Gerao Tabelas
de Cdigo
A fase de anlise lxica tem por objetivo S Intermedirio

ler o programa fonte e trans formar seq ncias de N
T
caracteres em uma represe ntao inter na, E
Otimizao
S
denominada itens lxicos. Por e xemplo , s uponha E
a expresso abaixo, descrita em Pascal: Gerao de
Cdigo
Exp := (A + B) * 1.5;.
Os itens l xicos contidos nes ta e xpresso,
Programa
so: Exp, :=, (, A, + , B, ) , *, 1 .5 e ;. Os ite ns Obejto
lxicos a sere m reco nhecidos pelo analisador
lxico so determinados pela gram tica da Fig ur a 3 : Fas es de u m c o mpil a dor
linguagem -fonte. Deste modo, caso um item
lxico no seja definido por esta gram tica, um erro lxico
:=
gerado. Por exemplo , s uponha mos que uma ling uagem
s supor te va lores i nteiros. Ento o va lor 1.5 iria ocasionar
um erro , o q ua l de ver ser tratado. Exp *
Estes itens lxicos so for necidos ao analisador
sinttico, assim que solicitados, o q ual os agr upa em uma + 1.5
estr ut ura de nominada de rvore sinttica. Para isto, ele usa
uma srie de regras de sinta xe definidas pela gram tica da A B
linguagem -fonte. Caso algum item lxico no seja Fig ur a 4 : r vore s int tic a par a
reconhecido pela regra sinttica sendo a na lisada, ocorre Ex p: = (A + B) * 1 .5 ;
ento um er ro sinttico, o qua l de ver ser tratado. Para o
nosso e xemp lo, a r vore sinttica da e xpresso acima dada pela Figura 4.
A fase de anlise sem ntica analisa a rvore sinttica gerada pelo analisador
sinttico em busca de inco nsist ncias sem nticas. Uma das tare fas mais importa ntes a
verificao de tipos, ou anlise de contexto . nesta fase que so detectadas , por
exemp lo, os conflitos entre tipos, a a us ncia de declaraes de variveis, f unes e
procedimentos.
Compiladores 5
Introduo
A fase de gerao de cdigo interm edirio permite a gerao de instrues para
uma mqui na abst rata, no rmalme nte em cdigo de trs endereos, mais adequadas a
fase de otimizao. Esta forma inte rmediria no executada diretamente pela mq uina
alvo .
A fase de otim izao analisa o cdigo no formato intermedirio e tenta me lhor- lo
de tal forma q ue ve nha a res ulta r um cdigo de m quina mais rpido em tem po de
execuo. Uma das tarefas e xec utadas pe lo otim izador a deteco e a e liminao de
movime nto de dados redunda ntes e a repetio de operaes dentro de um mesmo bloco
de programa.
E por fim, a fase de gerao de cdigo tem como ob jeti vo a nalisar o cdigo j
otimizado a gerar o um cdigo objeto definitivo para uma mqui na alvo . No rmalme nte
este cdigo objeto um cdigo de m quina relocvel ou um cdigo de m ontagem . Nesta
etapa as locali zaes de memria so selecionadas para cada uma das vari veis usadas
pelo programa. E nto, as ins tr ues intermedirias so, cada uma, trad uzidas numa
seq ncia de ins tr ues de mqui na q ue reali zam a mesma tare fa.

Carr egadores e Editor es de Ligao

A traduo completa de um program a fonte requer dois passos: com pilao ou


m ontagem . Neste passo gerado um cdigo objeto no formato relocvel, o qual no
exec utado diretame nte, visto q ue em um prog rama pode ocorrer refer ncias a outros
programa o u dados (refe rncia externa) os q uais se e nco nt ram em o ut ros progra mas,
compilados separadamente , o u em bibliotecas (librarys) da li nguage m se ndo compilada.
Deste modo, a funo do editor de ligao (Linker) cole tar prog ramas trad uzidos
separadamente e lig-los em um nico mdulo, norma lme nte denomi nado m dulo
absoluto de carga ou sim plesm ente program a executvel. J a funo do carregador
carregar o m dulo absoluto de carga na memria principal, substit ui ndo os endereos
relativos ao mdulo de carga por ende reos reais de memria.
Compiladores 1
Lingu agens Formais

Linguagens

q Alfabeto: conjunto finito de smbolos , podendo ser eve nt ualme nte vazio. Por exe mplo:
= conjunto de todas as le tras, = {a,e,i,o,u }, = {a,b, c,d}, = {0,1,2,3,4,5,6,7,8,9} , etc.
Os eleme ntos de um alfabeto so nor malme nte deno minados de tom os da
linguagem ou sm bolos term inais.
q Palavra, Cadeia ou Sentena: seq ncia finita de s mbo los, do alfabeto, justapos tos.
Por exemp lo, seja = {a,b,c} um alfabeto, e nto = aaabcc , = cbcaacbc, = bacba e
so cadeias sobre este alfabe to, se ndo es ta ltima de nomi nada de cadeia va zia.
q Tamanho ou Comprimento: se uma cadeia sobre uma alfabeto , ento | |
denota o seu comp rimento, isto , o nmero de s mbo los que compem . Por
exemp lo, se = {a, b} , e nto |a | = 1, |ab | = 2 e | | = 0.
q Para se designar o conjunto de todas as cadeias de comprimento k sobre o
alfabeto , utiliza -se a notao k , sendo que 0 = { }. Por exemp lo,
2 = {aa, ab, ba, bb} .
q Fecho transitivo ref lexivo (ou simplesmente fe cho) | | 0: seja o alfabeto
= {a,b} . E nto ,
* = { , a, b, aa, bb , ab, ba, aab, abb, baa, bba , . .. }
q Fecho transi tivo (ou fe cho posi tivo) | | > 0: se ja o a lfabeto = {a,b} . E nto,
+ = + { } = {a , b, aa, bb, ab, ba, aab, abb, baa, bba , . .. }
q Linguagem Formal : coleo de cadeias de smbolos , de comprimento fi nito,
denominadas sentenas da ling uagem .
q Se uma cadeia qualq uer sobre uma ling uagem L, e nto a concatenao de
n s mbo los do a lfabeto , se ndo q ue | | = n;
q Sendo e duas cadeias sobre uma linguagem L, e nto = a concatenao
de e , sendo ta mbm uma cadeia, e, porta nto , | | = | | + | |;
q Se uma cadeia sobre uma linguagem L, n a concatenao sucessiva de
com ela mesma n ve zes. Isto , se = a , e nto 0 = , 1 = a, 2 = aa, 3 = a aa,
etc.;
q Podemos definir uma ling uagem por trs modos: enum erao de sentenas,
gram ticas ou reconhecedores.

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 2
Lingu agens Formais

Gramticas
q Gramti ca : especificao de um co njunto de leis de formao de se nte nas da
ling uagem, podendo ser defi nida for malmente pe la q udr upla ordenada :
G = (VN, VT, P , S)
onde:

VN : representa o conjunto de todos os smbolos utili zados pela gramtica G, para


definir as regras de formao das se nte nas da li nguagem . Estes s mbolos so
denominados de no-te rm inais.
VT : representa o conjunto de todos os smbolos utili zados pela gramtica para a
formao das cadeias aceitas pela linguagem , norma lme nte de nomi nados de
sm bolos term inais ou simplesmente term inais. Ao conjunto V = VN VT d-se
vocabulrio da gramtica G. No te q ue VN VT = ;
P : representa o co njunto de todas as regras de formao utilizadas pe la gram tica
para a produo de cadeias da linguagem . A cada uma destas regras d-se o
nome de regra de produo da gramtica ou simplesme nte produo. Esta regras
tm a forma : ; onde uma cadeia conte ndo no m ni mo um no-term inal,
ou se ja a V* VN V* , pode ndo ser e vent ualmente va zia, e a V* . Uma
seq ncia de produes do tipo 1, 2, ..., n, pode ser abreviada
por 1 | 2 | . .. | n.
S : um eleme nto de VN cuja f uno dar i ncio ao processo de gerao de
sente nas, ta mbm c hamado de sm bolo inicial da gramtica.
q Forma Sentencial: q ualq uer cadeia de eleme ntos de V obtida a partir de S por
produes de P da gram tica G = (VN, VT, P, S). Deste modo:
a) S uma form a sentencial;
b) Se uma form a sentencial e , ento tambm uma form a
sentencial, sendo q ue , , V*, e V* VN V* .
q Obser ve q ue uma sentena , porta nto, uma forma se nte ncial F tal que F VT*.
Derivao di reta: aplicao de uma regra de produo para obteno de uma fo rm a
sentencial. Portanto, se V* e P, ento uma derivao
direta. Para indicarmos a ocorrncia de n passos de derivao direta, escrevemos
n ;
q Derivao no-tr ivial : ap licao de no m ni mo uma de rivao, deno tada por +.
q Derivao: ap licao de zero o u mais deri vaes diretas, sendo deno tada por *.
q Linguagem Gera da: uma l ingua gem gerada por uma gra mtica
G = (VN, VT, P, S), um co njunto de todas as poss veis sentenas po r ela geradas
atra vs de derivaes a pa rtir do s mbo lo i nicial S. Isto :
L(G) = { VT* | S + }

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 3
Lingu agens Formais

q Exemplo 1 : seja a gra mtica G1 = (VN, VT, P, S), onde :


VN = {A, B}
VT = {0, 1, }
P = {A 0A, A B , B 1B, B }
S=A
Atravs desta g ramtica podemos co ns tr uir as sente nas:

{ ,0,1, 00, 01, 00 , 001, 011, 111, 000, 0001 ,0011, . .. }

Tais sente nas tambm podem ser de finidas pela li ng uagem:

L(G1) = { 0n1m VT* | S 0* 1* e n, m 0}

Por exe mplo, s uponha mos a se ntena = 001. Ela pode ser ob tida pelas
seguintes deri vaes:

A 0A
0A 00A
00A 00B
00B 001B
001B 001

q Exemplo 2: dada uma li nguagem L, poss ve l defi nir uma gra mtica G2 para es ta
ling uagem, ta l q ue L( G2) = L . Por e xe mplo, s uponha a ling uagem:

L = { 0n1n VT* | S 0*1* e n 0}

Obser ve que para esta ling uagem, o nme ro de 1s deve coincidir exatame nte com
o mesmo nmero de 0s. Neste caso, ter amos as seguintes regras de produo
para a gram tica: S 0S1 e S . Porta nto, nossa gramtica se ria definida por :

G2 = ({S} , {0 , 1} , {S 0S1, S }, S})

Por exe mplo, as seg uintes se nte nas sero geradas por esta gramtica:

{ , 01, 0011, 000111, 00001111, . ..}

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 4
Lingu agens Formais
rvores de Derivao
q rvore de Derivao: fo rma de representar os passos de derivao de uma se nte na
para uma gra mtica G = (VN, VT, P, S), definida da seg ui nte forma :

1. A rvore co nstit uda inicialme nte pelo n rot ulado S uma rvore de derivao;
2. A rvore obtida pela substit uio de uma fo lha (n fina l) ro t ulada N de uma rvo re
de derivao, pela rvore

1 2 ... n

onde N 1 2... n P; tambm uma rvore de derivao.

Algumas co nsideraes importa ntes sob re rvores de derivao, so :

1. A constr uo da r vore ter mina q ua ndo todas as folhas fore m s mbo los
term inais;
2. A cada rvore de derivao cor responde pelo me nos uma ge rao;
3. A cada gerao corresponde apenas uma nica rvore de derivao, embora
vrias geraes possam te r a mesma rvore de de rivao;
4. Qua lq uer n, e xce to aque les q ue so folhas , rot ulado com um s mbo lo no-
term inal de G;
5. Um n no- term inal N, e seus ns descende ntes imediatos 1, 2, .. ., n
correspondem a uma derivao direta N 1 2... n.

q Vantagem: a gra nde va ntagem do uso de r vores de A


derivao reside no fato delas preservarem a estrutu ra
gram atical da sente na gerada, o q ue tor na m uito mais 0 A 1
simples a vis uali zao e o acompanhame nto de cada passo
de derivao. 0 A 1
q Exemplo 3: a rvore de derivao para a sente na 0011, de
acordo com a g ramtica

Figura 1: rvore de
G3 = ({A} , {0, 1 }, {A 0A1, A }, A) Derivao para a sentena
0011.
indicada pela Figura 1, a q ual correspo nde as derivaes :

A 0A1 00A11 00 11 0011

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 5
Lingu agens Formais
q Exemplo 4 : seja a gra mtica G4 = (VN, VT, P, S), onde :

VN = { E }
VT = { 1 , 2 }
P ={ E E +E | E * E |1 |2 }
S=E

Agora suponha a sente na


1 + 2 * 2. Obser ve q ue existe m E E
duas rvores derivao para a
sente na, co nforme i ndicado
pela Figura 2 e Figura 3. E + E E * E

A rvore da Figura 2 representa


uma der iva o a ma is a 1 E * E E + E 2
dire ita, e nq uanto a rvore da
Figura 3 representa uma
2 2 1 2
deriva o mais a esquerda .
Neste caso, dizemos q ue es ta
gramtica amb gua, isto , Figura 2: rvore de Figura 3: rvore de
possui mais de uma rvo re de Derivao para 1 + 2 * Derivao para 1 + 2 *
derivao para a mesma 2. 2.
sente na.

q Definio de Gramt i ca Ambgua: uma gramtica G dita ser uma gramt i ca


ambgua se, e some nte se, e xiste uma se nte na L( G) que possua d uas ou mais
rvores de deri vao.

q Visto que uma r vore de deri vao correspo nde a represe ntao g rfica de uma
derivao, e nto tamb m podemos definir um g ramtica amb g ua conforme indicado
a seguir.

q Definio de Gramt i ca Ambgua: uma gramtica G dita ser uma gramt i ca


ambgua se, e somente se, e xiste uma sente na L(G) que possua mais de uma
derivao esq uerda o u direita.

q Qua ndo uma gramtica amb g ua, fica dif cil decidir qual a derivao correta para
uma se ntena . Por e xemp lo, as segui ntes deri vaes so permitidas para a se nte na
1 + 2 * 2:

q Derivaes mais esq uerda:


EE+E 1+E1 +E *E 1+2* E1 +2 *2
EE*E E+E *E 1+E* E1 +2 *E 1+2* 2

q Derivaes mais direita:


EE+E E+E*E E+E*2 E +2 *2 1+2* 2
EE*E E*2 E+E* 2E +2 *2 1 +2 *2

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 6
Lingu agens Formais
q Pelas derivaes acima fica dif ci l decidir qual caminho a seguir na gerao da
sente na 1 + 2 * 2 . Assim, para a lguns casos desej vel q ue a a mbigidade de uma
gramtica seja eliminada . Is to feito rescre ve ndo-se as p rodues da gram tica de
modo a criar uma gra mtica equi va lente, mas sem a mbigidade. Entreta nto, nem
sempre isto poss vel, pois a ling uagem pode ser inerentemente amb gua .

q Definio de Lin guagem I nerentemente Ambgua: uma ling uagem dita ser
inerentemente amb gua se, e some nte se, todas as gramticas q ue a define so
amb guas .

A ling uagem L = { an bm cbm an | n , m 1 } um e xemplo de ling uagem i nere nteme nte


amb gua .

q Para o exemplo da gramtica G4, anteriorme nte descrita, seg uindo as conve nes
matemticas, verificamos q ue a r vore de derivao da Figura 2 a correta, e no a
da Figura 3 . Deste modo, devemos rescre ver as regras de produo de tal forma que a
multiplicao seja a va liada antes da adio, o q ue indicado pela no va gra mtica
G5 = (VN, VT, P, E), o nde:

VN = { E }
V T = { 1 , 2, + , * }
P = { E E + T | T, T T * F | F, F 1 | 2 }

Deve ser obser vado q ue G5 no amb gua , pois s e xiste uma nica deri vao
(esquerda e/o u direita) para a se ntena 1 + 2 * 2:

q Derivaes mais esq uerda:

E E + T T + T F + T 1 + T 1 + T * F 1 + F * F 1 + 2 * F 1+2*2

q Derivaes mais direita:

E E + T E + T * F E + T * 2 E + F * 2 T + 2 * 2 F + 2 * 2 1+2 *2

Entre ta nto, L(G4 ) = L(G5 ) e po rta nto G5 eq uiva lente a G4.

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 7
Lingu agens Formais

Hierarquia de Chomsky

q Podemos classificar as gramticas e as linguagens por elas geradas em quatro


grandes g rupos , de aco rdo com a hierarquia de Chom sky:
q Gramti cas Regulares, o u do Ti po 3 , se ndo as ling uage ns por elas geradas
denominadas de linguagens regulares ou linguagens do tipo 3;
q Gramti cas Livres de Contexto, ou do Tipo 2, sendo as ling uage ns por elas
geradas denomi nadas de linguagens livres de contexto, o u linguagens do tipo 2;
q Gramti cas Sensveis ao Contexto, o u do Ti po 1 , se ndo as li nguage ns po r e las
geradas denominadas de linguagens sensveis ao contexto, ou do linguagens do
tipo 1; e as
q Gramti cas I rrest ritas , ou Recursivamente Enumerveis , ou ainda, do Ti po 0,
sendo as ling uage ns por elas geradas deno minadas de linguagens irrestritas,
linguagens recursivam ente enum erveis, ou linguagens do tipo 0.
q Esta hierarquia definida em funo da presena ou no de certas restries,
confor me a nalisado nas p r ximas sees.
q Deve ser salientado q ue todas as linguagens regulares esto co ntidas no uni verso das
linguagens livres de contexto. Todas as linguagens livres de contexto esto contidas
no uni verso das linguagens sensveis ao contexto. E, todas as linguagens sensveis
ao contexto esto contidas no uni verso das linguagens irrestritas. A Figura 4 ilust ra
esta relao .

Tipo 0

Tipo 1

Tipo 2

Tipo 3

Fig ur a 4 : Hier ar quia de Ch o ms k y

q Definio - Gram ti cas Regulares : dada uma gram tica G = (VN, VT, P, S) , dize mos
que esta gram tica regular, o u do tipo 3, se e somente se as produes de P esto
na forma :
S A ou S

onde S, A VN e , VT, tal que . De uma maneira mais geral, uma gram tica
dita ser regular se e somente se suas produes poss uem, do lado esq uerdo, ape nas
um no-term inal e, do lado direito, um te rm inal seguido ou no de uma no- term inal.

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 8
Lingu agens Formais

q Exemplo 5 G ramti ca Regular : se ja a g ramtica G6 = (VN, VT, P, S), o nde

VN = {S, B}
VT = {a, b}
P = { S aS , S aB , B bB , B b}

Esta gramtica gera a ling uagem

L(G6) = { anbm | a ,b VT*, S a*b* e n, m > 0}

Note q ue es ta gra mtica gera se ntenas do tipo

{ ab, aab, abb, aaab, aabb, abbb, aaaab, aaabb, aabbb, abbbb, .. .}

ou se ja, todas as se nte nas geradas de vem conter pelo menos um a e um b.

q Definio - Gramt icas Liv res de Contexto: dada uma gram tica G = (VN, VT, P, S),
dizemos q ue esta gram tica l ivre de contexto, ou do tipo 2 , se e so me nte se as
produes de P esto na forma :

onde S VN e V* (lembre-se q ue V = VN VT). De uma ma neira mais gera l, uma


gramtica dita ser livre de contexto se e somente se suas produes possue m, do
lado esquerdo , apenas um no-te rm inal e, do lado direito, term inais e/ou no-
term inais, concate nados em qua lq uer o rdem.

q Exemplo 6 Gram ti ca Liv re de Contexto: se ja a gra mtica G7 = (VN, VT, P, S) ,


onde

VN = {S, A, B}
VT = {a, b}
P = { S aB , S bA , A a, A aS , A bA A , B b , B bS , B aB B }

Esta gramtica gera a ling uagem

L(G7) = { anbn | a ,b VT*, S a*b * e n > 0 }

isto , gera sente nas do tipo

{ ab, aabb, aaabbb, aaaabbbb, aaaaabbbbb, ... }

ou se ja, todas as se nte nas geradas poss uem o mes mo nmero de as e bs.

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 9
Lingu agens Formais
Obser ve q ue a g ramtica

G8 = ({S} , {a, b }, {S aSb, S ab} , S})

tambm gera se ntenas q ue co ntenha m o mesmo nmero de as e bs. Logo a


ling uagem gerada por elas a mesma, apesar das gramticas serem diferentes .
Neste caso

L(G7) = L( G8)

e, porta nto, G7 equi vale nte a G8.

q Exemplo 8 Gramti ca Livre de Contexto: outro e xemplo de gramtica li vre de


conte xto aq uela q ue lida com e xpresses arit mticas, respeitando a p recedncia
dos operadores. As regras de p roduo desta gra mtica so dadas por :

E E +T |E T |T
T T * F |F
F i d | (E)

onde id represe nta q ualq uer nmero v lido.


importante obser var q ue as gram ticas livres de contexto so mais teis
implementao de compiladores do que as gramticas regulares, j que estas
ltimas so mais restritas . Porta nto, pa ra a especificao de regras de sintaxe de
uma ling uagem so utili zadas gramticas livres de contexto, enq ua nto q ue para o
reconhecime nto de sente nas so utilizadas g ramticas regulares.

Deve-se salie ntar ainda q ue as rvores de derivao geradas por g ramticas


regulares so sempre co mpostas por deri vaes a direita, enq ua nto q ue
gramticas livres de contexto permitem deri vaes ta nto a esq uerda co mo a direita.

q Definio - G ramti cas Sensveis ao Contexto: dada uma gramtica G = (VN, VT, P,
S), dizemos que esta gram tica sensvel ao contexto, ou do tipo 1, se e somente
se as prod ues de P es to na forma :

onde V*VNV*, V* e | | | |. De uma ma neira mais geral, uma gram tica dita
ser sensvel ao contexto se e some nte se a lg uma de s uas prod ues poss ui, do lado
esquerdo, uma cadeia da forma A , a qual permite a s ubstit uio do no -term inal A
desde de que A esteja no conte xto de e . Isto , q ue a sua esq uerda ocorra um e
a sua direita ocorra um , sendo que , V* e A VN. Da o nome sensvel ao
contexto.

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 10
Lingu agens Formais

q Exemplo 9 Gramti ca Sensvel ao Contexto: seja a gramtica


G = (VN, VT, P , S), o nde:

VN = {S, A, B, C}
VT = {a, b, c }
P = { S aSBC, S aBC, CB BC, aB ab, bB bb, bC bc , cC cc }

Esta gramtica gera a ling uagem

L(G) = {anbncn | a ,b, c VT*, S a*b*c* e n > 0}

q Definio - Gramt i cas I rrestri tas: dada uma gram tica G = (VN, VT, P, S), dize mos
que esta gramtica irrestrita , ou do tipo 0, se e somente se nenhuma restrio
imposta s prod ues de P. Is to :

onde V*VNV*, V*.

q Exemplo 10 Gra mti ca I rrestri ta: se ja a gramtica G = (VN, VT, P, S) , o nde:

VN = {S, A, B}
VT = {a, b}
P = {S AB, AB BA, A a, B b}

Esta gramtica gera a ling uagem L( G) = {ab, ba} .

Prof. R ogrio Me lo Nepo mu ceno


Autmatos Fin itos 1

Introduo

q Verificamos nas sees a nteriores co mo defi nirmos uma g ramtica capa z de gerar
uma li nguagem . E nt reta nto , co nfo rme citado a nteriorme nte , podemos de finir uma
ling uagem atra vs da especificao de mecanismos para o reconhecime nto de
sente nas nes ta ling uagem, deno minados reconhecedores .
q A funo destes mecanismos s ubmete r uma se nte na da li nguagem um co njunto
de regras de aceitao, as quais verificaro se a sentena perte nce ou no
ling uagem q ue e las de finem .
q A tabela abaixo ilust ra os tipos de reco nhecedores e xiste ntes , as li nguage ns po r e les
reconhecidas e a eq ui val ncia com as gram ticas que geram tais li ng uagens .

Ta bela 1 : Ti pos de reco nhece dores


LIN GUA G ENS GR A M TICAS R EC ON HEC ED O R ES
Irres tritas Irres tritas M q u in as d e Tu rin g
Sen s v eis ao Co n texto Sen s v eis ao Co n texto M q u in a s d e Tu rin g co m mem ria limita d a
Liv res d e Co n te xto Liv res d e Co n te xto Au t ma to s d e Pilha
Reg u lares Reg u lares Au t ma to s Fin ito s

q As Mquinas de Turi ng e as Mquinas de Turi ng com memria limitada, no sero


estudadas neste te xto. O aluno , poder enco ntr- las em q ualq uer livro de Ling uagens
Formais e Autmatos .

Autmatos Finitos

q Definio Formal: um autmato de estado f inito M, o u simplesmente autmato


finito , uma q untup la orde nada M = (Q, , , q0 , F), onde:

q Q : representa um conjunto fi nito e no va zio, Q , de nominado conjunto de


estados;

q : representa um co njunto finito e no va zio, , de todos os smbolos


aceitos pelo a utma to, denomi nado al fabeto do autmato;

q : representa uma fun o de transi o de estados do autmato, a qual


mapeia Q x em Q, isto (Q x ) Q, ou seja , para cada par
(estado, s mbolo de entrada ) esta funo for nece um novo estado q Q para
qual o a ut mato de ver mo ver-se , o qua l deno minado confi gura o de M;

q q0 : representa o estado ini cial , com q0 Q, ou seja , o estado no q ua l o


autma to de ver iniciar;

q F : representa um co njunto finito de esta dos f inais o u estados de a ceita o,


com F Q, Is to , esta ndo o a utmato em um estado q , q Q, e um for lido
(nor malmente inte rpretado como o fim da sente na ou o fim do arqui vo), o
autma to de ver parar, se ndo a se ntena ace ita pelo a ut mato.
Autmatos Fin itos 2

q Graficame nte , podemos representar um a utmato finito Figura 1.

q Por exemp lo, o a utmato finito M1 = (Q, , , q0 , F) Fita de entrada


a seguir reconhece sente nas do tipo
{a, aba, ababa, abababa, ...}, isto sente nas da ... 0 1 0 0 0 1 0 1 0 1 ...
ling uagem L = {a(ba)n | a, b , n 0}, onde: Cabea de leitura

Q = {1, 2} Controle
Finito
= {a, b}
= {(1, a) = 2 , (1, b) = 3 , (2, a ) = 3 , (2, b ) = 1, Figura 1: Representao de um
(3, a) = 3 , (3, b) = 3} autmato finito
q0 = 1
F = {2}

q O autmato M1 ta mbm pode ser vis uali zado pelo


a
diagrama de tra nsio da Figura 2.
q Linguagem Ace ita: se A o co njunto de todas as 1 2
sente nas aceitas pelo a utma to M , ento di zemos
que A a linguagem reco nhecida por este autmato , b b a
o qua l de notamos por L( M) = A, isto :
L(M) = { | (q0 , ) = F }. 3

q O diagrama de transio da Figura 3 reconhece a


ling uagem L( M2 ) = {(ab)n (a| ) | n 0}, sendo
M2 = (Q, , , q0 , F), onde : a, b

Figura 2: Diagrama de estados do


Q = {1, 2} autmato finito M 1 .
= {a, b}
= {(1, a) = 2 , (2, b) = 1}
q0 = 1
F = {1, 2} a

q Obser ve pela Figura 2 e Fig ura 3 q ue apesar de M1 e 1 2


M2 parecere m iguais, L( M1 ) L( M2 ) .
b b a
q Ambos os aut matos, M1 e M2 , so determ inst i cos
(AFD). Entreta nto, podemos cons tr uir tambm 3
autma tos finitos no deter minst i cos (AFN),
bastando para isto altera rmos um po uco a
especificao formal.
a, b

Figura 3: Diagrama de estados do


autmato finito M 2 .
Autmatos Fin itos 3

Autmatos Finitos No Determinstico

q Definio Forma l de AFN: um autma to fini to no deter mins ti co (AFN) M, uma


qunt upla o rdenada M = ( Q, , , q0 , F), o nde:

q Q, , q0 e F so id nticos ao AFD;

q : a funo de tra nsio a qual mapeia Q x ( { })1 em 2Q, isto


(Q x ( { })) 2Q, ou seja, para cada par (es tado, s mbolo de entrada ) esta
funo for nece um novo conjunto de estados {q1 ,...,qn} Q para qual o autmato
poder se mo ver .

q Basicamente, podemos dizer q ue um a utma to :


q Determinst ico (AFD): se a partir de qualquer
estado e para cada um dos smbolo de entrada for b
possve l deter minar uma nica funo de
transio a ser aplicada. Note, porta nto, q ue a q0 q1
definio for mal de bem definida.
a
q No Determinsti co ( AFN): se a par tir de q ualq uer a b
estado existir mais de uma funo de transi o q2
possve l de se r aplicada para o mes mo smbolo de
entrada, o u e xistir tra nsies vazias o u no Figura 4: Diagrama de Estado
definidas, co nfor me ilust rado pelos diagramas da para o autmato M 3 .
Figura 4 e Figura 5 .
q Os diagramas de estados indicados pela Figura 4 e Figura 5, correspo ndentes aos
AFNs M3 e M4 , reco nhecem a mes ma li ng uagem, isto , L = { * | = {a, b} e
fo r mada por zero o u ma is co mb inaes da s cade ias ab e a ba}. Porta nto, M3 eq uiva lente a
M4 .

q Um AFD M5 , o qual tambm reco nhece a ling uagem L acima, indicado pela Figura
6. No te q ue tanto M3 co mo M4 so mais facilme nte obtidos do q ue M5 .

a a

a b a
q0 q1 q0 q2
q1 q3

a
b b b b
a
q2 q4
a b

Figura 5: Diagrama de Estado


para o autmato M 4 . Figura 6: Diagrama de Estado para o
autmato M 5 .

1
( {}) tamb m re pres entad o po r .
Implemen tao de Au tmatos Finitos 1

Introduo

q Um autmato fi nito pode ser


facilme nte impleme ntado em
digitos
qualq uer ling uagem de digitos
digitos
digitos
.
programao. A seg uir
analisamos uma imple mentao 1 2
3 4
em portugus estruturado para
um a utmato q ue reco nhece dgitos = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
nmeros inteiros e reais. O
Figura 1: Diagrama de estados para reconhecimento de
diagrama de transio dado
nmeros inteiros e reais.
pela Figura 1 , o q ual correspo nde
ao autma to
M1 = (Q, , , q0 , F), o nde:

Q = {1, 2, 3, 4}
= {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, .}
= {(1, digit o) = 2, (2, dig it o) = 2, (2, .) = 3, (3, dig it o) = 4, (4, dig it o) = 4}
q0 = 1
F = {2, 4}

q A funo Ler(Entrada) presente no p rograma tm co mo objeti vo ler um caracter


da cadeia Entrada, retorna ndo-o. A f uno EOF(Entrada) tm como objetivo
verificar se a cadeia Entrada foi toda percorrida, re tor na ndo Verdade, caso
afirmativo , e Falso, caso contrrio. J a f uno Mostre(Msg) permite mostrar a
mensagem dada por Msg na te la do co mp utador.

Procedimento Automato(Declare Entrada como String)


Rtulos 1, 2, 3, 4, Fim, Erro
Dgito = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
Declare C como Caracter
Incio
1: C <- Ler(Entrada)
Se C for um Digito, ento v para 2
Seno v para Erro
2: C <- Ler(Entrada)
Se C for um Digito, ento v para 2
Seno
Se C = ., ento v para 3
Seno Se EOF(Entrada) = Verdade, ento v para Fim
Seno v para Erro
3: C <- Ler(Entrada)
Se C for um Digito, ento v para 4
Seno v para Erro
4: C <- Ler(Entrada)
Se C for um Digito, ento v para 4
Seno
Se EOF(Entrada) = Verdade, ento v para Fim
Seno v para Erro
Fim: Mostre(Sentena reconhecida)
Termine o programa
Erro: Mostre(Sentena no reconhecida)
Fim
Implemen tao de Au tmatos Finitos 2

q Existem o ut ras formas de imp leme ntar este a utmato se m se utiliza r o coma ndo V
Para (conhecido na maioria das linguagens por Goto), o que para muitos fere a
essncia da programao estr ut urada. A seguir ilus trado um programa estr ut urado.

Procedimento Automato(Declare Entrada como String)


Declare C como Caracter
E como Inteiro
Erro como Lgico
Incio
C <- Ler(Entrada)
E <- 1;
Erro <- Falso
Enquanto NO EOF(Entrada) e NO Erro Faa
Caso E seja
1: se C um dgito, ento E <- 2
Seno Erro <- Verdade
2: se C um dgito, ento E <- 2
Seno
Se C = ., ento E <- 3
Seno Erro <- Verdade
3: se C um dgito, ento E <- 4
Seno Erro <- Verdade
4: se C um dgito, ento E <- 4
Seno Erro <- Verdade
Fim Caso
C <- Ler(Entrada)
Fim Enquanto
Se Erro OU ((E <> 2) E (E <> 4)), ento
Mostre(Sentena no reconhecida)
Seno Mostre(Sentena reconhecida)
Fim
Implemen tao de Au tmatos Finitos 3

Tabelas de Transio para Autmatos Finitos


q Uma forma a lte rna tiva de represe ntao de autma tos fi nitos feita pelo uso de
tabelas de transio.
q Tais tabelas relacio nam em suas linhas todas as poss veis tra nsies efet uadas por
todos os smbolos reco nhecidos pelo autmato . Enq ua nto que cada coluna representa
o estado atual, o sm bolo aceito pelo estado, o novo estado para o qua l o autma to
dever se mo ver aps reconhece r tal s mbolo e um ndice para a linha da tabela o nde
se inicia a relao de e ntradas para o no vo estado.
q A Tab ela 1 ilus tra uma tabe la de tra nsio para o diagrama da Figura 1, pass ve l de ser
implementada em um co mputador.
Ta bela 1 : Ta bela de tra ns io par a rec on hecime nt o de n meros
Lin h a Es tad o Smb o lo A tu al Pr ximo Es tad o Pr ximo Lin h a
1 1 0 2 11
2 1 1 2 11
3 1 2 2 11
4 1 3 2 11
5 1 4 2 11
6 1 5 2 11
7 1 6 2 11
8 1 7 2 11
9 1 8 2 11
10 1 9 2 11
11 2 0 2 11
12 2 1 2 11
13 2 2 2 11
14 2 3 2 11
15 2 4 2 11
16 2 5 2 11
17 2 6 2 11
18 2 7 2 11
19 2 8 2 11
20 2 9 2 11
21 2 . 3 22
22 3 0 4 32
23 3 1 4 32
24 3 2 4 32
25 3 3 4 32
26 3 4 4 32
27 3 5 4 32
28 3 6 4 32
29 3 7 4 32
30 3 8 4 32
31 3 9 4 32
32 4 0 4 32
33 4 1 4 32
34 4 2 4 32
35 4 3 4 32
36 4 4 4 32
37 4 5 4 32
38 4 6 4 32
39 4 7 4 32
40 4 8 4 32
41 4 9 4 32
Implemen tao de Au tmatos Finitos 4

q Para implementarmos esta tabe la, e m Pascal, po r e xemplo , primeirame nte de ve mos
declarar s ua estr ut ura , que pode ser do tipo a seguir, assumi ndo que o nmero de
tra nsies seja dado pe la co nsta nte NoTransicao:

Type
TTab = record of
Estado: integer;
Simbolo: char;
Proximo: integer;
Indice: integer;
End;
TTabela = array[1..NoTransicao] of TTab;

q Agora basta declara rmos a tabela co nfor me indicado a seg uir:

Var
Tabela: TTabela;

q Outro c uidado a ser tomado a decla rao de um arra y co nte ndo todos os estados
finais. Isto pode se r feito da segui nte for ma, ass umindo q ue o nmero de es tados
finais seja dado pela co ns tante NoFinais:

Type
TFinais = array[1..NoFinais] of integer;
Var
Finais: Tfinais;

q Um e xemp lo des ta tabe la para o diagrama da Figura 1 dado abaixo :

Linha Est ado F ina l


1 2
2 4

q A partir da tabela de transio, a qual dever ser previame nte pree nc hida, tomando -se
o cuidado de s ua primeira linha se r o es tado inicial, podemos escre ver o seg uinte
procedimento, o q ua l verificar se uma sente na aceita ou no pelo a utma to q ue
ela defi ne:
Implemen tao de Au tmatos Finitos 5

Procedure Automato( Tabela: TTabela, // Tabela Transio


Finais: TFinais, // Estados Finais
Entrada: String);// Sentena
Var E: integer; // Estado atual
I: integer; // Prxima linha
C: Char; // Smbolo lido
Erro: Boolean; // Indica a ocorrncia de um erro
Begin
I := 1;
E := Tabela[I].Estado;
C := Ler(Entrada);
Erro := False;
While not EOF(Entrada) and not Erro do Begin
While true do begin
If C = Tabela[I].Simbolo then
Begin
E := Tabela[I].Proximo;
I := Tabela[I].Indice;
Break;
End
Else
I := I + 1;
If (I > NoTransicao) or
(E <> Tabela[I].Estado) then
Begin
Erro := True;
Break;
End;
End;
C := Ler(Entrada);
End;
If Erro or not Final(Finais, E) then
write(Sentena no reconhecida)
else write(Sentena reconhecida);
End;

q Neste programa , as tabela de tra nsio, Tabela, e de estados finais, Finais,


recebida como parmetro, de ve ndo, por ta nto, terem sido montadas anteriorme nte . A
funo Final(Finais, E) verifica se o estado dado por E um estado final ou
no, reto rna ndo True ou False, respectivame nte .

q Obviame nte q ue poder amos co nst ruir uma tabela utili zando uma lista de estados de
tra nsio, onde cada e nt rada na tabela cor responderia a um estado co m s uas
corresponde ntes tra nsies. Ta l es tr ut ura poderia ser represe ntada por :

Type
PTab = ^TTab;
TTab = record of
Simbolo: char;
Estado: integer;
Next: PTab;
End;

TTabela = array[1..NoEstados] of PTab;


Implemen tao de Au tmatos Finitos 6

q Neste caso, Simbolo seria o smbolo a ser reconhecido pelo estado, Estado seria o
no vo estado para a tra nsio e Next seria um po nteiro para o pr ximo s mbo lo
reconhecido pelo estado atual. Ob viamente, TTabela seria uma tabela com um
ponteiro para uma lista de s mbolos reco nhecidos pelo estado. No vame nte, o estado
inicial correspo nderia a primeira linha da tabe la.
q A Tabe la 2 abaixo ilustra uma co nfig urao para o digrama de es tados da Figura 1. A
Figura 2 ilus tra a co nfigurao de me mria para es ta tabe la.

Ta bela 2 : Ta bela de po nteir os par a es ta dos de tr ans io para o recon hecime nt o de n meros

Linha / Estado Smbo los Prximo


Reco nhec idos Est ado
1 0..9 2
2 0..9 2
. 3
3 0..9 4
4 0..9 4

1 02 12 2 2 3 2 42 52 6 2 72 82 92

2 . 3 02 1 2 2 2 32 42 5 2 62 72 82 9 2

3 0 4 14 2 4 3 4 44 5 4 64 74 8 4 94

4 0 4 14 2 4 3 4 44 5 4 6 4 74 8 4 94

Fig ur a 2 : C onfig ur a o da me mria par a u ma t a bel a de tr ans io


Compiladores 1
Anlise Lx ica

Funes da Anlise Lxica


q O analisa dor lxi co a par te do compilador respo ns vel po r ler cada um dos
eleme ntos da sente na de entrada, neste caso, o programa fonte, e tra nsfo rm- los em
uma rep resentao conve niente para o analisa dor sintt i co: uma seq ncia fi nita de
itens lx icos .
q I tem Lxico Token: um i tem lxi co, o q ual norma lme nte c hamado tambm de
token, uma unidade bsica do texto correspo nde nte ao programa fo nte, se ndo,
norma lme nte, representado i nter name nte pelo ana lisador lxico po r t rs i nfor maes:
q Classe: classificao lxica do token identificador (sentena q ue se inicia por
uma let ra seg uida por q ualq uer combinao de le tras e d gitos) , constan te inteira,
constante real, palavra reservada, operador aritm tico, sm bolo, cadeia de
caracteres (cadeia de caracteres delimitada por aspas o u apstro fe), dentre
out ros.
q Valor - Lexema: corresponde ao valo r l xico do token, o qual depe nde da classe.
Pode ser de dois tipos:
q Tokens Simples: so tokens q ue no poss uem a rgume ntos, pois a s ua c lasse
j o define comp letame nte . So exemp los: operadores matemticos,
relacionais, lgicos e de a tribuio, s mbo los.
q Tokens com Argumento: so tokens que poss uem um valo r associado.
Correspondem aos e leme ntos da ling uagem defi nidos pelo progra mador, co mo
por exemplo , os identificadores, as cons tantes numricas e cadeias de
caracteres. Por e xe mplo, para um token do tipo cons ta nte num rica, o valor
pode ser o nmero inteiro represe ntado pela co nsta nte, e nq uanto que pa ra
identificadores, o valor pode ser a seqncia de caracteres ou um po nteiro para
uma tabela de s mbolos.
q Posio: identifica a loca lizao do toke n no prog rama fonte, o q ue co nstit ui uma
informao importa nte para o processo de cor reo de er ros.
q Exemplo: seja a gram tica indicada a seg uir:

G1 = (VN, VT, P, S)

onde:

VN = {E, T, F, I, N}
VT = { +, - , *, / , (, ), 0 .. 9, a .. z, A .. Z }
S = {E}
P={ ET+E|T-E|T
TF*T|F/T|F
F I | N | (E)
I I a | ...| I z | I 0 | ... | I 9 | a | ... | z
N N 0 | ...| N 9 | 0 | ... | 9 }

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 2
Anlise Lx ica

Obser ve que a p roduo I permite cons tr uir se nte nas q ue se iniciam por uma let ra
seguida por qualq uer combi nao de letras e d gitos os identi fi ca dores. A
produo N permite a constr uo de sente nas compostas por qua lque r combinao
de dgitos as constantes inteiras. Por exe mplo, so identificadores as seguintes
cadeias: X, Codigo, B54, C1A, C2a5, etc. E so constantes inteiras as seguintes
cadeias: 1, 0800, 1054, 125, e tc.

Se abstrairmos os identificadores pela palavra i d e os nm eros inteiros pela palavra


num, ento podemos reescre ver a gram tica acima como:

G2 = (VN, VT, P, S)

onde:

VN = {E, T, F }
VT = { +, - , *, / , (, ), i d, num }
S = {E}
P={ ET+E|T-E|T
TF*T|F/T|F
F i d | num | ( E ) }

Obser vando esta gra mtica, co nclumos que e la nos per mite cons tr uir e xpresses
aritmticas, com o u sem par nteses, e nvo lvendo as operaes de soma , s ubtrao ,
multiplicao e diviso entre operandos deno minados genericame nte de i d
(identificadores) e num (constan tes inteiras). Estas e xpresses so nor malme nte
enco ntradas na maioria das ling uagens de prog ramao.

Portanto, por es ta gram tica podemos evide nciar os segui ntes tokens: operadores
aritmticos e par nteses ( tokens simples) , id e num (toke ns co m arg umento).

Funcionamento do Analisador Lxico


q Podemos considerar o analisador lxi co como sendo uma rotina c hamada pe lo
analisador sintt i co. A cada chamada, a rotina l uma cadeia de caracteres e a
interpre ta, devo lve ndo o token correspo ndente.
q Exemplo: para a sente na de e ntrada: A * (C1a + 25) ; o analisador lxico devolveria
os segui ntes tokens:

Chamada Cadeia lida (Lexem a) Classe l xica


1 A Identificador
2 * Operador de M ultiplicao
3 ( Parntese Esquerdo
4 C 1a Identificador
5 + Operador de Adio
6 25 Constante Num rica
7 ) Parntese Direito

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 3
Anlise Lx ica

q Conve ncio nando q ue as classes so representadas pelos tipos: cI d (ide ntificador),


cNum (co nsta nte inteira), cA dd (operador de adio), cSub (operador de s ub trao),
cM ul (operador de multiplicao), cDiv (operador de Diviso), cLPar (parntese
esquerdo) , cDPar (parntese direito); ao ser chamado, o analisador l xico poderia
devolve r os seg uintes tokens :

Chamada Classe l xica Valor (o u Le xema )


1 cId A
2 cM ul
3 cLPar
4 cid C1a
5 cAdd
6 cNum 25
7 cDPar

q importante dize r q ue uma c lasse l xica pode represe nta r vrios ite ns l xicos, e no
apenas um. Por e xemp lo, se nossa gram tica supor tasse os operadores relacio nais:
=, >, <, >= e <=; poder amos identific-los pe la classe cRel.
q Aps ter definido quais so os tokens que constit uem a ling uagem a ser tratada, a
implementao do ana lisador l xico pode ser iniciada. Podemos implement- lo de
dois modos: como um simulador de aut mato fi nito ou e xpresses reg ulares , ou
ainda, uti liza ndo um gerador de a nalisadores l xicos, como o LEX, por e xe mplo.
q Ao lado enco ntra-se i ndicado um
diagrama de estados
corresponde nte a um autm ato
finito para reconhecime nto dos
identificadores, nmeros , e
demais smbolos utilizados pe la
maioria das ling uage ns de
programao. No diagrama,
podemos identificar os seguintes
eleme ntos: letras (l), d gitos (d) ,
caracter (c) e o utros s mbolos .
Os itens ro t ulados por ai
correspondem s aes
desempenhadas pelo analisador
lxico, co mo por e xemplo , a
identificao de palavras
reservadas, b usca e insero de
identificadores na tabela de
smbolos, de ntre o utras aes
que se julgue necessrias.

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 4
Anlise Lx ica

Expresses Regulares
q Toda linguagem regular pode ser descrita por uma expresso regular, a q ual
definida a partir de operaes regulares sobre co njuntos.
q Uma e xpresso reg ula r R sobre um a lfabe to , a qua l represe nta a ling uagem L(R) ,
indutiva mente defi nida por:
1. uma exp resso reg ula r e de no ta a lin guagem va zia;
2. uma exp resso regular , a q ual de nota a ling uagem co nte ndo e xc lusi vame nte a
palavra va zia, o u se ja, { };
3. Qua lq uer s mbolo a uma expresso reg ula r, a q ual de nota a li nguagem
conte ndo a pala vra unit ria a, o u seja , {a };
4. Se R uma e xpresso regular , e nto (R) tambm uma e xp resso reg ula r;
5. Se R1 e R2 so expresses reg ulares , e nto (R1 R2) uma e xpresso regular
sendo ta mbm de notada po r (R1 + R2) ou (R1 | R2) a q ua l de nomi nada de
operao de unio;
6. Se R1 e R2 so expresses regulares , e nto (R1R2) uma e xpresso reg ular a
qual de nominada de operao de co ncate nao;
7. Se R uma expresso reg ula r, e nto (R*) uma e xpresso reg ular a qua l
denominada de operao est rela de Klee ne.

q Precedn cia dos O pera dores Regula res: os parnteses das e xp resses reg ula res
podem ser re mo vidos, desde q ue respeitado as precedncias:

1. Estrela de Kleene ;
2. Concate nao;
3. Unio.

q Exemplo: as e xpresses reg ula res a seg uir geram a c lasse de nmeros i nteiros,
nmeros reais e identificadores, o nde letra = {a,.. ., z} e digito = {0,.. .,9} .
q I dentifi ca dores: letra (letra | digito)*
q Nmeros I nteiros: digito digito*
q Nmeros Reais: digito* . digito digito*

q A seguir ilustrada a imp leme ntao de um reconhecedor para nmeros e um pa ra


identificadores, utiliza ndo como modelo as e xpresses regulares indicadas pelo
exemp lo acima.

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 5
Anlise Lx ica

Reconhecimento de Nmeros
q Os tipos de nmeros podem ser i nteiros o u reais, o nde ambos sero cadeias de
dgitos , se ndo que os reais conte ro o ponto decimal em a lg um lugar da cadeia.
Assim, sero nmeros as seg uintes cadeias: 1, 1054, 5 .25, .25 , 0.125 , etc .
q A implementao para este reco nhecedor indicada a seg uir, o nde as c lasses cI nt e
cReal rep resentam nmeros i nteiros e reais, respectivame nte.

Rotina Numero
Declare Lexema como String
Inicio
Lexema =
Enquanto CARACTER um DGITO faa
Lexema = Lexema + CARACTER
LER um novo CARACTER
Fim Faa
Token.Classe = cInt
Se CARACTER um PONTO DECIMAL ento faa
Lexema = Lexema + CARACTER
LER novo CARACTER
Se CARACTER um DGITO ento
Enquanto CARACTER um DGITO faa
Lexema = Lexema + CARACTER
LER novo CARACTER
Fim faa
Token.Classe = cReal
Seno
Ocorreu um Erro Lxico Falta parte decimal
Fim Se
Fim Se
Token.Valor = Valor(Lexema)
Fim

q Na roti na acima considerado que a va rivel Token seja pblica ao programa . A


operao: Lexema = Lexema + CARACTER; indica a concate nao e a operao :
Token.Valor = Valor(Lexema); indica a converso do tipo stri ng para o seu
corresponde nte inteiro o u real, depende ndo da c lasse especificada.
q A rotina acima le r a se ntena de e nt rada, ca racter por carac ter, e e nq ua nto os
caracteres forem d gitos , ela os conca tena r juntos em Lexema. A primeira etapa da
rotina p ra q ua ndo for detectado um carac ter disti nto de d gito. Se este caracter for
um po nto decimal, e le ser conca tenado em Lexema, juntame nte com os pr ximos
possveis d gitos. A ausncia de caracteres na seq ncia de entrada tomada como
uma seq ncia de caracteres do tipo espao em branco, portanto, a ro tina acima
parar tamb m q ua ndo e ncontrar um espao em b ranco .

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 6
Anlise Lx ica
q Um reco nhecedor comp leto para nmeros de ver reconhecer nmeros reais e
inteiros, precedidos ou no de sinal, e nmeros em represe ntao cient fica ( na for ma
expo nencial).

Reconhecimento de I denti fi ca dores


q Como citado anteriorme nte , identificadores so cadeias de letras e d gitos desde q ue
comeando por uma let ra.
q Uma ve z q ue no pe rmitimos q ue o ut ro caracte r q ue no seja le tra o u d gito
componha um identificador, nosso reco nhecedor ficar mais simples, como ser visto
a seguir.

Rotina Identificador
Declare Lexema como String
Inicio
Lexema =
Enquanto CARACTER uma LETRA ou um DGITO faa
Lexema = Lexema + CARACTER
LER novo CARACTER
Fim Faa
Se Lexema uma Palavra Reservada ento
Token.Classe = Classe_da_Palavra_Reservada
Seno
Token.Classe = cId
Fim se
Se Lexema no est na Tabela de Smbolos ento
Inseri-lo na Tabela, juntamente com sua Classe
Fim se
Token.Valor = Endereo do item na Tabela de Smbolos
Fim

q Esta rotina ficar le ndo os caracteres da sente na de ent rada, um a um, at q ue


enco ntre um carac ter q ue no se ja letra ou d gito. No te q ue, ta nto es ta ro tina co mo
aquela que reco nhece os nmeros ter mina com um caracter que no foi usado, assim,
devemos tomar c uidados para q ue os re tor nos das ro tinas se jam co mpat veis com as
sadas dos mesmos .
q comum , nas li ng uagens de prog ramao, a e xist ncia de identificadores q ue
pertence m gra mtica e tm se u uso reser vado para contro lar o co mpilador - so as
palavras reservadas (key words) . Esses identificadores devem ser enca rados pelo
analisador lxico como s mbolos prprios da gra mtica. Por tanto, o q ue norma lme nte
se fa z co ns ultar uma Tabela de Palavras Reserva das, para verificar se o
identificador recenteme nte reco nhecido no , na verdade, uma palavra reservada
que, por isso, ter um cdigo inter no prprio. Por e xemp lo, no Pascal, as seg uintes
palavras so reser vadas: const, type, var , begin, end, while, do, for , do wnto , if, then,
else, case, of , ar ray, function, procedure, label, record, exit, b reak, con tinue.

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 7
Anlise Lx ica
q Outro prob lema similar o de difere nciar identificadores j definidos, e ntre eles os
identificadores de nomes de variveis inteiras, reais, booleanas , comple xas, etc ., dos
identificadores no definidos. fcil notar q ue o cdigo interno para um identificador
de varive l inteira deve ser difere nte do de uma varive l real, e assim por diante. Essa
distino pode ser feita a tra vs da co ns ulta a uma tabela , de nominada Tabela de
Smbolos, onde estaro as infor maes, nos c hamados des cr itores, acerca das
vari veis.

Juntando as Partes
q Os dois mdulos i ndicados anteriorme nte podem ser combinados at ra vs de um
mdulo pri ncipal, nes te caso, o md ulo do anal isador lx ico .
q No ana lisador l xico podemos incluir recursos adicionais, como, por exe mplo , eliminar
os espaos em bra nco, e liminar co me ntrios e efe t uar a co ntagem de li nhas. A roti na
a seguir ilust ra como seriam combinados os mdulos discutidos anteriorme nte , e
como eliminar os espaos em b ra nco e os s mbo los especiais, que por ve nt ura
ocorram no p rograma fo nte.

Rotina Lexico
Declare Lexema como String
Espao so os caracteres ASCII menor ou igual a 32
LF o caracter ASCII 10
Inicio
Lexema =
Enquanto o Caracter Espao e no Fim de Arquivo faa
Se o CARACTER um LF ento
Incremente o Contador de Linha
Fim Se
LER um novo CARACTER
Fim Enquanto
Se o Caracter um DGITO ento
Chame Numero
Seno
Se o Caracter uma LETRA ento
Chame Identificador
Seno
Se for Fim de Arquivo ento
Token.Classe = Fim de Arquivo
Seno
Ocorreu um Erro Lxico - caracter no reconhecido
LER um novo CARACTER
Chame Lxico e Retorne
Fim Se
Fim

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 1
Geradores de Analisadores Lx icos

Introduo
q Conforme verificado, poss vel escre ver um a nalisador l xico a par tir da
especificao de um aut mato fi nito o u de expresses regulares. E nt reta nto ,
para ling uage ns mais comple xas , essa estra tgia de impleme ntao
ext remame nte t rabalhosa.
q Para simplificar esta ta refa, diversas fer rame ntas de apoio fora m desenvo lvidas.
Uma dessas ferrame ntas os geradores de a nalisadores l xicos, q ue
automa tiza m o processo de criao do autmato e o processo de
reconhecime nto de sente nas regulares a partir da especificao das
expresses regulares co rrespo ndentes.
q Uma das fer rame ntas mais tradicionais dessa classe o programa Lex,
originalme nte desenvo lvido para o sistema operacional Uni x. O objeti vo de Lex
gerar uma roti na para o analisador lxico (s canner) em C a partir de um arquivo ,
conte ndo a especificao das expresses regulares e t rec hos de cdigo C que
sero exec utados q uando sente nas daq uelas exp resses fo rem reconhecidas.
q Atualme nte h diversas imp leme ntaes de Lex para diferentes sistemas, assim
como ferra mentas similares q ue t rabalham co m o utras ling uage ns de
programao. Por exe mplo, o FLex uma variao do Lex, prod uzido pelo
GNU, o qual tambm gera cdigo C. J o JLex uma variao q ue gera cdigo
Java. Ainda h va riaes em Pascal, C++ , de nt re o ut ras.

Especificao das Sentenas Regular es


q O ponto de partida para a criao de um analisador l xico, usa ndo Lex, criar o
arqui vo com a especificao das e xpresses reg ulares q ue descre ve m os itens
lxi cos que so aceitos. Este arq uivo composto por at trs sees, as q uais
so separadas pelo s mbolo % % .
q Declara es: Esta a primeira seo a ser declarada . ne la q ue se
enco ntra m as dec laraes de va riveis, de cons ta ntes ma nifestas e de
definies reg ulares a sere m usadas pelas regras de t raduo .
q Regras de Tradu o: Esta a segunda seo a ser declarada. Nela
enco ntra m-se especificadas as expresses reg ula res vlidas e as
corresponde ntes aes do programa . Cada regra expressa na for ma de
um par:
Padro { Ao }
onde Padro uma expresso reg ula r que pode ser reco nhecida pelo
analisador l xico gerado e Ao um fragmento de programa descreve ndo
que ao o ana lisador l xico dever tomar q ua ndo ta l e xpresso
reconhecida. Para a descrio do Padro, Lex define uma li ng uagem para
descrio de expresses regulares, co nfor me ser analisado a seguir. J
para a Ao, estas so descritas em C; e ntre ta nto, q ualq uer outra li nguagem
pode ser utili zada.

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 2
Geradores de Analisadores Lx icos
q Procedimentos Auxiliares : Esta a terceira e ltima seo do arqui vo de
especificao. Nela so colocadas as definies de procedimentos
necessrios para a realizao das aes especificadas ou auxiliares ao
analisador l xico

Linguagem de Especificao de Padres


q A descrio de um padro em Lex feita por meio de uma linguagem para
descrio de expresses reg ulares. Esta li ng uagem utili za a no tao para
expresses reg ulares , j definidas anteriorme nte , e acrescenta alg umas
modificaes e extenses , co nfo rme i ndicadas pela tabela.

. Todos os ca racteres, e xceto o a va no de linha


Denota uma classe de cara cteres a ser reco nhecida
[abc]
corresponde e xpresso reg ular (a | b | c)
Denota uma classe de cara cteres a ser reco nhecida, a q ual
[a-f] composta pela faixa de a f corresponde a expresso reg ula r
(a | b | c | d | e | f)
Denota uma classe de cara cteres ne gada , isto , qua lq uer carte r
[^abc]
exceto a, b o u c
R+ Uma o u mais ocorr ncias da e xpresso reg ular R
R? 0 ou uma ocor rncia da e xpresso reg ular R
R{4} Exatame nte q uatro ocorr ncias da e xpresso regular R
R{2,} Pelo me nos d uas ocor rncias da exp resso reg ula r R
R{2,4} Entre d uas e q uat ro ocor rncias da e xp resso reg ula r R
^R A expresso regular R ocorre ndo ape nas no i ncio de uma linha
R$ A expresso regular R ocorre ndo ape nas no fina l de uma linha
<<EOF>> Fim de arqui vo

q Como exemp lo, ve jamos a especificao das definies reg ulares para
identificadores e nmeros :

ID [A-Za-z] ([A-Za-z] | [0-9])*


NUM [0-9]+ (\. [0-9]+)?

Obser ve na defi nio de NUM a utilizao de \.. A utili zao do s mbolo de


escape \ necessria para que o Lex no co nf unda o carac ter ., o q ua l
dever se r reco nhecido, com a c lasse de todos os carac teres.

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 3
Geradores de Analisadores Lx icos

Exemplo de Especificao de Sentenas


q O e xemp lo a seg uir ilus tra a criao de um arq uivo de e nt rada para o Lex, o q ua l
dever reconhecer identificadores e nmeros .

/* seo de declarao */
%{
/* declarao das constantes manifestas */
#define ID, NUM
%}
/* declarao das definies regulares */
letra [A-Za-z]
digito [0-9]
id {letra} ({letra} | digito})*
num {digito} + (\. {digito}+)? (E[+\-]? {digito}+)?
%%
/* seo de regras de traduo */
{id} {yylval = instalar_id(); return (ID);}
{num} {yylval = instalar_num(); return (NUM);}
%%
/* procedimentos auxiliares */
instalar_id() {
/* procedimento para instalar o lexema, cujo primeiro
caractere apontado por yytext e cujo comprimento
dado por yyleng, na tabela de smbolos e retornar um
apontador para o mesmo
*/
}

instalar_num() {
/* procedimento similar para instalar um lexema que seja
um nmero
*/
}

q Obser vando o programa identificamos alg uns eleme ntos aos quais devemos
analisar :
1. Na seo de declaraes, todo o te xto e nvolvido por %{ e %} ser copiado
integra lme nte pa ra o a rqui vo de sa da gerado;
2. Aps a especificao de uma defi nio regular , como letra, por e xemplo ,
ao nos referirmos a ela deve remos envo lv-la por c ha ves, co nfor me pode ser
observado em {letra};
3. A varive l yylval uma varive l pb lica, a qua l tambm de ver fig urar no
analisador si nt tico, q ue per mite re tor nar o item reconhecido;
4. As variveis yytext e yyleng permitem, respectivame nte, identificar no
texto a posio do primeiro s mbo lo e o comprime nto do le xema reco nhecido.
q O prximo e xemplo aprese nta uma especificao mais completa, a qual
reconhece tambm os operadores relacionais.

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 4
Geradores de Analisadores Lx icos
/* seo de declarao */
%{
/* declarao das constantes manifestas */
#define LT, LE, EQ, NE, GT, GE, IF, THEN, ELSE, ID, NUM, RELOP
%}
/* definies regulares */
delim [ \t\n]
ws {delim}+
letra [A-Za-z]
digito [0-9]
id {letra} ({letra} | digito})*
num {digito} + (\. {digito}+)? (E[+\-]? {digito}+)?
%%
/* seo de regras de traduo */
{ws} {/* nenhuma ao e nenhum valor retornado */}
if {return (IF);}
then {return (THEN);}
else {return (ELSE);}
{id} {yylval = instalar_id(); return (ID);}
{num} {yylval = instalar_num(); return (NUM);}
"<" {yylval = LT; return (RELOP);}
"<=" {yylval = LE; return (RELOP);}
"=" {yylval = EQ; return (RELOP);}
"<>" {yylval = NE; return (RELOP);}
">" {yylval = GT; return (RELOP);}
">=" {yylval = GE; return (RELOP);}
%%
/* procedimentos auxiliares */
instalar_id() {
/* procedimento para instalar o lexema, cujo primeiro
caractere apontado por yytext e cujo comprimento
dado por yyleng, na tabela de smbolos e retornar um
apontador para o mesmo
*/
}
instalar_num() {
/* procedimento similar para instalar um lexema que seja
um nmero
*/
}

Ger ando o Analisador Lxico


q Aps ter criado o arquivo conte ndo as especificaes de entrada, nor malmente
um arq ui vo de exte nso .l, basta executarmos o Lex, especificando o nome
deste arq uivo . Como sa da ser gerado um arq ui vo de nome lex.yy.c, o qua l
dever se r poste riormente modificado, se necessrio, e compilado.
q O ponto de entrada para o analisador l xico a funo yylex(), a qual qua ndo
chamada ana lisar o arqui vo de ent rada, especificado pela varive l global yyin,
e devolver o token reconhecido. O arqui vo de ent rada norma lme nte o
teclado. Para modificar esta definio basta alterarmos o conte do da varive l
yyin.

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 1
Tabela de Palavras Reser vadas e de Smbolos

Tabela de Palavras Reservadas


q comum em quase todas as ling uage ns de programao, a utili zao de um co njunto
de identificadores que so reservados, deno minados de palavras reservadas . Estes
so utilizados para facilitar o reconhecime nto de algumas const r ues sintticas, no
podendo ser utilizados como nomes de vari veis, tipos, f unes, etc ..
q No Pascal, por e xe mplo, as seg uintes pa lavras so reser vadas, de ntre o utras:
and array begin case const div do
downto else end file for function goto
if in label mod nil not of
or packed procedure program record repeat set
then to type until var while with
q tarefa do analisador l xico, ao reco nhecer um identificador, ve rificar se o mesmo
no uma pala vra reser vada, classificando-o corre tame nte . Desta forma, ao se
const ruir o a nalisador l xico, necessrio a definio de uma tabela conte ndo todas
as palavras reser vadas da ling uagem. Uma rotina q ue permita ve rificar se o
identificador reco nhecido se e ncontra o u no na tabela, deve r ser tambm
implementada.
q O algoritmo a seguir ilus tra como poder amos impleme ntar esta tabela o a funo de
verificao. assumido que a tabela de palavras reser vadas global e esteja
ordenada alfabeticame nte. A f uno IsKeyword(s) recebe como entrada a s tri ng s
a ser pesquisada e retorna Verdade se for uma pala vra reser vada o u Falso caso
cont rrio. O mtodo de pesquisa adotado pela funo a b usca bin ria. Porta nto, a
tabela de ver es tar o rdenada corre tame nte.

Constante TamTabRes = 35
Declare TabRes como Array[1 at TamTabRes] de string contendo
and, array, begin, case, const, div,
do, downto, else, end, file, for,
function, goto, if, in, label, mod,
nil, not, of, or, packed, procedure,
program, record, repeat, set, then,
to, type, until, var, while, with

Rotina IsKeyword(declare s como string)


Declare
m, n, k como inteiro
Inicio
s <- minsculo(s)
m <- 1

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 2
Tabela de Palavras Reser vadas e de Smbolos
n <- TamTabRes

Enquanto (m <= n) faa


k <- m + (n - m) / 2
Se (s = TabRes[k]) ento
Retorne(Verdade)
Seno
Se (s > TabRes[k]) ento
m <- k + 1
Seno
n <- k - 1
Fim se
Fim se
Fim enquanto
Retorne(Falso)
Fim rotina

Tabela de Smbolos
q Enqua nto a tabela de palavras reser vadas uma est r ut ura est tica, utilizada ape nas
para consulta , a tabela de smbolos uma est rut ura dinmica. Ne la so mantidos
todos os identificadores, e se us a tributos, enco ntrados d ura nte o processo de a nlise
lxica. As i nfor maes aqui inseridas, pelo a na lisador l xico, sero cons ta nteme nte
cons ultadas e at uali zadas dura nte as demais fases de a nlise e s ntese do
compilador.
q Por exe mplo, a seg uinte co nst r uo Pascal:

Function Fat(n: integer): longint;


Var
i: integer
Begin
If n >= 0 then
begin
Fat := 1;
For i := 1 to n do Fat := i * Fat;
End;
End;
poderia resultar nas segui ntes i nfor maes, as q uais seriam inseridas na tabe la de
smbolos :

Lexema Categoria Tipo Endereo


fat Funo LongInt -2
n Parmetro Integer -1
i Varivel Integer 0

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 3
Tabela de Palavras Reser vadas e de Smbolos
q Neste caso, Lexem a contm a cadeia de caracteres reco nhecida como identificador;
Categoria reflete a sua classificao no programa (funo, varivel, parm etro,
procedim ento, tipo, etc. ), o q ue depe ndente do co nte xto o nde ocor re; Tipo
corresponde ao tipo de dados associado; Endereo identifica a sua posio de
memria corresponde nte. O utros at ributos poderiam ser e vide nciados na tabela , de
acordo com a necessidade.
q Conforme j citado, de responsabilidade do analisador l xico inserir na tabela de
smbolos todos os no vos identificadores e nco ntrados d urante a a nlise do progra ma
fonte. Assim, a tabela de s mbolos de ver ser pesquisada toda vez ao se reconhecer
um identificador. Caso este seja e nco nt rado, o se u e ndereo de acesso tabela de
smbolos re tor nado. Caso contrrio, e le ser i nserido e o seu e ndereo de acesso
retor nado.
q Apesar da operao citada acima ser realizada dura nte a anlise l xica, todas as
operaes abaixo de vem se r poss veis:
1. Determinar se um dado nome es ta na tabela;
2. Adicionar um no vo nome tabe la;
3. Acessar as informaes associadas com um dado nome ;
4. Adicionar no vas i nfor maes para um dado nome ;
5. Excluir um nome ou um gr upo de nomes da tabe la.
q Desta forma, para imple mentarmos uma tabela de s mbo los, a primeira coisa que
devemos decidir como iremos orga niz- la, o q ue ir influe nciar no tipo de b usca a
ser adotada e nas demais operaes.
q Basicamente, podemos impleme ntar uma tabela de s mbo los uti liza ndo-se de
estr ut uras do tipo ve tor, lista lineares , r vores binrias e tabelas hash. Para
implementaes utiliza ndo vetores e listas lineares , a busca de ver ser seqe ncial. J
as r vores bi nrias e tabe las hash o ferecem mecanismos de b usca mais o timizados.
q Na prtica, tabelas hash so as mais indicadas. E ntre tanto, a esco lha deste m todo
demanda uma boa definio da funo hash, o que permitir minimizar colises. Out ro
ponto importa nte tentarmos se mpre definir uma tabe la onde o nmero de eleme ntos
seja primo.
q O e xemplo a seg uir ilus tra o uso de tabelas hash co mo tabe la de s mbolos . A funo
hash escolhida simp les: dada a som a de todos os cdigos ASCII do identificador,
calcula o m dulo da diviso por tabSimLen, um nm ero prim o que corresponde ao
nm ero de elem entos de tabSim. As colises so resolvidas inserindo-se os
eleme ntos em uma lista e ncadeada. Ent reta nto , outras est ratgias, como a rvo re
binria, por exe mplo, pode ser adotada.

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 4
Tabela de Palavras Reser vadas e de Smbolos
Constantes
tabSimLen = 211
Tipos
TCategoria = (varivel, funo, parmetro, ...)
PTabSimRec = Ponteiro para TTabSimRec;
TTabSimRec um registro de
Lexema como cadeia de caracteres
Categoria como TCategoria
Prximo como PTabSimRec
Fim do registro
TTabSim = vetor contendo de 1 at tabSimLen de PTabSimRec
Declare
TabSim como TTabSim

Funo Hash(Id como cadeia de caracteres)


Retorna Integer
Declare
ndice como inteiro
Soma como inteiro
Inicio
Soma <- 0
Para ndice de 1 at Comprimento(Id) faa
Soma <- Soma + ASCII(Id[ndice])
Fim Para
Retorne((Soma Mdulo tabSimLen) + 1)
Fim

Funo InsTabSim(Id como cadeia de caracteres)


Retorna PTabSimRec
Declare
h como inteiro
p como PTabSimRec
Inicio
h <- Hash(Id)
p <- TabSim[h]
Enquanto p <> nulo faa
Se p->Lexema = Id ento
Retorne(p)
Seno
p <- p->Prximo
Fim Se
Fim Enquanto
Aloque(p)
p->Lexema <- Id
p->Prximo <- TabSim[h]
TabSim[h] <- p
Retorne(p)
Fim

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 5
Tabela de Palavras Reser vadas e de Smbolos
q A funo hash a seguir, denominada de f uno HashPJW, oferece um melhor
desempenho q ue a anterior, minimi za ndo o nme ro de co lises.

Funo Hash(Id como cadeia de caracteres)


Retorna Integer
Declare
lenId como inteiro
h, g como inteiro
p como inteiro
Inicio
h <- 0
g <- 0
lenId <- Comprimento(Id);
Para p de 1 at lenId faa
h <- (h desloque 4 bits para esquerda) + ASCII(Id[p])
g <- h E-Lgico 0xF0000000
Se g <> 0 ento
h <- h OU-Exclusivo (g desloque 24 bits para direita)
h <- h OU-Exclusivo g
Fim Se
Fim Para
Retorne((h Mdulo tabSimLen) + 1)
Fim

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 1
Anlise Sinttica

Funes da Anlise Sinttica


O objetivo do analisa dor sintt ico obter uma cadeia de tokens, provenientes de
chamadas ao analisador lxico, e verificar se esta cadeia pode ser gerada pela gramti ca
da ling uagem fo nte . Como sa da, o analisador sinttico pode gerar a rvore gramat i cal
corresponde nte cadeia de tokens dura nte a anlise lxica, alm de relatar e ve ntuais
erros de si nta xe e nco nt rados d ura nte a fase de a nlise.
Os m todos mais com uns de a nlise sinttica so c lassificados como:

q Anlise Sintti ca Des cendente (Top-Dow n): o a nalisador te nta co nst r uir a rvo re
gram atical a partir de s ua ra i z em direo s fo lhas.
q Anlise Sintti ca Ascendente (Bot tom-u p): o a na lisador tenta co nstr uir a rvo re
gram atical comeando pelas folhas e m direo raiz.

Em ambos os casos a e ntrada varrida da esq uerda para a direita, um s mbo lo de cada
ve z.

Deve ser salientado que os mtodos de anlise sinttica mais eficientes, ta nto top-do wn
como bottom -up, t rabalham ape nas com deter minadas s ubclasses de gra mticas.
Entre ta nto, vrias destas s ubclasses so suficiente mente exp ressivas para descre ver a
maioria das ling uage ns de p rogramao.

Ambigidade, Recurso e Fator ao Esquerda


Antes de iniciarmos nosso es t udo sobre a a nlise sinttica, importa nte discutirmos
alguns p roblemas e nfre ntados d ura nte a fase de proje to de a nalisadores sintticos para
determinadas g ramticas.

O primeiro destes problemas a ambigida de. Conforme a nalisado anterior mente, uma
gramtica amb g ua q ua ndo e la prod uz mais de uma r vore gramatical para a mesma
ent rada. Para ce rtos tipos de a nalisadores si ntticos, e xt remame nte importa nte q ue a
gramtica no seja amb g ua , pois, caso contrrio, o a nalisador no saber decidir sobre
qual r vore gramatical gerar .

Um e xemp lo c lssico para o problema da ambigidade o do else vazio. Considere a


forma se ntencial abaixo :
<cmd> ::= if <expr> then <cmd> | if <expr> then <cmd> else <cmd>

De acordo com esta gram tica, a se nte na :


If E1 then S1 else If E2 then S2 else S3

possui a r vo re grama tical ilus trada pela Figura 1. E nt reta nto , a sente na:
If E1 then If E2 then S1 else S2

possui as rvores grama ticais ilustradas pela Figura 2, o que nos permite obser var que ta l

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 2
Anlise Sinttica
gramtica amb gua .

<cmd>

if <expr> then <cmd> else <cmd>

E1 S1

if <expr> then <cmd> else <cmd>

E2 S2 S3

Figura 1: rvore If E1 then S1 else If E2 then S2 else S3

<cmd> <cmd>

if < expr> then < cmd > if <expr> then < cmd> else < cmd >

E1 E1 S2

if <expr > then <cmd> else <cmd> if < expr> then <cmd >

E2 S1 S2 E2 S1

a b

Figura 2: rvore If E1 then If E2 then S1 e lse S2

Obser ve que ambas rvo res esto corretas, mas a primeira a comumente utilizada em
implementaes de ling uage ns. Por ta nto, de vemos e fet uar a lg umas modificaes na
gramtica de tal forma q ue ape nas a r vore a seja gerada. Como regra, de vemos associar
cada else ao if mais prximo que ainda no te nha sido associado. Reconstr ui ndo a
gramtica obteremos :
<cmd> ::= <cmd_1> | <cmd_2>

<cmd_1> ::= if <expr> then <cmd_1> else <cmd_1>


<cmd_2> ::= if <expr> then <cmd> |
if <expr> then <cmd_1> else <cmd_2>

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 3
Anlise Sinttica

O seg undo proble ma a co nsiderar a re curso esquer da. Uma gram tica rec ursi va
esquerda se possui um no term inal A, tal que exista uma derivao S + S , S VN
e VT, para alguma cadeia . Os mtodos de anlise sinttica descendente no
podem processar gra mticas rec ursi vas esque rda, por ta nto de vemos elimi n-la .
Suponha uma gra mtica c ujas regras de prod uo so:

S S

onde S VN e , V+, sendo que no comea com S. Esta gramtica recursiva


esquerda . Para e liminar mos a recurso aplicamos a seg uinte regra :

1. Agrupamos todas as p rodues S , da forma : S S | ; e

2. Substit umos as p rodues S por:

S S '

S' S' |

O passo dois acima poderia ta mbm ser rea lizado da seg ui nte forma :

S S ' |

S' S' |

Entre ta nto, este seg undo modo introd uz um novo prob lema, o q ual de ver ser resolvido,
confor me verificado a seg uir .

Como exemplo, s uponha as seguintes regras de produo, obtidas de uma gramtica


para exp resses aritm ticas:

E E + T

E T

T T * F

T F

F (E) | id | num

onde id e num representam, respectiva me nte, q ualq uer identificador ou nm ero v lido.

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 4
Anlise Sinttica

Primeiramente agr upamos as p rodues rec ursi vas, o u seja :

E E + T | T

T T * F | F

Agora substit umos as prod ues, o q ue nos daria as prod ues a seg uir:

E TE'

E' +TE' |

T FT'

T' *FT' |

F (E) | id | num

O mtodo ap resentado acima elimi na todas as rec urses esq uerda e nvolve ndo ape nas
um passo, mas no e limina a rec urso e m mais de um passo, como a indicada abaixo:

S Aa | b

A Ac | Sd |

Para estes casos, devemos trans forma r as produes para a sua corresponde nte Forma
Norma l de Greibach.

O terceiro proble ma a ser co nsiderado diz respeito fatora o esquer da, o q ual cria
gramticas adequadas anlise sintt i ca preditiva . Por exe mplo , supo nha as regras de
produo abaixo

S aA | aB

Obser ve que no poss vel decidir sobre qual das prod ues aplicar. Neste caso, a idia
atrasar o mximo poss ve l est deciso at termos uma idia clara sobre qual prod uo
aplicar. Deste modo, de vemos reescre ver tais reg ras da seg uinte forma:

S aS'

S' A | B

As regras assim obtidas esto fatoradas esquerda. Como regra geral podemos efetuar a
fatorao a tra vs do a lgoritmo abaixo.

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 5
Anlise Sinttica

Seja uma gra mtica G c ujas regras de prod uo so dadas por :

S 1 | 2| ... | n |

onde S VN e , , V+, se ndo q ue no ocorre e m . Para cada no ter minal S,


enco ntra r o mais lo ngo prefi xo , com um d uas o u mais alter nati vas. Se e xiste um
prefixo co mum, o u seja , ento s ubstit uir todas as prod ues S,
S 1 | 2| ... | n | , por:

S S' |

S' 1 | 2| ... | n

Aplicar repetidamente esta tra nsfo rmao at que no haja d uas alter na tivas com um
prefixo co m um.

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 1
Anlise Sinttica Descendente
Anlise Sinttica Descendente
Como citado ante riorme nte, na a nlise desce ndente feita uma te nta tiva para se
const ruir uma rvore gram atical, para uma se nte na de e ntrada, a partir de s ua rai z em
direo s folhas. Tal sente na de ver ser analisada da esquerda para a direita. A anlise
estar comple ta se cada uma das folhas da rvore contive r s mbolos term inais da cadeia
de entrada. A nalisa-se a seg uir alg uns casos de a nlise desce nde nte.

Anlise Sinttica Descendente com Retrocesso


O mtodo de anlise descendente recursiva com retrocesso foi um dos primeiros a serem
utili zados. E ntre tanto um mtodo m uito ineficiente, no sendo, por tanto, visto com m uita
freq ncia.
Para ilust rar es te m todo, s upo nha uma gramtica c ujas prod ues so dadas a seg uir.

S cAd

A ab | a

Agora, supo nha a cadeia de entrada cad. Aplicando as regras de produo ter amos as
seguintes r vores grama ticais para a se nte na:

S
S
S

c A d c A d
c A d
a b a
(a)
(b) (c)

Obser ve que a r vore a corresponde a derivao S cAd. Para derivarmos o no


termina l A existem duas alter nati vas. Neste po nto o analisador deve escolher uma das
alter nati vas, mas de ver se lembrar das pr ximas alter nati vas e qual a situao at ual da
derivao, c riando assim um ponto de es colha. Escolhe ndo-se a p rimeira alter nati va,
A ab, obtemos a r vore b, a q ua l correspo nde deri vao S + cabd. Neste po nto
ocorre uma fa lha, pois a sente na gerada no corresponde sente na de entrada . Deste
modo, o analisador de ve efet uar um re tro cesso ao ltimo ponto de escolha, resta urar a
situao de derivao q uando da escolha da alter nati va que falho u, e co nti nuar o
processo de derivao a partir dai. Assim, a situao a nte rior era a for ma sente ncial cAd.
Como a primeira alterna tiva falho u, resta agora seguir a seg unda, o u seja , A a, o que
produzir a derivao S + cad, a qual correspo nde a rvore c . Como foi possve l gerar
a sente na i nicial a partir desta gra mtica, e nto tal se ntena pode ser reconhecida por

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 2
Anlise Sinttica Descendente
esta gram tica.

O problema por trs deste tipo de implementao a dificuldade de se restaurar a


situao no ponto de escolha e o a traso q ue is to pro voca.
A seguir ana lisado outro tipo de a nalisador desce nde nte rec ursivo , mas sem ret rocesso.

Anlise Sinttica Descendente Recursiva


O mtodo de anlise des cendente re cursiva necessita q ue a g ramtica no co nte nha
recurses esquerda e q ue este ja fatorada esquerda. O mtodo se baseia na esc rita de
um p rocedimento rec ursivo pa ra cada no-term inal da gramtica. Dura nte a deri vao,
qua ndo um term inal for derivado, um no vo item lxico dever ser lido. E q uando um no-
term inal encontrado, o procedimento que o define c hamado. As chamadas a estes
procedimentos so rec ursivas e, por ta nto, a li ng uagem a ser utilizada na impleme ntao
dever s upor tar esta ca racter stica de modo eficiente .

Exemplo 1: O exe mplo abai xo ilust ra um analisador sinttico recursivo para um


reconhecedor de e xpresses a ritmticas e nvolve ndo identificadores, valores inteiros e
reais. As regras gramaticais so dadas a seguir .

<exp> ::= <termo> + <exp> | <termo> - <exp> | <termo>


<termo> ::= <fator> * <termo> | <fator> / <termo> | <fator>
<fator> ::= id | IntNum | RealNum | ( <exp> )

onde:

id letra+ (letra | digito)*


IntNum digito+
RealNum digito* . digito+
letra [A-Za-z]
digito [0-9]

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 3
Anlise Sinttica Descendente
Algori tmo:

Rotina Exp
Inicio
Chamar Termo
Caso Lexema
'+', '-': Chamar Lexico
Chamar Exp
Fim do Caso
Fim da Rotina Exp

Rotina Termo
Inicio
Chamar Fator
Caso Lexema
'*', '/': chamar Lexico
chamar Termo
Fim do Caso
Fim da Rotina Termo

Rotina Fator
Inicio
Se Lexema '(' ento
chamar Lexico
chamar Exp
Se Lexema ')' ento
Chamar Lexico
Seno
Erro(') esperado')
Fim se
Seno
Se Token {Id, IntNum, RealNum} ento
Chamar Lexico
Seno
Erro('Operando esperado')
Fim se
Fim se
Fim da Rotina Fator

Programa AnalisadorSintaticoRecursivo
Inicio
Chamar Lexico
Chamar Exp
Se Token <> Eof ento
Erro('Fim de arquivo no esperado')
Fim se
Fim do Programa AnalisadorSintaticoRecursivo

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 4
Anlise Sinttica Descendente
Anlise Sinttica Descendente Preditiva
O mtodo de anl ise des cendente re curs iva predit iva necessita que a gramtica no
conte nha recurses esq uerda e q ue este ja fatorada esquerda.

Para se cons tr uir um analisador preditivo precisamos conhecer , dado o s mbo lo de


ent rada e a prod uo:

S 1 | 2| ... | n

com S, i VN e VT, qua l das alter nati vas i , 1 i n, a nica q ue deri va a fo rma
sente ncial comea ndo com . Isto , deve se r poss vel de tectar a alter nati va a ser
aplicada exami nando apenas o primeiro s mbolo da cadeia que a mesma deri va.

A seguir, basta se escrever um procedimento recursivo para cada no-ter mina l i , o qual
dever a nalisar a cadeia deriv vel a pa rtir dele . Deste modo , o procedime nto
corresponde nte a um no-te rm inal dever ser c ha mado sempre q ue fo r necessrio deri var
uma cadeia a partir des te no- term inal.

Exemplo 2: O exemplo a seguir ilus tra um analisador sinttico preditivo para uma
gramtica c ujas produes so indicadas abaixo :
S AS | BA

A aB | C

B bA | d

C c

Algori tmo:

Rotina S
Inicio
Chamar Lexico
Caso Lexema
'a', 'c': Chamar A
Chamar S
'b', 'd': Chamar B
Chamar A
Caso contrrio: Erro
Fim do Caso
Fim da Rotina S

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 5
Anlise Sinttica Descendente
Rotina A
Inicio
Caso Lexema
'a': Chamar Lexico
Chamar B
'c': Chamar C
Caso contrrio: Erro
Fim do Caso
Fim da Rotina A

Rotina B
Inicio
Caso Lexema
'b': Chamar Lexico
Chamar A
'd': Lexico
Caso contrrio: Erro
Fim do Caso
Fim da Rotina B

Rotina C
Inicio
Caso Lexema
'c': chamar Lexico
Caso contrrio: Erro
Fim do Caso
Fim da Rotina A

Programa AnalisadorSintaticoPreditivo
Inicio
Chamar Lexico
Chamar S
Se Token <> Eof ento
Erro
Fim Se
Fim do Programa AnalisadorSintaticoPreditivo

Exemplo 3: O pr ximo e xemp lo ilust ra um analisador sinttico preditivo, o q ual permite


verificar se uma e xpresso aritm tica est corre ta. A gra mtica indicada abaixo, j se
enco ntra ndo co m as rec urses esque rda elimi nadas e fatorada esque rda:

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 6
Anlise Sinttica Descendente
<expressao> ::= <termo> <maistermos>
<maistermos> ::= + <termo> <maistermos>
| - <termo> <maistermos>
|
<termo> ::= <fator> <maisfatores>
<maisfatores> ::= * <fator> <maisfatores>
| / <fator> <maisfatores>
|
<fator> ::= ( <expressao> ) | id | num

onde:

id letra+ (letra | digito)*


num digito+ | digito* . digito+
letra [A-Za-z]
digito [0-9]

Nesta gra mtica deve ser obser vado q ue alg umas prod ues podem deri var o s mbolo .
Tal deri vao deve ser e nte ndida como uma derivao defaul t. Is to , se o analisador
no fo r capaz de aplicar nenhuma das outras prod ues deri vadas a partir do no
term inal, ento e le ap lica a prod uo , o u se ja, no fa z nada.

A seguir temos a codificao da gramtica dada a nte riorme nte.

Algori tmo:

Rotina Expressao
Inicio
Se Token Id, Num ou '(' ento
Chamar Termo
Se Lexema '+' ou '-' ento
Chamar MaisTermos
Fim Se
Seno
Erro('Operando esperado')
Fim Se
Fim da Rotina Expressao

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 7
Anlise Sinttica Descendente
Rotina MaisTermos
Inicio
Chamar Lexico
Se Token Id, Num ou '(' ento
Chamar Termo
Se Lexema '+' ou '-' ento
Chamar MaisTermos
Fim Se
Seno
Erro('Operando esperado')
Fim Se
Fim da Rotina MaisTermos

Rotina Termo
Inicio
Se Token Id, Num ou '(' ento
Chamar Fator
Se Lexema '*' ou '/' ento
Chamar MaisFatores
Fim Se
Seno
Erro('Operando esperado')
Fim Se
Fim da Rotina Termo

Rotina MaisFatores
Inicio
Chamar Lexico
Se Token Id, Num ou '(' ento
Chamar Fator
Se Lexema '*' ou '/' ento
Chamar MaisFatores
Fim Se
Seno
Erro('Operando esperado')
Fim Se
Fim da Rotina MaisFatores

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 8
Anlise Sinttica Descendente
Rotina Fator
Inicio
Se Token Id, Num ou '(' ento
Lexico
Seno
Se Lexema '(' ento
chamar Lexico
Se Token Id, Num ou '(' ento
chamar Expressao
Se Lexema ')' ento
Chamar Lexico
Seno
Erro(') esperado')
Fim se
Seno
Erro('Operando esperado')
Fim Se
Seno
Erro('Operando esperado')
Fim Se
Fim Se
Fim da Rotina Fator

Programa Analisador
Inicio
Chamar Lexico
Chamar Expressao
Se Token <> Eof ento
Erro('Fim de arquivo no esperado')
Fim Se
Fim da Programa Analisador

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 1
Anlise Sinttica Descendente No Recursiva

Anlise Sinttica Pr editiva No Recur siva

pos s ve l co nstr uir um anali sador


sint t ico predit iv o no rec urs ivo ma nte ndo
Entrada a + b $
uma pi lha, ao invs de c ha madas
rec urs ivas, e co ns ulta ndo uma t abela Pilha
sint t ica para a ap licao de uma prod uo Programa Analisador
a um dado no-t erminal. A F ig u ra 1 ilus tra X Sinttico Preditivo Sada
um ana li sador s int t ico deste t ipo. Y
Pela figura pode mo s obser var 5
Z
co mpo ne ntes co m tare fas d is t intas. A Tabela Sinttica
ent rada co mposta pe la c ade ia a ser $ M
ana lisad a, fina lizada pe lo s mbo lo $, o q ua l
represe nta o fim da cade ia. A pi lha co nt m Fig ur a 1 : Es que ma de u m A n alis ador S int tic o
uma seq nc ia de s mbo los gra ma t ic a is, Predi ti vo N o Recurs i vo
co m o s mbo lo $ ind ica ndo o se u fundo.
Inic ia lme nte, a p ilha co nt m o s mbo lo de
part ida da gra mt ica sobre o topo da p ilha, isto , ac ima de $. A t abela sint t ica, aqui
represe ntada po r M, um arra y b id ime ns io na l M[A, a ], o nde A um no t erminal e a um
t erminal o u o s mbo lo $. O co nte do de M[A, a] uma prod u o a s er ap licada q ua ndo A e st
sobre o topo da pilha e a o smbo lo de entrada, o u uma co nd io de erro. J o Programa
func io na co nfo r me ind icado a se guir.
Seja X o s mbo lo no topo da pi lha e a o s mbo lo prese nte na e ntrada. O Programa
deve s e guir o s se guintes pas sos :

1. Se X = a = $, o progra ma pa ra e a nunc ia o tr mino, co m s ucesso, da a n lise


s int t ica ;
2. Se X = a $, o pro gra ma re mo ve X da p ilha e a va n a o po nte iro da e ntrad a para o
prximo s mbo lo;
3. Se X um no ter mina l, o p ro gra ma co ns ulta a e nt rada M [X, a] da t abela sint t ica.
Essa e ntrada se r uma prod uo para X, da gra m t ica, o u uma e ntr ada de erro. Se
por exe mp lo, M[X, a] = {X UVW}, o progra ma s ubs t it ui X, no topo da pi lha,
por WVU, com U ao topo. Co mo sa da o pro gra ma e xec uta a ao de finida pe la
produ o ap licada. No no sso caso, ire mos ass umir q ue ser impre sso a prod uo
ut il izada. Se M [X, a] = er ro, o pro gra ma c ha ma uma rot ina de rec upe rao de er ro.

Em ter mos gera is, pode mos de fin ir um a lgor it mo para um anali sador sint t ico no
recursiv o predit iv o, confor me se se gue, te ndo co mo e ntrad a uma cade ia w a ser ana lisada e
uma t abe la s intt ica M, e co mo sa da uma de r iva o ma is a e sq uerda de w, se w est iver e m
L(G), ou uma co nd io d e erro, c aso co nt rr io.

Pr of. Ro gr io Melo Ne pomuce no


Compiladores 2
Anlise Sinttica Descendente No Recursiva
Colocar $S na pilha, com S, o smbolo de partida, ao topo
Fazer w$ a entrada
Faa ip apontar para o primeiro smbolo de w$
Repetir
Seja X o smbolo ao topo da pilha
Seja a o smbolo apontado por ip
Se X for um terminal ou $, ento
Se X = a, ento
Remover X da pilha e avanar ip
Seno
Erro()
Fim Se
Seno
Se M[X, a] = X Y1Y2...Yn, ento
Remover X da pilha
Empilhar YnYn - 1... Y1, com Y1 ao topo da pilha
Escrever a produo X Y1Y2 ... Yn
Seno
Erro()
Fim Se
Fim Se
At que X = $

Para e xe mp li fica r o func io na me nto do a lgor it mo, co ns idere aba ixo, j e li minada a
rec urso a e sq uerda e fato rada a esq ue rda.

E TE'
E' +TE'|
T FT'
T' *FT'|
F (E)|id

A t abela s int t ica para es ta gra mt ica d ada pe la F ig u ra 2. A e ntr adas e m bra nco so
entradas de er ro, e nq ua nto q ue a s de ma is ind ic a m uma prod uo co m a q ua l se de ve e xpa nd ir
o no t erminal ao topo da pi lha.

No Smbo los d e Entrada


Ter mina l id + * ( ) $
E E TE ' E TE '
E' E' +TE' E' E'
T T F T' T F T'
T' T' T' *FT' T' T'
F F id F (E)
Fig ur a 2 : Ta bel a S int tica M par a Ex pres s es Ma te mticas Co nten do A pen as A di o e Multi plica o.

Pr of. Ro gr io Melo Ne pomuce no


Compiladores 3
Anlise Sinttica Descendente No Recursiva
Supo nha q ue a e ntrada co nte nha a se nte na id + id * id. Para esta ent rada, o
ana lisado r pred it ivo rea liza r a seq nc ia de mo vime ntos des cr itos pe la figura.

Pilha Entrada Sada


$E id + id * id $
$E'T id + id * id $ E TE'
$E'T'F id + id * id $ T FT'
$E'T'id id + id * id $ F id
$E'T' + id * id $
$E' + id * id $ T'
$E'T+ + id * id $ E' +TE'
$E'T id * id $
$E'T'F id * id $ T FT'
$E'T'id id * id $ F id
$E'T' * id $
$E'T'F* * id $ T' *FT'
$E'T'F id $
$E'T'id id $ F id
$E'T' $
$E' $ T'
$ $ E'
Fig ur a 3 : Mo vi men t os feitos pelo A n alis ador Pre di ti vo N o Recurs i vo para a
entra da id + id * id .

Pr imeir o e Seguinte

A constr uo de a na lisadore s s int t icos pred it ivo s no rec urs ivos a uxiliad a por duas
fun es asso c iadas gra mt ica G. Estas funes, de no minadas de Pri mei ro (F irst ) e Segui nt e
(Follow), nos per mite m pre e nc her a s e nt radas de uma t abe la s intt ica pred it iva para G,
se mpre q ue p oss ve l. Os co nj untos de t ok ens prod uzido s pe la funo Segui nt e podem ta mb m
sere m us ados co mo t ok ens de s incro nizao d ura nte a rec uper ao de er ros.
Seja qua lq uer cade ia de s mbo los gra ma t ic a is e A um no te r mina l q ue ocorr e e m
a lguma for ma se nte nc ia l de G. Podemos de finir int uit iva me nt e Primeiro( ) co mo se ndo o
conj unto d e todo s os ter mina is q ue co mea m as c ade ias der ivadas a par t ir de , e Seguint e(A)
co mo se ndo o co nj unto de ter mina is a q ue pode m figur ar imed ia ta me nte d ire ita de A e m
a lguma fo r ma se nte nc ia l, isto , S * Aa, para a lgum e .
De uma ma ne ir a ma is prec isa, pode mos ca lc ular Primeiro (X) pa ra todos o s s mbo los
gra mat ica is X, ap lica ndo repet ida me nte as re gras aba ixo a t q ue ne nhum t er mina l o u possa
ser ad ic io nado a q ua lq uer co nj unto Prime iro.

Pr of. Ro gr io Melo Ne pomuce no


Compiladores 4
Anlise Sinttica Descendente No Recursiva
1. Se X for um t erminal, e nto Primei ro(X) {X};
2. Se X , for uma prod uo, e nto ad ic io nar a Pr imeiro(X );
3. Se X fo r um no t erminal e X Y1 Y2 ...Yn uma p rod uo, e nto co lo car a e m
Primeiro(X) se, para a lgum i, a est iver e m Primeiro ( Yi) e est iver e m todos
Primeiro( Y1 ), ..., Primei ro( Yi - 1 ); is to , se Y1 ... Yi 1 * ;
4. Se X for um no t ermina l, X Y1 Y2 ...Yn uma prod u o, e es t ive r e m todos
Primeiro( Yi), i = 1, 2, ..., n, e nto ad ic io nar a Primei ro(X);
5. Se X for uma cade ia do t ipo X1 X2 ...Xn , adic io na r a Primeiro(X1 X2 ...Xn ) todos os
s mbo los de Pr imeiro(X1 ) {}. Se Pr imeiro(X1 ), e nto ad ic io na r todos os
s mbo los de Pr imeiro (X2 ) {} a Pr imeiro(X1 X2 ...Xn ). Se Primeiro(X2 ), e nto
ad ic io na r todos os s mbo lo s de Primeiro(X3 ) {} a Primeiro (X1 X2 ...Xn ), e assim
suce ss iva me nt e. F ina lme nt e, ad ic io nar a Primeiro (X1 X2 ...Xn ), se e some nt e se,
para todo i, i = 1, 2, ..., n, Pr imeiro(Xi).

Do mes mo modo, pode mos ca lc ular Seguint e(X) para todo s os no te r mina is X,
ap lica ndo repet ida me nte a s re gras aba ixo at q ue nada ma is possa ser ad ic io nado a q ua lq uer
conj unto Segu int e.

1. Coloca r $ e m Segu int e(S), o nde S o s mbo loe de pa rt ida da gra mt ica e $ o
marcador d e fim da e nt rada;
2. Se exist ir uma prod uo X A , colocar e m Seguint e(A), t udo e m Primeiro ( ),
exce to ;
3. Se exist ir uma prod uo X A ou uma prod uo X A , onde
Primeiro( ), isto , * , ento, adc io nar t udo d e Seguint e(X) e m Seguint e(A).

Como e xe mp lo, co ns ider e as prod ue s aba ixo :

E TE'
E' +TE'|
T FT'
T' *FT'|
F (E)|id

Os conj untos Prime iro e Segu int e para est as prod ue s e nco nt ra m- se listado s a se guir :

Primeiro(E) = Pr imeiro(T ) = Primeiro (F) = Prime iro(TE ) { ( , id }


Primeiro(E ) = Primeiro (+TE ) = { + , }
Primeiro(T ) = Primei ro(*FT ) ={ * , }

Seguint e(E) = Seguint e (E ) = { ) , $ }


Seguint e(T) = Seguint e (T ) = { + , ) , $ }
Seguint e(F) = Seguint e (E ) = { + , * , ) , $ }

Pr of. Ro gr io Melo Ne pomuce no


Compiladores 5
Anlise Sinttica Descendente No Recursiva

Tabelas Sintticas Pr editivas

Uma t abela s int t ica M para uma gra mt ica G pode ser co nstr uda por inte r md io do
a lgor it mo a se guir.

1. Para cada prod uo X da gr a m t ica, e xe c ute os pa ssos 2 , 3 e 4 ;


2. Para cada te r mina l a e m Primeiro ( ), ad ic io ne X a M[X, a];
3. Se Primeiro ( ), ento ad ic io ne X a M[X, b] p ara cada ter mina l
b Seguint e(X);
4. Se Primeiro( ) e $ Segu int e(X), e nt o ad ic io ne X a M[X, $];
5. Faa cada e ntr ada inde finid a de M se r erro.

Ap lica ndo- se o a lgor it mo ac ima gra mt ica da seo a nte r ior obte mos a t abela
snt t ica da Fig u ra 2, po is :

1. Como p ara E TE', Primeiro(E) = Pr imeiro(TE ) = {(,id}, ento


M[ E, ( ] = M [ E, id ] = E TE';
2. Como para E +TE'|, Primeiro(E ) = Primeiro (+TE ) = {+,} e
Primeiro(+TE ), ento M[ E , + ] = E +TE' e
M[ E , ) ] = M[ E , $ ] = E , pois Seguint e(E ) = {), $}; e assim
suce ss iva me nt e.

Gramticas LL(1)

Supo nha a gra mt ica do exe mp lo a nter ior. Para es ta gra m t ic a, pode mos imp le me nta r
um anali sador s int t ico descendent e predit iv o, ana lisa ndo ape nas um (1 ) nico s mbo lo da
entrada (look ahead), pa ra to mar mos as dec ises s int t icas. Ta l s mbo lo de ve se r a na lis ado a
part ir da esquerda para a direit a (Lef t t o rigt h), produzindo uma der iv ao linear mais a
esquerda (l ef t linear). Por ta nto, d ize mo s q ue es ta gra mt ica LL(1).
Gra mt icas LL(1 ) posse m vr ias p ropr iedades d ist inta s. Ne nhuma gra m t ica a mb gua
ou re c urs iva esq ue rda pode se r LL(1). Pode se r ta mb m d e mo ns trado q ue uma gra mt ica
LL(1) se, e so me nte se, s e mpre q ue A | fore m d ua s prod ue s d ist intas de G, e
vigo rare m as se guinte s co nd ie s :

1. e no deriva m, ao mes mo te mpo, cade ia s co mea ndo pe lo me s mo ter mina l a,


qua lq uer q ue se ja a;
2. No m ximo um do s do is, o u , deriva m ;
3. Se * , ento no der iva qua lq uer cade ia co mea ndo por um t er mina l e m
Seguint e(A);

Pr of. Ro gr io Melo Ne pomuce no


Compiladores 6
Anlise Sinttica Descendente No Recursiva
Por e xe mp lo, a gra m t ica a s e guir no LL (1), po is e la a mb gua. I sto , e la no
ate nde te rce ira co nd io c itada ac ima.

S i E t S S | a
S e S |
Eb

Gra mt icas recurs iv as esquerda o u ambgua s no so LL(1 ), po is pe lo me nos uma


de s uas e ntradas na t abela s int t ica so mult iplament e def inidas, co nfor me pode ser visto p e la
Fig u ra 4. N e la, pode mo s obser var q ue a e ntrad a para M[S , e] cont m ta nto S e S como
S , uma ve z q ue Seguint e(S ) = { e, $ }.

No Smbo los d e Entrada


Ter mina l a b e i t $
S Sa S iEt SS'
S' S' S'
S' eS
E Eb
Fig ur a 4 : Ta bel a S int tica M par a a Gr a mtica S i Et SS | a, S' e S | , E b.

Poder ia mo s te nta r tra ns fo r ma r esta gra mt ica para LL(1) e limina ndo a recurso
esquerda e f at orando esquerda. Entre ta nto, e xiste m a lgumas gra m t ica s para as q ua is
ne nhuma a lterao ir p rod uzir uma gr a m t ica LL(1 ), co mo o c aso do nosso e xe mp lo.

Pr of. Ro gr io Melo Ne pomuce no


Compiladores 7
Anlise Sinttica Descendente No Recursiva

Exer ccios

1. Dete r mine o co nj unto Primeiro e Seguint e para a gra m t ica do e xe mp lo a nte r ior.
2. Dete r mine o co nj unto Primeiro e Seguint e para a gra m t ica a se guir, co ns tr ua a s ua tabe la
s int t ica e ind iq ue se e la LL(1) e o porq u.

S aSbS | bSaS |

3. Dete r mine o co nj unto Primeiro e Seguint e para a gra m t ica a se guir, co ns tr ua a s ua tabe la
s int t ica e ind iq ue se e la LL(1) e o porq u.

S AaAb | BbBa
A
B

4. Dete r mine o co nj unto Primeiro e Seguint e para a gra m t ica a se guir, co ns tr ua a s ua tabe la
s int t ica e ind iq ue se e la LL(1) e o porq u.

S id A
A ( B ) |
B id C
C , B |

5. Dete r mine o co nj unto Primeiro e Seguint e para a gra m t ica a se guir, co ns tr ua a s ua tabe la
s int t ica e ind iq ue se e la LL(1) e o porq u.

S id B
B , S | : C
C int D | real D
D ; S |

Pr of. Ro gr io Melo Ne pomuce no


C om piladore s 1
A nlise S int t ic a Asc en dente
Intro duo
A an lise sin ttica as cen den te ( Bo tto m-U p) , tambm denomi nada de an lise
redutiva (o u ai nda Sh ift-Re duce ), a nali sa uma se nte na de e nt rada e tenta co nstrui r
uma r vore de deri vao, comea ndo pelas fo lhas e p rossegui ndo para a rai z,
produzi ndo uma der ivao ma is d ireita, na ordem i nve rsa. Caso seja obtida uma
rvore cuja rai z tem por rt ulo o smbolo i ni ci al da gramti ca, e na qua l a seqnci a dos
rt ulos das fo lhas for ma a se ntena de e nt rada, e nto esta se ntena perte nce a
li nguagem gerada pela g ramtica, e a r vo re obtida a s ua rvo re de deri vao.
P odemos pensar na anli se asce ndente co mo o p rocesso de reduzi r uma se ntena de
ent rada para o s mbolo ini ci al S da g ramtica.
P or exe mplo, seja a se ntena ab b cd e e as produes g ramati cai s a seg ui r:
S aA Be
A Abc | b
B d
P ara reconhecer esta sente na devemos proc ura r por uma subcadeia que possa ser
derivada por alguma das prod ues aci ma, e s ubsti tu- la pelo no-termi nal do lado
esquerdo da regra. O processo deve ser repe tido at q ue a cadei a de e nt rada esteja
reduzi da ao smbolo i ni ci al S .
P odemos demonst rar os passos de a nli se da cadei a aci ma atra vs da tabela a abaixo .

Passos Ent rada Re gra Ap licada Sad a


1. abbcde Ab aAbcde
2. aAbcde A A bc aA de
3. aA de B d aAB e
4. aA B e S aA Be S

Na tabela podemos obser var q ue o processo de red uo correspo nde exatame nte a
segui nte deri vao mai s a di reita, na orde m i nve rsa:
S aAB e aA de aA bcde abbcdee
Tambm podemos obser var que a a nli se da sente na de e ntrada fei ta da esquerda
para a di rei ta, na te nta ti va de se enco ntra r uma s ubcadei a em uma se nte na ,
conte ndo ape nas s mbo los te rminai s, ta l q ue e xista uma p roduo , cuja
substi t uio de por permi ta a reduo de , em zero ou mais passos, ao s mbolo
i ni cial. fo rma se ntenci al , d-se o no me de h and le. S e a s ubcadei a esti ver
bem defi ni da em e a produo for clara no conte xto , e nto di zemos q ue
um handl e de .
C om piladore s 2
A nlise S int t ic a Asc en dente
A tabela a segui r i l ustra o handl e correspo ndente a cada etapa de red uo.

Passos E nt rada Ha nd le Re gra Aplicada Sada


5. abbcde b Ab aA bcde
6. aA bcde A bc A Abc aA de
7. aA de d B d aA Be
8. aA Be aABe S aABe S

Construo de Analisadore s Asce nde nte s


A construo de anal i sadores ascendentes fei ta atra vs da i mpleme ntao de
autm atos de pi lha, cujos controles so di rigi dos por tabel as de anl i se sintti ca. Para
tal uti li zado uma pi l ha si nt ti ca para guarda r os smbolos gramati cai s de uma
sente na de e nt rada a ser decomposta. Usamos $ para marcar o fi na l da pi l ha e o fi nal
da sentena de entrada. D este modo, no i ncio do processo de an li se dever ser
empi lhado sobre a pil ha o s mbolo $. A sente na a ser a nalisada tambm de ver ser
segui da de $. A ssi m se a cadei a de entrada, ento teremos a segui nte
confi g urao:

Pilha Sent e na de E ntrada


$ $

O processo de reco nheci me nto pelo a na li sador si ntti co, co nsi ste e m empil ha r zero ou
mais smbo los da sente na de ent rada at que um handl e surja sobre o topo da pilha.
Quando i sto ocorre, reduz-se para o no-termi nal correspondente, empi l ha ndo-o. O
processo se repete at que tenha si do detectado um erro ou q ue a pilha contenha em
seu topo o no-termi na l de parti da segui do do smbolo $, e a entrada es teja vazi a. Isto
:

Pilha Sent e na de E ntrada


$S $
C om piladore s 3
A nlise S int t ic a Asc en dente
E xi stem e feti vame nte q uatro aes poss vei s de serem reali zadas pelo a na li sador
si ntti co:
1. Empi lh ar (S h ift) : esta ao exec utada para se colocar o s mbo lo de e nt rada
sobre a pi lha;
2. Redu zi r (Redu ce) : esta ao exec utada q uando um handl e est sobre a pilha.
Neste caso, o ana li sador o substit ui pe lo no termi na l correspo ndente;
3. Aceitar : esta ao anunci a o tr mi no, co m s ucesso, do reco nheci mento da
sente na de entrada;
4. Erro : esta ao exec utada q uando um er ro si ntti co e ncontrado. Neste caso
o ana li sador si ntti co dever c hama r uma roti na de rec uperao de er ros.
C onsi dere como exemp lo as regras gra mati cai s:
E E+E
E E*E
E (E)
E id
e a se ntena id1 + id2 * id3 . O processo de reco nheci me nto demo nstrado abai xo.

Passo Pilha E nt rada Ha nd le Ao


1. $ id1 + id2 * id3 $ E mpilha r
2. $id1 + id2 * id3 $ id1 Reduzir por E id
3. $E + id2 * id3 $ E mpilha r
4. $E + id2 * id3 $ E mpilha r
5. $E + id2 * id3 $ id2 Reduzir por E id
6. $E + E * id3 $ E+E Reduzir por E E+E
7. $E * id3 $ E mpilha r
8. $E * id3 $ E mpilha r
9. $E * id3 $ id3 Reduzir por E id
10. $E * E $ E*E Reduzir por E E+E
11. $E $ Aceitar

Obser ve pela tabela que para ocorre r o processo de reduo o handle dever sempre
estar sobre o topo da pi l ha.
C om piladore s 4
A nlise S int t ic a Asc en dente
Anl ise de Prece d nci a de Ope rad ore s
Os ana lisadores de precednci a de operadores operam sobre a classe de gram ticas
denomi nadas de gramticas de o pera dores, q ue so aq uelas que no co ntm
produes do ti po A e, no lado di rei to das produes, os no termi nai s aparecem
sempre separados por smbolos termi nai s, ou seja, no h doi s ou mai s no termi nai s
adjacentes, tal como A B C .
P or exe mplo, seja a seg ui nte gramti ca:
E EOE | ( E ) | E | i d
O +| |* | / |^
E sta gramtica no de operadores, devi do produo E E OE , a qual poss ui trs
termi nai s consecuti vos. Entretanto, podemos transfor m-la para uma gramti ca de
operadores, s ubsti t ui ndo o no termi nal O pelos termi nai s por ele gerado, obte ndo:
E E + E | E E | E * E | E / E | E ^ E | ( E ) | E | id
A anlise de precednci a de operadores bastante efi ciente e apli cada,
pri nci palme nte , no reco nheci mento de e xpresses. E ntreta nto, este mtodo apresenta
algumas desva ntage ns, de nt re elas a di fi culdade de li dar com operadores i guai s que
tenham si g ni fi cados di ferentes (como por e xemplo , o operador , o qua l pode ser
tanto bi n ri o como unri o) e ser ap li cado a apenas uma c lasse restri ta de gramti cas.

Re lae s de Pre ce dn cia de Ope ra dor


A parti r de uma gra mti ca de operadores podemos co ns tr ui r um a nali sador si ntti co
uti li za ndo-se das rela es de pre cedn cia de o perado res exi stentes entre os tokens
a serem a nali sados.
E xi stem trs relaes de precednci a de operadores:

1. a b: a tem p rece dn cia men o r q ue b;

2. a b: a tem p rece dn cia maio r que b;

3. a b: a e b tm a mesma preced ncia.

A uti li dade destas re laes na a nlise de uma sente na a i denti ficao do handl e:

q : i denti fica o li mi te esque rdo do handl e;

q : i denti fica o li mi te di rei to do handl e;

q : i ndi ca q ue os ter mi nai s per tence m ao mesmo handle.


C om piladore s 5
A nlise S int t ic a Asc en dente
D evemos ter c ui dado ao i nterpre tar esses operadores poi s, di ferentemente dos
operadores mai or, meno r e i gual da matemti ca, per fei tamente poss vel termos a b
e a b si multa neamente .

Os a nalisadores si ntti cos de precednci a de operadores so di ri gi dos por uma tabela


de pre ce dncia, c ujas relaes defi nem o movi mento que o ana li sador deve fazer:
em pil har, reduzi r, acei tar ou cham ar uma roti na para tratam ento de erros . Esta tabela
uma matri z quadrada que re laci ona todos os termi nais da gramti ca mai s o marcador $.
Os termi nai s nas lin has representam te rmin ais n o to po da pi lha, e os ter mi nai s nas
co lun as represe ntam termin ais sob a cab ea de le itu ra.
P or exe mplo, sejam as prod ues a segui r:
E E E | E E | ( E ) | id
A tabela de precednci a de operadores para es ta gram tica i ndi cada abaixo.

id ( ) $
id


(
)
$ Acei ta

B asi camente, um ana li sador de precednci a funci ona da segui nte for ma. Seja a o
termi na l mais ao topo da pi lha , despre zando-se qualquer no ter mi nal que possa
ocorrer, e b o ter mi na l sob a cabea de lei tura:

1. S e a b ou a b, ento em pi l ha;

2. S e a b, ento proc ure um handl e na pi lha , o qual dever estar deli mi tado
pelas relaes e , e o s ubsti t ui pe lo no termi nal correspo ndente.

D eve ser obser vado que o handl e vai desde o topo da pi lha at o primei ro termi nal a,
i ncl usi ve, q ue tem abai xo de si um termi nal b, tal q ue b a.
C om piladore s 6
A nlise S int t ic a Asc en dente

A Figura 1 i lus tra como funciona um a na li sador


deste ti po. Ne la podemos i denti fi car, de acordo Fita de Entrada

com a tabela de precednci a defi ni da Pilha id 1 id 2 id3$


anteri or mente, que sobre o topo da pi l ha temos o
handl e E E , poi s, neste caso, o termi nal E
mais ao topo da pi lha , $ o termi nal sob a cabea
de lei tura e $. Logo, o handl e vai desde o E Analisador
topo da pi lha at o no termi nal E que antecede o Sinttico
E
termi na l , poi s . $
P ara i lust rar o f unci oname nto de um a na li sador Tabela de
de precednci a de operadores, supo nha que se Precedncia de
deseje reconhecer a sente na: i d1 i d2 i d3 ; Operadores
consi derando a tabela de preced ncia de
operadores defi ni da anteri orme nte . Os Fig ura 1
movi me ntos efetuados pelo anali sador si nt ti co
so i ndi cados abai xo.

Passo Pilha Re la o E nt rada Ha ndle Ao


1. $ i d1 i d2 i d3 $ Emp ilha r
2. $id1 i d2 i d3 $ id1 Red uzir por E id
3. $E i d2 i d3 $ Emp ilha r
4. $E i d2 i d3 $ Emp ilha r
5. $E id2 i d3 $ id2 Red uzir por E id
6. $E E i d3 $ Emp ilha r
7. $E E i d3 $ Emp ilha r
8. $E E id3 $ id3 Red uzir por E id
9. $E E E $ E E Red uzir por E E E
10. $E E $ E E Red uzir por E E E
11. $E $ Ace itar

Os mo vi mentos de um anali sador de precednci a de operadores so efet uados de


acordo com um algori tmo, o qual recebe como e nt rada uma tabela de precednci a de
operadores, t , e uma cadei a w a ser a nali sada. Es te algo ri tmo i ndi cado a seg ui r.
C om piladore s 7
A nlise S int t ic a Asc en dente
A l go r it mo Pr ec e d n ciaO per ad o res( t, w)
I n ic i o
Se ja w$ a ca de ia de en t rada
Se ja S o s m bo lo de pa r tida
Re pi ta Se m pr e
Se $S e st n o t op o d a p il h a
e $ es t so b a c abe a de leit ura , e nto
Ac ei te a c ad ei a d e e nt r ada e p ar e
S e n o
Se ja a o t er mi nal ao t o po d a P il h a
Se ja b o t er mi nal so b a cab ea d e lei tur a
Se a b ou a b , e nt o
E m pi l ha r b
A v an ar a ca be a d e le itu ra
Se n o
Se a b , e nt o
Re pi ta
D e se m pi lh ar
At en con tr a r a rela o e nt re o
te rm ina l d o to p o da p ilh a e o lt imo
te rm ina l d es em pil had o
// S eja a pr od u o X , sen do o
// h and le de se mpi lha do
// N est e c as o, X dev er ser em pi l hado
Em pi lha r o n o te rmi na l cor res po n dent e
S e n o
Ch am ar a r ot in a d e t ra t amen to de erro s
F i m Se
Fi m S e
F i m Se
Fi m R e pi t a
Fim
C om piladore s 8
A nlise S int t ic a Asc en dente
Construo d a Tabe la de P rece dncia de Ope rad ore s

P ara constr ui r a tabela de precednci a de operadores, podemos uti li zar doi s mtodos,
os quais nos permi te m comp utar as re laes de precednci a entre os smbolos
termi nai s de uma gra mti ca de operadores : o mtodo in tuit ivo e o me cn i co .

Mt odo Intuitiv o

E ste mtodo permi te obter as re laes de equi val nci a a parti r do co nheci mento prvi o
da associ ati vi dade e precednci a dos operadores da gra mti ca.

S ejam doi s operadores 1 e 2. O algori tmo f unci ona do segui nte modo , lembrando-se
que o lado di rei to da re lao correspo nde li nha da tabela (termi nal mai s ao topo da
pi lha) e o lado di rei to cor responde col una da tabela ( termi nal sob a cabea de lei t ura) :
1. Se o operador 1 tem mai or precednci a sobre o operador 2, ento fa zemos
1 2 e 2 1.
2. Se os operadores 1 e 2, tm a mesma precednci a, isto , precedncia i gual,
ento:
2.1. Se so associati vos esq uerda, e nto fazemos 1 2 e 2 1;
2.2. Se so associati vos di rei ta, e nto fa zemos 1 2 e 2 1.
3. As relaes entre os operadores e os demai s tokens (operandos e deli mitadores)
so fi xas . P ara todo operador , temos :
id e i d ,
( e ( ,
) e ) ,
$ e $ ;
4. As relaes ent re os tokens q ue no so operadores tambm so fi xas:
) ) e ( (,
id ) e ( i d,
id $ e $ i d,
) $ e $ (,
( ).
C om piladore s 9
A nlise S int t ic a Asc en dente

S eja a gramti ca de operadores a seguir :

E E + E | E E | E * E | E / E | E ^ E | ( E ) | id

Tm-se as seg ui ntes preced nci as e associ ati vi dade e nt re os operadores :

1. ^ : tem mai or precednci a e associ ati vo di reita ;

2. * e / : te m preced nci a i ntermedi ri a e so associ ati vos esquerda;

3. + e - : te m me nor precednci a e so associati vos esq uerda.

A tabela de precednci a de operadores para esta a gramti ca i ndi cada abai xo. A s
posi es em branco so assi naladas como erro .

id + * / ^ ( ) $
id
+
*

/
^
(
)
$ A cei ta

Obser ve q ue na gramti ca acima a p roduo : E E ; foi elimi nada, i mpedi ndo assi m
que o operador se ja uti li zado como bi n ri o e unri o. Para ter mos os doi s
si gni fi cados para o mesmo operador, o a nali sador lxi co de ve disti ngui r entre os doi s
ti pos, por exemplo , represe ntando o operador unri o por u, o qua l o caso quando o
operador precedi do de outro operador, de abre parnteses , de vrg ula ou de um
smbolo de atri b ui o.
C om piladore s 10
A nlise S int t ic a Asc en dente
Mt odo Mec nic o
E ste mtodo obtm as relaes de precednci a di retamente a parti r da gramti ca de
operadores, a q ual no pode ser amb g ua .
O algori tmo funci ona do seg ui nte modo:
1. Defi na l eadi ng(A )1 para o no termi nal A como sendo o conj unto dos termi nais a,
tal q ue a o termi nal ma is esqu er da em alguma forma se ntenci al deri vada de
A;
2. Defi na t rail ing(A )2 para o no termi nal A como sendo o conj unto dos termi nais a,
tal q ue a o termi nal mais d ireita em a lg uma forma se ntenci al deri vada de A ;
3. Para cada doi s termi nai s a e b, temos:
3.1. a b, se e xi ste um lado di rei to de produo da for ma a b , onde ou
um no termi nal e e so arbi t rri os;
3.2. a b. se e xi ste um lado di rei to de produo da for ma aA , e b est em
leadi ng(A );
3.3. a b, se exi ste um lado di rei to de produo da forma A b e a est em
trai li ng(A );
3.4. $ b, se S o s mbo lo de par ti da da gramti ca e, para q ualq uer b,
b l eadi ng(S);
3.5. a $, se S o s mbo lo de par ti da da gramti ca e, para q ualq uer a,
a t rai l i ng(S);

C omo exemplo de ap li cao do algori t mo, s upo nha a gramti ca de operadores:

E E + E | E * E | E ^ E | ( E ) | id

E sta gramti ca amb g ua. Portanto, no podemos apli car o algori t mo sem a ntes
eli mi narmos a ambi gi dade. Is to pode ser fei to transformando as produes para
expressar a precednci a e a associ ati vidade dos operadores. Conseg ue-se i sto
i ntrod uzindo um s mbo lo no termi nal para cada nve l de precednci a. No caso de

1
A traduo para leading, neste contexto, seria frente. Portanto, leading(A) seria o conjunto formado por todos os
smbolos terminais frente de uma forma sentencial derivada de A, isto , os primeiros smbolos terminais (no
confundir com o conjunto Primeiro(A)).
2
A traduo para trailing, neste contexto, seria finaliza. Portanto, trailing(A) seria o conjunto formado por todos os
smbolos terminais que finalizam uma forma sentencial derivada de A, isto , os ltimos smbolos terminais.
C om piladore s 11
A nlise S int t ic a Asc en dente
associ ati vi dade esquerda, a avaliao ser fei ta da esquerda para a di reita. J para a
associ ati vi dade di rei ta, a avali ao ser fei ta da di reita para a esquerda. Por tanto,
temos a seg ui nte g ramti ca:
E E+T |T // Operador de m enor prec edncia e a ssociat iv o esquerda
T T*F |F // Operador de pre cedncia int ermediria e associat ivo esquerda
F P^F |P // Operador de m aior p recednc ia e assoc iat iv o direit a
P ( E ) | id // Operandos

Os co nj untos l eadi ng e t raili ng so indi cados pela tabela abai xo.

L eadi ng T rai li ng

E +, *, ^, (, id +, *, ^, ), i d

T *, ^, (, i d *, ^, ), id

F ^, (, i d ^, ), i d

P (, i d ), i d

A gora, calc ulemos as relaes de precednci a:

1. a b: e xami nar todos os lados di rei tos das produes proc urando por formas
a b, onde ou um no ter mi na l e e so a rbi trri os. Neste caso, a
ni ca produo q ue se enq uadra P ( E ). Portanto , temos:
( )

2. a b: exami na r todos os lados di rei tos das produes procurando por formas
aA , tal que b es t em l eading(A). Nes te caso, te mos as prod ues:
P E + T (par + T) : o q ue nos d a relao: + {*, ^, ( , id}
T T * F (par * F ): o que nos d a relao: * {^ , ( , id }
F P ^ F (par ^ F ): o q ue nos d a relao: ^ {^ , ( , i d}
F ( E ) (par ( E ) : o que nos d a relao: ( {+ , *, ^, (, id}
C om piladore s 12
A nlise S int t ic a Asc en dente
3. a b: exami na r todos os lados di rei tos das produes procurando por formas
A b , tal que e a est e m t rai l i ng(A ). Neste caso , temos as prod ues:
P E + T (par E +): o q ue nos d a relao: { +, *, ^, ) , i d} +
T T * F (par T *): o q ue nos d a re lao: { *, ^ , ) , id} *
F P ^ F (par P ^): o q ue nos d a relao: { ), id } ^
F ( E ) (par F )): o q ue nos d a relao: { +, *, ^, ) , i d} )
4. $ b, se S o smbolo de parti da da gramti ca e, para qualquer b,
b leadi ng(S). C omo $ tem precednci a menor que qualquer termi nal em
l eadi ng(E ), ento temos :
$ { + , *, ^, ( , i d }

5. a $, se S o smbolo de parti da da gramti ca e, para qualquer a,


a t rai li ng(S). C omo qualq uer termi na l em t rai l i ng(E ) possui precednci a mai or
que $ , e nto temos:
{+ , *, ^, ), i d} $

A tabela de precednci a obti da a parti r des te algori tmo indi cada abai xo.

id + * ^ ( ) $
id
+
*
^
(
)
$ A cei ta
C om piladore s 13
A nlise S int t ic a Asc en dente
Funes de Pre cednc ia

P odemos usar funes para i ndicar ao analisador a p recednci a de operadores,


substi t ui ndo assim a tabela de precednci a. A s funes f e g mapeiam terminai s em
i ntei ros. E s tes i ntei ros i ndicam a preced nci a. S ejam a e b termi nais:
q f(a) < g(b ) sempre que a b;
q f(a) = g(b ) sempre que a b;
q f(a) > g(b ) sempre que a b.

O mtodo aprese nta a lg umas desva ntagens, como no representar as e nt radas de


erros. A lm di sto , nem sempre poss vel obter as f unes f e g .
O algori tmo para obter as f unes de precedncia o segui nte:
1. Cri ar smbolos fa e ga para cada a e leme nto de V T e $.
2. Di stri bui r os s mbolos c ri ados em gr upos , ta l q ue :
2.1. S e a b, ento fa e gb esto no mesmo gr upo;
2.2. S e a bec b, fa e fc deve ro fi car no mesmo gr upo q ue gb ;
2.3. S e, ai nda, c d, ento fa, fc, gb e gd devero fi car no mesmo grupo, mesmo
que a d no ocorra.
3. Gerar um g rafo di rigi do cujos n s so os gr upos formados a nte ri orme nte. Para
quai squer a e b:
3.1. S e a b, co nstr ui r um arco do grupo fa para o gr upo gb; e
3.2. S e a b fazer um arco de gb pa ra fa .
4. Se o grafo conti ve r ci clos, e nto as f unes de precednci a no e xi stem. S e no
houver ci clos, ento f(a) i gual ao cami nho mai s longo i ni ci ando em fa e g(a)
i gual ao cami nho mai s longo i ni ciando em ga.

P or exe mplo, seja a gramti ca:


E E+T |T
T T*F |F
F ( E ) | id
C om piladore s 14
A nlise S int t ic a Asc en dente

A tabela de precednci a de operadores para es ta gram tica i ndi cada abaixo.

id + * ( ) $
id
+
*
(
)
$ A cei ta

P elo algori tmo proposto temos o grafo i ndi cado pela


Figura 2. A s funes f e g enco ntram-se i ndi cadas abai xo. gid fid

+ * ( ) id $ f* g*
f 2 4 0 4 4 0
g 1 3 5 0 5 0 g+ f+

f$ g$

Figura 2
C om piladore s 15
A nlise S int t ic a Asc en dente
Anl ise L R(k)
A nali sa-se a segui r uma tc ni ca efi ciente de an li se ascendente, a qua l pode ser
uti li zada para decompor uma ampla classe de gramti cas li vres de conte xto. A tcni ca
chamada de a nli se LR (k), o nde o L signi fi ca q ue a e ntrada li da da esq uerda para a
di rei ta (left-to- ri ght), o R si gni fica a const r uo da deri vao mai s di rei ta em reverso
(ri ghtm ost-deri vati on), e o k o nme ro de s mbolos de entrada q ue de vem ser lidos
(l ookahead) para que o anali sador possa tomar decises. D entre as va ntagens destes
anali sadores destaca m-se:

1. So capazes de reconhecer, p rati came nte, todas as est r ut uras sint ticas
defi ni das por uma gramti ca li vre de co ntexto;
2. o mtodo mai s geral e efi ciente que o de precednci a de operadores e
qualq uer out ro ti po de anali sador sh ift-redu ce, podendo ser i mpleme ntado com
o mesmo grau de efi ci nci a;
3. So capazes de descobri r erros sintticos to cedo quanto poss vel , numa
var redura de e nt rada da esquerda para di rei ta.

A pri ncipal desva ntagem deste m todo est na di fi culdade para se cons tr ui r um
anali sador sint tico LR manual mente, se ndo nor malme nte, necess rio a uti li zao de
ferrame ntas especi ali zadas, denomi nadas de geradores de anali sadores (parser-
generator), como por e xemp lo o YAC C (Ye t A nother Compi l er-C ompi ler) e o B IS ON .
H basi camente trs ti pos de anali sadores LR :

1. SL R (Si m pl e LR ): de fci l i mplementao, porm ap li cvei s a uma c lasse restri ta


de gramticas;
2. LR Can nico s: so os mai s poderosos, podendo ser apli cados a um grande
nmero de li nguagens li vres de co ntexto; e
3. LA L R (Look Ahead LR): de nvel i nte rmedi ri o e i mplementao efi ci ente , que
funci ona para a mai ori a das li nguagens de programao o mtodo uti li zado
pelo YA C C.
C om piladore s 16
A nlise S int t ic a Asc en dente
B asi camente, um a nali sador L R composto
por uma fita de entrada, uma pi lha, um
programa e uma tabel a si ntti ca, a q ual
composta por duas partes : a o (acti on) e
desvio (goto) . O programa o mesmo para os
trs ti pos de anali sadores L R , apenas a tabel a
si ntti ca muda de um para outro. A Figura 3
i lustra a forma esquemtica de um ana li sador
L R . A fita de entrada mostra a sente na a ser
anali sada, fi nali zada pelo marcador $. A pi lha
Figura 3
armaze na os s mbo los X i da gramti ca
i nterca lados por estados sm do a nali sador,
forma ndo o par Xm sm . O s mbolo na base da pi l ha sempre S0 , o u se ja, o estado i nici al
do ana li sador.
Na tabela si ntti ca, a parte ao cont m as segui ntes aes, as quai s esto associadas
aos estados e aos s mbo los te rmi nai s li dos da e ntrada:
1. Empi lhar s, o nde s um estado;
2. Reduzi r usando uma prod uo A ;
3. Acei tar; o u
4. Erro.
A parte desvio co ntm t ransi es de estados em relao aos s mbolos no termi nai s
da gramti ca.
B asi camente, o anali sador f unci ona como se segue. Seja sm o estado no topo da pi lha e
ai o termi na l sob a cabea de lei tura. O ana li sador cons ulta a tabela A o [sm , ai], a qual
pode assumir um dos va lores :
1. Empi lha s: ca usa o empil hame nto de ais ;
2. Reduzi r A : causa o desempi lhamento de 2r s mbolos , onde r = | |, e o
empi lhamento de Asj , o nde sj res ul ta da cons ulta tabela desvio[sm -r, A ] ;
3. Acei ta: o anali sador reconhece a sente na como vli da; e
4. Erro: o a nali sador pra a e xecuo , i denti fi cando um erro si ntti co.

O f unciona me nto de um anali sador LR pode se r e ntendi do co nsiderando as


tra nsfor maes que ocorrem na pi lha e na fita de entrada, de nomi nada de configurao
do analisador, a q ual represe ntada pelo par (pi lha, fi ta). P orta nto, a configurao
i ni cial de um a na li sador LR dada por (s0 , a1 a2 ... an$).
C om piladore s 17
A nlise S int t ic a Asc en dente
C onsi derando a configurao (s0 X1 s1 X2 s2 ... Xm sm, ai ai+1 ... an $), tm-se a segui nte
confi g urao aps a apli cao de cada ao:
1. Se Ao[sm , ai] = empilhar s , ento tem-se a nova co nfi gurao:
(s0 X 1 s1 X2 s2 ... Xm sm ai s, ai+1 ... an $). Observe que a cabea de lei tura ava nada
para o prxi mo s mbolo na ent rada;
2. Se Ao[sm , ai] = reduzi r A , ento tem-se a no va co nfi gurao:
(s0 X 1 s1 X 2 s2 ... X m-r sm -r A s, ai ai+1 ... an $); onde s = desvio [sm-r, A] e r = | |. Nesse
caso, o ana li sador desempi lha 2r smbolos da pi lha , dei xa ndo no topo sm-r e
empi lha A e s. Obse r ve que a cabea de leitura no avanada , ma nte ndo o
mesmo s mbolo entrada ;
3. Se ao [sm, ai ] = acei tar, e nto o a nali sador conc lui co m s ucesso; e
4. Se ao [sm, ai] = e rro, ento o ana li sador pra emiti ndo uma mensagem de erro,
ou c hama uma roti na de tratame nto de e rro.

C omo exemplo, considere a gramti ca abai xo:


1. E E + T
2. E T
3. T T * F
4. T F
5. F ( E )
6. F i d
A tabela si ntti ca L R para esta gramtica i ndicada a segui r, onde os smbo los si e ri
si gni fi cam, respecti vame nte, empi lha r i e reduzi r i . A s entradas no defi ni das so de
erro.

Ao Desvi o
E stado id + * ( ) $ E T F
0 s5 s4 1 2 3
1 s6 aceit a
2 r2 s7 r2 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 s6 s11
9 r1 s7 r1 r1
10 r3 r3 r3 r3
11 r5 r5 r5 r5
C om piladore s 18
A nlise S int t ic a Asc en dente

A s configuraes do ana li sador no reconheci mento da ent rada: i d1 * i d2 + i d3 ; indi cado


abai xo.

P asso P i lha F ita de E ntrada A o

1. 0 i d1 * i d2 + i d3 $ E mpi lhar

2. 0 i d1 5 * i d2 + i d3 $ Reduzi r F i d

3. 0F3 * i d2 + i d3 $ Reduzi r T F

4. 0T2 * i d2 + i d3 $ E mpi lhar

5. 0 T 2* 7 i d2 + i d3 $ E mpi lhar

6. 0 T 2 * 7 i d2 5 + i d3 $ Reduzi r F i d

7. 0 T 2 * 7 F 10 + i d3 $ Reduzi r T T * F

8. 0T2 + i d3 $ Reduzi r E T

9. 0E1 + i d3 $ E mpi lhar

10. 0 E 1 + 6 i d3 $ E mpi lhar

11. 0 E 1 + 6 i d3 5 $ Reduzi r F i d

12. 0 E 1 + 6 F 3 $ Reduzi r T F

13. 0 E 1 + 6 T 9 $ Reduzi r E E + T

14. 0 E 1 $ A cei ta
C om piladore s 19
A nlise S int t ic a Asc en dente

O algori tmo para um ana lisador LR i ndi cado a segui r, o qual recebe como ent rada um
tabela si nttica t e a cadeia w a ser ana li sada.

A l go r it mo An al i se L R(t, w)
I n ic i o
S e ja w $ a c a de i a de en tr a da
E m pi lh ar S, o s mbo lo de part ida , n a pi lha
F a a i p a po n ta r par a o p r imei ro s m bolo de w $
R e pi ta se mp r e
Se ja s o e s tado ao t o po d a p il h a
Se ja a o s mbol o a po n tado po r i p
Se a o [s , a] = e mp i lhar x en t o
E mp i lh a r a
E mp i lh a r x
A va n a r ip par a o pr xim o s mbo lo da ent rada
Se no
S e a o[s, a] = redu zir A e n to
De s empi lha r 2 *| | s mbo los da pil ha
Se j a x o e st a do a o t op o da pil ha
Em p ilha r A
Em p ilha r d es v io[x , A ]
// Nest e p on t o ex ecu ta - se q ual qu e r a o
// dese jad a, como po r e xemp lo es c rev er
// a re du o A
S en o
Se a o[s , a ] = ace it a r en to
Ret orn ar
Se n o
Cha mar r o tina de t r atam ent o d e e rro
Fi m Se
F im Se
Fi m S e
F i m Re pit a
Fim
C om piladore s 20
A nlise S int t ic a Asc en dente
Construo de Analisadore s Si nt tic os SL R
C onforme citado anteri orme nte , o que varia em um mtodo de anli se L R a sua
tabela si ntti ca. P or sua faci li dade de i mplementao , apresentaremos agora o
algori tmo para constr uo da tabela si ntti ca para o m todo SL R .

A const ruo de a nalisadores S LR basei a-se no q ue se de nomi na co nju n to can ni co


de iten s L R(0) . Um item L R (0) (ou simples mente item) de uma gramtica G uma
produo de G com um po nto e m alguma posi o do lado di rei to da prod uo. P or
exemp lo, para a produo A X Y Z tem-se quatro i tens: A X Y Z, A X Y Z,
A X Y Z, A X Y Z . A produo A gera apenas um tem: A .

Int ui ti va mente podemos di zer que o item i ndi ca o quanto de uma produo j foi vi sto
at um de termi nado momento no processo de a nli se.

A i di a central no mtodo S L R de cons tr ui r, a par ti r de uma gram tica, um autmato


fi ni to deter mi nsti co que reconhea pref ixo s viveis. Pref ixo s viveis so formas
sente nciai s di rei tas que aparecem no topo da pi lha de um ana li sador do tipo empi lhar-
reduzi r. Os itens so agr upados em conj untos que do ori gem aos es tados do
anali sador S LR . So es tes esta do s q ue i ro reconhecer os pre fi xos vi vei s.

A constr uo do con ju nto can n i co de tens LR (0), ou si mplesme nte con jun to
can n ico L R(0) , para uma gramtica G, requer d uas operaes e nas f unes clo su re
(fech amen to ) e go to ( desvio ):

1. Adi ci onar gramti ca G a produo S S, onde S o s mbolo i ni cial de G


gramti ca e S um no vo s mbo lo no ter mi na l, gera ndo a gramti ca G ,
denomi nada de gramt ica au men tada ; e
2. Computar a funo clo su re e goto para G.

O objetivo de se acrescentar a produo S S G i ndi car o momento em que o


processo de anli se acaba e acei ta a sentena de e nt rada. Ou seja , i sto ocorre q uando
o ana li sador est po r red uzi r S S.
C om piladore s 21
A nlise S int t ic a Asc en dente
Ope rao Closure

S e I um co n jun to de i ten s L R(0) de G, ento clo sure(I) o con ju nto de i ten s


const rudo a partir de I pe las seg ui ntes reg ras:

1. Todo item de I adi ci onado em clo sure( I) ; e

2. Se A B est em closu re(I) e B pertence a G , ento adi ci one o item


B em I, se ele j no esti ver l. Repi ta esta regra at que nenhum novo
item possa ser adi ci onado.

Int ui ti va mente o i tem A B em clo sure(I) i ndi ca que, em algum po nto do


processo de anli se, espera mos ver uma cadeia deri v ve l a par ti r de B . S e B
uma prod uo de G , ento tambm esperamos ve r uma cadei a derivvel de neste
ponto . Por esta razo i nc lumos B em clo sure(I) .
P or exe mplo, seja a gramti ca aume ntada G:

E E

E E+T|T

T T*F |F

F ( E ) | id

S e I = {E E }, ento clo sure(I) co ntm os seg ui ntes i te ns:

E E

E E+T

E T

T T*F

E F

F (E)

F id
C om piladore s 22
A nlise S int t ic a Asc en dente
Ope rao got o

Informa lme nte , go to (I, X ) , avano de I atra vs de X , co nsi ste em co letar as produes
com ponto no lado esque rdo de X , X termi nal o u no te rmi na l (X V N V T), avanar o
ponto de uma posi o e obter a f uno clo su re deste co nj unto.

F ormalme nte, para X (VN V T ), a funo go to (I, X) a funo clo su re do conj unto
dos tens {A X } tal q ue {A X } I.

P or exemplo, seja a gramti ca aume ntada G usada anteri ormente. Se I = {E E ,


E E + T} , ento goto (I, +) :

E E+T

T T*F

T F

F (E)

F id

Algo ritm o para a Constr u o d o Con junto Canni co de Ite ns LR(0)

P ara uma gramti ca G , o co nju n to can n ico de i ten s LR (0) , referi do por C , obti do
pelo algori t mo abai xo .

A l go r it mo Cl os u re ( G)
I n ic i o
C <- I 0 = c lo sur e({ S S} )
r e pi ta
P ar a c ad a c o njun to de iten s I e m C e
P ar a c ad a s mbol o X d e G, tal q u e
g ot o(I ,X ) e go t o( I,X ) C F aa
Ad ic i on e got o(I ,X ) em C
A t qu e n en h um c onj un t o de it en s pos sa se r ad icio nad o C
Fim
C om piladore s 23
A nlise S int t ic a Asc en dente

P or exe mplo, seja a gramti ca aume ntada G:

E E

E E+T|T

T T*F |F

F ( E ) | id

O co n jun to can n ico de i ten s L R(0) para G dado por:

1. Ini ci alizao : C = {I0 = closure( {E E} )}

I0 = {E E , E E + T, E T, T T * F , T F , F ( E ), F id}

2. Repi ta: P ara t odo I C e X G , calcu lar got o(I, X ) e ad icionar a C

I1 = got o(I0, E ) = cl osure({E E , E E + T}) = {E E , E E + T} ;

I2 = got o(I0, T) = cl osure({E T , T T * F } ) = {E T , T T * F };

I3 = got o(I0, F ) = cl osure({T F }) = {T F };

I4 = got o(I0 , () = cl osure( {F ( E )} ) = {F ( E ), E E + T, E T,


T T * F, T F, F ( E ), F i d}

I5 = got o(I0, i d) = cl osure({F i d } ) = {F i d }

I6 = got o(I1, +) = cl osure({E E + T} ) = {E E + T, T T * F , T F ,


F ( E ), F i d}

I7 = got o(I2, *) = cl osure({T T * F }) = {T T * F , F ( E ), F i d}

I8 = got o(I4, E ) = cl osure({F (E ), E E + T} ) = {F (E ), E E + T }

got o(I4, T) = cl osure({E T , T T * F} ) = I2, o qua l j foi inc l udo

got o(I4, F ) = cl osure({T F }) = I3 , o qua l j foi i nc l udo

got o(I4, () = cl osure( {F ( E )}) = I4, o qua l j foi i ncl udo

got o(I4, i d) = cl osure({F i d } ) = I5 , o q ual j foi i ncl udo

I9 = got o(I6, T) = cl osure({E E + T , T T * F } ) = {E E + T , T T * F }

got o(I6, F ) = cl osure({T F }) = I3 , o qua l j foi i ncl udo


C om piladore s 24
A nlise S int t ic a Asc en dente
got o(I6, () = cl osure( {F ( E )}) = I4, o qua l j foi i ncl udo

got o(I6, i d) = cl osure({F i d } ) = I5 , o q ual j foi i ncl udo

I10 = got o(I7 , F ) = cl osure({T T * F }) = {T T * F }

got o(I7, () = cl osure( {F ( E )}) = I4, o qua l j foi i ncl udo

got o(I7, i d) = cl osure({F i d } ) = I5 , o q ual j foi i ncl udo

I11 = got o(I8 , )) = closure( {F ( E ) }) = { F ( E ) }

got o(I8, +) = closure( {E E + T} ) = I6 , o qua l j foi i ncludo

got o(I9, *) = closure({T T * F} ) = I7 , o qua l j foi i ncludo

C omo resultado temos a seg uinte tabe la:

Conj unt o Cannicos d e It e ns LR (0)


Co nju n t o It e n s
I0 E E, E E + T, E T, T T * F, T F, F ( E ) , F i d
I1 = g o t o (I0 , E) E E , E E + T
I2 = g o t o (I0 , T) E T , T T * F
I3 = g o t o (I0 , F) TF
I4 = g o t o (I0 , ( ) F ( E ), E E + T, E T , T T * F, T F , F ( E ), F i d
I5 = g o t o (I0 , i d ) F id
I6 = g o t o (I1 , + ) E E + T, T T * F, T F, F ( E ), F i d
I8 = g o t o (I4 , E) T T * F, F ( E ), F i d
I9 = g o t o (I6 , T) F (E ) , E E + T
I9 E E + T , T T * F
I1 0 = g o t o(I7 , F) T T* F
I1 1 = g o t o(I8 , )) F(E )
C om piladore s 25
A nlise S int t ic a Asc en dente
Construo d a Tabe la de P ars ing SLR

D ada uma gramti ca G , obtm-se G, aumenta ndo G com a produo S S, onde S


o s mbolo de parti da de G. A par ti r de G, determi na-se o co nju n to can ni co de i ten s
L R (0) . Fi nalme nte, co nstri -se as tabe las a o e desvio , co nfor me i ndi cado pelo
algori tmo abai xo.
1. Constr ua o co nj unto ca nni co C = {I0 , I1 , ... , In};
2. Cada li nha da tabela cor responde a um estado i do anali sador, o q ual
const rudo a parti r de Ii, 0 i n;
3. A li nha para da tabela ao para o estado i determi nada pelas regras abai xo.
Entre ta nto, se ho uver alg um conflito na apli cao destas regras, ento a
gramti ca no S LR (1), e o a lgori tmo fa l ha:
a) S e A a est em Ii e go to ( Ii, a) = Ij , a V T, ento ao [i , a ] = empi l har j;
b) S e A est em Ii, A S, ento ao[i , a] = reduzi r A , para todo
a S egu inte(A) ;
c) S e S S est em Ii, e nto defi na a o [i , $] = aceita.
4. A li nha da tabela desv io para o estado i de termi nada do seg uinte modo:
a) P ara todos os no termi nai s A, se go to(Ii, A) = Ij, e nto desvio [i , A ] = j .

5. As entradas no defi ni das so erros ;


6. O estado de parti da o estado 0 .
P elo algori tmo, a tabela si ntti ca para a gramti ca de expresses aumentada G ,
defini da anteri orme nte, :
A o Des vi o
E s tado id + * ( ) $ E T F
0 s5 s4 1 2 3
1 s6 a c e it a
2 r2 s7 r2 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 s6 s11
9 r1 s7 r1 r1
10 r3 r3 r3 r3
11 r5 r5 r5 r5
Compiladores 1
Geradores de Analisadores Sintticos

Introduo
q Conforme verificado, poss ve l escre ver um a nalisador si nttico desce ndente
manua lme nte. E ntreta nto , escre ver um ana lisador ascende nte j uma tare fa
mais desgastante.
q De qualq uer modo, pa ra ambos os casos, e xistem geradores a utomticos para
analisadores si ntticos, ta nto desce ndentes como ascende ntes .
q Para os analisadores descende ntes, LL Gen e Coco/ R so dois exemplos de
geradores automticos para gram ticas LL(1).
q J para os analisadores ascendentes , YACC e BISON so os geradores
autom ticos mais conhecidos e utilizados, trabalha ndo com gramticas LALR(1) .
Um outro gerador extremame nte interessa nte o GOLD, tambm para
gramticas LALR(1). Enq ua nto o YACC e o BISON lem a especificao BNF da
gramtica e geram o cdigo fonte para o analisador sint tico, o GOLD, ao
cont rrio, gera um arq uivo conte ndo a tabe la sinttica. Esta tabela , por s ua ve z,
carregada em tempo de execuo, por um mdulo de run-tim e, permitindo
assim que g ramticas difere ntes possam ser p rocessadas pelo mesmo
programa.
q Analisa-se a seguir a utili zao do YACC/BIS ON.

Ar quivo de Especificao YACC

q O YACC (Yet Another Com piler-Com piler) um gerador auto mtico de


analisadores sintticos (parser-ge rnerator ), dese nvolvido pela Bell Laboratories,
em 1975. Atualme nte , o YACC faz parte do pacote UNIX, assim como o LEX,
ambos traba lha ndo de for ma i ntegrada.
q Atualme nte, o pacote FLEX/B ISON utili zado com va ntagens em s ubstit uio
ao LEX/YACC, dentre elas a disponibilizao e a gerao de cdigo para
diversas pla tafor mas. O for mato do arq ui vo de especificao para a gramtica a
ser analisada (de nominado norma lme nte de programa YACC) praticame nte o
mesmo, para ambos os casos, ma nte ndo assim a compatibilidade. Caso uma
exte nso no seja especificada, a e xte nso padro . y.
q Da mesma forma q ue o LEX, um programa YACC cont m trs sees,
separadas pelo s mbolo % % :
q Declara es: Esta a primeira seo a ser declarada . ne la q ue se
enco ntra m as declaraes de variveis, de consta ntes manifes tas e todos os
tokens a serem utili zados pelas regras de traduo. Os tokens de vero ser
identificados pela palavra %toke n. Por e xemp lo, os toke ns para os
identificadores e para as palavras reser vadas IF , THEN e ELSE poderiam
ser:
%TOKEN IF THEN ELSE
%TOKEN ID

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 2
Geradores de Analisadores Sintticos

q Regras de Tradu o: Esta a segunda seo a ser declarada. Nela


enco ntra m-se especificadas as produes da gramtica para a linguagem a
ser reco nhecida. Por e xemp lo, a prod uo:
<Expr> ::= <Expr> + <Termo> | <Termo>
dever se r trad uzida para:
expr : expr '+' termo | termo
Caso tenha sido definido o token PLUS para o operador de adio, ento
ter amos :
expr : expr PLUS termo | termo
Aes semnticas podem ser especificadas, desde que esteja m e nvolvidas
por cha ves , co nfo rme i ndicado a seg uir:
expr : expr '+' termo {$$ = $1 + $3} | termo
No exemp lo podemos observar a utili zao de $$, $1 e $3. Estes elementos
correspondem aos atrib utos associados a produo. O $$ corresponde ao
atributo associado expr, o lado esquerdo da produo, o qual ser
retor nado como res ultado da ava liao desta produo. J $1 correspo nde
ao atributo do primeiro smbo lo gramatical do lado direito da produo, neste
caso expr, enqua nto $3 corresponde ao terceiro, o termo. Observe q ue o
$2 corresponde, porta nto, ao atrib uto do s mbolo +. Assim, se a
expresso a ser a nalisada 1 + 2, temos $$ = 3, $1 = 1, $2 = + e $3 =
2.
q Procedimentos Auxiliares : Esta a terceira e ltima seo do arqui vo de
especificao. Nela so colocadas as definies de procedimentos
necessrios para a realizao das aes especificadas ou auxiliares ao
analisador si nt tico.

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 3
Geradores de Analisadores Sintticos

Exemplos de Especificao de Gramtica


Exemplo 1:
q O e xemplo a seguir pe rmite co nst r uir um a nalisador si nt tico para ava liar
expresses arit mticas, sim ulando uma calc uladora de mesa, a q ua l a cada
ENTER pressionado ava lia a expresso corrente. O arqui vo de especificao
para o YACC i ndicado abaixo.

/* seo de declarao */
%{
/* incluso de arquivos de cabealhos */
#include <ctype.h>
%}
/* declarao dos tokens */
%TOKEN NUM
%%
/* seo de regras de traduo */
linha : linha expr '\n' {printf(Resultado: %g\n, $2}
expr : expr '+' termo {$$ = $1 + $3}
| expr '-' termo {$$ = $1 - $3}
| termo
;
termo : termo '*' fator {$$ = $1 * $3}
| termo '/' fator {$$ = $1 / $3}
| fator
;
fator : NUM {$$ = $1}
| '(' expr ')' {$$ = $2}
;
%%
/* procedimentos auxiliares */
/* Analisador Lxico */
int yylex()
{
int c;
c = getchar();
if (isdigit(c))
{
yyval = c '0'
return NUM
}
return c
}

Exemplo 2:
q O exe mplo a nte rior utilizo u uma f uno yylex(), responsve l pela a nlise
lxica da entrada, co nstr uda no prp rio arqui vo de especificao. Ent reta nto ,
isto no necessrio. Na verdade , o LEX e o YACC foram projetados para
trabalharem um com o outro. Porta nto, apesar de podermos optar por
implementar nosso p rprio ana lisador l xico de nt ro do progra ma YACC, seria
mais interessa nte fa ze- lo co m a a juda do LEX.

Prof. R ogrio Me lo Nepo mu ceno


Compiladores 4
Geradores de Analisadores Sintticos
q O YACC espera, como a na lisador l xico a se r defi nido, a f uno yylex(), que
tem o mesmo nome do ana lisador gerador pelo LEX. Desta forma, basta incluir
ao arquivo de definio, na seo de funes, o arq uivo lex.yy.c, o qual
contm a imp leme ntao do ana lisador l xico gerado .
q O arqui vo de especificao abaixo permite a construo de uma calc ulado ra de
mesa um pouco mais ava nada, a qua l lida com va riveis. Deta lhes adicionais
sobre como constr uir o arqui vo de especificao poder ser obtido no manual do
YACC/B ISO N.

/* seo de declarao */
%{
/* incluso de arquivos de cabealhos */
#include <ctype.h>

float x[26];
%}
/* declarao dos tokens */

%token <Real> NUM /* constantes numrica */


%token <Integer> ID /* variveis */
%type <Real> expr /* expresses */

%left '+' '-' /* operadores */


%left '*' '/'
%right UMINUS

%token ILLEGAL /* token ilegal */

%%
/* seo de regras de traduo */
input : /* derivao vazia no faz nada */
| input '\n' { yyaccept; }
| input expr '\n' { printf(Resultado: %f, $2); }
| input ID '=' expr '\n' { x[$2] := $4;
printf(%c = %f, $2, $4); }
| error '\n' { yyerrok; }
;
expr : expr '+' expr { $$ := $1 + $3; }
| expr '-' expr { $$ := $1 - $3; }
| expr '*' expr { $$ := $1 * $3; }
| expr '/' expr { $$ := $1 / $3; }
| '(' expr ')' { $$ := $2; }
| '-' expr { $$ := -$2; }
%prec UMINUS
| NUM { $$ := $1; }
| ID { $$ := x[$1]; }
;
%%
/* procedimentos auxiliares */
#include yylex.yy.c;
void main()
{
for(int i = 0; i < 26; i++) { x[i] = 0; }
if !(yyparse = 0) { printf(Erro sinttico\n); }
}

Prof. R ogrio Me lo Nepo mu ceno


C om piladore s 1
Tradu o Dirigida pe la Sint axe

Intro duo
A Traduo D iri gi da pel a Si ntaxe (T D S) uma tc ni ca de especi fi cao de
compi ladores que permi te associ armos regras semnti cas s produes gramati cai s, as
quai s sero ava li adas quando tai s prod ues fore m uti li zadas no reco nheci me nto de
uma se nte na. A a vali ao destas regras pode gerar ou i nte rpretar cdi go, armazenar
i nformaes na tabela de smbolos, emiti r me nsagens de erro ou rea li zar q ualq uer o utra
tarefa necessri a.
E xi stem d uas no taes para associarmos regras sem nti cas s p rodues :

q D efi ni es Di ri gi das pel a S i ntaxe (DDS ): so especi fi caes de alto nvel ,


escondendo mui tos detal hes de i mplementao , li bertando o us uri o de especi ficar
a ordem exata o nde as tradues ocorrem; e

q E squem as de T raduo (ET ): possibi li tam que o us uri o evi denci e alg uns detalhes
de i mpleme ntao, i ndi cando a ordem na q ual as trad ues devem oco rrer .

A s DDS e os E T so generali zaes de gramti cas livres de contexto , nas quai s a cada
smbolo da gram ti ca pode ser associ ado um co nj unto de a tri butos, di vi didos em doi s
subco nj untos: A t ri butos S inteti zados e Atri butos Herdados.

B asi camente, podemos pensar em um at ri buto como se ndo uma vari vel a q ual
associ ada a um s mbolo gramati cal , podendo represe ntar qualquer i nfor mao
necessri a, como uma cadei a de caracteres, um ti po, uma posi o de memri a, etc.
P or exemplo, supo nha a produo A . P odemos associar o atri buto v al A para
armaze na r o resultado da deri vao de , o q ue se ri a represe ntado po r A .v al.

O valor de cada a tri buto associ ado a um n da rvore de deri vao defi nido pela
regra sem nti ca associ ada produo usada naque le n . O valor de um at ri buto
si nteti zado em um n calc ulado a parti r dos va lores dos atri butos dos fi lhos daquele
n na r vore. O va lor de um atributo herdado calculado a parti r dos va lores dos
atri butos dos i rmos e pai daque le n.

A s regras sem nti cas estabelecem dependnci as ent re os atri butos, as quais sero
representadas por um g rafo de dependnci as. A partir do grafo de dependnci as,
derivamos uma ordem de avali ao para as regras semnti cas. A avaliao destas
regras defi ne os va lores dos atri b utos nos ns da rvore de deri vao para uma dada
cadei a de entrada, podendo tambm produzi r efei tos colaterai s, como, por exemplo,
atuali za r o u imprimi r o valor de uma vari vel.

Uma r vore de deri vao que mostra os valores dos atributos associ ados a cada n
chamada de rvore de deri vao anotada. O processo para ca lc ular os va lores dos
atri butos de cada n c hamado de anotao o u decorao da r vore de deri vao.
C om piladore s 2
Tradu o Dirigida pe la Sint axe
C oncei tua lmente , at ravs das d uas notaes podemos ana li sar si ntati came nte o fluxo
de tokens presentes na entrada, co nst r ui ndo a r vore gramati cal e, em seguida,
percorr-la da forma necessria, a vali ando as regras sem nti cas associ adas a cada n.
C asos especiai s de DDS e E T podem ser implementados em um ni co passo atravs
da avali ao das regras sem nti cas dura nte a a nli se si ntti ca, sem co nstrui r
expli ci tame nte a rvo re de derivao o u o grafo de dependnci a ent re os a tri butos.

De finio Diri gid a pela Si ntax e


Numa DD S , cada produo gramati cal A tem associ ada a si um conj unto de regras
semnti cas da forma b := f(c1 ,...,ck), o nde f uma f uno e:

1. b um a tri buto si nteti zado de A e c1,.. .,ck so at ri butos pertencentes as


smbolos gramati cai s da prod uo; ou
2. b um at ri buto herdado perte ncente a um dos s mbo los gramati cai s do lado
di rei to da produo e c1 ,...,ck so atributos perte nce ntes as smbolos
gramati cai s da produo .
E m ambos os casos , di ze mos que b depende dos atrib utos c1 ,.. .,ck .

Uma gram tica de atri butos uma D D S na qual as funes nas regras semnticas no
produzem efei tos co laterais.

Norma lme nte, as f unes nas regras gramati cai s sero freqe nteme nte escri tas como
expresses. A quelas que ca usarem efeitos colaterai s sero escri tas como chamadas de
procedi mentos o u como fragmentos de progra mas.
C omo exemplo , co nsi dere a DD S da Figura 1, a qua l uti li zada para especi fi car um
programa para uma calc uladora de mesa.

P rodues Regras Sem nti cas


L E = i m pr i mi r( E.v al )
E E1 + T E . va l : = E1 . va l + T .va l
E T E . va l : = T.v al
T T1 * F T . va l : = T1 . va l * F .va l
T F T . va l : = F.v al
F ( E) F . va l : = E.v al
F d ig i to F . va l : = dig it o .l e xval
Figura 1: D DS de uma cal cula do ra de mes a.
C om piladore s 3
Tradu o Dirigida pe la Sint axe
E sta defi ni o associ a um atri b uto sinteti zado, c hamado val, a cada smbolo no-
termi na l E , T e F . P ara cada produo E, T e F , a regra sem nti ca calcula o a tributo v al
para o no-termi na l do lado esq uerdo a parti r dos valores de v al para os no- termi nai s
do lado di rei to. A uti li zao do no termi nal E1 na fi gura se justi fica apenas para
podemos di ferenci ar o no termi nal E do lado esq uerdo e do lado di rei to da regra de
produo.
O toke n dig ito tem um a tri buto si nteti zado lex v al cujo va lor for neci do pelo anal i sador
l xico. A regra semnti ca associ ada a produo L E = uma roti na q ue i mpri me o
valor da e xp resso ari tm ti ca gerada por E .

E m uma D DS , smbo los termi nai s tm apenas atri b utos si nteti zados . A lm di sso,
valores para os atri butos de termi nai s so normalmente for neci dos pelo anali sador
lxi co.

Atri butos Sinte ti zad os


O atri buto sinteti zado de um n aquele c ujo va lor depende dos atri butos associ ados
aos seus ns fi l hos.

Uma D DS que usa exte nsi vamente atri butos si nteti zados c hamada de S -atri buda.
Uma r vo re de deri vao para uma DD S S -atri buda pode ser anotada atravs da
avali ao ascendente das regras semnti cas para os atri butos de cada n.

A D DS da Figura 1
S -atri buda, a qual especi fi ca uma L
calculadora de mesa que l uma
li nha contendo uma e xpresso E.val = 19 =

ari tmti ca formada por d gi tos,


E1 .val = 15 + T.val = 4
parnteses , operadores + e *,
segui da do smbolo =, e i mprime
o va lor da exp resso. Por T.val = 15 F.val = 4
exemp lo, dada a expresso
T1.val = 3 * F.val = 5 digito.lexval = 4
3 * 5+ 4 =, o programa i mpri mi r o
valor 1 9.
F.val = 3 digito.lexval = 5
A rvore de deri vao anotada
para a expresso de entrada digito.lexval = 3
3 * 5+ 4 =, dada pela Figura 2.
Obser ve que o resultado
i mpresso na rai z da r vore o Figura 2: rvore de derivao anotada para 3*5+4=.
valor E .val do fi lho esquerda da
rai z.
C om piladore s 4
Tradu o Dirigida pe la Sint axe

Atri butos He rda dos


Um at ri buto herdado de um n aquele c ujo valor defi ni do em f uno dos at ri butos
do n pai e/ou dos ns i r mos. A tri butos herdados so co nveni entes para e xpressar a
dependnci a de uma constr uo de li ng uagem do conte xto onde a const ruo
aparece. P or e xemplo , pode-se usar um at ributo herdado para regi stra r se uma
i denti fi cador aparece esquerda ou di rei ta de uma atri buio a fi m de decidi r se
necessri o sal va r o e ndereo ou o va lor do identifi cador.

A pesar de ser semp re poss vel resc reve r uma DD S com apenas atri b utos si nteti zados,
mai s na t ural usar D DS com atri b utos herdados.
O exemplo Figura 3 i l ust ra o uso de uma D DS com atri butos herdados na q ual permi te
di stri bui r i nformaes de tipo para vri os i denti fi cadores em uma declarao.
Produes Regras Semnti cas
D T L L . ti p o := T. ti p o
T i nt T . ti p o := in te i ro
T r eal T . ti p o := re al
L L 1 , id L 1 .tip o : = L .tip o
I n cT i po(i d.i nd i ce, L.t ipo )
L id I n cT i po(i d.i nd i ce, L.t ipo )
Figura 3 : DD S tendo L .t i po como atri buto herda de .

O no-termi na l T tem um at ri buto si nteti zado t ipo, cujo valor deter mi nado a parti r das
produes T int ou T real.

A regra semntica L.t ipo := T.t ipo,


associ ada produo D T L, D
armaze na no atrib uto herdado L.t ipo
o ti po especifi cado na declarao. As T.tipo := real L.tipo := real
regras semnti cas passam este ti po
para bai xo na r vore de deri vao real L.tipo := real , id3
atravs do atri buto L.t ipo. Regras
associ adas com as produes q ue
definem L cha mam a roti na IncTipo() L.tipo := real , id2
para incl uir o tipo de cada
i denti fi cador, apontado pelo atri b uto id1
indice , na tabela de s mbo los. Figura 4: rvore anotada com atributo herdado
A Figura 4 i l ustra a r vore de L.tipo em cada n.
derivao ano tada para a se nte na:
r e al id 1, i d2 , i d3 .
C om piladore s 5
Tradu o Dirigida pe la Sint axe
Obser ve que o va lor de L.t ipo determi na o ti po da li sta de identifi cadores id1 , id2 , id3 .
E stes valores so deter minados calc ulando-se o valor do at ri buto T.t ipo j unto ao fi l ho
esquerda da rai z e ava li ando-se L.t ipo de modo descende nte, na rvore direi ta da
rai z. A cada n L, a roti na IncTipo () cha mada para inseri r na tabela de smbolos o fato
de que o i denti fi cador do fil ho mai s esq uerda des te n do ti po rea l.

Graf os de De pe nd nci a
S e um atri buto b de um n da rvore de deri vao depender de um atri buto c , a regra
semntica para c deve ser avali ada antes da que defi ne b. As i nterdepend nci as entre
os atri butos herdados e si nteti zados dos ns de uma rvore de deri vao podem ser
representados em um gra fo di ri gi do chamado g rafo de dependncia.

A ntes de se cons trui r um grafo de dependnci a, deve -se modi fi car cada regra
semntica para a forma b := f (c1 ,...,ck), i ntroduzi ndo um atri buto si nteti zado fict ci o b para
cada regra sem nti ca que consi sta em uma c hamada de procedimento. O grafo deve
possui r um n para cada atri buto e um arco a parti r de c em di reo b, evidenci ando a
relao de depe ndnci a.

P ara se constr ui r um gra fo de depend nci a basta segui r o segui nte a lgori tmo :

Pa ra ca da n n da r vo r e de de ri v ao fa a
P ara c a da a tri but o a do sm bo l o gr ama ti c al e m n fa a
C o ns tr uir um n no gra fo de d epe nd ncia s p ara a
F im Pa r a
Fi m Par a
Pa ra ca da n n da r vo r e de de ri v ao fa a
P ara c a da r egr a s em ntic a b : = f(c 1, . ..,c k) ass ocia da
p rod u o us ada em n faa
P ar a i : = 1 to k faa
C on str uir u m arc o a p a rtir de c i at o n b
F im Pa ra
F im Pa r a
Fi m Par a
C om piladore s 6
Tradu o Dirigida pe la Sint axe
P or exemp lo, s upo nha q ue A .a := f(X .x , Y.y) seja uma regra sem nti ca para a produo
A X Y. E sta regra defi ne o a tri buto si nteti zado A.a q ue depende dos atri b utos X.x e Y.y.
Logo teremos o grafo de depend nci as i l ust rado pela F igura 6 .

S e a produo A X Y possui r a regra semnti ca X .x := f(A .a, Y.y) associ ada a si , ento
X .x um a tri buto herdado de A .a e Y.y . Por tanto, tere mos a g rafo de depend nci as
i lustrado pela F igura 5.

A a A a

X x Y y X x Y y
Fig ura 6 : A .a s inte tizado a Fig ura 5 : X.x he rdado a pa rti r
pa rti r de X .x e Y .y. de A .a e Y .y.

A Figura 7 i l ust ra o gra fo de


dependnci as para a r vore de D
derivao da Figura 4 . Os ns
5
esto marcados por nmeros os T 4
tipo
L 6
tipo
quai s i ndi cam a ordem de 7 3
dependnci a ent re os atri butos . real tipo L 8 , id3 entrada
P or exemp lo, o arco 45 i ndica a
dependnci a e ntre os a tri butos 9 2
L 10 , id2
L.t ipo e T.t ipo, de acordo com a tipo entrada

regra sem nti ca L.t ipo := T.t ipo , 1


associ ada produo D T L. id1 entrada

C ada uma das regras semnti cas Fig ura 7 : G rafo de de pend nc ia pa ra a rvo re de
IncTipo( id.indi ce, L.t ipo) associadas de rivao da Figura 4.
s produes L le va cri ao de
um atri buto fict ci o. Os ns 6, 8 e 10 so co nst rudos para esses atri butos fi ct ci os.
Obser ve que a a vali ao de um atri b uto b de um n do grafo de depe ndnci as s pode
ocorrer qua ndo os a tributos c1 ,...,ck, dos quais e le depe nde, j ti ve rem sido si nteti zados.

Qualq uer ordenao topol gi ca de um grafo de dependnci as prov uma ordem de


avali ao vli da para as regras semnticas associ adas aos ns da rvore de deri vao.
Is to , numa o rdenao topolgica, os atri b utos c1 ,...,ck de uma regra semnti ca
b := f (c1 ,...,ck) so ava li ados antes que f seja a valiada.
C om piladore s 7
Tradu o Dirigida pe la Sint axe
Uma orde nao topolgica de um gra fo ori entado accl i co qualq ue r orde nao
m 1 ,...,m k dos ns do grafo, tal que o senti do dos arcos ocorre dos ns que aparecem
mais cedo para os ns que aparecem mai s tarde na ordenao. Isto , se mi m j um
arco, e nto m i ocorre a ntes de mj na orde nao. P ara o grafo da F igura 7 , uma
ordenao topo lgi ca pode ser obti da li sta ndo-se os ns em ordem crescente de
numerao .

Construo de rv ore s Si nttic as


Uma rvore si ntti ca abstrata (ou si mplesme nte rvo re si ntti ca) uma forma
conde nsada da r vore de deri vao, ti l pa ra a rep resentao das co nstr ues da
li nguagem. Nela, os operadores e as palavras cha ves no fi guram como fol has, mas
si m como ns i nteri ores.

P or exemplo, a produo S if A then B else C


poderi a aparecer como a rvore si ntti ca i ndi cada if A then B else C
pela F igur a 8.

Outra si mpli fi cao enco nt rada nas r vores


si ntti cas a elimi nao das cadei as de produo
si mples, como A B e B C . Por exemplo, A B C
consi derando as produes E, T e F da Figura 1 , a
expresso 3* 5 +4, teri a as rvores de deri vao e Fig ura 8 : rvore s int tica para
si ntti ca i ndi cadas pela F igura 9. S i f A t hen B el se C .

rvore de Derivao rvore Sinttica

E
+

E + T
* 4

T F
3 5
T * F 4

F 5

Fig ura 9 : rvo re de de rivao e s int tica para a ca de ia 3*5+4, de acordo co m as


produe s E, T e F da g ra mt ica da fig ura 1.
C om piladore s 8
Tradu o Dirigida pe la Sint axe
O uso de r vores si nt ti cas como forma de representao i ntermedi ri a permi te que a
traduo se ja fei ta de modo i ndepende nte da a nli se si ntti ca, e vita ndo assi m alg umas
restri es.

Uma t raduo di ri gi da por sintaxe pode basear-se em q ualq uer das duas fo rmas:
rvores de deri vao ou rvores si ntti cas. Em ambos os casos, os atri butos so
associ ados aos ns da r vore.

E m uma rvore si ntti ca para a representao de e xpresses, cons tr umos subrvores


para cada uma das subexpresses, atravs da cri ao de um n para cada operador e
operandos. C ada n composto por trs campos: o pri mei ro campo i denti fi ca o
operador (comumente chamado de rtul o), e os demai s contm apontadores para os
demai s operandos. Podem exi sti r tambm campos adi ci onai s para representar os
valores dos atri butos associ ados que le n.

Usaremos as segui ntes f unes para c ri ar os ns das rvo res si ntti cas para as
expresses com operadores bi nri os. C ada funo retor na um apontador para o n
recm-cri ado.
1. C riaN o(op, esquerdo, d ireit o): cri a um n de operador com rtulo op e dois
campos conte ndo apontadores para os opera ndos esquerdo e di rei to;
2. C riaF olha(id, indic e): cri a um n de i denti fi cador, com r t ulo id e um campo
conte ndo um apo ntador (ind ice) , para a e ntrada de id na tabela d e s mbo los ;

3. C riaF olha(num , val): cri a um n para um nmero, com rt ulo num e um campo
v al conte ndo o valor deste nmero.

P rodues Regras S em nti cas


E E1 + T E. pt r : = C ri aN o(' +', E 1. ptr , T .ptr )
E E1 T E. pt r : = C ri aN o(' -', E 1. ptr , T .ptr )
E T E. pt r : = T .p tr
T ( E) T. pt r : = E .p tr
T id T. pt r : = C ri aF olh a(i d, id.i ndi ce )
T n um T. pt r : = C ri aF olh a(n um , num .va l)
Fig ura 10 : D DS pa ra a co ns truo da rvo re s int tica de uma e xpre ss o s implif ica da.

A Figura 11, i ndi cada a segui r, i l ust ra a uti li zao destas funes para cri ao da rvore
si ntti ca para a expresso a - 4+ c , uti li zando a DD S da F igura 10.
C om piladore s 9
Tradu o Dirigida pe la Sint axe

E ptr
Tabbela de
Smbolos
E ptr + T ptr
...
E ptr - T ptr a
id
.
+ .
T ptr num
.

- b
id
.
.
id num 4 id .

Figura 11 : rvo re s int tica pa ra a expres s o a - 4 + c.

A rvore de deri vao foi const r uda de modo ascendente. Os ns E e T da rvore de


derivao utili zam o atri b uto si nte ti zado pt r co mo apo ntador pa ra a r vo re si ntti ca, a
qual real me nte constr uda. A rvo re de deri vao pode no ser expli citamente
i mplementada, e xi sti ndo ape nas de forma i magi nri a.

Av aliao As ce nde nte de Definies S-At rib udas


E xi stem c lasses de DD S para as quai s fci l const rui r trad utores. Uma des tas classes
as DDS S-A tribudas, isto , defi ni es di ri gi das pela si nta xe que contm apenas
atri butos si nteti zados.

A tri butos si nteti zados podem ser ava li ados por uma anal i sador ascendente a medida
que a cadei a de entrada reconheci da. O analisador consegue ma nter os va lores dos
atri butos si nteti zados, associ ados aos smbo los da gramti ca, em sua prpria pil ha.
S empre que ocorre uma reduo, os va lores dos no vos at ri butos si nteti zados so
computados , a parti r dos atri butos que esto na pi l ha, associ ados aos smbo los do lado
di rei to da produo q ue est sendo reduzi da.

P ara se armazena r os valores dos a tri butos si nteti zados, so adi ci onados novos
campos na pi l ha do anali sador. P or exemplo, s upo nha a D D S a segui r e a pi lha
si ntti ca c uja si t uao i ndi cada pela Figura 12.
C om piladore s 10
Tradu o Dirigida pe la Sint axe

P roduo Regra S em ntica


A X YZ A.a := f (X .x, Y.y, Z.z)

i mportante obser var q ue a pi l ha si ntti ca pode


ser i mplementada como um array de regi stros,
cada qual conte ndo o par (S im bolo, V al) . Pilha Sinttica

Smbolo Val
A ntes q ue X YZ seja reduzi do para A , o valor dos
atri butos Z.z, Y.y e X.x esto armazenados em Z Z.z Topo
V al[Topo], Val [Topo - 1] e Val[Topo - 2], Y Y.y
respecti vamente. S e o smbolo no possui
atri butos, ento a e nt rada V al da pi lha X X.x
i ndefi ni da. A ps a reduo , o Topo .
decrementado de 2, A armazenado em .
Sim bolo[Topo] e o valor do atri buto si nteti zado A.a .
colocado em V al[Topo] .

C onsi dere agora, a D D S da a calculadora de Figura 12 : Pil ha s i ntt ica co m


mesa, represe ntada pela F igura 1. Os at ri butos c a mpo pa ra at ri buto s inte tiza do.
si nteti zados na r vore da Figura 2 podem ser
avali ados por um a nali sador ascende nte c uja e nt rada seja 3 *5+ 4= . Para tal, devemos
modi fi car o anali sador para exec utar as i nstrues da fi gura antes de fazer as redues
apropri adas. O cdi go foi obtido a parti r das regras sem nti cas s ubsti t ui ndo -se cada
atri buto por uma posi o correspo nde nte ao campo Val , na pi l ha sintti ca.

Produes Regras S em nti cas


L E= imprimir(V al[ Topo] )
E E1 + T V al[ nTopo] := Val[ Topo -2] + Val[ Topo]
E T
T T1 * F V al[ nTopo] := Val[ Topo -2] * Val[ Topo]
T F
F (E ) V al[ nTopo] := Val[ Topo - 1]
F digit o V al[ Topo] := digit o.lexv al
Fig ura 13 : DD S pa ra uma cal cula do ra de mes a pa ra um a nal is ado r s intt ico as ce nde nte .
C om piladore s 11
Tradu o Dirigida pe la Sint axe
Quando o ana li sador si nt ti co reconhece um dgi to, o token digit o empi lhado em
Sim bolo[Topo] e seu at ri buto ar mazenado em Val[ Topo] .

Obser ve que o cdi go no mostra como as vari vei s Topo e nTopo so gerenci adas.
E ntre ta nto, qua ndo uma produo com r s mbolos di rei ta reduzi da, o valor de nTopo
fei to i gua l (Topo + r + 1) . A ps a execuo de cada i nstr uo, Topo i g ualado a
nTopo.

A fi gura abaixo mostra a seq nci a de mo vi me ntos reali zada para a entrada 3 * 5+ 4 =.

P asso E ntrada Pi lha P roduo


S mbolo V al Usada
1. 3*5+ 4= - -
2. *5+ 4= 3 3
3. *5+ 4= F 3 F digit o
4. *5+ 4= T 3 T F
5. 5+ 4 T* 3-
6. +4 T *5 3-5
7. +4 T *F 3-5 F digit o
8. +4 T 15 T T*F
9. +4 E 15 E T
10. 4 E+ 15 -
11. = E+4 15 - 4
12. = E+F 15 - 4 F digit o
13. = E+T 15 - 4 T F
14. = E 19 E E+T
15. L 19 L E=
Fig ura 14: M ovimentos re ali za dos pelo a nal is ado r si nttico pa ra a e ntra da .3*5+4=.

Obser ve pela fi gura aci ma q ue as i nstr ues so sempre exec utadas antes de uma
reduo. Os E squemas de Traduo, consi derados na prxi ma seo, provm uma
notao pa ra se i nterca lar aes com a a nli se si ntti ca.
C om piladore s 12
Tradu o Dirigida pe la Sint axe

De finie s L- Atri bu da s
Quando a traduo reali zada d ura nte a anl i se sinttica, a ordem de aval i ao dos
atri butos fei ta de acordo com ordem de criao dos ns da rvore de deri vao.
Uma ordem na tura l, q ue carac teri za m ui tos m todos de anli se descende nte e
ascendente, aq uela obti da atra vs da apli cao do mtodo de pesqui sa em
profundidade (depth-fi rst) para a ava liao dos atri butos associ ados a cada n da
rvore de deri vao, o q ual defi nido pelo seg uinte procedi mento:

Pr oc edi me n to D ept hFi rs t (n: n)


In c io
Par a c ad a fil ho m d e n, da e s quer da pa r a a dir eit a, faa
In ci o
A v al ia r o s a tr i buto s h er d ados de m
D e pt hF irs t(m )
Fim
Ava li a r os at rib ut o s si nte ti z ados de n
Fi m
Os atri butos de uma defi nio L-A tri buda podem sempre serem ava li ados numa ordem
de pesqui sa em profundi dade, vi sto que a info rmao dos atri butos sempre aparecem
no fl uxo da esquerda para a di rei ta.

D i zemos q ue uma D DS L-A tri buda se cada atri b uto herdado de X i, 1 i n, do lado
di rei to de A X1 X2 ...Xn , depender somente:
1. D os atri butos dos s mbolos X1 X 2 ...Xi - 1 esquerda de X i na produo e

2. D os atri butos herdados de A .

Toda defi ni o S-A tribuda L-A tri buda, vi sto que as rest ri es (1) e (2) se apli cam
somente aos at ri butos herdados.
P or exemp lo, a DD S a segui r no L-A tri buda, poi s o atri b uto herdado Q.h do s mbolo
gramati cal Q depende do atri buto si nteti zado R.s do s mbolo gramati cal sua di rei ta.
P rodues Regras S em nticas
ALM L.h := l(A .h)
M.h := m (L.s)
A .s := f(M.s)
AQR R.h := r(A .h)
Q.h := q( R.s)
A .s := f(Q.s)
Figura 15 : Exe mplo de D DS que no L-A t ri bu da.
C om piladore s 13
Tradu o Dirigida pe la Sint axe

Esque m as de Tradu o
Um E squema de T raduo (E T) uma gra mti ca li vre de co ntexto na q ual os at ri butos
so associ ados aos smbolos g ramaticai s e as aes so envol vi das entre chaves
e i nseridas ao lado di rei to das produes, podendo ter a tri butos si nteti zados e
herdados. Esquem as de Traduo consti tuem notaes apropri adas para a
especi fi cao de traduo d urante a si nta xe.
P or exe mplo, o ET da F igura 16 mapei a exp resses i n-fi xas para ps -fi xas.

P rodues
E T R
R O T {im prim i r( O .L exe ma )} R1
T num {im prim i r( n um .va l) }
O + | - {O. Lexe m a = L exi co .L e xe ma}
Fig ura 16: Es que ma de T raduo pa ra conve rte r e xpre ss es in-f ixas pa ra ps -fixas .

T R

9 {imprimir('9')} - T {imprimir('-')} R

5 {imprimir('5')} + T {imprimir('+')} R

2 {imprimir('2')}

Fig ura 17: rvo re de de rivao pa ra a e xpre s so in-fixa 9 -5+2.

A Figura 17 il us tra a r vore de deri vao para a expresso 9- 5 + 2 uti li za ndo-se do E T


da Figura 16.A s aes aparecem associ adas aos ns apropriados. A es so tratadas
como smbolos ter minai s. Q ua ndo exec utadas em uma pesquisa em profundi dade,
i mpri mem a expresso 9 5- 2 + .

Na defi ni o de um E T deve-se assegurar que os valores dos atri butos estejam


di sponvei s sempre q ue as aes se referi rem a eles.
C om piladore s 14
Tradu o Dirigida pe la Sint axe
No caso mais si mples, quando so necessri os apenas atri butos si nteti zados, pode-se
const rui r o ET cri ando uma ao q ue co nsi ste de uma a tri bui o para cada regra
semnti ca, e co locando esta ao no fi nal do lado di rei to da prod uo associ ada.

S e exi sti rem ambos, atri butos si nteti zados e herdados, de ve-se proceder da segui nte
forma:

1. Um atri b uto herdado para cada smbolo no lado di reito de uma produo
deve ser calc ulado em uma ao a ntes deste smbolo;

2. Uma ao no deve se re feri r a um a tributo si nteti zado de um s mbolo


direi ta desta ao;

3. Um atri b uto si nteti zado do no- termi nal esq uerda pode ser calculado
somente depois que todos os atri butos q ue ele refere nci a tenham si do
calculados. A ao que calcula tai s atri butos pode, em geral, ser especi fi cada
no fi nal da p roduo.
O ET abai xo no sati sfa z o pri mei ro dos req ui si tos aci ma:

S A 1 A2 { A1 .h := 1; A 2. h : = 2 }

A a {i mp ri m ir (A. h) }

O at ri buto herdado A.h, na seg unda prod uo, ai nda no est defi ni do qua ndo uma
tentati va de i mpri mi r seu valor fei ta, durante uma travessi a em uma pesqui sa em
profundidade da rvore de deri vao, para a entrada a. A travessi a i ni ci a em S e visi ta
as sub-r vores A 1 e A 2 a ntes q ue os valores de A1 .h e A 2 .h sejam atri budos .

S empre possve l ini ci ar com uma DD S e construi r um ET que sati sfaa os trs
requi si tos aci ma, conforme a nali sado na prxi ma seo .

Trad uo De sce nde nte (Top- Dow n)


Nesta seo, E T sero i mplementados durante a anli se predi ti va.T rabal haremos com
E T ao i nvs de DD S de modo que poderemos expli ci tar a ordem na q ual as aes e as
avali aes de a tributos sero executadas. A tra ns formao se apli ca E T com at ri butos
si nteti zados.

P ara adaptar E T com produes rec ursi vas esq uerda para an li se predi ti va, de ve-se
eli mi nar a recursi vi dade esquerda e fazer a transformao correspo ndente
avali ao de a tri butos.
P or exemp lo, s uponha a DD S da Figura 18 . P odemos transform- la para o E T indi cado
pela F igur a 19.
C om piladore s 15
Tradu o Dirigida pe la Sint axe

P rodues Regras S em nti cas


E E1 + T E. val : = E1. va l + T . va l
E E1 - T E. val : = E1. va l - T . va l
E T E. val : = T .v al
T ( E) T. val : = E .v al
T n um T. val : = n um .va l
Figura 18 : DD S pa ra e xpress es arit m ticas simple s .

Produes
E E1 + T {E. val := E1. v al + T.va l }
E E1 - T {E. val := E1. v al - T.va l }
E T {E .val := T. val }
T (E) {T .val := E. val }
T num {T .val := nu m.v al}
Figura 19 : Es que ma de T raduo pa ra expres s es aritm t icas simples .

E li mi nando -se a rec ursi vi dade esquerda e reali za ndo as t ra nsformaes


correspondentes para a avali ao de at ri butos, ob tm-se o Esquem a de Traduo da
fi gura a bai xo.
Produes
E T { R .h := T .va l}
R { E .v a l := R. s}
R +
T { R 1. h := R. h + T .va l}
R1 { R .s := R 1. s }
R -
T { R 1. h := R. h - T .va l}
R1 { R .s := R 1. s }
R { R .s := R .h}
T ( E) { T .v a l := E. va l }
T n um { T .v a l := nu m. v al }
Figura 20 : Es que ma de T raduo pa ra expres s es aritm t icas simples .
C om piladore s 16
Tradu o Dirigida pe la Sint axe
P elo E squema de T raduo aci ma, a rvore de deri vao anotada para a expresso 9-
5+2 co nstr uda conforme i ndi cado pela Erro ! A orige m da refe r ncia no foi
e ncont rada. . A s setas mostram o cami nho de de termi nao da e xpresso.

T.val = 9 R.h = 9

num.val = 9 - T.val = 5 R.h = 4

num.val = 5 + T.val = 2 R.h = 6

num.val = 2

Fig ura 21: rvo re de de rivao anotada para a e xpre s s o 9-5+2.

P ara a anlise descendente assume-se que uma ao exec utada no momento em


que um s mbolo na mesma posi o expandi do. Assi m, na segunda produo
(R + T R1), a atri bui o R1 .h := R.h + T.val exec utada aps T ter si do totalmente
expa ndi do para termi nai s, e nqua nto q ue a segunda ao ( R.s := R1 .s) e xecutada aps
R1 ter si do tota lme nte e xpa ndi do. No caso de defi ni es L-A tri budas, um at ri buto
herdado de um s mbolo de ve ser calc ulado por uma ao q ue aparece antes do
smbolo, e um atri b uto si nte ti zado do no- termi nal esq uerda de ve ser calc ulado aps
todos os at ri butos dos q uai s ele depende te nham si do calculados.
A Figura 22 i l ustra a tra nsfo rmao da D DS da Figura 10, para cri ao de rvores
si ntti cas, para ET . A eli mi nao da recurso esquerda deste esquema produz o E T
representado pela fi gura . A rvore si ntti ca constr uda para a e xpresso a-4+c
i ndicada pela E rro ! A o rig em d a refern cia no foi enco ntrada.. Nela, os atri butos
si nteti zados so mostrados di rei ta de cada n e os atri butos herdados so most rados
esquerda .
Produes
E E1 + T { E.p tr := C r ia No( '+ ', E1 .p tr , T .pt r) }
E E1 - T { E.p tr := C r ia No( '- ', E1 .p tr , T .pt r) }
E T { E .p tr := T. pt r }
T ( E) { T .p tr := E. pt r }
T id { T .p tr := Cr ia F ol ha( id , i d. ind ic e) }
T n um { T .p tr := Cr ia F ol ha( nu m, nu m.v al )}
Figura 22 : Es que ma de T raduo para a const ruo da rvo re sint tica de uma e xpre s so
C om piladore s 17
Tradu o Dirigida pe la Sint axe
s impl ifica da.
Produes
E T { R.h := T. ptr}
R { E.p tr := R.s}
R +
T { R1. h : = Cr iaN o(' +', R.h , T .pt r)}
R1 { R.s := R1. s}
R -
T { R1. h : = Cr iaN o(' -', R.h , T .pt r)}
R { R.s := R1. s}
R { R.s := R. h}
T ( E) { T.p tr := E.pt r}
T id { T.p tr := Cria Fol h a( id, id. i nd ice )}
T n um { T.p tr := Cria Fol h a( num , nu m .v al) }
Fig ura 24 : Es que ma de Traduo se m re curs o a e s que rda pa ra a co ns t ruo da rvo re
s intt ica de uma e xpre s so s impl ifica da.

E ptr

T ptr R

- T ptr
h R s

T ptr num + T ptr h R s


id

id num 4 id

Entrada para 'a' Entrada para 'c'


na Tab.Smbolo na Tab.Smbolo

Fig ura 23 : Util i zao de atri butos herda dos para cons t ruo de rvo re s
sintticas .
C om piladore s 18
Tradu o Dirigida pe la Sint axe
Proje to de um Trad utor Pre di tiv o
P ara constr ui rmos um anal i sador si ntti co predi ti vo o qual i mplementa um E T baseado
em uma gram ti ca adequada a nli se descendente , alguns c ri tri os de vem ser
respei tados, conforme a nali sador a seg ui r .
1. P ara cada produo no- termi nal A, devemos cons trui r uma f uno que
conte nha um parmetro formal para cada atri buto herdado de e que retor ne
os valores dos atri butos si nteti zados de A . A funo para A deve possui r uma
vari vel loca l para cada atri buto de cada smbolo gramati cal que fi gure em
uma prod uo para A .

2. O cdi go para o no-termi na l A deci de que produo usar , baseado no


smbolo corre nte de e nt rada.

3. C onsi derando os tokens, os no- termi nai s e as aes no lado direi to da


produo, da esq uerda pa ra a direi ta, o cdi go associ ado a cada produo
reali za:
a) P ara o token X com atri buto si nteti zado x , sal var o valo r de x na vari ve l
declarada para X.x . Em segui da, gerar uma chamada para reconhecer o
token X e a vanar a ent rada.

b) P ara o no-ter mina l B, gerar uma at ri bui o c := B (b1 , b2, ..., bk) com uma
chamada de funo do lado di rei to, onde b1 , b2 , ..., bk so as vari vei s para
os atri butos herdados de B e c a va ri ve l para o at ributo si nteti zado de B.

c) P ara uma ao, copi ar o cdi go dentro do a na li sador si nt ti co,


substi t ui ndo cada refer nci a a um atri buto pela vari vel pa ra aque le
atri buto .

O exemplo a segui r i l ustra como proceder para a co nstr uo de a nali sador si ntti co
descendente predi ti vo q ue i mplementa o E T da Figura 24. A parti r dos atri butos dos no
termi nai s da gramti ca, obtemos os segui ntes ti pos de argumentos e resultados para as
funes de E, R e T:

Fu n o E: n _r vor e_ s int tic a;

Fu n o R( i : n_ rv or e _sin tt ic a ): n _r vor e_si nt tic a;

Fu n o T: n _r vor e_ s int tic a;

Obser ve q ue uma ve z q ue E e T no possue m at ri butos herdados, e nto no poss uem


argume ntos. E nt reta nto, todos possuem um valor de retor no , o q ual correspo nde ao n
da rvo re si ntti ca c ri ado, i sto , o atri buto si nteti zado pt r.
C om piladore s 19
Tradu o Dirigida pe la Sint axe
P odemos ai nda combi nar duas prod ues R, da F igura 24, para tor narmos o trad utor
menor . As novas t radues usam o token OpA di para representar os operadores + e - ,
obtendo as prod ues da Fi gura 25.
Produes
E T { R.h := T. ptr}
R { E.p t r := R.s}
R O pA d i
T { R1. h : = Cr i aN o(O pAd i. Le x em a, R. h, T. ptr )}
R1 { R.s := R1. s }
R { R.s := R. h}
T ( E) { T.p t r := E.pt r }
T id { T.p t r := Cria F ol h a( id, i d. i nd ice )}
T n um { T.p t r := Cria F ol h a( num , nu m .v al) }
Fig ura 25 : Esque ma de T raduo a pro pria do pa ra um a nal is ador s i ntt ico predi tivo pa ra a
cons t ruo da rvo re s intt ica de uma e xpre ss o simpli fica da.

O cdi go para a prod uo R , co nst r udo de aco rdo com os cri tri os defi nidos
anteri or mente, indi cado a segui r.
Fu n o R( i : n_ rv or e _sin tt ic a ): n _r vor e_si nt tic a;
Va ri ve is
ptr , h 1, s , s 1: n _r vor e_ s int tic a;
op: c a ra ct er;
In c io
Se To k en = O pAd i e nto / / Pr odu o R O pAdi T R
In ci o
o p := Op Ad i .lex val ;
L x ico ;
p tr := T;
h 1 := Cr ia N o(op , h , p tr);
s 1 := R( h1 ) ;
s := s1 ;
Fi m
Sen o / / Pr odu o R
s := h ;
Ret or n ar s ;
Fi m;
No cdi go aci ma, a vari vel h 1 corresponde ao atri buto herdado R 1. h e s 1 corresponde
ao atri buto sinteti zado R 1 .s .

O cdi go para as p rodues E e T podem ser obti dos de modo se mel hante .
Esquemas de Traduo da Linguagem PASCAL SIMPLIFICADA

<programa> ::= program <id> {A1} <corpo> {A30}


----------------------------------------------------------------------
<corpo> ::= <declara> <rotina> begin <sentencas> end
----------------------------------------------------------------------
<declara> ::= var <dvar> <mais_dc> |
<mais_dc> ::= ; <cont_dc>
<cont_dc> ::= <dvar> <mais_dc> |
<dvar> ::= <variaveis> : <tipo_var>
<tipo_var> ::= integer
<variaveis> ::= <id> {A2} <mais_var>
<mais_var> ::= , <variaveis> |
--------------------------------------------------------------------
<rotina> ::= <procedimento> | <funcao> |
<procedimento> ::= procedure <id> <parametros > ; <corpo > ;
<rotina>
<funcao> ::= function <id> <parametros> : <tipo_funcao> ; <corpo> ;
<rotina>
<parametros> ::= ( <lista_parametros> ) |
<lista_parametros> ::= <lista_id> : <tipo_var> <cont_lista_par>
<cont_lista_par> ::= ; <lista_parametros> |
<lista_id> ::= <id> <cont_lista_id>
<cont_lista_id> ::= , <lista_id> |
<tipo_funcao> ::= integer
--------------------------------------------------------------------
<sentencas> ::= <comando> <mais_sentencas>
<mais_sentencas> ::= ; <cont_sentencas>
<cont_sentencas> ::= <sentencas> |
<var_read> ::= <id> {A5} <mais_var_read>
<mais_var_read> ::= , <var_read> |
<var_write> ::= <id> {A6} <mais_var_write>
<mais_var_write> ::= , <var_write> |
<comando> ::=
read ( <var_read> ) |
write ( <var_write> ) |
for <id> {A25} := <expressao> {A26} to {A27} <expressao> {A28}
do begin <sentencas> end {A29} |
repeat {A23} <sentencas> until ( <condicao> ) {A24} |
while {A20} ( <condicao> ) {A21} do begin <sentencas> end {A22} |
if ( <condicao> ) {A17} then begin <sentencas> end {A18}
<pfalsa> {A19} |
<id> {A13} := <expressao> {A14} |
----------------------------------------------------------------------
<chamada_procedimento>
----------------------------------------------------------------------
<chamada_procedimento> ::= <id_proc > <argumentos>
<argumentos> ::= ( <lista_arg> ) |
<lista_arg> ::= <expressao> <cont_lista_arg>
<cont_lista_arg> ::= , <lista_arg> |
----------------------------------------------------------------------
<condicao> ::= <expressao> <relacao> {A15} <expressao> {A16}
<pfalsa> ::= else begin <sentencas> end |
<relacao> ::= = | > | < | >= | <= | <>
<expressao> ::= <termo> <outros_termos>
<outros_termos> ::= <op_ad> {A9} <termo> {A10} <outros_termos> |
<op_ad> ::= + | -
<termo> ::= <fator> <mais_fatores>
<mais_fatores> ::= <op_mul> {A11} <fator> {A12} <mais_fatores> |
<op_mul> ::= * | /
----------------------------------------------------------------------
<fator> ::= <id_var> {A7} | <intnum > {A8} |
(<expressao>) | <id_funcao> <argumentos>
----------------------------------------------------------------------
<id> ::= letra (letra | digito)* {A3}
<intnum> ::= digito+ {A4}
Observao sobre a sintaxe da Linguagem Pascal

A construo de programas poder conter comentrios, os quais so inicializados pelo smbolo "{"
e finalizados pelo smbolo "}". Qualquer seqncia de caracteres contidos entre estes dois
delimitadores devero serem desconsiderados pelo compilador. Portanto, durante a fase de
anlise lxica, torna -se vivel desprezar todos os comentrios. Isto pode ser feito da seguinte
forma:

Se NextCar = '{' ento

Enquanto NextCar <> '}' faa


Chamar Ler

Fim faa
Chamar Ler

Fim se
Exemplo de um programa em PASCAL SIMPLIFICADO

{ Programa: Somatrio }
{ Autor : Rogrio Melo Nepomuceno }
{ Data : 21 de Setembro de 1999 }

Program Somatorio

Var
Ini, Fim, Conta, Soma : integer;
Begin
Ini := 0;
Fim := 0;
Soma := 0;
read( Ini, Fim );
For Conta := Ini To Fim do begin
Soma := Soma + Conta
End;
write( Soma );
End.
Universidade de Uberaba
Bacharelado em Sistemas de Informao
Compiladores

LLiin
nggu
uaag
geen
nss R
Reeg
guullaarreess ee A
Auutt
mmaatto oss d
dee E
Essttaad
doo FFiin
niitto
o
LLiissttaa d
dee E
Exxeerrcccciio
oss

1) Seja = {a, b} um alfabeto. Determine o fecho transitivo reflexivo (* ) e o fecho positivo


( +) sobre este alfabeto.

2) Sabendo-se que o alfabeto de uma dada linguagem L = {0, 1}, e que


L = { | * || 3}, determine quais as sentenas desta linguagem.

3) Sabe-se que uma linguagem L possui as sentenas {a, abaa, aabbaaaa, aaabbbaaaaaa,
aaaabbbbaaaaaaaa, ...}. Determine formalmente que linguagem esta.

4) A linguagem definida anteriormente pode ser gerada por uma gramtica G. Determine
que gramtica esta.

5) Desenvolva gramticas que gerem as seguintes linguagens:

a) L1 = { {0, 1} | comea com 1 e termina com 0 }


b) L2 = { {0, 1} | contm 0101 como subcadeia }
c) L3 = { {0, 1} | contm comprimento de no mnimo 3 smbolos, sendo o terceiro
smbolo um 0 }
d) L4 = { {0, 1} | comea com 0 e tem comprimento mpar, ou comea com 1 e tem
comprimento par }
e) L5 = { {0, 1} | no possui 110 como subcadeia }
f) L6 = { {0, 1} | tem comprimento de no mximo 5 smbolos }
g) L7 = { {0, 1} | qualquer cadeia, exceto as cadeias 11 e 101 }
h) L8 = { {0, 1} | possui ocorrncia par de 0 seguida por ocorrncia impar de 1}
i) L9 = { {0, 1} | possui 0101 como prefixo e 1010 como sufixo }
j) L10 = { {0, 1} | possui no mximo duas ocorrncias da cadeia 0000 }

6) Determine os diagramas de estados para cada uma das linguagens definidas


anteriormente.

7) Determine os autmatos finitos determinsticos para cada uma das linguagens definidas
anteriormente.

8) A gramtica G = (VN, VT, P, A) a seguir gera uma linguagem L. Determine que linguagem
esta.
VN = {A, B, L, D} VT = {a, ..., z, 0, 1, ..., 9}
P = {A LB, B LB | DB, L {a, ..., z}, D {0, ..., 9}}

Prof. Rogrio Melo Nepomuceno


Universidade de Uberaba
Bacharelado em Sistemas de Informao
Compiladores

LLiin
nggu
uaag
geen
nss R
Reeg
guullaarreess ee A
Auutt
mmaatto oss d
dee E
Essttaad
doo FFiin
niitto
o
LLiissttaa d
dee E
Exxeerrcccciio
oss

9) A gramtica definida anteriormente tal que ela gera a linguagem correspondente aos
identificadores da linguagem Pascal, isto , palavras formadas por uma ou mais letras ou
dgitos, as quais sempre se iniciam por uma letra. Desta forma, considerando ainda esta
linguagem, modifique a gramtica acima de modo que seja gerado identificadores que
possuam um tamanho de no mximo de quatro caracteres.

10) Um nmero em Pascal pode ser inteiro ou real. Um nmero inteiro no contm a parte
decimal, enquanto um nmero real pode conter a parte decimal separada por um ponto.
Construa uma gramtica que gere nmeros em Pascal.

11) Desenvolva uma gramtica que gere expresses aritmticas com parnteses balanceados,
os operadores de multiplicao e/ou adio (representados por * e +, respectivamente) e
um operando, representado por x. Por exemplo, as seguintes expresses devem ser
vlidas: x, x*(x + x), x + x * x, (((x))), etc..

12) Na linguagem Pascal, podemos declarar variveis utilizando-se da seguinte estrutura:


var1 , var2 , ..., varn : tipo ;. Considerando que a lista de variveis aceitas pela linguagem
so: x, y, w e z; e que os tipos so: i, l, s, r e e; construa a gramtica para o
reconhecimento da declarao de uma lista de variveis.

Prof. Rogrio Melo Nepomuceno


Universidade de Uberaba
Bacharelado em Sistemas de Informao
Compiladores

LLiin
nggu
uaag
geen
nss R
Reeg guullaarreess ee A
Auutt
m maatto
oss d dee E
Essttaad
doo FFiin
niitto
o
T
Trraabbaallh
ho od dee IIm
mp plleem
meen nttaao
o
Sejam as linguagens definidas a seguir. Construa os diagramas de estado que
reconhea estas linguagens e implemente-os, utilizando a linguagem de
programao definida em sala de aula.

1. { {0, 1} | comea com 0 e tem comprimento mpar, ou comea com 1 e tem


comprimento par }

2. { {0, 1} | possui 0101 como prefixo e 1010 como sufixo }

3. { {0, 1} | possui no mximo duas ocorrncias da cadeia 0000 }

4. { {0, 1} | possui ocorrncia par de 0 seguida por ocorrncia impar de 1}

5. Os identificadores em Pascal so formados utilizando combinaes de letras,


dgitos e o smbolo de sublinhado (_), sendo obrigatrio que o primeiro smbolo
seja uma letra. No h qualquer diferenciao entre letras maisculas e
minsculas. Por exemplo, so identificadores as cadeias: A, C01,
Valor_Desconto, IRRF_27_5_Porcento, etc.

6. Um nmero em Pascal pode ser de vrios tipos. Entretanto, os mais comuns so


os inteiros e os reais. Os nmeros inteiros so combinaes de um ou mais
dgitos. Podemos ter inteiros de 8, 16, 32 e 64 bits, cujos valores mnimos e
mximos so dados pela frmula: (2 N 1) + (2N 1 1). Portanto, temos os
seguintes mnimos e mximos para os inteiros:

8 bits (ShorInt): 128 +127


16 bits (Integer): 32.768 +32.767
32 bits (LongInt): 2.147.483.648 +2.147.483.647
64 bits (Int64): 9.223.372.036.854.775.808 +9.223.372.036.854.775.807

Um nmero inteiro se ele cai em um dos casos acima. Por sua vez, um nmero
real se ele possui uma parte inteira e uma parte decimal, as quais so
delimitadas por um ponto decimal (.). Caso o nmero no caia em nenhum dos
casos acima temos um erro e, portanto, o nmero no ser reconhecido.
Construa um programa que reconhea um nmero e imprima o tipo
correspondente a este nmero.

7. A linguagem Pascal permite que voc declare variveis (identificadores) como


sendo dos seguintes tipos base (tambm considerados identificadores): byte,
word, char, string, shortint, integer, longint, real e boolean. A declarao de uma
lista de tipos feita da seguinte forma:

Id ( , Id)* : Tipo ; ( Id ( , Id)* : Tipo ; )*


Universidade de Uberaba
Bacharelado em Sistemas de Informao
Compiladores

LLiin
nggu
uaag
geen
nss R
Reeg guullaarreess ee A
Auutt
m maatto
oss d dee E
Essttaad
doo FFiin
niitto
o
T
Trraabbaallh
ho od dee IIm
mp plleem
meen nttaao
o
onde Id representa um identificador correspondendo ao nome da varivel sendo
declarada e Tipo corresponde a um identificador de tipo.
A representao acima tambm poderia ser expressa da seguinte forma:

( Id ( , Id)* : Tipo ; )+

8. A linguagem Pascal permite que voc introduza comentrios em seu programa.


Um comentrio qualquer bloco de texto delimitado por: { e } ou (* e *). Um
comentrio tambm pode ser identificado pela combinao //. Neste caso, todo
o texto a partir deste marcador at o fim da linha considerado como sendo um
comentrio. O fim de uma linha identificado pela sequncia LF (line feed
ASCII 10) e CR (carriage return ASCII 13) no Windows, e apenas LF no Unix.
Construa um programa que reconhea e imprima todos os comentrios
encontrados em um programa fonte Pascal.

9. Escreva um programa que reconhea e imprima todos operadores matemticos


(+, , *, /, \, **), relacionais (=, <, <=, >, >=, <>) e lgicos (not, and, or),
encontrados em um programa fonte Pascal, indicando o tipo e que operador
este.

10. Escreva um programa que reconhea, em um fonte Pascal, todas as construes


de identificao de procedimentos, incluindo a lista de argumentos e os seus
respectivos tipos, caso estes existam. Este programa dever emitir um relatrio
indicando quais so estes procedimentos e os seus argumentos, incluindo o tipo
de cada um.
Lembre-se que, em Pascal, a declarao de um procedimento feita da seguinte
forma:

procedure Id [ (Id [, Id]* : Tipo [; Id [, Id]* : Tipo ]* );

Nesta notao, o colchete foi introduzido para melhorar a clareza do texto, visto
que o parntese faz parte da construo, devendo ser, portanto, reconhecido.
Deve ser observado que um autmato de estado finito no suficiente para lidar
com este tipo de problema, sendo necessrio introduzir uma pilha como
mecanismo de memria para permitir a declarao de tipo de uma lista de
variveis.

11. Construa um simulador universal para autmatos finitos que permita informar o
nome do arquivo onde se encontra a tabela de transies, leia esta tabela e, a
seguir, permita reconhecer sentenas mediante a interpretao desta tabela.

12. A partir dos diagramas de estados definidos nos itens de 1 4, implemente as


tabelas de transio correspondentes, em arquivos (um arquivo para cada
tabela), e a seguir simule-as no simulador universal construdo no item anterior.
Universidade de Uberaba
Bacharelado em Sistemas de Informao
Engenharia de Computao
Compiladores

A
Annlliissee LLxxiiccaa
T
Trraab
baallh
hooddee IIm mp plleemmeen nttaao
o
O objetivo deste trabalho e possibilitar ao aluno o completo entendimento e o conseqente desenvolvimento de
um analisador lxico, o qual ser posteriormente integrado ao compilador a ser desenvolvido durante o semestre.
O analisador lxico dever identificar e classificar os seguintes itens lxicos:

Item Classe Expresso Regular Exemplo


Identificadores cId letra (letra | digito)* Valor, F5B
Nmeros Inteiros cInt (+ | -)? digito+ 45, -32, +5
Nmeros Reais cReal (+ | -)? dgito+ (. dgito+)? ((E | e) (+ | -)? dgito+)? 1.5, 0.2E+2
Strings cStr Cadeia de caracteres delimitada por aspas UNIUBE
Atribuio cAtr := :=
Parntese Esquerdo cLPar ( (
Parntese Direito cDPar ) )
Adio cAdd + +
Subtrao cSub - -
Multiplicao cMul * *
Diviso cDiv / /
Igual cEQ = =
Menor cLT < <
Maior cGT > >
Menor ou Igual cLE <= <=
Maior ou Igual cGE >= >=
Diferente cNE <> <>
Ponto e Vrgula cPVir ; ;
Virgula cVir , ,
Ponto cPto . .
Dois Pontos cDPto : :
Fim de Arquivo cEOF Identifica o fim do arquivo sendo processado

Ao ser chamado o analisador lxico dever ler um item lxico e devolver as seguintes informaes ao programa
solicitante: classe, lexema (ou valor) e posio (linha e coluna).
Dever ser desenvolvido um pequeno programa para guiar a execuo do analisador lxico tarefa que ser
feita posteriormente pelo analisador sinttico. Este programa dever ser feito de tal forma que todos os itens
identificados possam ser vistos atravs de uma caixa de rolagem, contendo o nmero da linha e a posio onde
o mesmo ocorreu, bem como a sua classificao e o lexema correspondente. A Figura 1 ilustra um formulrio
deste tipo como exemplo. Nela podemos observar que alguns itens so tratados como palavras reservadas,
neste caso, da linguagem Pascal. Leve isto em considerao na sua implementao.
Os casos no previstos devero ser considerados como erros lxicos.

Figura 1
Universidade de Uberaba
Bacharelado em Sistemas de Informao
Engenharia de Computao
Compiladores

A
Annlliissee S
Siinnttttiiccaa
A Avvaalliiaad
doorr d
dee E Exxp
prreessss
eess
TTrraabbaallh hood dee IIm
mp plleemmeen nttaao
o
O objetivo deste trabalho possibilitar ao aluno o completo entendimento e o conseqente
desenvolvimento de um pequeno avaliador de expresses aritmticas. Para tal, ser necessrio a
utilizao do analisador lxico definido anteriormente e a construo de um analisador sinttico
descendente recursivo. A BNF a ser considerada indicada abaixo:

<cmd> ::= <exp> ; <cmd> |


<exp> ::= <exp> + <termo> | <exp> - <termo> | <termo>
<termo> ::= <termo> * <fator> | <termo> / <fator> | <fator>
<fator> ::= ( E ) | Num

Esta gramtica necessita primeiramente ter as recurses esquerdas eliminadas. A gramtica


resultante, caso seja necessrio, tambm dever ser fatorada esquerda.
Adicionalmente, para que o avaliador funcione, torna-se necessrio incorporarmos algumas aes
durante o processo de anlise sinttica, as quais fazem uso de duas pilhas para auxiliar na avaliao
das expresses: uma para os operadores e outra para os operandos. Estas aes so:
q A1: ao identificar um fator Num o mesmo dever ser empilhado;
q A2: ao identificar um operador o mesmo dever ser empilhado;
q A3: ao identificar o segundo termo de uma expresso, o operador sobre o topo da pilha de
operadores dever ser removido, assim como os dois operandos sobre o topo da pilha de
operandos. A operao indicada pelo operador removido dever ento ser aplicada sobre estes
dois operandos, sendo o resultado novamente empilhado na pilha de operandos;
q A4: ao identificar um ponto e vrgula, o operando sobre o topo da pilha de operandos dever ser
desempilhado e impresso.

Como sugesto, a Figura 1 indica um modelo de formulrio a ser seguido.

Figura 1
Universidade de Uberaba
Bacharelado em Sistemas de Informao
Compiladores

IIm
mp plleemmeen nttaao
od dee u um
mC Co om mp piillaaddo
orr
A
Annlliissee LLxxiiccaa,, S
Siin
nttttiiccaa ee G
Geerraaood dee C
Cd
diig
goo

O objetivo deste trabalho e possibilitar ao aluno o completo entendimento e o conseqente desenvolvimento de um


compilador para uma linguagem simples, a qual gerar cdigo para uma mquina abstrata. O analisador sinttico a ser
implementado do tipo descendente recursivo, no podendo ser utilizando nenhuma ferramenta para o seu
desenvolvimento.
A tabela abaixo descreve a relao dos grupos de alunos, bem como a BNF para cada gramtica e a linguagem de
implementao a ser adotada para o projeto proposto.

Compilador
Grupo Alunos Gramtica
Lxico Sinttico Cdigo

Simone
Delphi TRADUTOR
Andr
Lize
VB PAM
Adriano
C++
Fabiano C
Builder
Thiago
VB BASIC
Daniela
Delphi Eduardo PASCAL
Universidade de Uberaba
Bacharelado em Sistemas de Informao
Engenharia de Computao

Compiladores

A
Annlliissee S
Siin
nttttiiccaa PPrreecceed
dn ncciiaa ddee O
Oppeerraad
doorreess
LLiissttaa d
dee E Exxeerrcccciio
oss
1. Indique quais das gramticas abaixo so gramticas de operadores:

a) S AbS, A a | B, B bB | aa
b) S ABcBA, A aA | a, B bB | b
c) S aSe | B, B bBe | C, C cBe |

2. Transforme a gramtica abaixo em uma gramtica de operadores:

E E |(E ) | V L
L E |
V id S
S(E)|

3. Construa uma tabela de precedncia de operadores para a gramtica abaixo:

ListDecl ListDecl ; Decl | Decl


Decl ListId : Type
ListId id | ListId , id
Type Escalar | array ( Dimens ) of Type
Escalar id | ( Dimens ) | int
Dimens Limite .. Limite
Limite int | id

4. Dadas as gramticas G1 e G2 abaixo:

G1: S S | ( S ) | S > S | p | q
G2: S ( S S ) | ( S S ) | ( S ) * | a | b

a) G1 e G2 so gramticas de operadores? Justifique.


b) Caso afirmativo, construa as tabelas de precedncia correspondentes.

5. Dada a gramtica G = (N, T, P, S), onde:


N = {S, L, E}
T = {repeat, until, id, ;, :=, or}
P = { S repeat L until E | id := E
LL ;S|S
E E or E | E | id }

a) G uma gramticas de operadores? Justifique.


b) Construa, pelo mtodo mecnico, uma tabela de precedncia de operadores que
possibilite o reconhecimento de L(G).

Prof. R ogrio Me lo Nepo mu ceno

Potrebbero piacerti anche