Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Objetivosgerais
A construo de compiladores um ramo da cincia da computao cujo estudo
agrega conhecimentos e habilidades importantes aos profissionais desta rea, tais
comoumexemplodeestruturaoapropriadadoproblema,abordagemmetodolgica
consistente e necessria ao desenvolvimento de projetos deste porte, alm de
experincias em sistemas que congregam diferentes conhecimentos especficos de
computao.
Dadas as caractersticas de interpretao e traduo de informaes, o estudo dos
conceitosfundamentaisenvolvidosnoprojetoeconstruodecompiladorespermite
uma aplicao mais ampla das tcnicas envolvidas, uma vez que torna o aluno
familiarizadocomoselementosnecessriosescritadeinterpretadoresdecomandos
e programas de interface, bem como ao processamento de dados estruturados e
extensveis.
Objetivosespecficos
Familiarizar os alunos com as principais tcnicas e conceitos envolvidos na
compilao de programas de computador. Aprimorar seus conhecimentos sobre
programao atravs do estudo da estrutura e caractersticas de uma linguagem de
programao, e das tarefas realizadas por um compilador para transformar os
programasemseusequivalentesemlinguagemdemquina.
Planodeensino
1.Introduo
1.1.Descriodoprocessorealizadopelocomputadorapartirda
codificaodeumalgoritmopeloprogramadoratasuaexecuoemum
computador
1.2.Caracterizaodaslinguagensquantoaonveldeabstrao
1.3.Identificaoediferenciaodoselementosdodomnio
1.3.1.Linguagemfonte,deimplementaoealvo
1.3.2.Compiladores,tradutores,montadoreseinterpretadores
1.3.3.IDEs,debuggers,editoresgrficosdeinterfaceedemais
ferramentasdeapoio
1.4.Modelosparaaconstruodecompiladores
1.4.1.Asetapasdetransformaodocdigo
1.4.2.Compiladoresdeumapassagemedemltiplaspassagens
1.4.3.OmodelodeAnliseeSntese
2.AnliseLxica
2.1.Atransformaodefluxodecaracteresemlistadetokens
2.2.Autmatosfinitosparareconhecimentoeclassificaodetokens
2.3.Identificaodeerroslxicos
3.AnliseSinttica
3.1.Produes(dasGramticasLivresdeContexto)ervoresdederivao
3.2.Descendente(topdown):DescendenteRecursivaeLL
3.3.Ascendente(bottomup):LReLALR
3.4.Abordagensparaotratamentoerecuperaodeerros
4.AnliseSemntica
4.1.Tabeladesmbolos
4.2.Gramticasdeatributos
5.Geraodecdigo
5.1.Cdigosdetrsendereos
5.2.Blocosbsicos
5.3.Diagramasegrafosdedependncia
5.4.Otimizaes
6.Assemblers,linkeditoresecarregadores
Bibliografiabsica
AHO,A.V.;LAM,M.S.;SETHI,R.;ULLMANN,J.D.Compiladores:princpios,tcnicase
ferramentas2ed.SoPaulo:PearsonAddisonWesley,2008.
LOUDEN, K. C. Compiladores: princpios e prticas 1 ed. So Paulo: Pioneira
ThomsonLearning,2004.
TOSCANI, Simao Sirineo; PRICE, Ana Maria de Alencar. Implementao de linguagens
deprogramao:compiladores3Ed.Vol.9Ed.Artmed,2009.
Bibliografiacomplementar
RICARTE,I.Introduocompilao1ed.RiodeJaneiro:Elsevier,2008.
GRUNE, D.; BAL, H. E.; JACOBS, C. J. H.; LANGENDOEN, K. G. Projeto moderno de
compiladores:implementaoeaplicaesRiodeJaneiro:Campus,2001.
APPEL,A.W.ModerncompilerimplementationinJava.London:CambridgeUniversity
Press,1998.
EPSTEIN,RichardL.CARNIELLI,Walter.Computabilidade,funescomputveis,lgicae
osfundamentosdamatemtica.Ed.UNESP,2009.
NIES,Andre.Computabilityandrandomness.Ed.Oxford,UK,2009.
Introduo
Dacodificaoexecuodeumprograma
Algumasperguntasimportantesdeseremrespondidasjdeincioso:Oqueocorre
desdeacodificaodeumalgoritmoporumprogramadoratasuaexecuoemum
computador? Quais so os elementos envolvidos? O que compete a cada um deles
nesteprocesso?
Programador Cdigofonte [Prprocessador] Cdigofonte
sem
macros [Compilador] Cdigoobjeto (.obj) [Linker] Cdigo de mquina
realocvel(.exe) [Carregador] Cdigodemquinaabsoluto
Podemosdescreveresteprocessodaseguintemaneira:
O programador codifica o algoritmo utilizando uma linguagem de programao
(linguagemfonte) e o salva em um arquivo texto (cdigofonte). Antes de ser
compilado,ocdigosubmetidoaumprprocessamentoparaaremoodemacros
e, ento, pode ser passado ao compilador para ser transformado em cdigo de
mquina(cdigoobjeto),deacordocomaplataformaalvo.
Neste novo arquivo criado pelo compilador, habitualmente com extensoobj, temos
apenas o cdigo referente s instrues e funes definidas por este programador,
faltandoaindajuntlocomocdigodemquinarelativosfunesdasbibliotecas.
Para que isso seja feito, um programa realiza a ligao entre os diversos arquivos
objetoseacrescentaoscabealhosnecessriosaosistemaoperacionalparaidentific
loscomoumarquivoexecutvel(cdigodemquinarealocvel).
Quando, ento, desejamos executar o programa, o carregador ouloaderdo sistema
operacional aloca o cdigo em alguma poro de memria que o caiba e que esteja
disponvel,resolvendoosendereosdasvariveisestticasedeentradadefunoat
o momento sob a forma de deslocamentos, por isso sendo chamado de cdigo de
mquinaabsoluto.
Caracterizaodaslinguagensquantoaonveldeabstrao
certodizerquequalquerproblemapodesercodificadousandoqualquerlinguagem,
afinal todo e qualquer programa , de fato, um conjunto de instrues dadas em
linguagemdemquina;masaquesto:serqueissoconveniente?
As linguagens de programao podem ser classificadas de acordo com o grau de
abstraoqueoferecem,ouseja,oquopermissivassoparaqueoprogramadorse
concentre nos aspectos essenciais, ignorando caractersticas menos importantes ou
minciasoperacionais.
Destemodo,aslinguagenscomumaltograudeabstrao,geralmentemaisprximo
da linguagem humana, so chamadas delinguagem de alto nvel, enquanto aquelas
mais prximas das caractersticas e cdigo de mquina, em que o conhecimento de
detalhesrelativosarquiteturaeorganizaosofundamentais,soditaslinguagens
debaixonvel.
Identificaoediferenciaodoselementosdodomnio
Nocontextodecompiladores,importantecompreenderoqueosdiferentes
termosdodomniosignificam.Emboracumprindotarefasparecidas,oscompiladores,
tradutores,montadoreseinterpretadoressoelementosdiferentes.
Compiladores: traduzem programas codificados em linguagens dealto nvelpara
linguagem debaixo nvel. (ex.: C > .EXE, Java > Bytecode ou C# > MSIL (Microsoft
IntermediateLanguage))
Tradutores: traduzem programas codificados em linguagens dealto nvelpara
linguagemdealtonvel.(ex.:Portugus>InglsouC#>Java)
Montadores:traduzemprogramascodificadosemlinguagensdebaixonvel(simblica)
paralinguagemdebaixonvel.(ex.:Assembly>.EXE)
Interpretadores:diferenciamsedosdemaisporrealizarematraduodocdigofonte
etambmexecutlo.(ex.:Browser>HTML,Bash(Linux)>Scripts)
Ferramentasdeapoio
Tm por objetivo aumentar a produtividade no processo de desenvolvimento.
Podemoscitarcomoexemplos:
InterfacesIntegradasdeDesenvolvimento(IDEs):costumeiramenteoferecemdiversos
recursos, mas principalmente auxiliam no gerenciamento de arquivos relativos ao
projeto, permitem a execuo e depurao da aplicao sem que seja necessrio
deixar o ambiente de desenvolvimento, o complemento de comandos e realce de
sintaxe.
Depuradores (debuggers):permitem a execuo passo a passo do cdigo,
acompanhamentodovalordevariveisecontedosdememriaduranteaexecuo,
inserodepontosespecficosdeparada,dentreoutros.
Editores grficos de interface: muito teis em projetos que tenham janelas e outros
elementos grficos; habitualmente permitem a insero e posicionamento de
componentesusandoomouse.
OmodelodeAnliseeSnteseparaaconstruodecompiladores
Este modelo se fundamenta em dividir o processo em duas grandes fases: a anlise,
emqueocdigofonteserverificadoeummodelorepresentativodesuaestruturae
significadosconstrudo;easntese,emqueocdigocorrespondentetraduoser
efetivamenteproduzidodeacordo.
Aanlise lxica(ouscanner) a primeira etapa do processo de compilao e sua
funovarrerocdigofonte,caractereporcaractere,compondooselementosque
de fato formam o programa e que so chamados de tokens ou lexemas.
Adicionalmente, elementos tais como espaos em branco, tabulaes, marcas de
formatao de texto, comentrios ou qualquer outro que sejam irrelevantes ao
processodecompilaosoeliminados.Destemodo,dizemosqueoanalisadorlxico
responsvelportransformarofluxodecaracteresemumfluxodetokens.
Garantida a produo de uma sequncia coerente de lexemas, precisamos ainda
verificar a adequao da estrutura gramatical do programa. A prxima subfase
aanlisesinttica,emquesebuscadeterminarseumasequnciadesmboloslxicos
(cadeia) pode ser gerada pela gramtica que define a linguagem em questo. Essa
tarefaconsisteemconstruirarvoredederivaocorrespondente.
Restaaindaverificarosignificadoouasemnticadoprograma,tarefaexecutadapela
ltima etapa da anlise, a chamadaanlise semntica. de sua responsabilidade
verificar certos aspectos que no foram investigados anteriormente por
impossibilidadeouinadequaodepropsito,taiscomoquestesrelativasaescopo,
regrasdevisibilidadeecompatibilidadeentretipos.
Umavezgarantidoqueocdigofontevlidoecoerente,podesepassaraoprocesso
de sntese. durante agerao de cdigoque efetivamente ocorre a produo do
cdigo equivalente ao programa original. Dado o nvel de dificuldade inerente
diferenaentreosnveisdeabstrao,umaprimeiratentativapodeserrealizadaeseu
produtopassaporumafasedeotimizao,cujoobjetivomelhorarocdigogeradoe
eliminarredundncias,aumentandoodesempenho.
Leiturarecomendada:
Captulo 1, principalmente as sees 1.1 1.4 do livro Compiladores: princpios,
tcnicaseferramentas(LivrodoDrago).
Captulo 1 completo do livro Implementao de linguagens de programao:
compiladores.
Exercciosresolvidos:
1.Umadiscussotpicaentredesenvolvedoresapaixonadosadequealinguagemde
programaodesuaprefernciaamelhor.Umexemplodessesembatesocorreuem
certaocasio,quandoumdesenvolvedorJavaeumprogramadorCtrocavaminsultos
arespeitodalinguagemprediletadooutro,dizendo:
Cumaporcaria!Sequiserportarumaaplicao,vaiterquearrumarocdigofonte
erecompilar...isso,senoderproblema!
2.Conceituecadaumdoselementosdadosaseguir:
a)Linguagemfonteeobjeto;
Resp.:Linguagemfontealinguagemusadaparaescreverprogramasquesoentrada
deprocessadores de linguagens. Linguagemobjeto a linguagem usada para
escreverprogramasquesosadadeprocessadoresdelinguagens.
b)Linguagemdealtonveledebaixonvel;
Resp.: Linguagem de alto nvel a linguagem mais prxima da linguagem natural, e
apresenta como principais caractersticas portabilidade, segurana, legibilidade e uso
deabstraes.Linguagemdebaixonvelalinguagemmaisprximadohardware,e
AnliseLxica
Antes de tentar converter o algoritmo em cdigo de mquina, devese analisar o
cdigofonte para que seja possvel identificar os elementos que o compem e
assegurarqueestejacorreto,tantoemtermosestruturaisquantosemanticamente.
Cabeaoanalisadorlxicoseparareidentificaroselementosvlidosquecompemo
programafonte, atravs do processamento individual dos caracteres do arquivo de
entrada.Competelheaindaatarefadeeliminaroschamadoselementosdecorativos"
doprograma,isto,caracterestaiscomoespaosembranco,marcasdeformatao
detextoecomentrios.
Issosignificaque,concludaaanliselxica,oselementosutilizadosparaaescritado
programa,taiscomoidentificadores,operadores,delimitadoresepalavrasreservadas
terosidoreconhecidoseidentificados.
Tarefasquelhesopertinentes:
Esquadrinharocdigofonte,smboloasmbolo,compondotokenseclassificandoos
(segundoseusignificadoparaalinguagem);
ComporegerenciarachamadaListadeTokens,umarelaodetodososelementos
identificadospeloscanningemumalistalinear;
Comofazlo?
Os tokens possuem uma estrutura sinttica, e deste modo podemos descrever cada
um dos itens da linguagem (palavras reservadas, operadores, delimitadores etc.)
atravsderegrasdeproduo,taiscomo:
identif=letra{letra|dgito}
nmero=dgito{dgito}
if="i""f
igual="=""=
Pensandonisso,inevitavelmentesurgeapergunta:Porqueoanalisadorlxicono
umapartedoanalisadorsinttico?
Observealgunsaspectosquejustificamessadivisodefases:
1. Isso deixaria o analisador sinttico mais complicado de ser construdo, a citar a
dificuldade para distinguir palavras reservadas e identificadores. Porexemplo, uma
regrasintticaquepoderiaserescritaassim:
Statement::=ident"="Expr";"|
"if""("Expr")"...
Precisaria ser reescrita desta forma, para que fosse possvel tratar as duas tarefas
simultaneamente:
Statement::="i"("f""("Expr")"...|notF{letter|digit}"="Expr";")|
notI{letter|digit}"="Expr";".
2. O scanning deve eliminar brancos, tabulaes, fins de linha e comentrios.
Considerando que esses caracteres podem ocorrer em qualquer lugar do cdigo,
teramosdeespecificargramticasmaiscomplexas.Exemplo:
Statement::="if"{Blank}"("{Blank}Expr{Blank}")"{Blank}....
Blank::=""|"\r"|"\n"|"\t"|Comment.
3.Tokenspodemserdescritosporgramticasregulares,quesomaissimplesemais
eficientes que as gramticas livres de contexto. A maioria das estruturas lxicas so
regulares:
Nomes::=letra{letra|dgito}
Nmeros::=dgito{dgito}
Strings::="\""{qqCaractereExcetoAspas}"\""
Palavrasreservadas::=letra{letra}
Operadores::=>|=|+|...
4. Gramticas regulares no podem lidar com estruturas aninhadas, pois no so
capazes de manipular recurso central. Esse tipo de construo importante na
maioriadaslinguagensdeprogramao.
ExpressesaninhadasExpr..."("Expr")"...
ComandosaninhadosComando"do"Comando"while""("Expr")"
ClassesaninhadasClasse"class""{"...Classe..."}"
Osautmatosfinitospodemreconhecerlinguagensregulares.Assim,podemosdefinir
oscannercomoumAFDquereconheaoselementosdalinguagemfonte.
Oprocessamentodecadacaractereobtidoserregidopelastransiesprevistaspelo
autmato,demodoqueoAFDterreconhecidoumasentena:
Seaentradativersidoconsumidatotalmente;ou
Senoforpossvelrealizarumatransiocomoprximosmbolodaentradaeo
autmatoencontrarseemumestadofinal.
Vejaumexemplonoesquemaaseguir:
Leiturarecomendada:
Captulo 1, principalmente as sees 1.1 1.4 do livro Compiladores: princpios,
tcnicaseferramentas(LivrodoDrago).
Exerccioresolvido:
1) Em meio a um cdigofonte, h elementos considerados desnecessrios ao
processodecompilao,taiscomoespaosembrancoequebrasdelinha,dentre
outros.Seosespaosembrancosonecessriosparaquesepossasepararuma
palavradeoutra,entodequemodosoconsideradosdesnecessrios?
AnliseSinttica(Introduo)
Visogeraldoprocesso
Tendoafunodeverificarseasconstruesutilizadasnocdigofonteestona
formaapropriada,aanlisesintticatemaresponsabilidadede:
DadaumagramticalivredecontextoGeumasentenas,aquirepresentadapelo
programafonte,oanalisadorsintticotemopropsitodeverificarsespertence
linguagemgeradaporG.Emoutraspalavras,apartirdostokensfornecidospelo
analisadorlxico,tentarconstruirarvoredederivaoparassegundoasregrasde
produodadaspelagramticaG.Seestatarefaforpossvel,oprograma
consideradosintaticamentecorreto.
Tarefasquelhesopertinentes:
>Comprovarqueasequnciadetokenscumpreasregrasgramaticais;e
>Gerararvoregramaticaldoprograma.
Assim,entendemosquesodesuacompetncia:
Aidentificaodeerrosdesintaxe,porexemplo:A*/B;
Acorretainterpretaodaestruturahierrquicaeaevoluodasentena,mesmo
quandosobaspectosimplcitos.(ex.:A/B*Cserentendidacomo(A/B)*Cem
FortraneA/(B*C)emAPL);
Acapacidadedetratamentoe/ourecuperaodeerrosdesintaxe.Valeressaltar,
emrelaoaesseaspecto,oprojetodeoferecerrecursossuficientes;mastambm
Tratamento/Recuperaodeerros
Em geral, programas contm erros. Assim, um bom compilador deve, na medida do
possvel, detectar todos os erros ocorridos, avisar o usurio de suas ocorrncias e
recuperarsedeles,demodoquesejapossvelanalisarorestantedocdigofonte.
Aimplementaodeumbommecanismodedetecoerecuperaodeerrosmuitas
vezesdependedaquestoserconsideradadesdeoinciodoprojetodalinguagem.
Modopnicooudesespero
Param imediatamente diante do primeiro erro ou, identificado um erro, o
analisador sinttico descarta smbolos de entrada, at que seja encontrado um
token pertencente ao subconjunto de tokens de sincronizao (e.g.: ponto e
vrgula,delimitadoresetc.).
Recuperaodefrases
Ao descobrir um erro, o analisador sinttico pode tentar uma recuperao
realizando uma correo local na entrada restante, substituindoa por alguma
cadeia que permita que a anlise prossiga. Por exemplo, substituir uma vrgula
inadequadaporumpontoevrgula,ouaindaremoverum:excedente.
Produesdeerro
Modificar a gramtica incluindo regras de produo estratgicas, de modo a
acomodar os erros mais comuns. Assim, sempre que uma produo de erro for
identificada pelo analisador, possvel conduzir o tratamento mais adequado
quelasituaoemespecial.
Correoglobal
Emgeral,empregaalgoritmosqueescolhem,entrepossveissolues,aquelaque
apresentaumasequnciamnimademudanasparaqueseobtenhaumacorreo
globaldoprogramaenodoserrosindividualmente.
Alguns dados interessantes que devem ser considerados quando se pensa em quo
eficiente deve ser o mtodo de tratamento e recuperao de erros versus o tempo
demandadoparaqueoperedemodosatisfatrio:
Cerca de 60% dos programas so compilados de modo correto sinttica e
semanticamente. Dentre os que apresentam erros: cerca de 80% dos enunciados
apresentam apenas um erro e 13% apresentam apenas dois erros. Em
aproximadamente90%doscasos,oserrosenvolvemumnicotoken.
Anlisesintticadescendenteeascendente
Osmtodosdeanlisesintticapodemserclassificadossegundoamaneirapelaquala
rvoredederivaodacadeiaanalisadaxconstruda:
Nosmtodosdescendentes,arvoredederivaocorrespondenteaxconstruda
de cima para baixo, ou seja, da raiz (o smbolo inicial S) para as folhas, onde se
encontrax.
Nosmtodosascendentes,arvoredederivaocorrespondenteaxconstruda
de baixo para cima, ou seja, das folhas, onde se encontra x, para a raiz, onde se
encontraosmboloinicialS.
Notequeasregrassoconsideradasnaordem12463466,amesmaordememque
as
regras
so
usadas
na
derivao
esquerda:EE+TT+Ta+Ta+T*Fa+F*Fa+a*Fa+a*a
Porm,seusarmosummtododeanliseascendente,asregrassoidentificadasna
ordem64264631,eospassosdeconstruodarvorepodemservistosnafiguraa
seguir:
TiposdeAnalisadoresSintticos:
MtodosdeCockeYoungerKasamieEarly
o universais:servemparaqualquergramtica(bemeficientes).
Mtodos descendentes (topdown): constroem a rvore sinttica de cima para
baixo
o AnalisadoresDescendentesRecursivos
o AnalisadoresLL(k)
Mtodos ascendentes (bottomup): constroem a rvore sinttica de baixo para
cima
o AnalisadoresSR
o AnalisadoresLR
o AnalisadoresLALR
Leiturarecomendada:
Captulo 4, sees 4.1 e 4.2 do livro Compiladores: princpios, tcnicas e ferramentas
(LivrodoDrago).
Captulo 3, seo 3.1 do livro Implementao de linguagens de programao:
compiladores.
Exercciosresolvidos:
1.Conceituecadaumdositensdadosaseguir:
Anlisesintticadeterminsticaxnodeterminstica;
Anlisesintticadescendentexascendente;
GramticaelinguagemLL(1)eLR(1).
Resp.:Aanlisedeterminsticaaquelaemquetodasasdecisesdemovimentaodo
reconhecedor so tomadas "sem arrependimento". Se no houver movimentao
possvel, isso indica a ocorrncia de um erro na cadeia de entrada. A anlise
nodeterminstica, por outro lado, opera por tentativa e erro. Erros na cadeia de
entrada so apontados apenas depois de esgotadas todas as possibilidades de
movimentao.
A anlise descentente, tambm conhecida como topdown, aquela em que o
reconhecedoriniciaosseusmovimentosnaraizdagramticaeevoluiatacadeiade
entrada (em termos de rvore, aquela em que a rvore montada de cima para
baixo). A anlise ascendente, ou bottomup, aquela em que os movimentos do
reconhecedor vo da cadeia entrada em direo raiz da gramtica (a rvore
montadadebaixoparacima).
UmaGramticaLL(1)aquelaquegeraumalinguagemquepodeserreconhecidada
esquerda para a direita, usando derivaes mais esquerda e com lookahead de
apenas um smbolo. Linguagem LL(1) aquela que pode ser gerada por alguma
gramtica LL(1). Gramtica LR(1) aquela que gera uma linguagem que pode ser
a)Mostreosmovimentosdeumreconhecedorascendentenaanliseda
sentena (a,(a),(a,a));
b)Mostreosmovimentosdeumreconhecedordescendentenaanliseda
sentena (a,(a),(a,a));
c)Obtenhaoesboodeumreconhecedorrecursivodescendenteparaalinguagempor
eladefinida.
Resp.itema:Osmovimentosdeumreconhecedorascendentesero:
(a,(a),(a,a))(I,(a),(a,a))(I,(I),(a,a))(I,(S),(a,a))
(I,L,(a,a))(I,I,(a,a))(I,I,(I,a))(I,I,(I,I))(I,
I,(I,S))(I,I,(S))(I,I,L)(I,I,I)(I,I,S)(I,S)
(S)L
Resp.itemb:Osmovimentosparaoreconhecedordescendentesero:
L(S)(I,S)(a,S)(a,I,S)(a,L,S)(a,(S),S)
(a,(I),S)(a,(a),S)(a,(a),I)(a,(a),L)(a,(a),(S))
(a,(a),(I,S))(a,(a),(a,S))(a,(a),(a,I))(a,(a),(a,a))
Resp.itemc:Umreconhecedorrecursivoobtidotranscrevendocadaumadasregras
deproduodagramticacomoumasubrotinaresponsvelporconsumirostokens
dacadeiagerada.Semprequeencontrarmosumsmbolonoterminalnasentena,
realizaseachamadasubrotinacorrespondente;e,quandoencontramosumsmbolo
terminalnaregra,verificamossecorrespondeaosmbolodadonaentrada(posio
correntedeanlisedecdigofonte).Deacordocomessesconceitos,poderamostero
seguintecdigoparaestagramtica:
voidparseL(){
accept("(");
parseS();
accept(")");
}
voidparseS(){
parseI();
whiles==","{
acceptIt();
parseI();
}
voidparseI(){
switchs{
case"a":acceptIt();
break();
case"(":parseS();
break;
AnliseSintticaIAnliseDescendente
defaul:ERRO();
}
}
Arepresentaodoprocessoserfeitaatravsdeconfiguraes(,y),emque ey
representam, respectivamente, o contedo da pilha e orestoda entrada ainda no
analisada.Porconveno,vamossuporqueotopodapilhaficaesquerda,isto,que
oprimeirosmbolode osmbolodotopodapilha.
Existemduasformasdetransiodeumaconfiguraoparaoutra:
(1)expansodeumnoterminalpelaregraA:permitepassardaconfigurao(A,
y)paraaconfigurao(,y).
(2)verificao de um terminal s: permite passar da configurao (s, sy) para a
configurao(,y).
Osegundotipodetransioservepararetirarterminaisdotopodapilhaeneleexpor
oprximonoterminalaserexpandido.Aconfiguraoinicialparaaentradax(S,x);
o processo termina na configurao (,), com a pilha vazia, e a entrada toda
considerada.
AnliseSintticaLL(1)
(restanteda)
Entrada
a+a*a
a+a*a
a+a*a
a+a*a
a+a*a
+a*a
a*a
a*a
a*a
a*a
*a
a
a
Derivaoesquerda
(leftmost)
E
E+T
T+T
F+T
a+T
a+T*F
a+F*F
a+a*F
a+a*a
Nestemtodo,aescolhadaregraaserusadaduranteoprocessodeanlise
descendentesedatravsdeduasinformaes:onoterminalAaserexpandidoeo
primeirosmboloadorestodaentrada.
UmatabelaMindexadaporestasduasentradasnosfornecearegraaserutilizada:
M[A,a].Valeressaltarqueessatcnicaspodeserempregadaparaumaclasse
restritadegramticas,aschamadasgramticasLL(1).
OnomeLL(1)indicaque:
Acadeiadeentradaexaminadadaesquerdaparaadireita(L=lefttoright);
Oanalisadorprocuraconstruirumaderivaoesquerda(L=leftmost);
Exatamente1smbolodorestodaentradaexaminado.
ExemploSuponhaagramticaaseguir:
1.
2.
3.
4.
5.
6.
7.
8.
ETE'
TFT'
F(E)
Fa
E'+TE'
E'
T'*FT'
T'
EssagramticaLL(1)e,assim,asuatabeladeanliseMser:
E
T
F
E'
T'
(
1
2
3
a
1
2
4
5
8
6
8
6
8
Nessatabela,aentradaM[S,k]correspondenteaonoterminalSeaoterminalktem
onmerodaregraquedeveserusadaparaexpansodeS.Asentradasindicadaspor
""correspondemaerros,ouseja,socombinaesquenopodemocorrerdurantea
anlisedecadeiasdalinguagem.
Paraanalisaracadeiaa+a*a,teremosasseguintesconfiguraes:
Pilha
E
TE'
FT'E'
aT'E'
T'E'
Entrada
a+a*a
a+a*a
a+a*a
a+a*a
+a*a
Escolhadaregra
M[E,a]=1
M[T,a]=2
M[F,a]=4
M[T',+]=8
E'
+TE'
TE'
FT'E'
aT'E'
T'E'
*FT'E'
FT'E'
aT'E'
T'E'
E'
+a*a
+a*a
a*a
a*a
a*a
*a
*a
a
a
M[E',+]=5
M[T,a]=2
M[F,a]=4
M[T',*]=7
M[F,a]=4
M[T',$]=8
M[E',$]=6
Vamos,agora,mostrarcomoconstruirM,atabeladeanliseLL(1).Nocasomais
simples,osmboloa(oprimeirodorestodaentrada)oprimeirosmboloderivadodo
noterminalaserexpandidoA,efazpartedeFirst(A).Nestecaso,adevepertencera
First(),emqueAumadasalternativasderegraparaA.Comoilustrao,
podemosverque,noexemploacima,aregraF(E)foiusadacomosmbolo(.
OutrapossibilidadeadequenosejaAonoterminalresponsvelpelageraodo
smboloa,massimalgumoutronoterminalencontradodepoisdeA.Nestecaso,
devemosterapertencendoaoFollow(A).Comoilustrao,podemosverque,no
exemploacima,aregraT'foiusadacomosmbolo+.
ParaconstruiratabelaM,vamosexaminartodasasregrasdagramtica:
Paracadaregrai:A,temosM[A,a]=i,paracadaaemFirst().
Paracadaregrai:A,se*,temosM[A,a]=i,paracadaaemFollow(A).
SeagramticaLL(1),cadaentradadeMrecebernomximoumvalor.Asentradas
deMquenoreceberemnenhumvalordevemsermarcadascomoentradasdeerro.
CasoalgumaentradadeMsejadefinidamaisdeumavez,dizemosquehouveum
conflito,equeagramticanoLL(1).
ExemploConsidereagramticadadanoexemploanterior.EssagramticaLL(1),ea
tabeladeanliseMpodeserconstrudacomoindicado.Temos,paracadaregra:
1.ETE'
2.TFT'
3.F(E)
4.Fa
5.E'+TE'
6.E'
7.T'*FT'
8.T'
First(TE')={(,a}
First(FT')={(,a}
First((E))={(}
First(a)={a}
First(+TE')={+}
Follow(E')={$,)}
First(*FT')={*}
Follow(T')={$,+,)}
M[E,(]=1eM[E,a]=1
M[T,(]=2eM[T,a]=2
M[F,(]=3
M[F,a]=4
M[E',+]=5
M[E',$]=6eM[E',)]=6
M[T',*]=7
M[T',$]=8,M[T',+]=8eM[T',)]
=8
ExemploConsidereagramticadadaabaixo,esquerda.Teremos:
1.EE+T
2.ET
3.TT*F
4.TF
5.F(E)
6.Fa
First(E+T)={(,a}
First(T)={(,a}
First(T?F)={(,a}
First(F)={(,a}
First((E))={(}
First(a)={a}
M[E,(]=1eM[E,a]=1
M[E,(]=2eM[E,a]=2
M[T,(]=3eM[T,a]=3
M[T,(]=4eM[T,a]=4
M[F,(]=5
M[F,a]=6
Consequentemente,agramticanoLL(1),porcausadosconflitos(mltiplas
definies)paraM[E,(],M[E,a],M[T,(]eM[T,a].Emalgunscasos,comooda
gramticadoexemploanterior,possvelconcluirqueagramticanoLL(1)por
inspeo.Asduascaractersticasmaisbviasso:arecursoesquerdaea
possibilidadedefatorao.
Recursoesquerda:
SeumagramticapermiteumaderivaoA*A,paraalgumnoterminalAepara
algumacadeianovazia,agramticaditarecursivaesquerda.
Nocasomaissimples,existenagramticaumaregraAAresponsveldiretamente
peladerivaomencionada.ParaqueAnosejaumnoterminalintil,deveexistirna
gramtica(pelomenos)umaregradaformaA,semrecursoesquerda.
AcombinaodessasduasregrasfazcomqueFirst(A)e,portanto,First(A)
contenhamtodosossmbolosdeFirst(),eissolevanecessariamenteaumconflito.A
eliminaodarecursoesquerdapodesertentada,procurandotransformara
gramticaemumagramticaLL(1).
Observarqueacombinao:
AA
A
Permiteageraodecadeiasdaforma,equeessasmesmascadeiaspodem
sergeradasdeoutramaneira.Porexemplo:
AA'
A'A'
A'
Estaoutraformadegeraousarecursodireita,quenocriaproblemas.
Prefixoscomuns
Tratasedocasoemqueduasregrascomeamcomomesmosmboloouconjuntode
smbolos(prefixo),isto,regrascomoAeA,comFirst().Nestecaso,
existeumainterseoentreFirst()eFirst(),eagramticanopodeserLL(1).
Istoaconteceporquenopossveldecidir,olhandoapenasoprimeirosmbolo
derivadode,qualaregracorreta.Asoluosimpleseenvolveafatorao.
Suponhaasregrasabaixo:
A
A
Podemosreescreveressasregrasemequivalentes,demodoacolocaroprefixoem
umaregraeadiaradecisoentreeparaquandooprimeirosmboloderivado
deoudeestivervisvel.
AA'
A'
A'
EstasduastcnicaspermitemtransformaralgumasgramticasemgramticasLL(1).
Entretanto,valeressaltarquealgumasgramticaslivresdecontextoGLCnotm
gramticasequivalentesLL(1).Nessecaso,aaplicaodessastcnicasoumesmode
outraspodernotersucesso.
ExemploConsidereagramticaaseguir:
1.EE+T|T
2.TT*F|F
3.F(E)|a
Estagramticaapresentaduassituaesderecursoesquerda.Fazendoas
substituiesindicadas,temos:
1.ETE'
2.E'+TE'|
3.TFT'
4.T'*FT'|
5.F(E)|a
EestagramticaLL(1),comojfoivistoanteriormente.
ExemploSuponhatransformaragramticaabaixoemumagramticaLL(1)
equivalente:
1.LL;S|S
2.SifEthLelLfi|ifEthLfi|s
3.Ee
TemosrecursoesquerdanasregrasdeL,epossibilidadedefatoraonasregrasde
S.UmatransformaodestagramticaemLL(1)teriaoseguinteresultado:
1.LSL'
2.L';SL'|
3.SifEthLS'|s
4.S'elLfi|fi
5.Ee
Novamente,podemosverificarqueestaumagramticaLL(1).
Leiturarecomendada:
Captulo4,seo4.4dolivroCompiladores:princpios,tcnicaseferramentas(Livrodo
Drago)
Captulo 3, seo 3.2 do livro Implementao de linguagens de programao:
compiladores
Exercciosresolvidos:
1.Considereagramticaabaixo:
SaXb|aYc|aaZd
XbX|bc
YcY|cb
ZdZ|
a)EssagramticaLL(1)?Proveasuaresposta.
b)CasoagramticaacimanosejaLL(1),obtenhaumagramticaequivalenteque
sejaLL(1)eprovequeanovagramtica,defato,LL(1).
Resp.itema:No,poisosconjuntosFirstnosodisjuntos.Emtodasasregras
encontramosprefixosiguaisparaaspossveisderivaesdecadaregra,querde
maneiradiretaouindireta.Notequeissoserefletediretamentenosvaloresincludos
nosconjuntosFirsteFollow,conformedadosabaixo:
First(aXb)={a},First(aYc)={a},First(aaZd)={a}
First(bX)={b},First(bc)={b}
First(cY)={c},First(cb)={c}
First(dZ)={d},follow(Z)={d}
Resp.itemb:Eliminandorecursesefazendosubstituiesdossmbolosnas
construesdadasporS,teremos:Sab*bcb|ac*cbc|aad*d.Fatorandoastrs
diferentespossibilidadesdederivaoparaosmboloS,ficaramoscomaseguinte
regra:Sa(b*bcb|c*cbc|ad*d)
possvelobservarqueessagramticanoapresentarecursesesquerda,umavez
quederivadiretamentedesentenascompostasapenasdesmbolosterminais.Alm
disso,tambmnotasequeosprefixosparacadaumadaspossveisderivaesapso
primeirosmboloasodiferentesparaostrscasospossveis.Estesaspectospodem
serconfirmadosquandocalculamososconjutosFirstparacadaumadastrs
possibilidadesdederivaoapresentadasparaosmboloS:First(b*bcb)={b};First
(c*cbc)={c}eFirst(aad*d)={a}
2.Obtenhaoesboodeumreconhecedor,atravsdomtodorecursivodescendente,
para a linguagem definida pela expresso:(+||)(d+(|.|.d*)|.d+)(e(+|
|)d+|)
So exemplos de sentenas pertencentes
45.312,+.76,5.44e2,+0.88e35.
essa
linguagem:123,
elseifs==""takeIt();
ifs=="d"{
takeIt();
whiles=="d"takeIt();
ifs=="."{
takeIt();
whiles=="d"takeIt();
}
}
elseifs=="."{
takeIt();take("d");
whiles=="d"takeIt();
}
elseERRO();
ifs=="e"{
takeIt();
ifs=="+"takeIt()
elseifs==""takeIt();
take("d");
whiles=="d"takeIt();
}