Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Introduo
Objetivos:
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.
Pf / L f P/ L Po / Lo
Mf M Mo
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 .
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
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.
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:
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:
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 :
Por exe mplo, as seg uintes se nte nas sero geradas por esta gramtica:
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
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.
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 :
VN = { E }
VT = { 1 , 2 }
P ={ E E +E | E * E |1 |2 }
S=E
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 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 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 .
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:
E E + T T + T F + T 1 + T 1 + T * F 1 + F * F 1 + 2 * F 1+2*2
E E + T E + T * F E + T * 2 E + F * 2 T + 2 * 2 F + 2 * 2 1+2 *2
Hierarquia de Chomsky
Tipo 0
Tipo 1
Tipo 2
Tipo 3
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.
VN = {S, B}
VT = {a, b}
P = { S aS , S aB , B bB , B b}
{ ab, aab, abb, aaab, aabb, abbb, aaaab, aaabb, aabbb, abbbb, .. .}
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 :
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 }
ou se ja, todas as se nte nas geradas poss uem o mes mo nmero de as e bs.
L(G7) = L( G8)
E E +T |E T |T
T T * F |F
F i d | (E)
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.
VN = {S, A, B, C}
VT = {a, b, c }
P = { S aSBC, S aBC, CB BC, aB ab, bB bb, bC bc , cC cc }
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 :
VN = {S, A, B}
VT = {a, b}
P = {S AB, AB BA, A a, B b}
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 .
Autmatos Finitos
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 Q, , q0 e F so id nticos ao AFD;
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
1
( {}) tamb m re pres entad o po r .
Implemen tao de Au tmatos Finitos 1
Introduo
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 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.
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;
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 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
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;
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
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
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 }
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.
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).
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.
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*
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
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
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
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.
q Como exemp lo, ve jamos a especificao das definies reg ulares para
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.
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
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:
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.
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 .
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
<cmd>
E1 S1
E2 S2 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
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>
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
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 .
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.
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.
S 1 | 2| ... | n |
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.
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)
onde:
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
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
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
onde:
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.
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
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
Programa Analisador
Inicio
Chamar Lexico
Chamar Expressao
Se Token <> Eof ento
Erro('Fim de arquivo no esperado')
Fim Se
Fim da Programa Analisador
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.
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.
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.
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).
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 :
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.
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 :
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 :
S i E t S S | a
S e S |
Eb
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.
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 |
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.
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
:
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.
A uti li dade destas re laes na a nlise de uma sente na a i denti ficao do handl e:
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
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
E E + E | E E | E * E | E / E | E ^ E | ( E ) | id
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);
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
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
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 }
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
id + * ( ) $
id
+
*
(
)
$ A cei ta
+ * ( ) 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 :
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
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
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
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 .
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 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 ):
E E
E E+T|T
T T*F |F
F ( E ) | id
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.
E E+T
T T*F
T F
F (E)
F id
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
E E
E E+T|T
T T*F |F
F ( E ) | id
I0 = {E E , E E + T, E T, T T * F , T F , F ( E ), F id}
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.
/* 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.
/* seo de declarao */
%{
/* incluso de arquivos de cabealhos */
#include <ctype.h>
float x[26];
%}
/* declarao dos tokens */
%%
/* 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); }
}
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 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.
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.
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.
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 =
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.
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.
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.
E
+
E + T
* 4
T F
3 5
T * F 4
F 5
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.
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.
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 .
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
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] .
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 =.
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:
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
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')}
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;
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 .
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
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 .
T.val = 9 R.h = 9
num.val = 2
E ptr
T ptr R
- T ptr
h R s
id
id num 4 id
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 .
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.
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:
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
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:
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
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.
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}}
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..
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.
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.
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 ; )+
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.
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:
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:
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
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 |
E E |(E ) | V L
L E |
V id S
S(E)|
G1: S S | ( S ) | S > S | p | q
G2: S ( S S ) | ( S S ) | ( S ) * | a | b