Professional Documents
Culture Documents
Asconfiguraestambmserodaforma(,y),emque ocontedodapilhaey
orestodaentrada.Entretanto,aconvenosobreotopodapilhainvertida:otopo
fica direita, ou seja, o ltimo smbolo de o smbolo do topo. As mudanas de
configuraoso:
(1)reduo pela regra A : permite passar da configurao (, y) para a
configurao(A,y).
(2)empilhamentooudeslocamentodeumterminals:permitepassardaconfigurao
(,sy)paraaconfigurao(s,y).
Observequeesteltimotipodetransiooquepermitetrazerosterminaisparaa
pilhaafimdequepossamparticipardasredues.
A configurao inicial para a entrada x (, x), com a pilha vazia, e ao final temos a
configurao(S,),indicandoquetodaaentradaxfoilidaereduzidaparaS.
a
F
T
E
E+
E+a
E+F
E+T
E+T*
E+T*a
E+T*F
E+T
E
(restanteda)
Entrada
a+a*a
+a*a
+a*a
+a*a
+a*a
a*a
*a
*a
*a
a
Derivaodireita
(invertida)
a+a*a
F+a*a
T+a*a
E+a*a
E+F*a
E+T*a
E+T*F
E+T
E
AnliseSintticasLR(1)
H um mtodo de anlise sinttica ascendente que chamado sLR(1). As letras que
geramasiglaquelhednomeindicam:
S:avariantemaissimplesdosmtodosLR(1).
L:acadeiadeentradalidadaesquerdaparaadireita(lefttoright).
R:omtodoconstriumaderivaodireita(rightmost)invertida.
1:apenasumsmbolodorestodaentradaexaminado.
aregraAsejausadanaderivaodacadeiadeentrada;
ossmbolosterminaisderivadosapartirdejsejamtodosencontrados,faltando
encontrarossmbolosterminaisderivadosde.
Exemplo:
Considereagramticaaseguir:
1. EE+T
2. ET
3. TT*F
4. TF
5. F(E)
6. Fa
Agramticaaumentadapassaaser:
0.SE
1. EE+T
2. ET
3. TT*F
4. TF
5. F(E)
6. Fa
Ositenspossveisparaagramticaaumentadasofinitose,nestecaso,compreendem
ototalde20:
S'E,S'E,EE+T,EE+T,EE+T,EE+T,...,Fa,
Fa
Oestadoinicialofechamentode{SE}.ComohumpontoantesdeE,devemos
acrescentar os itensEE+TeET. Por causa do ponto antes deT,
acrescentamosTT*FeTF.Por
causa
do
ponto
antes
deF,
acrescentamosF(E)eFa.
Oestadoinicial(estado0)ser,ento,compostopelositens:
S'E,EE+T,ET,TT*F,TF,F(E),Fa.
medidaqueaanliseprossegue,opontodevecaminharparaadireitanosdiversos
itens do estado. Encontrado um smboloX, passamos de um item AXpara um
itemAX. Note que os smbolos terminais sero encontrados na entrada,
enquantoossmbolosnoterminaisseroencontradoscomoresultadoderedues.
Se o autmato de reconhecimento estiver num estado p que tem itens com a
marcao (ponto) antes de um smboloX, uma transio rotulada com este
smboloXnos levar a outro estado q que ter um item com a marcao depois da
ocorrnciadeXparacadaitemnoestadopcomopontoantesdeX.Osoutrositensdo
estadoqseroobtidosapartirdofechamentodoestado.
Parageraratabeladetransiesutilizadaspeloanalisador,geramostodososestados
e transies possveis a partir do estado inicial e de outros estados gerados a partir
dele.Onmerodeestadosdesteautmatosempreserfinito,umavezqueonmero
deitensfinito.
Assim, a coleo completa de estados para a gramtica dada como exemplo a
seguinte:
0.S'E
EE+T
ET
TT*F
TF
4.F(E)
EE+T
ET
TT*F
TF
7.TT*F
F(E)
Fa
8.F(E)
F(E)
Fa
1.S'E
F(E)
Fa
5.Fa
EE+T
9.EE+T
TT*F
EE+T
2.ET
TT*F
3.TF
6.EE+T
TT*F
TF
F(E)
Fa
10.TT*F
11.F(E)
Astransiesentreosestadosestoespecificadasnatabelaabaixo:
0
1
2
3
4
5
6
7
8
9
10
11
E
1
T
2
F
3
3
10
(
4
4
4
a
5
5
5
11
Notequeatabelaincluialgunsestadosapartirdosquaisnohtransies.
O analisador sLR(1) um analisador ascendente. Em vez de smbolos, entretanto, a
pilha do analisador contm os estados correspondentes aos smbolos. Primeiro,
observamos que, a cada estado q, com exceo do estado inicial, corresponde
exatamente um smboloX, que o nico smbolo que ocorre depois do ponto, nos
itens do estado q. Todas as transies para q so feitas com o smboloX, podendo
ocorrer,entretanto,quedoisoumaisestadossejamacessveispelomesmosmboloX.
Nestecaso,osestadossedistinguemporconterinformaoadicionalsobreaposio
emqueosmboloX ocorrenacadeiadeentrada.
As duas aes possveis em analisadores ascendentes se aplicam aqui. Um
empilhamento (shift) pode ocorrer quando existe uma transio com um terminal a
partir do estado corrente (o estado do topo da pilha). Quando existe um item
completoB,noestadocorrente,podeserfeitaumareduopelaregraB.Em
umanalisadorsLR(1),aregra:
ReduzapelaregraB seosmbolodaentradapertenceraoFollow(B).
Oprimeirosmbolopertencenteaorestantedaentradaconhecidocomoosmbolo
delookaheadecombaseneleenoestadocorrentequesedeterminamasaesdo
parser.
AtabelaparaoanalisadorsLR(1)podeconterasseguintesaes,dadasemfunodo
estadoq(dotopodapilha)edosmbolosdelookahead(dadopelaentrada):
Empilhamentooestadop(querepresentas)deveserempilhado,eoanalisador
lxicodeveseracionadoparaobteroutrosmbolodaentrada.
ReduoseT[q,s]=reduceB,os||estadoscorrespondentesa devemser
retiradosdapilha,eoestado(q,B)deveserempilhado,representandoB.
AceitaoseT[q,s]=reduceS'S,oprocessoseencerracomsucesso.
0
1
2
3
4
5
6
7
8
9
10
11
E
1
T
2
F
3
3
10
(
4
4
4
a
5
5
5
6
r2
r4
r6
6
r1
r3
r5
7
r4
r6
7
r3
r5
r2
r4
r6
11
r1
r3
r5
r0
r2
r4
r6
r1
r3
r5
Entrada
(a+a)*a
a+a)*a
+a)*a
+a)*a
Ao
empilhar:4
empilhar:5
reduzir:6
reduzir:4
0(4T2
0(4E8
0(4E8+6
0(4E8+6a5
0(4E8+6F3
0(4E8+6T9
0(4E8
0(4E8)11
0F3
0T2
0T2*7
0T2*7a5
0T2*7F10
0T2
0E1
+a)*a
+a)*a
a)*a
)*a
)*a
)*a
)*a
*a
*a
*a
a
reduzir:2
empilhar:6
empilhar:5
reduzir:6
reduzir:4
reduzir:1
empilhar:11
reduzir:5
reduzir:4
empilhar:7
empilhar:5
reduzir:6
reduzir:3
reduzir:2
reduzir:0(aceitar)
Asequnciadasreduesfoi642641546320,comoeraesperado,e
correspondentederivao
direitaS'ETT*FT*aF*a(E)*a(E+T)*a(E+F
)*a(E+a)*a(T+a)*a(F+a)*a(a+a)*a
Leiturarecomendada:
Captulo4,seo4.5dolivroCompiladores:princpios,tcnicaseferramentas(Livrodo
Drago)
Captulo 3, sees 3.3 e 3.4 do livro Implementao de linguagens de programao:
compiladores.
Exercciosresolvidos:
AnliseSemntica
Visogeral
Astcnicasdeanlisesintticavistasatomomentodescrevem,basicamente,
elementosreconhecedores.Ouseja,mquinasquedeterminamseumacadeia
(programafonte)pertenceounolinguagemreconhecida.
Observeque,nocasodeaceitao,ainformaosobreaformadederivaodexdeve
serusadanageraodocdigoparax;e,nocasodenoaceitao,ainformao
disponveldeveserusadaparatratamentodeerros(sinalizandoosparaqueo
programadorpossacorrigilo)erecuperao(paraqueoparserpossacontinuara
anlise).
Almdainformaosintticasobreaformadederivaodaentrada,deveficar
disponveltambmainformaolxica,compostaessencialmentepelascadeias
correspondentesaoschamadostokensvariveis(identificadores,literaisinteiros,reais,
cadeiasetc.).Estainformaodeveserprocessadanasfasesseguintesdocompilador.
Umatcnicageraldetratamentodasinformaesobtidasduranteasfasesdeanlise
lxicaesintticaabaseadaemgramticasdeatributos.Utilizandoessetipode
gramtica,possvelespecificarqualquerformadetraduodirigidapelasintaxe,
associandovaloresosatributosaossmbolosterminaisenoterminaisdeuma
gramticalivredecontexto.
GramticasdeAtributos
Umagramticadeatributoscompostadeduaspartes:
umagramticalivredecontexto,quedescreveumalinguagem;e
regrasdeclculo,quepermitemcalcularvaloresqueestoassociadosaos
smbolosterminaisenoterminaisdagramtica.
Vejamos,porexemplo,umagramticadeatributosquepermitecalcularovalorem
decimaldeumnmerobinriocompartefracionria:
G=({N,B,I},{0,1},P,N)
P:
(1) NI1.I2
N.v:=I1.v+I2.v
I1.p:=0
I2.p:=I2.l
(2) NI
N.v:=I.v
I.p:=0
(3) I0I1B
I0.v:=I1.v+B.v
I0.l:=I1.l+1
I1.p:=I0.p+1
B.p:=I0.p
(4)
(5)
(6)
IB
B0
B1
I.v:=B.v
I.l:=1
B.p:=I.p
B.v:=0
B.v:=2B.p
Notequealgumasocorrnciasdesmbolosnagramticaestodiferenciadaspor
ndicessuperiores(sobrescritos).IstonospermitefazerrefernciaaoprimeiroIeao
segundoIdaprimeiraregra,porexemplo.Anumeraodasregras(regrassintticas)
tambmserveapenasparafacilidadedereferncia.
Asregrasdeclculopermitemcalcularosatributosv(valor),p(posio)el
(comprimento).Noteque,emN,shrefernciasaovalor(N.v);emB,aovalore
posio(B.veB.p),masemIexistemrefernciasaostrsatributos(I.v,I.p,I.l).
Paracadaregrasinttica,hregrassemnticasquepermitemoclculodealguns
atributos,algumasvezesdadosemfunodeoutrosatributos.Porexemplo,paraa
regra1,temos(entreoutras)aregrasemntica:
N.v:=I1.v+I2.v
ElaindicaqueovalordeNobtidosomandoosvaloresdoprimeiroIedosegundoI.
Essasregrassocriadasporumprocessodeprogramao,pormesteprocessono
especificaasequnciaemqueasregrassemnticasdevemseraplicadas.Omomento
paracalcularN.vnoespecificado,eaaplicaopodeserfeitaqualquermomento,
desdequeI1.veI2.vtenhamsidocalculadosantes.DizemosqueN.vdependedeI1.ve
I2.v.Fundamentalmente,asregraspodemseraplicadasemqualquerordem,desde
queosvaloresusadosnasregrastenhamsidocalculadosantes,ouseja,obedecendoa
relaesdedependnciaentreatributos.
Supondoqueestejamosprocessandoacadeia101.011combasenagramticado
exemplo,construmosarvoresintticaparaacadeiautilizandoumanalisador
ascendente,queresultariaem:
CategoriadosAtributos
Podemosclassificarosatributosemherdadosesintetizados,deacordocomosmbolo
dagramticaaqueestassociado.Estaclassificaosebaseianaposiodosmbolo
naregraeatendeaosseguintescritrios:
Setivermosumaregrar:AX1X2...Xm,eumaregrasemnticaassociadaregrar
permitecalcularumatributoxdeA(A.x:=...),entodizemosqueoatributoxdeA
sintetizado.
Poroutrolado,senaregrar:AX1X2...Xmpodemoscalcularumatributoyde
qualquerumdossmbolosXi,(Xi.y:=...),oatributoydeXiditoherdado.
Destamaneira,aordemdeclculonoarbitrria.Comooladoesquerdodaregra
apareceemcimanarvoredederivao,emgeralosatributossintetizadosso
calculadosemfunodeoutrosatributoscorrespondentesansinferioresnarvore
e,portanto,valoressucessivosdoatributopodemsercalculadossubindoarvore.De
maneiraanloga,osvaloressucessivosdeatributosherdadossoobtidosdos
elementossuperioresepodemsercalculadosdescendoarvore.
Paramaiorclareza,faamosalgumasrestries:
Cadaatributodeveterapenasumaclassificao,sendosintetizadoouherdado.
Isto,umatributoadeumsmboloXnopodesercalculadoumavezquandoo
smboloXseencontraaoladoesquerdodeumaregra,eoutravezquandoXse
encontraaoladodireitodeoutraregra.(Observequeosatributossoassociados
aossmboloseassimpodemosterumatributoherdadoX.a,eoutroatributoY.a
sintetizado).
Todasasregrasdevemapresentarregrassemnticasparacalculartodosos
atributosassociadosaumsmbolo.Isto,numaregraAX1X2...Xmdevemestar
presentesregrassemnticasparaclculodetodososatributossintetizadosdeAe
detodososatributosherdadosdetodososXi.
Umagramticaquesatisfazessasduasrestrieschamadaumagramticanormal.
Retomandonossoexemplo,analisamosqueosatributosN.v,I.v,I.l,B.vso
sintetizadoseosatributosI.peB.psoherdados.Observeque,atravsdaregra(3),
estocalculadososatributossintetizadosdeI0(I0.veI0.l),osatributosherdadosde
I1(I1.p)edeB(B.p).
Assim,aordemdeclculoqueutilizaremosparaatabelaserdadaemtrsetapas:
l(sintetizado)sercalculadoprimeiro,subindoarvore;
p(herdado)sercalculadologodepois,descendoarvore;e
v(sintetizado)sercalculadoporltimo,subindoarvore.
Aordeml,p,vusadaporquenenhumvalordeldependedealgumvalordeoutro
atributo,masvaloresdeppodemdependerdosvaloresdel(naregra1,temosl2.p:=
l2.l)evaloresdevpodemdependerdosvaloresdep(naregra6,temosB.v:=2B.p).
Atabelaabaixoapresentaospassosparaoclculodecadaumdosatributosparao
exemplodado:
N/
atrib.
5/l
11/l
3/l
N/
regra
5/4
11/4
3/3
Nsenvolvidos
Clculo
5(I),7(B)
11(I),13(B)
3(I0),5(I1),6(B)
I.l:=1
I.l:=1
I0.l:=I1.l+1=2
9/l
2/l
8/l
2/p
8/p
3/p
4/p
9/p
10/p
5/p
6/p
11/p
12/p
7/p
13/p
7/v
13/v
5/v
6/v
11/v
12/v
3/v
9/3
2/3
8/3
1/1
1/1
2/3
2/3
8/3
8/3
3/3
3/3
9/3
9/3
5/4
11/4
7/6
13/5
5/4
6/5
11/4
12/6
3/3
9(I0),11(I1),12(B)
2(I0),3(I1),4(B)
8(I0),9(I1),10(B)
1(N),2(I1),8(I2)
1(N),2(I1),8(I2)
2(I0),3(I1),4(B)
2(I0),3(I1),4(B)
8(I0),9(I1),10(B)
8(I0),9(I1),10(B)
3(I0),5(I1),6(B)
3(I0),5(I1),6(B)
9(I0),11(I1),12(B)
9(I0),11(I1),12(B)
5(I),7(B)
11(I),13(B)
7(B)
13(B)
5(I),7(B)
6(B)
11(I),13(B)
12(B)
3(I0),5(I1),6(B)
4/v
9/v
4/6
9/3
4(B)
9(I0),11(I1),12(B)
10/v
2/v
10/6
2/3
6(B)
2(I0),3(I1),4(B)
8/v
8/3
8(I0),9(I1),10(B)
1/v
1/1
1(N),2(I1),8(I2)
Representandograficamente,teramos:
I0.l:=I1.l+1=2
I0.l:=I1.l+1=3
I0.l:=I1.l+1=3
I1.p:=0
I2.p:=I2.l=3
I1.p:=I0.p+1=1
B.p:=I0.p=0
I1.p:=I0.p+1=2
B.p:=I0.p=3
I1.p:=I0.p+1=2
B.p:=I0.p=1
I1.p:=I0.p+1=1
B.p:=I0.p=2
B.p:=I.p=2
B.p:=I.p=1
B.v:=2B.p=4
B.v:=0
I.v:=B.v=4
B.v:=0
I.v:=B.v=0
B.v:=2B.p=
I2.v:=I1.v+B.v=
4
B.v:=2B.p=1
I2.v:=I1.v+B.v=
B.v:=2B.p=1/8
I2.v:=I1.v+B.v=
5
I2.v:=I1.v+B.v=
3/8
N.v:=I1.v+I2.v=
5,3/8
GramticasSAtribudas:Umadefiniodirigidapelasintaxesomentecomatributos
sintetizadoschamadadedefinioSatribuda.Natraduodirigidapelasintaxe,
assumesequeosterminaistenhamsomenteatributossintetizadosnamedidaemque
asdefiniesnoprovidenciemquaisquerregrassemnticas.
Exemplodeumagramticadestetipodadoaseguir:
(1)E0E1+TE.val:=E1.val+T.val
(2)ETE.val:=T.val
(3)T0T1*FT.val:=T1.val*F.val
(4)TFT.val:=F.val
(5)F(E)F.val:=E.val
(6)FidF.val:=id.lexval
GramticasLAtribudas:Atributossintetizadossobastanteusadosnaprtica,
entretantoousodeatributosherdadosconvenienteparaexpressarconstruesde
LingagemdeProgramaoemrelaoaocontextoemqueaparecemassim,costuma
seraplicadaaverificaodetiposouaindaparacontrolarseumidentificador
apareceaoladoesquerdo(endereo)oudireito(valor)deumaatribuio.
Exemplodeumagramticadestetipodadoaseguir:
(1)DTLL.in:=T.tipo
(2)TintT.tipo:=inteiro
(3)TfloatT.tipo:=real
(4)LL1,idL1.in:=L.in
incluir_tipo(id.token,L.in)
(5)Lidincluir_tipo(id.token,L.in)
Leiturarecomendada:
Captulo 5, seo 5.1, 5.2, 5.3 e 5.4 do livro Compiladores: princpios, tcnicas e
ferramentas(LivrodoDrago).
Captulo4,sees4.1,4.2e4.3dolivroImplementaodelinguagensdeprogramao:
compiladores.
Exerccios resolvidos:
1. Apesar de a maioria das linguagens de programao de alto nvel exibir diversos tipos de
dependncias de contexto, elas (as linguagens) normalmente so representadas,
sintaticamente, atravs de gramticas livres de contexto. Justifique:
a) O motivo de se usar essa estratgia;
Resp.: Formalismos para representar dependncias de contexto so geralmente mais
complexos e trabalhosos de se usar do que aqueles usados para representar linguagens livres
de contexto.
b) Quais as consequncias prticas na especificao da linguagem-fonte?
Resp.: A linguagem especificada atravs de uma gramtica livre de contexto mais ampla do
que a linguagem desejada.
c) Quais as consequncias prticas no desenvolvimento do compilador para a linguagem?
Resp.: c) Torna-se necessrio introduzir uma fase de anlise de contexto, posterior anlise
livre de contexto, para detectar eventuais erros de contexto contidos no programa-fonte.
2. Responda:
GeraodeCdigo
Segundoomodelodeanliseesntese,podemosconsiderarqueosmdulosiniciais
docompilador(frontendmodules)traduzemumprogramafonteparauma
representaointermediria,enquantoseusmdulosfinais(backendmodules)geram
ocdigoobjetofinal.
Emboraumprogramafontepossasertraduzidodiretamenteparaalinguagemobjeto,
ousodeumarepresentaointermediriaindependentedemquinatemasseguintes
vantagens:
1)Permitiroreaproveitamentodecdigo,facilitandoaportabilidadedeum
compiladorparadiversasplataformas,umavezqueapenasosmdulosfinaisprecisam
serrefeitosacadanovaplataformadehardware.
2)Autilizaodeumotimizadordecdigoqueanaliseaspectosindependentemente
demquinaemelhoreocdigointermedirioantesdeumatraduodefinitiva.
Existemvriasformasderepresentaodecdigointermedirio;asduasmaiscomuns
so:rvoresdesintaxeetriplasdecdigointermedirio(ouinstruesde3
endereos).
rvoresdeSintaxe
Umarvoredesintaxemostraaestruturahierrquicadeumprogramafonte.
Porexemplo,aatribuio:a=b*c+b*d
poderiarepresentadagraficamentepor:
Que,porsuavez,poderiateraseguinteimplementao:
TriplasdeCdigoIntermedirio
Triplasdecdigointermediriososequnciasdecomandosdaforma:x:=yopz
Nesteformato,oselementosx,yezpodemservariveisouconstantes
definidaspeloprogramador,ouaindavariveistemporriasgeradaspelocompilador;
oelementoopdefineooperador,isto,caracterizaaoperaoaserrealizada
(aritmtico,relacionaletc.),enquantoo:=defineatribuio.
Assim,retomandooexemploanterior(comandodeatribuio),teramosasseguintes
triplas:
#tripla
1
2
3
4
5
operando
1
t1
t2
t3
t4
a
operador
*
U
*
+
:=
operando
2
B
D
B
t1
t4
operando
3
c
t2
t3
TiposdeTriplas
Bastantesemelhantessinstruesemlinguagemdemontagem,podemostertriplas
comrtulossimblicosetriplasparacontroledefluxo.Vejaalgunsexemplosbastante
comuns:
Naturezada
operao
Atribuies:
Exemplodecdigo
x:=yopz
Equivalenteemtriplas
1.
gotoL
1.
t1opyz
x:=t1
t1Uy
x:=t1
t1:=y
x:=t1
Ljmp
ifxoprelythen
gotoL
sub(x1,x2,...,
xn)
1.
Loprelxy
1.
parmx1
parmx2
...
parmxn
callsubn
t1addressy
x:=t1
t1lindy
2.
x:=y
1.
x:=y
2.
1.
2.
Desvio
incondicional
Desviocondicional
Chamadaasub
rotina
2.
...
n.
n+1.
Ponteirose
Endereos
x:=&y
1.
2.
x:=*y
1.
2.
*x:=y
1.
2.
ndicesemarrays
x:=y[i]
1.
...
m.
...
...
...
n.
p.
x[i]:=y
p+1.
1.
...
m.
...
...
...
n.
p.
x:=t1
t1:=y
xsindt1.
/*
*avaliandicedey
*/
/*
*calculaendereode
*ynaposioi
*/
tplindtn
x:=tp
/*
*avaliandicedex
*/
/*
*calculaendereode
*xnaposioi
*/
tnsindy
Oselementoslindesindrepresentam,respectivamente,asoperaesdeload
indirect(quecarregaocontedodeposiodememriadadaporesseendereo)
estoreindirect(quearmazenanaposiodememriadadaporesseendereo).
AGeraodeCdigo
Umaformasimplesdegeraodecdigointermediriopodeserconstrudaapartirdo
mesmomecanismoutilizadoparaaverificaodetipos.Ouseja,umagramticade
atributospodeapresentartambmregrasquepermitamageraodecdigo
intermediriosimultaneamenteaaessemnticasdeverificaodetipo.
Supondoumalinguagemhipotticaqualquer,cujagramticaabaixodefinisseasintaxe
paraexpressesaritmticasecomandosdeatribuio:
Aid:=E
ETE'
E'+TE'|
TFT'
T'*FT'|
Fid|num_inteiro|num_real|(E)
Podemosacrescentaraesparaageraodecdigo,taiscomo:
QuandooanalisadorsintticoaplicarasregrasFidouFnum_intou
Fnro_real,podemossimplesmenteempilharnumapilhadecontrolede
operandos(PcO)oidentificador,nmerointeiroounmerorealcorrespondente
(ouindicadordeondeseencontraesseoperando).
QuandooanalisadorsintticoaplicarasregrasE'+TE'ouT'*FT',sabemos
quesetratadeumaoperaodeadiooumultiplicao.Assim,senohouver
problemasdecompatibilidadeentreostipos,podemosgerarumcdigo
intermedirioutilizandoosdoisoperandosqueestiveremnotopodaPcOe
armazenandooresultadoemumavariveltemporria,quedeverserdeixadana
PcOparaoperaesfuturas.
Reescrevendoasregrasparaintroduziraesdegeraodecdigonecessrias,
teramos:
Aid<G1>:=E
<G2>
E'+TE'<G3>
T'*FT'<G4>
Fid<G5>
<G1>
/*lembrarqualoelementodoladoesquerdodeuma
atribuioeiniciarocontadordevariveistemporrias
em1*/
lado_esquerdo<smbolo;
prox_temp=1;
<G2> /*gerarefetivamenteocdigoreferenteaocomando
deatribuio*/
oper_1<pop(PcO);
emitir(lado_esquerdo,':=',oper_1);
<G3> /*geraodocdigoparaumaadio*/
oper_2=pop(PcO);
oper_1=pop(PcO);
result=make_temp();
emitir(result,'+',oper_1,oper_2);
<G4> /*geraodocdigoparaumamultiplicao*/
oper_2=pop(PcO);
open_1=pop(PcO);
resul=make_temp();
emitir(resul,'*',oper_1,oper_2);
<G5> /*encontrouumidentificadorcomooperador.Ento,
seoescopoforglobal,colocarseunomenaPcO;sefor
local,colocararefernciarelativapilhadoprograma
(p.ex.[base_da_pilha+endereo_relativo])*/
pesquisa_tab_smbolo(smbolo);
sesmbolo.escopo=global
push(PcO,smbolo);
seno
push(PcO,[base_da_pilha+endereo_relativo]);
Fnum_int<G6>
<G6>
Fnum_real<G7>
<G7>
/*encontrouumnmerointeirocomooperador;
colocarnaPcO*/
push(PcO,smbolo);
/*encontrouumnmerorealcomooperador;colocar
naPcO*/
push(PcO,smbolo);
Leiturarecomendada:
Captulo 6, sees6.1 a 6.9do livro Compiladores: princpios, tcnicas e ferramentas
(LivrodoDrago).
Captulo 5, sees 5.1 a5.4do livro Implementao de linguagens de programao:
compiladores.
Exerccios resolvidos:
1. Com base na gramtica dada como exemplo, determine a pilha de anlise e o
conjunto de triplas geradas para o comando: x=a+b*c
Resp.: Procedemos anlise sinttica da cadeia de entrada normalmente, ou seja,
simulando a construo da rvore de derivao atravs de uma estrutura do tipo pilha,
por meio das operaes de Expanso pela Regra X e Verificao do Smbolo S.
Adicionalmente, sempre que encontrarmos na pilha uma instruo para a gerao de
cdigo, grafada por <Gn>, realizamos as tarefas especificadas naquela regra.
Pilha
$A
$<G2>E:=<G1>id
$<G2>E:=<G1>
Entrada
x:=a+b*c$
:=a+b*c$
PcO
$<G2>E:=
$<G2>E
$<G2>E'T
$<G2>E'T'F
$<G2>E'T'<G5>id
$<G2>E'T'<G5>
$<G2>E'T'
$<G2>E'
$<G2><G3>E'T+
$<G2><G3>E'T
$<G2><G3>E'T'F
$<G2><G3>E'T'<G5>id
$<G2><G3>E'T'<G5>
$<G2><G3>E'T'
$<G2><G3>E'<G4>T'F*
$<G2><G3>E'<G4>T'F
a+b*c$
+b*c$
b*c$
*c$
c$
ab
Obs.
ExpandirregraAid:=E
Verifica(id):Ok
lado_esquer=x;
prox_temp=1;
Verifica(:=):Ok
ExpandirregraETE
ExpandirregraTFT
ExpandirregraFid
Verifica(id):Ok
push(PcO,a)
ExpandirregraT
ExpandirregraE+TE
Verifica(+):Ok
ExpandirregraTFT
ExpandirregraFid
Verifica(id):Ok
push(PcO,b)
ExpandirregraT*FT
Verifica(*):Ok
ExpandirregraFid
$<G2><G3>E'<G4>T'<G5>id
$<G2><G3>E'<G4>T'<G5>
$<G2><G3>E'<G4>T'
$<G2><G3>E'<G4>
$<G2><G3>E'
$<G2><G3>
$<G2>
$
abc
at1
t2
Verifica(id):Ok
push(PcO,c)
ExpandirregraT
t1:=b*c
ExpandirregraE
t2:=a+t1
x:=t2
Verifica($):Ok
Assemblers,LinkeditoreseCarregadores
Viso geral
Tanto os compiladores quanto os montadores produzem um arquivo de binrio contendo o cdigo-objeto
associado ao arquivo-fonte de entrada. Observe que o arquivo com o cdigo-objeto contm parte da
informao necessria sua execuo, mas para que ocorra a execuo preciso que esse cdigo seja
transferido para a memria principal. Caso o cdigo ainda faa referncias a elementos (dados ou rotinas)
definidos externamente ao mdulo, ser preciso integrar essas referncias ao cdigo executvel. Assim,
as etapas envolvidas desde a traduo de um programa at a execuo de um computador passa por
uma srie de mdulos, que so:
Compilador: responsvel pela traduo de um programa descrito em linguagem de alto nvel para
uma linguagem-alvo, de baixo nvel e prxima da linguagem de mquina (quando no a prpria).
Montadores (assembler): encarregados da traduo do programa escrito em linguagem Assembly,
resultando em um programa em linguagem de mquina.
Ligadores (linker / link-editor): responsveis por unir diferentes partes de um programa e construir um
nico executvel. Sua existncia fundamental para permitir a modularizao de um programa e o
uso de bibliotecas estticas.
Carregadores (loader): usualmente parte do Sistema Operacional, este elemento que realiza a
transferncia de um programa do disco para a memria principal.
Vale ressaltar que o projeto de um compilador pode adotar diferentes arquiteturas, combinando e
integrando numa nica ferramenta as funcionalidades de mais de um desses mdulos. Por exemplo:
Montador e carregador integrados;
Montador e carregador independentes;
Montador, ligador e carregador independentes.
Assemblers (Montadores)
A substituio dos opcodes mnemnicos pelas instrues com os opcodes numricos do conjunto
ISA (Instruction Set of Architecture), seguindo uma tabela de associaes que relaciona o
mnemnico com a instruo-alvo.
A substituio dos endereos simblicos que representam destinos de saltos e constantes por
endereos numricos; ou seja, determinar de maneira absoluta ou relativa em termos do valor do
registrador PC (Program Counter) o endereo de destino dos rtulos.
Reservar espao para dados de acordo com o tipo associado a cada varivel declarada no programa.
Gerar constantes em memria para variveis e constantes, determinando o valor associado ao modo
de endereamento do operando.
Para um melhor entendimento, suponhamos um processador hipottico baseado na arquitetura de VonNeumann e que apresente o seguinte conjunto de instrues:
Opcode
Opcode
Simb
lico
Num
rico
ADD
SUB
MUL
DIV
JMP
JMPN
JMPP
JMPZ
COPY
LOAD
STORE
INPUT
OUTPUT
STOP
01
02
03
04
05
06
07
08
09
10
11
12
13
14
Tama
nho
(em
bytes)
Nmero
de
Operandos
Ao
2
2
2
2
2
2
2
2
3
2
2
2
2
1
1
1
1
1
1
1
1
1
2
1
1
1
1
0
ACCACC+mem(operando)
ACCACCmem(operando)
ACCACC*mem(operando)
ACCACC/mem(operando)
PCoperando
SeACC<0entoPCoperando
SeACC>0entoPCoperando
SeACC=0entoPCoperando
mem(operando2)mem(operando1)
ACCmem(operando)
mem(operando)ACC
mem(operando)entrada
sadamem(operando)
Encerraaexecuo
Assim, o programa escrito em linguagem de alto nvel (dado abaixo, na coluna da esquerda) ser
traduzido pelo compilador para seu equivalente em linguagem de montagem (dado na coluna ao centro),
enquanto o montador far a traduo definitiva do cdigo, resolvendo os endereos e traduzindo os
demais elementos.
Programaem
LinguagemdeAlto
Nvel
ProgramaemLinguagem
deMontagem
(Assembly)
Programaem
LinguagemdeMquina
inta,b,c;
read(a)
read(b)
c=a+b;
write(c);
Rtulo
Mnemnico
Operando
N1:
N2:
N3:
INPUT
INPUT
LOAD
ADD
STORE
OUTPUT
STOP
SPACE
SPACE
SPACE
N1
N2
N1
N2
N3
N3
Endereo
Opcode
Operando
00
02
04
06
08
10
12
13
14
15
12
12
10
01
11
13
14
??
??
??
13
14
13
14
15
15
Os montadores podem realizar duas passagens no arquivo-fonte: a primeira com o objetivo de reconhecer
os smbolos definidos pelo programador (identificadores) e construindo a tabela de smbolos com seus
respectivos valores, enquanto na segunda passagem que efetivamente a gerao do cdigo-objeto
realizada.
Formato do arquivo-objeto
Tipicamente, um arquivo-objeto contm as seguintes informaes:
Carregador (Loader)
Se a arquitetura adotada define que a montagem e o carregamento so realizados por mdulos
separados, o montador produzir um arquivo contendo o cdigo de mquina, juntamente com as
informaes necessrias a fim de que o carregador (loader) possa carregar o cdigo de mquina para a
memria e transferir a execuo para o programa carregado.
Uma destas formas carga o chamado carregamento absoluto, em que os endereos so fixos e o
programa carregado sempre na mesma posio. Esse tipo de esquema bastante limitado, porm
permite uma compreenso de detalhes importantes da operao de carregadores e montadores.
A forma mais elementar para a execuo do cdigo de mquina gerado pelo montador ocorre atravs do
esquema assemble and go, no qual um nico programa combina as tarefas associadas ao montador e
ao carregador. Essa estratgia combina as etapas de montagem e carregamento num nico programa e,
portanto, no gera um arquivo com o mdulo-objeto.
Assim que o cdigo de mquina gerado pelo montador, ento colocado diretamente na posio de
memria indicada pelo contador de localizao. Ao trmino da montagem, o programa executvel j
estar na memria e o montador precisa simplesmente transferir o controle de execuo para a primeira
instruo do cdigo gerado.
O mdulo de carregamento para o carregador absoluto composto por dois tipos de registro:
Registro do tipo texto (ou tipo 0): contm informao que deve ser transferida para a memria na
posio indicada.
Registro do tipo fim (ou tipo 1): informao do endereo para incio da execuo do programa, deve
ter apenas uma ocorrncia no fim do mdulo de carregamento.
Suponha que um montador tenha gerado o cdigo relativo ao contedo de dois seguimentos, sendo o
primeiro equivalente a uma rea de dados (variveis do programa), e o segundo correspondendo rea
de instrues, que contm o cdigo de mquina associado a cada instruo do programa. A organizao
do mdulo de carregamento, segundo esse esquema, seria composto por trs registros:
000006000400000000
000004000E30380000600031C0000060024E75
100004000
Os quatro campos do registro significam, respectivamente: tipo, endereo, tamanho (em bytes) e o
contedo do registro. Assim, a interpretao de cada registro dever:
- Como o campo tipo contm valor 0, isso indica que o registro do tipo texto e, portanto, o seu contedo
(dado no quarto campo), cujo tamanho equivale a quatro bytes (informado no terceiro campo), dever ser
transferido memria a partir da posio $ 6000 (de acordo com o endereo que dado no segundo
campo).
De modo anlogo, o segundo registro indica a transferncia, a partir da posio $ 4000 de memria, dos
14 bytes cujo contedo dado armazenado no quarto campo.
Por fim, o ltimo registro est presente para a finalizao do processo de carga, indicando que o controle
de execuo dever ser transferido para a posio indicada no segundo campo (isto , o endereo
$ 4000).
Assim, um algoritmo simples como o que dado a seguir poderia ser utilizado como carregador:
CarregadorAbsoluto(mdulo)
1 arqOpenFile(mdulo)
2 whilenotEndOfFile(arq)
3 doregistroReadLine(arq)
4 tipogetTipoDoRegistro(registro)
5 enderecogetEnderecoDoRegistro(registro)
6 iftipo==0
7 thentamanhogetTamanhoDoRegistro(registro)
8 cdigogetConteudoDoRegistro(registro,tamanh
o)
9 MoveParaMemoria(endereo,cdigo,tamanho)
1 elseGoTo(endereo)
0
Ligadores (Linker)
Tm por principal objetivo juntar diferentes arquivos-objeto, gerando um nico arquivo executvel. Em
outras palavras, o linker recebe como entrada os diversos mdulos que devem ser conectados, gerando
como sada um nico mdulo de carga. Na sequncia, o programa carregador recebe o mdulo de carga
(executvel) como entrada e transfere seu cdigo para a memria, ficando sob sua responsabilidade
apenas os ajustes de relocao de acordo com o endereo base de memria.
possvel adotar estratgias combinadas, porm, ao isolar os procedimentos de ligao e de
carregamento atravs de programas separados, possvel uma economia na quantidade de memria
alocada, haja vista que o carregador compartilha a memria com o programa que est sendo executado.
Um linker deve ser capaz de resolver referncias cruzadas, provenientes de mdulos montados de forma
independente, bibliotecas de funes, fazendo uso de funes cujo cdigo no conhecido em todos os
momentos do processo. Uma referncia cruzada no resolvida resultante de smbolos desconhecidos
dentro de um mdulo e que normalmente so definidos em outros mdulos.
Durante o processo de montagem, o montador deve informar a existncia de referncias cruzadas e criar
uma tabela de uso, inserindo-a juntamente no cdigo-objeto gerado. A tabela de uso tem por objetivo
indicar quais smbolos externos foram utilizados pelo mdulo e onde cada um deles foi referenciado.
Note que, embora uma referncia no resolvida possa ser entendida como um erro do ponto de vista do
montador, na verdade ela pode no ser, uma vez que sua definio pode ter sido feita em outro mdulo
interdependente. Uma forma comum para tratar essa questo a incluso de diretivas de montagem (por
exemplo, a diretiva EXTERN na linguagem C). A desvantagem que um erro de montagem desta
natureza somente detectado durante o processo de ligao, quando todos os mdulos so reunidos e
h ainda alguma referncia no resolvida.
Relocao e Ligao
O esquema de montagem e carregamento absoluto apresenta uma forte limitao: o fato de que o
programador deve ter acesso direto a posies de memria, especificando exatamente em que regio da
memria o programa e seus dados sero carregados.
A memria um recurso controlado pelo sistema operacional e o programador no deve estar preso
necessidade de conhecer posies da memria fsica para que o seu programa funcione corretamente.
Por sua vez, desenvolver um programa completamente independente de sua localizao uma atividade
complexa e, embora possvel, caber ao sistema resolver os problemas relacionados com
posicionamento do cdigo atravs do processo chamado de relocao.
Outro aspecto que tambm requer a colaborao do montador e do carregador para seu funcionamento
a combinao de mdulos interdependentes, mas que tenham sido montados individualmente. Neste
contexto, comum que um mdulo faa referncia a smbolos definidos em outros mdulos e, assim, o
montador recebe a informao de que um smbolo est definido em outro mdulo ou de que um smbolo
estar sendo referenciado por outro mdulo. Esta informao ento registrada junto ao mdulo-objeto
para que seja utilizada pelo carregador, responsvel pela resoluo destes smbolos entre os mdulos
envolvidos.
Os dois tipos de ajustes que podem ocorrer no contedo do mdulo-objeto so:
o Dicionrio de Smbolos Externos (ESD), que contm todos os smbolos que esto envolvidos no
processo de resoluo de referncias entre segmentos: smbolos associados a referncias externas
(ER), a definies locais (LD) ou a definies de segmentos (SD);
o Diretrio de Relocao e Ligao (RLD) que, para cada segmento, indica quais posies devero
ter seus contedos atualizados, de acordo com o posicionamento em memria deste e de outros
segmentos.
A partir destas estruturas, o carregador de ligao direta capaz de definir os valores para todos os
smbolos com referncias entre segmentos e reajustar o contedo das posies afetadas pela relocao.
No exemplo que tratamos anteriormente, o montador oferecia como resultado um mdulo objeto com dois
tipos de registros: registro com cdigo de mquina (tipo 0) e um registro de fim (tipo 1). Para o esquema
de ligao direta, este montador deveria ser modificado para fornecer outros dois tipos adicionais: um tipo
para ESD e outro para RLD.
Os registros do tipo ESD contero:
todos os smbolos definidos no segmento que podem ser referenciados por outros segmentos
(lembrando ainda que podem ser de dois tipos: definio do segmento ou definio local); e
os smbolos que so referenciados, mas no definidos no segmento.
Campo
1.
2.
3.
4.
5.
Significado
Tipodoregistro(0),
Smbolo
Tipodedefinio(SDsegmento,ouLD
local)
Endereorelativonosegmento
Campodedimenso,comocomprimentoem
bytes
Campo
1.
2.
3.
4.
Significado
Tipodoregistro(1)
Endereorelativo
Comprimentoembytes
Cdigodemquina
Registros do tipo RLD indicam quais posies no segmento devero ter contedo alterado de acordo com
os endereos alocados aos segmentos e indicam tambm a partir de que smbolo o contedo dever ser
corrigido. Esses registros tero o seguinte formato:
Campo
1.
2.
3.
4.
Significado
Tipoderegistro(2)
Posiorelativa
Comprimentoembytes
Smbolo(basedeajuste)
Por fim, um registro do tipo END especificar o endereo de incio de execuo para o segmento que
contm a rotina principal, sendo dado na seguinte forma:
Campo Significado
1.
Tipoderegistro(3)
2.
Endereodeexecuo
Imagine que tenhamos um programa composto por dois mdulos: o main e um pgm. O
programa main obtm um valor inteiro entre 0 e 15 de uma varivel chamada DIGIT e coloca na varivel
CHAR a representao equivalente em ASCII (isto , um valor entre 0 e F):
1
2
3
4
MAIN
5
6
7
8
9
ADD_0
CHAR
MOVE.BDIGIT,D0
CMPI.B#10,D0
BLTADD_0
ADDQ.B#(A0
10),D0
ADDI.B#0,D0
MOVE.BD0,CHAR
RTS
DS.W1
ENDMAIN
Observe que o cdigo faz referncia a um smbolo DIGIT que ser definido externamente, pois a rea de
dados do programa define apenas a varivel CHAR (linha 8).
No segmento onde DIGIT efetivamente definido, torna-se necessrio indicar que ele poder ser
referenciado externamente. Neste exemplo, utilizamos a pseudoinstruo GLOB com este objetivo. O
cdigo referente ao programa pgm dado por:
1
2
3
4
5
6
7
PGM
VALUE
DIGIT
GLOBDIGIT
MOVE.WVALUE,D0
MOVE.WD0,DIGIT
RTS
DS.W1
DS.W1
END
A pseudoinstruo GLOB obrigar a criao de um registro do tipo ESD com tipo de definio LD e,
assim, quando a posio relativa deste smbolo for determinada na tabela de smbolos locais, a
informao do registro dever ser complementada.
O montador dever gerar os mdulos-objeto para cada uma das partes e o linker as combinar
produzindo um nico mdulo. Como estamos tratando de um carregamento de ligao direta, o mdulo
nico ser colocado diretamente na memria, sem que seja criado em disco.
Aps a montagem, suponha que o mdulo objeto obtido para o segmento main seja:
0.MAIN.SD.00.1C
1.00.6.103900000000
1.06.4.0C00000A
1.0A.2.6D02
1.0C.2.5E00
1.0E.4.06000030
1.12.6.13C00000001A
1.18.2.4E75
1.1A.2.0000
2.02.4.DIGIT
2.14.4.MAIN
3.00
Observando mais detalhadamente o mdulo, encontramos:
o registro de fim de segmento END (registros do tipo 3), que deve especificar a posio relativa de
execuo, que a posio 00.
CarregadorLigadorDireto_etapa1(listaDeMdulos)
1 total0
2 foreachmduloinlistaDeMdulos
3 doarqOpenFile(mdulo)
4 encontradofalse
5 repeat
6 registroReadLine(arq)
7 tipogetTipoDoRegistro(registro)
8 iftipo=="ESD"
9 thendeftipogetCampoDeDefinio(registro)
10 ifdeftipo=="SD"
11 thentamanhogetTamanhoDoCampo(registro)
12 totaltotal+1
13 encontradotrue
14 untilencontrado
15 CloseFile(arq)
16 iplaAlocaMemoria(total)
Uma vez determinado qual o endereo inicial de carregamento, IPLA (Initial Program Load Address), o
carregador inicia a criao de uma Tabela de Smbolos Externos Globais GEST. Para realizar esta
tarefa, apenas as informaes presentes em registros do tipo ESD (com tipos de definio SD e LD) so
utilizadas. Assim, o segundo passo poderia ser implementado da seguinte forma:
CarregadorLigadorDireto_etapa2(listaDeMdulos,ipla)
1 GESTCriarTabela()
2 tamSeg0
3 iniSegipla
4 foreachmduloinlistaDeMdulos
5 doarqOpenFile(mdulo)
6 whilenotEndOfFile(arq)
7
8
9
10
11
12
13
14
15
16
17
18
19
doregistroReadLine(arq)
tipogetTipoDoRegistro(registro)
iftipo=="ESD"
thendeftipogetCampoDefinio(registro)
ifdeftipo=="SD"
thenvaloriniSeg
tamSeggetCampoTamanho(registro)
elsevaloriniSeg+
getCampoPosicao(registro)
smbologetCampoSimbolo(registro)
InsereNaTabela(GEST,smbolo,valor)
elseiftipo=="END"
theniniSeginiSeg+tamSeg
CloseFile(arq)
Na fase de definio da GEST, um possvel erro que poderia ser detectado a duplicidade na definio
de alguns dos smbolos da tabela, refletindo situaes em que um mesmo smbolo redefinido em
segmentos distintos.
No ltimo passo do processo, o carregador ir realizar a transferncia do cdigo de mquina para a
memria e transferir o controle da execuo do programa para o endereo inicial do programa recmcarregado. O carregador voltar a tomar como endereo inicial de carregamento o valor ipla, lendo
novamente cada mdulo-objeto na sua sequncia original.
A varivel pontoDeIncio registrar a posio de incio de execuo para o segmento que definir um
registro do tipo END com argumento.
Quando um registro ESD for lido, o nico processamento necessrio ser a obteno do comprimento do
segmento, permitindo a atualizao correta da varivel que indica a posio inicial de carga de cada
segmento, iniSeg. Esta informao est no registro ESD com tipo de definio igual a SD (Segment
Definition).
Os registros do tipo TXT devero ter seu contedo transferido para a memria principal. Os contedos de
cada campo do registro (posio relativa ao incio do segmento, tamanho e contedo) so obtidos e o
endereo de destino resolvido tomando por base o valor de iniSeg. Ao final da transferncia, as
posies indicadas em registros do tipo RLD devero ter seu contedo ajustado a partir da informao
registrada na GEST.
Os registros do tipo RLD devem ter suas indicaes de posio relativa corrigida, sendo que o endereo
de memria cujo contedo ser alterado, endereo, obtido a partir da combinao desta informao e
do endereo de incio do segmento, iniSeg. O novo valor especificado pelo campo de smbolo presente
neste registro (o smbolo lido do registro e seu valor obtido a partir de uma busca na GEST). Neste
ponto, possvel detectar erros associados a smbolo que tenham sido referenciados mas no tenham
sido definidos em nenhum mdulo.
Assim, a terceira etapa do carregamento direto poderia ser dada pelo seguinte algoritmo:
CarregadorLigadorDireto_etapa3(listaDeMdulos,ipla,GEST)
1 pontoDeIncioipla
2 iniSegipla
3 tamSeg0
4 foreachmduloinlistaDeMdulos
5 doarqOpenFile(mdulo)
6 whilenotEndOfFile(arq)
7 doregistroReadLine(arq)
8 tipogetTipoDoRegistro(registro)
9
1
0
1
1
1
2
1
3
1
4
1
5
1
6
1
7
1
8
1
9
2
0
2
1
2
2
2
3
2
4
2
5
2
6
2
7
2
8
2
9
3
0
3
1
3
2
3
3
switchtipo
case"ESD":
deftipogetCampoDefinio(registro)
ifdeftipo=="SD"
thentamSeggetCampoTamanho(registro)
case"TXT":
endereoiniSeg+
getCampoPosicao(registro)
tamanhogetCampoTamanho(registro)
cdigogetCampoConteudo(registro)
MoveParaMemoria(endereo,cdigo,tamanho)
case"RDL":
endereoiniSeg+
getCampoPosicao(registro)
tamanhogetCampoTamanho(registro)
smbologetCampoSimbolo(registro)
baseBuscaNaTabela(GEST,smbolo)
MoveParaMemoria(endereo,valorAntigo,tamanh
o)
novoValorvalorAntigo+base
MoveParaMemoria(endereo,novoValor,tamanho
)
case"END":
endereogetCampoPosicao(registro)
ifendereonulo
thenpontoDeIncioiniSeg+tamSeg
iniSeginiSeg+tamSeg
CloseFile(arq)
GoTo(pontoDeIncio)
Leitura recomendada:
Captulo 7 do livro Compiladores: princpios, tcnicas e ferramentas (Livro do Drago).
Captulos 7 e 8 do livro Implementao de linguagens de programao: compiladores.
Exerccios resolvidos:
1. Descreva a estrutura de um frame tpico utilizado no ambiente de execuo de uma linguagem de
programao estruturada em blocos. Explique o que e para que serve cada um de seus campos.
Resp.: O frame comporta as variveis locais de cada bloco (acessadas atravs de offsets positivos em
relao ao LB) e tambm as seguintes informaes:
A base do frame referenciada por um ponteiro fixo durante toda a execuo do bloco, denominado LB.
O topo do frame apontado por um registrador denominado SB, que flutua durante a avaliao de
expresses.
2. Suponha que um endereo ocupe dois bytes, um integer tambm dois bytes, o tipo boolean igual a um
byte e o tipo real, a quatro bytes. Considere ainda a seguinte estrutura de um programa Pascal:
programP;
varA,B:integer;
functionQ(N:boolean):real;
varE,F,G:boolean;
begin
...
end;
procedureR(M:real);
varC,D:real;
procedureS():
varE:real;
begin
...
end;
begin
...
end;
begin
...
end.
Resp.:
Posio
Endereobase:
Topo:
Contedo
A(2)
B(2)
**FrameR**
M(4)
LD(vazioouSB)
LE(vazioouSB)
ER
C(4)
D(4)
**FrameS**
LD(R)
LE(R)
ER
E(4)
Resp.:
Posio
Endereobase:
Contedo
A(2)
B(2)
**FrameR**M(4)
LD(vazioouSB)
LE(vazioouSB)
ER
C(4)
D(4)
**FrameS1**
LD(R)
LE(R)
ER
E(4)
**Frame(S2)**
LD(S1)
LE(R)
ER
Topo:
E(4)
**Frame(Q)**
N(1)
LD(S2)
LE(vazioouSB)
ER
E(1)
F(1)
G(1)