Sunteți pe pagina 1din 104

G ENERADOR DE COMPILADORES BASADO EN

ANALIZADORES ASCENDENTES

Memoria del Proyecto de Final de Carrera


Ingeniera Informtica realizado por Laia Felip Molina
y dirigido por Xavier Snchez Pujades
Bellaterra, 18 de Septiembre de 2009

Escola Tcnica Superior dEnginyeria

El abajo firmante Xavier Snchez Pujades


Professor/a de l'Escola Tcnica Superior d'Enginyeria de la UAB,

CERTIFICA:

Que el trabajo al que corresponde esta memoria ha sido realizado bajo su


direccin por Laia Felip Molina

Y por tal que conste firma la presente.

Firmado: Xavier Snchez Pujades


Bellaterra, 18 de Septiembre de 2009

Amispadresporensearmequeelesfuerzoeselcaminoparalogrartusobjetivos.
Amistos,porsuayudayapoyoincondicional.
ADani,pornodejardecreerenm.
AKenny,porsucompaa.

TABLADECONTENIDO

1. I N T R O D U C C I N ..........................................................................................1

1.1. O B J E T I V O S .................................................................................................1
1.2. M O T I V A C I O N E S . ..........................................................................................2
1.3. E S T A D O D E L A R T E ......................................................................................2
1.4. C L A S I F I C A C I N D E L A M E M O R I A ..................................................................6

2. P L A N I F I C A C I N ..........................................................................................7

2.1. P L A N I F I C A C I N I N I C I A L ..............................................................................7
2.2. P L A N I F I C A C I N F I N A L . ................................................................................9
2.3. E S T U D I O D E V I A B I L I D A D ...........................................................................12

3. U N C O M P I L A D O R .....................................................................................13

3.1. A N A L I Z A D O R L X I C O ................................................................................14

3.2. A N A L I Z A D O R S I N T C T I C O .........................................................................16

3.2.1. G R A M T I C A S L I B R E S D E C O N T E X T O .................................................16
3.2.2. D E R I V A C I N ...................................................................................17
3.2.3. R B O L E S S I N T C T I C O S ....................................................................18
3.2.4. M T O D O S D E A N L I S I S S I N T A C T I C O S . ...............................................19
3.2.5. A N L S I S I S A S C E N D E N T E ..................................................................23

3.2.5.1. LR ( K ).................................................................................25

3.2.5.1.1.
A N L I S I S LR (0).......................................................27
3.2.5.1.2.
T A B L A D E A N L I S I S A S C E N D E N T E ...............................31
3.2.5.1.3.
I N I C I O D E A N L I S I S . ...................................................32
3.2.5.1.4.
A N L I S I S LR (1).......................................................36
3.2.5.1.5.
A N L I S I S LALR (1). ..................................................43

3.3. A N A L I Z A D O R S E M N T I C O . .........................................................................46

3.3.1. G R A M T I C A D E A T R I B U T O S ..............................................................47
3.3.2. T I P O S D E A T R I B U T O S . ......................................................................48

3.4. G E N E R A D O R D E C D I G O ............................................................................50

VIIITABLADECONTENIDO

4. D E S A R R O L L O ..........................................................................................51

4.1. L X I C O . ....................................................................................................51
4.2. S I N T C T I C O . .............................................................................................51

4.2.1. A U T M A T A LR (1). .........................................................................53

4.2.1.1. C R E A R P R O D U C C I N I N I C I A L .................................................54
4.2.1.2. C R E A R C L A U S U R A .................................................................54
4.2.1.3. C R E A R E S T A D O . ....................................................................56
4.2.1.4. C R E A R T R A N S I C I O N E S . ..........................................................57
4.2.1.5. V E R E S T A D O S . ......................................................................58

4.2.2. A U T M A T A LALR (1).....................................................................62


4.2.3. T A B L A D E A N L I S I S .........................................................................64
4.2.4. A N A L I Z A D O R LALR (1). ..................................................................66

4.3. A A D I R A C C I O N E S S E M N T I C A S . ................................................................68

4.3.1. F U N C I N D E R E D U C C I N . .................................................................70
4.3.2. A T R I B U T O S H E R E D A D O S ..................................................................75

5. C O N C L U S I O N E S . .......................................................................................79
6. A N E X O ...................................................................................................81

6.1. E X P R E S I O N E S R E G U L A R E S .........................................................................81
6.2. C L C U L O D E A N U L A B L E S ...........................................................................82
6.3. C L C U L O D E P R I M E R O S .............................................................................83
6.4. E J E M P L O S D E L A N A L I Z A D O R A S C E N D E N T E LALR (1). .................................84

B I B L I O G R A F A ........................................................................................89
N D I C E ...................................................................................................91

TABLADEILUSTRACIONES

F I G U R A 2.1 P L A N I F I C A C I N I N I C I A L Y F I N A L ....................................................................................11
F I G U R A 3.1 D E F I N I C I N D E U N C O M P I L A D O R ...................................................................................13
F I G U R A 3.2 F A S E S D E U N C O M P I L A D O R ...............................................................................................14
F I G U R A 3.1.1 A N A L I Z A D O R L X I C O ...................................................................................................15
F I G U R A 3.2.1 A N A L I Z A D O R S I N T C T I C O ............................................................................................16
F I G U R A 3.2.2 R B O L S I N T C T I C O .......................................................................................................19
F I G U R A 3.2.3 A N L I S I S D E S C E N D E N T E ( D E R I V A C I N P O R L A I Z Q U I E R D A ).................................21
F I G U R A 3.2.4 A N L I S I S A S C E N D E N T E (D E R I V A C I N P O R L A D E R E C H A )......................................23
F I G U R A 3.2.5 G R A M T I C A LR ( 0 ).......................................................................................................27
F I G U R A 3.2.6 A U T M A T A LR ( 0)........................................................................................................30
F I G U R A 3.2.7 E S T R U C T U R A D E L A N A L I Z A D O R S I N T C T I C O ............................................................32
F I G U R A 3.2.8 T A B L A D E A N L I S I S LR ( 0 ).........................................................................................33
F I G U R A 3.2.9 A N A L I Z A D O R L R ( 0).....................................................................................................35
F I G U R A 3.2 10 G R A M T I C A P A R A M O S T R A R T O D O S L O S M T O D O S ...............................................35
F I G U R A 3.2.11 A U T M A T A LR ( 0 ) C O N C O N F L I C T O D E S P L A Z A R R E D U C I R ................................36
F I G U R A 3.2.12 A U T M A T A LR ( 1 ).....................................................................................................40
F I G U R A 3.2.13 T A B L A D E A N L I S I S D E L A U T M A T A LR ( 1).........................................................41
F I G U R A 3.2.14 A N A L I Z A D O R LR ( 1)..................................................................................................42
F I G U R A 3.2.15 A U T M A T A LAL R ( 1)................................................................................................44
F I G U R A 3.2.16 T A B L A D E A N L I S I S D E L A U T M A T A L ALR ( 1)...................................................45
F I G U R A 3.2.17 A N A L I Z A D O R L ALR (1).............................................................................................45
F I G U R A 3.3.1 A N A L I Z A D O R S E M N T I C O .............................................................................................46
F I G U R A 3.3.2 A T R I B U T O S S I N T E T I Z A D O S ..........................................................................................48
F I G U R A 3.3.3 A T R I B U T O S H E R E D A D O S ...............................................................................................49

X T A B L A D E I L U S T R A C I O N E S

F I G U R A 4.2.1 E S T A D O S D E L A U T M A T A LR ( 1 )...............................................................................60
F I G U R A 4.2 2 A U T M A T A LR ( 1) E N COSE L....................................................................................61
F I G U R A 4.2.3 E S T A D O S LALR ( 1)......................................................................................................63
F I G U R A 4.2.4 A U T M A T A L ALR ( 1) E N COSEL..............................................................................64
F I G U R A 4.2.5 V E C T O R D E L I S T A S D E A N L I S I S .................................................................................65
F I G U R A 4.3.1 P I L A E N A N L I S I S S I N T C T I C O Y S E M N T I C O ...........................................................69
F I G U R A 4.3.2 A U T M A T A L ALR ( 1) C O N A T R I B U T O S .....................................................................73
F I G U R A 4.3.3 A N L I S I S LALR ( 1) C O N A T R I B U T O S ........................................................................74

Captulo1
INTRODUCCIN
1.1

O BJETIVOS

El objetivo fundamental de este proyecto consiste en crear un generador de compilador,


basado en analizadores ascendentes. Como base para hacer este analizador se usar el
lenguajeCoselyelmdulocom,queesungeneradordecompiladoresbasadoenanalizadores
descendentes y que actualmente se est utilizando en las prcticas de la asignatura de
CompiladoresI.Elnuevogenerador,quetienecomoentradaunagramtica,hadecomprobar
siesunagramticaascendenteLALR(1)yanalizarunacadenadeentradadesmbolosusando
dichagramtica.
Lacompilacinsecomponeprincipalmenteencuatroetapas:

LXICO
Enesteapartado,nicamentesehadeaplicarunscanner,queyaexistapreviamente,
sobre el generador de compiladores Com de Cosel. De esta manera se pueden leer
todoslossmbolosdelacadenadeentrada.

SINTCTICO
Se parte de las gramticas generadas en el modulo Com, para un anlisis
descendente. Con estas se pueden obtener todos los smbolos de dicha gramtica,
smbolos terminales y no terminales, transformaciones de BNF a producciones,
producciones,anulables,primeros,siguientes,etc;usadoscomobaseparagenerarun
analizador ascendente. De esta forma, se puede crear una autmata LALR (1),
analizarlo y comprobar si la gramtica de entrada pertenece a una gramtica
ascendenteLALR(1).Finalmente,analizarunacadenadeentradadesmbolosusando
dichagramtica.Estaeslaetapamsimportantedelacompilacin.

2 C A P T U L O 1. I N T R O D U C C I N

SEMNTICOYGENERACINDECDIGO
Estas etapas de la compilacin, son realizadas mediante Cosel. Por este motivo,
simplementeelgeneradorComhadepermitirlaintroduccindeatributosyacciones
semnticas. De esta manera, se pueden verificar las declaraciones de las variables y
lasgramticaslibrescontexto.

1.2

M OTIVACIONES

Esteproyectoestdestinadoaserunaherramientadocenteparalosalumnos.Portanto,ha
de ser fcil de aplicar y visualizar, cosa que no cumplen los generadores ascendentes que
existenactualmenteYACCyBison.Estehechosehacepatentesobretodoeneltratamientode
atributosheredadosysintetizados,yaqueusanunanotacinbasadaen$,queespocolegible
ycomprensible.

1.3

E STADODEL A RTE

Conlaaparicindelprimerordenadordigitalen1946,sehizonecesarioescribirsecuenciasde
cdigo, o programas, que daran como resultado que estas computadoras realizaran los
clculosdeseados.Enunprimermomento,estosprogramasseescribanenlenguajemquina:
cdigos binarios que representaban las operaciones reales de la mquina que van a
efectuarse.Estetipodelenguajessonderpidainterpretacinporpartedelamquina,pero
dedifcilcomprensindelserhumano.
Acausadelamolestaylentaescrituradeloscdigosbinarios,estaformadecodificarpronto
fuereemplazadaporellenguajeensamblador,quemejorextraordinariamentelavelocidady
precisinconlaquesepodanescribirlosprogramas,perotenavariosdefectos:aneradifcil
deescribir,leerycomprender.Porotrolado,ellenguajeensambladordependaporcompleto
de la mquina en particular para la que se haba escrito el cdigo. Esto significa que si un
cdigosequeraexportaraotracomputadora,estesetenaquevolveraescribirdesdecero.
Posteriormente, aparecen los lenguajes de alto nivel. Estos lenguajes se escriben mediante
instruccionesosentenciassimilaresalasdeloslenguajeshumanos.Estofacilitalaescrituray
comprensindelcdigoalprogramador.Paraqueestetipodelenguajesepuedaexpresaren

C A P T U L O 1. I N T R O D U C C I N 3

diferentesmquinas,surgeelconceptodecompilador,unprogramaquetraduceunlenguaje
dealtonivelaotrodebajonivel.[1]
Enlaactualidadexistenmuchoslenguajesdealtonivel,paraloscualessehancreadomuchas
metodologas basadas en la generacin de compiladores. Estas metodologas se basan en el
anlisissintcticotantoascendentecomodescendente.
ElanalizadorsintcticoqueseproponeenesteproyectoeselanalizadorascendenteLALR(1).
Algunos de los compiladores basados en analizadores ascendentes LALR (1) que se usan
actualmenteson:BISONyYACC.

YACC (YetAnotherCompilerCompiler)
Es un programa muy extendido en UNIX. YACC acepta como entrada una gramtica
libredecontexto,yproducecomosalidaelautmatafinitoquereconoceellenguaje
generado por dicha gramtica. YACC solo acepta las gramticas LALR (1). Adems,
permite asociar acciones a cada regla de produccin y asignar un atributo a cada
smbolo de la gramtica ya sea terminal o no terminal. Dado que el autmata que
generaYACCestescritoenlenguajeC,todaslasaccionessemnticasydeclaraciones
necesarias,debenserescritasenestemismolenguaje.YACCpartedeunossmbolos
terminalesquedebensergeneradosporunanalizadorlxico.Dichoanalizadorpuede
implementarseapartirdeLEX.
Cadareglagramaticalseexpresadelasiguienteforma:
noTerminal:componentes;

dondecomponentesesunasecuenciadeceroomsterminalesynoterminales.Por
convencin, los smbolos no terminales se escriben en minscula y los terminales en
mayscula, las flechas se sustituyen por : y cada regla debe acabar en ;. Se va a
mostrar una correspondencia entre gramtica formal y su equivalencia en notacin
YACC.[2]

Gramticaformal

NotacinYACC

EE+T

e:e+t

|T

|t

4 C A P T U L O 1. I N T R O D U C C I N

Junto con los smbolos terminales y no terminales, se pueden aadir acciones


semnticasenformadecdigoCdelimitadoporllaves.Porejemplo:
e:e+t{Printf(Estoesunasuma\n);};

La importancia de las acciones semnticas, es asociar a los smbolos terminales y no


terminales un atributo. Los nombres de los atributos son siempre los mismos y
dependennicamentedelaposicinqueocupaelsmbolodentrodelaregla.Deesta
forma,elnombre$$serefierealatributodelaparteizquierdadelaregla,mientras
que $i se refiere al atributo asociado al iensimo smbolo de la gramtica
componentes.Esdecir,

Elatributodelantecedentees$$.

Elatributodelprimersmbolodecomponenteses$1.

Elatributodelsegundosmbolodecomponenteses$2.

Etc.

Lasaccionessemnticasseejecutarnsiemprequesereduzcalaregla,porloqueesta
seencargadecalcularunvalorpara$$enfuncinde$i.Porejemplo:
e:e+t{$$=$1+$3;}
|t{$$=$1;};

t:t*f{$$=$1+$3;}
|f{$$=$1;};

f:NUM{$$=$1;}

Elanalizadorlxicoseencargadeasignarunvaloralosatributosdelosterminales,en
estecasoNUM.

B I S O N
Es un generador de analizadores sintcticos perteneciente al proyecto GNU, que
convierte una descripcin gramatical para una gramtica independiente de contexto
LALR(1),enunprogramaenCqueanalizaprogramas.BisonescompatibleconYACC,
por tanto, todas las gramticas escritas para YACC deberan funcionar con Bison,

C A P T U L O 1. I N T R O D U C C I N 5

obteniendo el mismo resultado. Usndolo junto a LEX esta herramienta permite


construircompiladoresdelenguaje.[3]
UnareglagramaticaldeBisontienelamismanotacinqueYACC.
exp:exp+exp

IgualqueocurreconYACC,unareglagramaticalpuedetenerunaaccincompuestade
sentenciasenC.Cadavezqueelanalizadorreconozcaesaregla,seejecutalaaccin.
Enesteejemplo,semuestraunareglaquedicequeunaexpresinpuedeserlasuma
dedossubexpresiones:
exp:exp'+'exp{$$=$1+$3;};

LEX / FLEX
Son generadores de analizadores lxicos que reciben como entrada un fichero de
texto que contiene las expresiones regulares que corresponden a las unidades
sintcticas del lenguaje que se va a compilar. Estos generadores crean un fichero en
cdigo C, que contiene una funcin llamada yylex() que implementa el analizador
lxico.[2]
EsteficheroLEX/FLEXconstadetrespartes:laseccindedefiniciones,reglasyrutinas
auxiliares.Comosepuedeverenelsiguienteejemplo:
/*Seccindedefiniciones*/
#include<stdio.h>//ParausarPrintfenlasreglas

/*SeccindeReglas*/

Digito[09]

/*Seccinderutinasauxiliares*/
Begin{printf(Beginreconocido\n);}
End

{printf(Endreconocido\n);}

Intmain(){
Returnyylex();//Sillegaalfindelaentradatermina
}

6 C A P T U L O 1. I N T R O D U C C I N

1.4

C LASIFICACINDELAMEMORIA

Lamemoriaestdivididaendiferentescaptulos.Acontinuacin,seexplicabrevementecada
unodeellos.
C A P T U L O 2: P L A N I F I C A C I N
En este captulo, se muestra la planificacin inicial y final del proyecto. Tambin se
realizaelestudiodeviabilidaddelproyecto.
C A P T U L O 3: U N C O M P I L A D O R
Enesteapartadoseexplicalapartetericadelproyecto.Quesuncompilador,cules
sonsusetapasyqurealizacadaunadeellas.Sobretodo,sedaespecialimportanciaa
la fase de anlisis sintctico, que es donde se usan los analizadores ascendentes.
Tambinsemuestrandiferentesejemplosparasucomprensin.

C A P T U L O 4: D E S A R R O L L O
Enestaseccin,semuestracomoseharealizadoungeneradorsintcticoascendente,
basadoenlapartetericaexplicadaenelcaptulo3.Seexplicandiferentesejemplos
paravisualizarydemostrarsubuenfuncionamiento.

C A P T U L O 5: C O N C L U S I O N E S
En este captulo, se detalla cuales son las conclusiones extradas despus de la
elaboracin del proyecto. Cules han sido los objetivos conseguidos y cules son los
pendientes.
C A P T U L O 6: A N E X O

Seadjuntainformacincomplementariaymsejemplos,paraunamejorcomprensin.
BIBLIOGRAFA
NDICE

Captulo2
PLANIFICACIN
Eneste captulo,sedescribela planificacininicial yfinaldelproyecto.Sehanrepresentado
mediante un diagrama, como se puede observar en la Figura 2.1. En estos diagramas, se
muestracomosehavistoalteradalaplanificacinfinalrespectolainicial.Estosehaproducido
debidoalafaltadeexperienciaenlaplanificacindeproyectosy,obviamente,acausadela
aparicindeimprevistosduranteeldesarrollodelmismo.Tambinseencuentraelestudiode
viabilidadcorrespondientealproyectorealizado.

2.1

P LANIFICACIN I NICIAL

Paraexpresareltiempoutilizadoeneldesarrollodelproyecto,seusalasemanacomoforma
representativa de las horas trabajadas. Si se tiene en cuenta que cada da se van a trabajar
aproximadamente4horas,entonceslasemanaequivaleatrabajarentre20y25horas.
Ahoraseexplicanlospuntosquesetuvieronencuentaenunprimermomento.

ESTUDIOPREVIO
Antesdeempezaraprogramar,setendrqueinvestigarsobrelasprincipalesetapas
decompilacinyrealizarunestudiodelaprogramacinenCoselydelmduloCom.
Enunasemanahabrtiempoparapoderllevarloacabo.

E S T U D I O L R (1) Y LALR (1)


Una vez obtenida la documentacin necesaria para el estudio de los algoritmos, se
pensqueunasemanaserasuficienteparatenerasimiladoslosalgoritmosLR(0),LR
(1)yLALR(1).

D E S A R R O L L O L R (1) Y LALR (1)


DesarrollodelautmataLR(1)yseguidamenteelLALR(1).Sesuponequeestepunto
es uno de los ms complejos del proyecto. Como consecuencia, se puso de margen
cuatrosemanas.

8 C A P T U L O 2. P L A N I F I C A C I N

TABLAANLISIS
Una vez obtenido el autmata LALR (1), se necesita una tabla para poder aplicar el
anlisisascendente.Comoesteapartadosloconsisteentraducirelautmataauna
matriz,seapostporunasemanaparadesarrollarlo.

A N A L I Z A D O R LALR (1)
Finalmente, del apartado sintctico, falta implementar el algoritmo del analizador
ascendente basado en las acciones desplazar y reducir. Para realizar esta
implementacin, se hace necesario el uso de la tabla de anlisis creada con
anterioridad.Enunprimermomento,sepensqueendossemanassepodrarealizar.
Una vez finalizado el analizador sintctico, se tiene que probar para comprobar su
buenfuncionamiento.

ESTUDIOSEMNTICO
UnavezcomprobadoelbuenfuncionamientodelanalizadorLALR (1),hayquehacer
un estudio sobre los diferentes atributos que puede soportar una gramtica
dependientedecontextoylasaccionesquepuedellevaracabo.Llevarunasemana
realizaresteestudio.

DESARROLLOSEMNTICO
Terminado el estudio, se ha de empezar a tratar los atributos y las acciones
semnticasdesdeelpuntodevistadeungeneradorascendentesintctico.Sesupone,
que este apartado es otro de los ms complejos del proyecto, por esta razn su
margenesdecincosemanas.

MEMORIAYPRESENTACIN
Aunque la memoria se va escribiendo durante todo el desarrollo del proyecto, se
necesitan unas tres semanas ms, para recopilar toda la informacin obtenida y
explicartodolorealizadodelamejorformaposible.

PRESENTACIN
Unavezfinalizadalamemoria,lapresentacinsepuederealizarperfectamenteenuna
semana,yaquesehandetenerclaroslospuntosadestacarenlapresentacin.

C A P T U L O 2. P L A N I F I C A C I N 9

2.2

P LANIFICACIN F INAL

Una vez finalizado el proyecto, han surgido diferentes cambios respecto a la planificacin
inicial.
Inicialmente,nosetuvoencuentaladificultadtantoenlacomprensincomoeneldesarrollo
de los algoritmos a aplicar a lo largo del proyecto. Ahora, se explican, nicamente, los
apartadosmodificadosrespectolaplanificacininicial.

E S T U D I O L R (1) Y LALR (1)


Se pens que una semana sera suficiente para entender los algoritmos pero,
finalmente, se increment en una semana ms. Esto se produjo debido a las escasa
informacinobtenidasobrelosalgoritmosascendentesLR(1)yLALR(1),yaquedicha
informacinsloapareceendosdelosocholibrosreferenciadosenlabibliografay,
adems,estosusanlosmismosejemplosparaexplicareldesarrollodelosalgoritmos.
Estehechodificultsucomprensin.

D E S A R R O L L O L R (1) Y LALR (1)


DuranteeldesarrollodelautmataLR(1)yLALR(1)aparecieronvariosproblemasque
setuvieronqueresolver.Comoconsecuencia,eltiempotranscurridoenestaetapaes
superioraloindicadoenunprincipio.Laimplementacindelosautmatassedemor
unsemanams.

TABLAANLISIS
Para crear las tablas de anlisis se tuvo un pequeo problema de optimizacin, que
hizoincrementareltiempodedesarrolloentresdasms.

A N A L I Z A D O R LALR (1)
Alahoraderealizarelalgoritmodeanlisisascendentesetuvieronvariasdificultades
que hicieron retrasar de nuevo el desarrollo del proyecto. Se necesitaron unas tres
semanasparasuimplementacin.

10 C A P T U L O 2. P L A N I F I C A C I N

DESARROLLOSEMNTICO
Esunodelosapartadosenlosquesehanencontradomsdificultades,debidoaque
suimplementacinprovocabalamodificacindeunagranpartedecdigo.Portanto,
eltiempodeelaboracinseincrementendossemanasmsdeloprevisto.

EXMENES
Duranteeltiempoqueseestuvorealizandoelprocesosemnticosetuvoquehacerun
parnacausadelosexmenes.Esteperiodofuede4semanas.

PERIODODEPRUEBAS
Finalizadoslosexmenesyeldesarrollosemntico,sepusoacomprobarsirealmente
funcionabatodo.Estaseccin,nosetuvoencuentaenlaplanificacininicialyesuna
de las ms importantes, ya que como suele pasar, se produjeron varios errores que
retrasarondenuevoeltiempodedesarrollo(dossemanas).

VACACIONES

DOCUMENTACINPARALAMEMORIA
Este apartado no estaba incluido en la planificacin inicial. Simplemente se basa en
recolectarinformacinsobrelosalgoritmosoexplicacionestericasmsimportantes,
recogida durante todo el proyecto. Ms tarde, todos estos conceptos se explican y
detallanenlamemoria.

F I G U R A 2.1 P L A N I F I C A C I N I N I C I A L Y F I N A L

12 C A P T U L O 2. P L A N I F I C A C I N

2.3

E STUDIODEVIABILIDAD

Acontinuacin,semuestraelestudiodeviabilidadrealizadoapartirdelaplanificacininicial
expuestaenelapartadoanterior.
Primero,sehademirarsisetienelainformacinadecuadaparapodergenerarunanalizador
ascendente LALR (1). Este punto, no tiene ningn riesgo, debido a que la mayor parte de la
informacinestexplicadaenloslibrosdecompiladores.Tambinhahabidounestudiodelos
generadoresdeanlisisascendentesyaexistentes,YACCyBison,exceptoenelcasodepaso
porparmetrosyaquetienenproblemasdeviabilidadenlosatributosheredados.
ComoplataformaparahaceresteanalizadorascendenteLALR(1)seusaellenguajeCoselyel
mdulo Com, que son de dominio pblico. Por tanto, para desarrollar este proyecto, se
necesitauncostequeesequivalentealashorastrabajadasporelingeniero,yaqueelsoftware
utilizadoesgratuito.
Un riesgo que puede aparecer en la realizacin del proyecto es la comprensin del
funcionamientodelgeneradorCom,queusacaractersticasdeCosel,peroeldirectordeeste
proyecto tiene todos los conocimientos necesarios, ya que fue l, quien desarroll el
compiladordeCoselyelmduloCom.
Una vez recopilada toda la informacin, se ha de desarrollar e implementar un analizador
ascendenteLALR(1)usandoparaelloellenguajeCosel.
Para tener un coste orientativo del presupuesto que supone realizar este proyecto, hay que
sumarlashorastrabajadasporelingeniero.
Segnlaplanificacininicial,setrabajan20horascadaunadelasquincesemanasenlasque
sehallevadoacabolarealizacindelproyecto.Creyendoqueuningenierocobra30/hora,el
coste total del proyecto asciende a 9.000. Teniendo en cuenta la planificacin final, se
produce una desviacin sobre el coste inicial del proyecto de 3.000 , provocando que el
presupuestofinalseade12.000.

Captulo3
UNCOMPILADOR
Latraduccinesunprocesoquetomacomoentradauntextodeunprogramaescritoenun
lenguajeyretornacomosalidaeltextodeunprogramaenotrolenguaje,dondeesteltimo
mantiene el significado del texto original. Un compilador traduce un lenguaje de entrada, el
lenguajefuente,aunlenguajesalida,ellenguajeobjeto.Unaparteimportantedelprocesode
traduccin es que el compilador avise de la presencia de errores al usuario en el programa
fuente.EnlaFigura3.1semuestraunpequeoesquemadeuncompilador.

Lenguaje
Fuente

Lenguaje
Objeto

Compilador

Errores

Figura3.1DefinicindeunCompilador

Un programador puede escribir un programa en un lenguaje de alto nivel, para luego


compilarloaunprogramalegibleporlamquina.
Se pueden construir compiladores para una gran diversidad de lenguajes fuente y lenguajes
mquinautilizandolasmismasfasesbsicas.Cadaunadeestasfases,transformaellenguaje
fuentedeunarepresentacinenotra.[4]

14 C A P T U L O 3. U N C O M P I L A D O R

AnalizadorLxico

AnalizadorSintctico

TABLADESIMBOLOS

AnalizadorSemntico

MANEJODEERRORES

LenguajeFuente

GeneradordeCdigo

LenguajeObjeto

Figura3.1Fasesdeuncompilador

ComosemuestraenlaFigura3.2,uncompiladoroperaendiferentesfases.Lastresprimeras
fases forman la mayor parte del anlisis de un compilador. Aparecen dos actividades, la
administracindelatabladesmbolosqueseaplicaenelanlisissemnticoy,lagestinde
erroresqueinteractaconlasetapasdeanlisislxico,sintcticoysemntico.
El administrador de la tabla de smbolos es una funcin primordial para un compilador, ya
queregistralosidentificadoresutilizadosenelprogramafuenteyreneinformacinsobre
losdiferentesatributosdecadaidentificador.[2]
Ahoraseexplicancadaunadelasfasesdeuncompilador.

3.1

A NALIZADOR L XICO

Elanalizadorlxico,tambinconocidocomoanalizadormorfolgico(scanner,eningls)se
encargadeleerunasecuenciadecaracteresdelprogramafuente,carcteracarcter,ylos

C A P T U L O 3. U N C O M P I L A D O R 15

agrupa para formar unidades con significado propio. Estas unidades son los componentes
lxicos(tokens,enings).Estoscomponentespuedenser:

PA L A B R A S R E S E RVA DAS :If,else,do,while,for,end,

I D E N T I F I C A D O R E S : nombres asociados a variables, funciones, tipos definidos por


elusuario,etiquetas,etc.

O P E R A D O R E S :+*/==<>&()=!

C O N S TA N T E S : constantes numricas que representan valores enteros, reales, en


puntoflotante,odecaracteresquerepresentancadenas.

Secuenciade
caracteres

Analizador
Lxico

Secuenciade
smboloso
Tokens

Figura3.1.1AnalizadorLxico

ComosepuedevisualizarenlaFigura3.1.1alanalizadorlxicoseleintroduceunasecuencia
decaracteresyestedevuelveuntokenconformeelanalizadorsintcticolovanecesitando
paraavanzarenlagramtica.Lostokenssonlossmbolosterminalesdelagramtica.Como
elanalizadorlxicoeslapartedelcompiladorqueleeeltextofuente,tambinpuederealizar
ciertasfuncionesademsdeanalizar,porejemplo,guardareltextonecesarioparagenerar
informedeerrores.[5]
La forma de especificar los tokens, de modo que sean reconocidos por los analizadores
lxicos, est casi siempre definida por expresiones regulares, ya que este formato resulta
mscmodoparaelcompilador.Paramsinformacinsobrelasexpresionesregularesmirar
laseccin6.1delanexo.

16 C A P T U L O 3. U N C O M P I L A D O R

3.2

A NALIZADOR S INTCTICO

Latareadelanalizadorsintctico(parser,eningls)esdeterminarlaestructurasintcticade
un programa a partir de los tokens producidos por el analizador lxico y, de esta forma,
construir el rbol sintctico que representa esta estructura. Hay que recordar que el
analizador sintctico es la etapa ms importante de la compilacin (continuando el anlisis
iniciado por el analizador lxico), ya que comprueba que la sintaxis de la instruccin es
correcta. Por este motivo, el anlisis sintctico considera como smbolos terminales las
unidades sintcticas retornadas por el analizador lxico. Como se puede comprobar en la
Figura3.2.1,elanalizadorsintcticorecibelostokensdelanalizadorlxicoyrealizaelrbol
sintcticopara,mstarde,aplicarelanalizadorsemntico.[6]

Secuenciade
smboloso
Tokens

Analizador
Sintctico

rbol
Sintctico

Figura3.2.1AnalizadorSintctico

La estructura sintctica a reconocer es especificada mediante una gramtica libre de


contexto.Lasgramticassonunaherramientaesencialenelanlisissintctico.

3.2.1

G RAMTICASLIBRESDECONTEXTO

Las gramticas o especficamente las gramticas libres de contexto, se usan formalmente


paradescribirlaestructuradelosprogramasenunlenguajedeprogramacin.
UnagramticaG,esunatupladecuatrocomponentes(T,N,S,P).

Un conjunto de tokens, T, tambin llamados smbolos terminales, son los smbolos


bsicosconlosquese construyen lascadenas.Los tokensconstituyenlossmbolos
delalfabetodellenguajedescritoporlagramtica.

C A P T U L O 3. U N C O M P I L A D O R 17

Un conjunto de smbolos no terminales, N, designan cadenas de tokens. Cada


smbolo no terminal representa un conjunto de cadenas, lo cual simplifica la
definicindellenguajegeneradoporlagramtica.

En toda gramtica existe un smbolo no terminal destacado, S, al que se le conoce


comosmboloinicial.

Un conjunto de producciones o reglas P, constan de un smbolo no terminal


(llamadoladoizquierdoocabeceradelaproduccin),unaflechayunasecuenciade
smbolos terminales y/o no terminales (llamado parte derecha de la produccin).
Estas producciones describen la forma en que se pueden combinar los smbolos
terminales y no terminales para formar cadenas. A continuacin se muestra la
notacindeunaproduccin.[7]
N(TN)*

Se muestra un pequeo ejemplo de una produccin, donde EXPRESION es un smbolo no


terminalyoperadoresunterminal.[6]
EXPRESIONEXPRESIONoperadorEXPRESION

Apartirdeahora,lossmbolosterminalesseexpresanenletraminsculaylosnoterminales
enmaysculas.Alconjuntodeellossellamasmbolosgramaticales.

DERIVACIN

3.2.2

Laderivacinconsisteentrataracadaproduccincomounaregladesustitucin,dondeel
smbolonoterminaldelacabeceradeunareglasesustituyeporlacadenaformadaporel
cuerpodelaproduccin.Elrbolsintcticoseconstruyeapartirdelasderivaciones.
Enelsiguienteejemplo,seobservaunagramticaextradaapartirdelanalizadorlxico.
EXPEXP+EXP
EXP
EXPEXP
EXPEXP
EXP(EXP)
EXPid

18 C A P T U L O 3. U N C O M P I L A D O R

Apartirdeestemomento,lasgramticassesimplificanusandoeloperando|explicadoen
elapartado6.1delanexo.
EXPEXP+EXP|EXPEXP|EXP|(EXP)|id

Se considera una gramtica para expresiones aritmticas, donde EXP es un smbolo no


terminal que representa una expresin. Mientras que (, ), const (constante) e id
(identificador),sonsmbolosterminales.
La produccin EXP EXP, indica que una expresin precedida del operador menos,
tambin es una expresin. Esta produccin se puede utilizar para crear expresiones ms
complejasapartirdeotrasmssimplesporelmtododederivacin.
SisedescribelaaccinanteriorcomoEXP EXPsepuedeleer comoEXPderivaen
EXP. La produccin EXP (EXP), dice que, en una cadena de smbolos gramaticales, se
puedensustituircualquierinstanciadeEXPpor(EXP).[8]
EXPEXP(EXP)(id)

3.2.3

EXPEXP

EXP(EXP)

EXPid

RBOLESSINTCTICOS

Gracias a los rboles sintcticos, se puede hacer una representacin grfica de las
derivaciones.Coneste mtodo,serepresentalajerarquadela estructurasintcticadelas
sentenciasgeneradasporlagramtica.
Construirunrbolsintcticosignificaquesecreaunrboldenodosyqueestosnodosdeben
ser etiquetados con smbolos gramaticales, de izquierda a derecha. Los nodos hoja son
etiquetados con smbolos terminales y los nodos internos son etiquetados como no
terminales.Elnodoraz(inicial)esetiquetadoconelsmbolodeiniciodelagramtica.[8]
Acontinuacin,sepresentaunagramtica,dondeEXPyFACsonsmbolosnoterminalesy+,
*eidsonterminales,
EXPEXP+EXP|FAC
FACFAC*FAC|id

C A P T U L O 3. U N C O M P I L A D O R 19

Apartirdeestagramtica,sepuedegenerarlasecuenciaid*id+idmediantelossiguientes
pasos de derivacin. En la Figura 3.2.2, se muestra el rbol generado a partir de dicha
derivacin.
EXPEXP+EXPFAC+EXPFAC*FAC+EXPFAC*FAC+FAC
id*FAC+FACid*id+FACid*id+id

id

F
*

id

id

Figura3.2.2rbolSintctico

3.2.4

M TODOSDEANLISISSINTCTICO

La mayora de mtodos de anlisis se pueden dividir en dos clases: descendente y


ascendente,segnelordenenelqueseconstruyeelrbol.

A N L I S I S D E S C E N D E N T E odearribaabajo(topdown):esunatcnicaqueintenta
construir un rbol sintctico de la cadena de entrada, comenzando por la raz y
creandolosnodosapartirdeellahastallegaralashojas.Asimismo,sepuedepensar
como un mtodo que intenta encontrar una derivada ms a la izquierda de la
cadenadeentrada.[9]

A N L I S I S A S C E N D E N T E o de abajo arriba (bottomup): es una tcnica que


pretende construir un rbol sintctico para una determinada cadena de entrada
empezandoporlashojasyconstruyendoelrbolhastallegaralaraz.Silapalabra

20 C A P T U L O 3. U N C O M P I L A D O R

reduccin se considera el proceso inverso a la derivacin, es decir, sustituir una


subcadenaquecoincidaconelladoderechodeunaproduccinporunsmbolono
terminaldelaizquierda,sepuedeconsiderarqueestemtododeanlisisrealizala
reduccin de la cadena c de entrada hasta convertirla en el smbolo inicial S de la
gramtica.Elresultadofinalcoincideconunaderivacinporladerechadelacadena
deentradaperoescritaenordencontrario.[9]
Acontinuacin,semuestranlasdosformasdeaplicarladerivacinenunaciertagramtica
cuando entra una cadena de smbolos. Los ejemplos que se realizan en cada uno de los
apartadossehacenconlagramticaquesemuestraacontinuacin:
ET|E+T
TF|T*F
Fid

D E R I V A C I N P O R L A I Z Q U I E R D A : ( A N L I S I S D E S C E N D E N T E )
La derivacin por la izquierda cosiste en reemplazar siempre el no terminal que se
encuentra ms a la izquierda primero. En el siguiente ejemplo se puede ver una
demostracin.
E E+T T+T F+T id+T id+T*F id+F*F
id+id*Fid+id*id

E
E
T

T
+

E
E

E
E

T
F

C A P T U L O 3. U N C O M P I L A D O R 21

E
T

id

id

E
T

E
T

id

id

id

id

id

id

Figura3.2.2Anlisisdescendente(Derivacinporlaizquierda)

D E R I V A C I N P O R L A D E R E C H A ( A N L I S I S A S C E N D E N T E )
La derivacin por la derecha reside en que siempre se sustituye primero el no
terminalqueseencuentramsaladerecha.Yelrbolseconstruyedesdelashojas,
hastallegaralaraz.Sepuedeverunaevidenciaenelsiguienteejemplo.
id+id*id F+id*id T+id*id E+id*id E+F*id
E+T*idE+T*FE+TE

22 C A P T U L O 3. U N C O M P I L A D O R

id

id

id

id

E
T

id

id

id

id

id

id

id

id

id

E
T

id

id

id

id

T
T

F
+

id

id

C A P T U L O 3. U N C O M P I L A D O R 23

E
T

id

id

id

Figura3.2.3Anlisisascendente(Derivacinporladerecha)

Como se ve en las dos Figuras anteriores, el proceso de recorrer el rbol para el anlisis
descendentecomienzaenlaraz,mientrasqueelascendenteempiezaenlashojas,peroel
resultadofinaleselmismoparalosdoscasos.

3.2.5

A NLISISASCENDENTE

Los analizadores sintcticos ascendentes, construyen y recorren el rbol sintctico de una


cadenadeentradacorrectadesdelashojas(smbolosterminales)hastalaraz(axioma),en
una direccin ascendente, como se ha visto en la Figura 3.2.4. Es un proceso reiterado,
dondeinicialmenteseutilizalacadenaquesevaaanalizaryfinalizacuandosecompletael
anlisis con xito o cuando, por culpa de algn error sintctico, no se puede continuar. En
cadapasodelanlisissepretendeindicarqueregladelagramticasetienequeaplicaren
ese punto del rbol, teniendo en cuenta el estado de este y la posicin de la cadena de
entradaalaquesehallegado.
Portanto,lapartederechadeunaproduccincontieneunaindicacin,llamadapunto,
queseparalaparteanalizadadelaquenoloest.[10]
EE+T

En este tipo de anlisis se pueden aplicar dos acciones esenciales: reduccin y


desplazamiento.

24 C A P T U L O 3. U N C O M P I L A D O R

REDUCCIN
Enlapartederechadeunaproduccin,cuandounasubcadenadelaparteizquierda
delpunto,correspondealapartederechadeunaproduccin,estasesustituyeporla
parteizquierdadelaproduccin.
SiNesunnoterminalyderivaenelsmboloterminalonoterminal.puedeser
tantoterminalcomonoterminalyaesunterminal.Sereduceunasubcadenadela
partequeseencuentraenlaizquierdadelpuntoaysesustituyeporN.

Reduccin
aN

DESPLAZAMIENTO
Se avanza un smbolo en la cadena de entrada y, el punto en todas las reglas que
siguensiendocompatiblesconlasubcadenadelacadenadeentrada.

SemuestraunejemplodelautilizacindelpuntoydelasaccionesReduciryDesplazar.
EE+T

Inicialmente,elpuntoseencuentraenelorigendelapartederechadelaregla,puestoque
nosehaprocesadoinformacinsuficienteparaavanzar.Paraqueestasealareglautilizada,
primerosetendrquereducirlapartedelacadenadeentradacorrespondientealsmbolo
noterminalE,
EE+T

Encontraracontinuacinunsmboloterminal+,suponedesplazarelpuntounaposicin.
EE+T

Indicaqueelanalizadorhacomprobadolapartederechadelareglayescompatibleconla
partedelacadenadeentradaanalizada.Enestemomento,sepuedereducirtodalapartede
la cadena de entrada asociada a E+T y substituirla por el smbolo no terminal E, que es la
parteizquierdadelaregla.
EE+T

C A P T U L O 3. U N C O M P I L A D O R 25

Existen muchas tcnicas ascendentes, al contrario de lo que ocurre en el anlisis


descendente,paraelcual,enlaprctica,sloestdisponibleunatcnicaelLL(1).Seexplica
latcnicaLR(0),importantedesdeelpuntodevistatericoperopocoprctico,paradespus
pasaraestudiarconmsprofundidadlastcnicasdelaimportanciaprcticaLR(1)yLALR(1).

3.2.5.1 LR ( K )

Seintroduceunatcnicaeficientedeanlisissintcticoascendentequesepuedeutilizarpara
procesarunaampliaclasedegramticaslibredecontexto,estatcnicasedenominaLR(k).
La abreviatura L indica que se realiza una lectura de izquierda a derecha de la cadena de
entrada (en ingls, from left to right), mientras que la R refleja que estos analizadores
construyen una derivacin por la derecha de la entrada en orden inverso (en ingls, rigth
mostderivation).Porltimolakhacereferenciaalnmerodesmbolosquesedebenmirar
por adelantado para tomar las decisiones de reducir o desplazar. Cuando se omite la k, se
asumequees1.
LadiferenciaquehacealosmtodosLR(k)mspoderososquelosLL(k)esporvariarazones.

Losmtodos LR (k) disponen delainformacin delaentradaylosestados porlo


quehaidopasandoelanalizador(lacadenaquehaidoreconociendohastaahora),
mientrasquelosmtodosLL(k)slodisponendelainformacindelaentrada.

Los analizadores LR (k) logran reconocer la gran mayora de los lenguajes de


programacinquepuedansergeneradosmediantegramticaslibresdecontexto.

El mtodo de funcionamiento de los LR (k) tiene la ventaja de localizar un error


sintcticocasienelmismomomentoenqueseproduce,conloquealcanzaunagran
eficienciadetiempodecompilacinfrenteaprocedimientosmenosadecuadoscomo
eselretroceso(backtracking).

El principal inconveniente del mtodo es que supone demasiado trabajo construir


manualmente un analizador sintctico LR (k) para una gramtica de un lenguaje de
programacinmuytpico,siendonecesarioutilizarunaherramientaespecializadaparaello.
Si la gramtica contiene ambigedades u otras construcciones difciles de analizar ante un
examen de izquierda a derecha de la entrada, el analizador puede localizar las reglas de
produccinproblemticaseinformardeellas.

26 C A P T U L O 3. U N C O M P I L A D O R

Otrograninconvenientedelanlisisascendenteconsisteendecidircundoloquepareceser
lapartederechadeunaproduccinpuedeserreemplazadoporsuparteizquierda.Estono
es trivial, ya que pueden haber partes derechas comunes a varias producciones o
produccionesquederivanenfinaldecadena$.
Los analizadores LR (k) constituyen una familia en la que existen numerosas variantes.
Existenvariosalgoritmosdeanlisisascendente.Elmsutilizadoeselalgoritmodeanlisis
pordesplazamientoreduccin.Estealgoritmoestbasadoenunapilayunatabladeanlisis,
comoseexplicamsadelante.Existendiferentesmtodosparaconstruirelautmata:

LR (0)
Es el mtodo ms fcil de implementar, pero el que tiene menos poder de
reconocimiento. No utiliza la informacin del smbolo de adelanto para decidir la
accinarealizar.Porestemotivo,surgenconflictosquesemencionanmsadelante.

SLR (1)
SussiglassignificanSimpleLR.Esmuyparecidoalmtodoanterior,peroesteyausa
unsmbolodeadelanto.ElautmataSLR(1)tienemenosestadosqueelautmata
LR(1),portanto,latabladeanlisisconstruidaconSLR(1)esmuchomscompacta.
Por este motivo, el conjunto de gramticas SLR (1) es mucho ms reducido que el
conjuntodegramticasLR(1).

LR (1)
Eslamejortcnicaperoesmuycostosa.Debidoaqueesteautmatageneramuchos
estados,elconjuntodegramticasesamplioyeltamaodelastablasseincrementa
considerablemente.

LALR (1)
Del ingls Look Ahead LR, con un smbolo de adelanto. Es una versin intermedia
entreelmtodoSLR(1)yelLR(1),yaqueLALR(1)aprovechalasventajasdeambos
autmatas. El autmata es ms reducido que LR (1), pero tiene un subconjunto de
gramticasmsamplioqueSLR(1).[9]

Ahora,sedesarrollanlosmtodosdeanlisisascendente,peroseentramsendetallecon
losanlisisLR(0),LR(1)yLALR(1),yaquesonconlosquesehatrabajado.

C A P T U L O 3. U N C O M P I L A D O R 27

3.2.5.1.1 A NLISIS LR (0)

Losanalizadoresascendentessiguensimultneamentetodosloscaminosposibles,esdecir,
cadaestadodelautmatamantienetodaslasreglascuyaspartesderechassoncompatibles
conlasubcadenadeentradayaanalizada.Cadaunadeesasreglaseshipottica,puestoque
alfinalsolounareglaesaplicada.
Se van a explicar todos los pasos que hay que tener en cuenta para crear el autmata del
analizadorLR(0).

CREARCLAUSURA
Apartirdeunagramticaydeunaproduccin,sepuedecrearunestadoaadiendo
aestetodaslasproduccionesquepuedanaparecerdependiendodelaposicindel
puntoydelagramtica.
Dadalasiguientegramtica,
SE$
ET
EE+T
Tnum

Figura3.2.4GramticaLR(0)

paracrearelestadoinicialsecogelaproduccininicialyelpuntoqueseencuentra
delante del primer smbolo de la cadena de entrada. Se trata de reducir toda la
cadena al smbolo inicial. De esta manera, se relaciona nicamente con el smbolo
inicial.

SE$

Un smbolo no terminal nunca se puede encontrar en una cadena de entrada, solo


puede aparecer mediante una reduccin. Por esta razn, cuando el analizador esta
situado justo delante de un no terminal, hay que aadir todas las producciones
donde su parte izquierda sea igual al este smbolo no terminal. A lo largo de la

28 C A P T U L O 3. U N C O M P I L A D O R

construccin del autmata aparecen muchas configuraciones en las que hay que
aplicarlareflexinanterior.

ApartirdelagramticaquesemuestraenlaFigura3.2.5,seenseacomosecreael
estadoinicialS0.Comolaprimeraproduccin tienedetrsdel punto elsmbolono
terminalE,hayqueaadiralestadotodaslasproduccionesqueempiecenporE,

SE$

Enestecaso,lasproduccionesqueempiezanporE,son:
ET
EE+T

Porlamismarazn,comoTesunnoterminalhayqueaadiralestadoinicialtodas
lasreglasdondelaparteizquierdacoincidaconelnoterminalT.
Tnum

Estasconfiguracionestienenencomnqueelsiguientesmboloaanalizaresunno
terminal.Poresonoquedanadapendienteenelestadoinicial.Comoconsecuencia,
sisellamaalestadoinicialS0,sepuededecirque:
S0={SE$
ET
EE+T
Tnum}

ESTADOSDEACEPTACINYDEREDUCCIN
Unestadoesdeaceptacin,cuandoexisteunaproduccindereduccinenelestado,
esdecir,cuandoelpuntodeestaseencuentraalfinaldelacadenay,portanto,no
precede a ningn smbolo terminal o no terminal. Se puede ver que el estado
contiene el cierre de la produccin S E $ , representado en el autmata por
doblecrculo.

C A P T U L O 3. U N C O M P I L A D O R 29

TRANSICINENTREESTADOS
Se van a crear todos los estados que surgen del estado inicial S0, dependiendo del
smbololedoenlacadenadeentrada.
SienlacadenadeentradaseencuentraelsmboloE,slolaproduccin(SE$)
y(E E+T)siguensiendocompatiblesconlaentrada.Enestecaso,sepuede
desplazarunsmbolo,tantoenlacadenadeentradacomoenestasproducciones.Si
elsiguienteestadosellamaS1,sepuedeexpresarcomo:
S1={SE$,
EE+T}

Pero si en la cadena de entrada se encuentra el smbolo T, nicamente se puede


desplazar un smbolo de la produccin E T y de la cadena de entrada. Este
estadoesdeaceptacin,puestoqueelpuntoseencuentraalfinaldelacadena.Siel
siguienteestadosedenominaS2,sepuedevercomo:

S2={ET}

Slosepuedeproducirotroestadoapartirdelestadoinicial,silacadenadeentrada
seencuentraconelsmboloterminalnum.Enestecaso,sedesplazaunsmbolodela
produccin T num y de la cadena de entrada. Este estado tambin es de
aceptacin,porquedespusdelpuntonohaymssmbolos.Siesteestadosellama
S3,seexpresacomo:
S3={Tnum}

Aplicando todos los puntos mencionados anteriormente y a partir de la gramtica que se


muestraenlaFigura3.2.5,sepuedeconstruirunautmataLR(0).Comosepuedeverenla
Figura3.2.6.

30 C A P T U L O 3. U N C O M P I L A D O R

S0

S E$
E T
E E+T
T num

S1

S E$
EE+T

E E$

T
EE+ T

E T

num

S4

S2

T num

EE+T

S6

S5

S3

Figura3.2.5AutmataLR(0)

CONFLICTOS
Ocurrecuandoenunestadodelautmatasepuedenrealizarmsdeunaaccin.

C O N F L I C T O D E S P L A Z A R R E D U C I R
Seproducecuandoenunestadoseconsigueefectuarlaaccindereduccin
y desplazar. Si se supone el conjunto de elementos correspondientes a un
estadodelautmatadeanlisisascendente.
Ti
TiE

SenecesitatantodesplazarTiEcomoreducirTi,portantosellegaa
unproblema.

C O N F L I C T O R E D U C I R R E D U C I R
Ocurrecuandoenunestadoaparecendosaccionesdereducir.Tambinen
elcasodetener:

Ti
Vi

C A P T U L O 3. U N C O M P I L A D O R 31

Existe un inconveniente ya que no se puede reducir dos producciones a la


vez.[10]

3.2.5.1.2 T ABLADEANLISISASCENDENTE

Las tablas de anlisis contienen informacin equivalente a la funcin de transicin del


autmata,quereconoceellenguajeasociadoalagramticaqueseestanalizando.
El nmero de filas coincide con el nmero de estados que tenga el autmata. Segn la
tcnicaaplicadasepuedeconstruirunautmatadistintocondiferentesestados.Haytantas
columnascomosmboloshayaenelalfabetodelagramtica.Latablaespecificalaaccina
realizarencadamomento.[9]
Latabladebeespecificar,enfuncindelsmbolodelacadenadeentradaydelestadoenel
que se encuentra el autmata, cul ser el estado siguiente y las modificaciones que se
deben de hacer tanto en la pila como en la cadena de entrada, segn si se produce un
desplazamientoounareduccin,sisehafinalizadoexitosamenteosisehadetectadoalgn
error.Parapoderespecificarestainformacinseaplicarlasiguientenotacin:

Si se produce un desplazamiento se indica con D<e>, donde <e> representa un


estadodelautmatadeanlisis.Representalaaccindedesplazarelsmboloactual
eiralestado<e>.

Siseproduceunareduccin,semuestraconR<p>,donde<p>identificaunareglade
lagramtica.Simbolizalaaccindereduccindelaregla<p>.

SielanlisisfinalizaconxitoserepresentaconAceptar.

SinofinalizaconxitoseexpresaconError.

EnlasiguienteFiguraseobservaelesquemadelanalizadorsintctico.Dondesemuestranlas
filasdeaccinydeir_a,ascomoelcontenidodelapila,queseexplicamsdetalladamente
acontinuacin.[10]

32 C A P T U L O 3. U N C O M P I L A D O R

Pila

Cadenadeentrada
a1

Tabladeanlisis
SmbolosTerminales

Sm

SmbolosNoTerminales

Xm

a2

Estados

T1

...

T2

Nt1

...

Nt2

Sm1

...

S0

Xm1

ak

...

...

...

...

...

Sn

S0

Figura3.2.6EstructuradelAnalizadorSintctico

3.2.5.1.3 I NICIODELANLISIS

Es importante saber que el algoritmo de anlisis ascendente utiliza la pila para conservar
todalainformacinnecesariaycontinuarelanlisis.Poresto,aexcepcindelestadoinicial
enelqueseinsertaelestadoinicialalapila,enelrestoseintroducenelestadodelautmata
yelsmboloexaminadoeneseinstante.

D E S P L A Z A M I E N T O D< E >
Cuando en la ejecucin del algoritmo aparece en una casilla D<e> significa que, el
smboloactualdelacadenade entradaes unodelosqueesperaunadelas reglas
conlapartederechaparcialmenteanalizadas.Porestemotivo,sepuedepasaraun
nuevoestado<e>delautmatayavanzarunaposicinenlacadenadeentrada,de
maneraqueelsmboloactualpaseaserelsiguientealanalizado.Estoimplica:

Introducirenlapilaelsmbolodeentrada.

Introducirenlapilaelnuevoestado<e>.

C A P T U L O 3. U N C O M P I L A D O R 33

R E D U C C I N R< P >
Al aparecer R<p> simboliza que, teniendo en cuenta el smbolo de la cadena de
entrada, alguna de las reglas representadas en el estado actual del autmata ha
desplazado toda su parte derecha, esta puede ser substituida por el smbolo no
terminaldelaparteizquierdadelaregla<p>.Estosupondr:
Sacardelapilatodalainformacinasociadaconlapartederechadelaregla
<p>. Como al desplazar se almacena tanto el estado como el smbolo de
entrada, si la longitud de la parte derecha a reducir es N, se tendrn que
hacer2*Nextraccionesdelapila.
RealizarunDesplazamientoconelsmboloreducido

ACEPTACIN
Encasodeapareceraceptarenunacasillaenlaejecucindelalgoritmo,elanlisis
terminayseconcluyequelacadenahafinalizadocorrectamente.

ERROR
Sisellegaaunacasilladeerrorseconsideraquelacadenanohafinalizadoconxito
yelanlisisterminaParaunamejorcomprensindelatabladeanlisis,estascasillas
serepresentancomocasillasvacas.[10]

Acontinuacin,secrealatabladeanlisisLR(0)apartirdelautmatadelaFigura3.2.6,yse
analizalacadenadeentradanum+num$.MostradoenlaFigura3.2.9.
Estados
0
1
2
3
4
5
6

num
D3

R3

D5

D4

Aceptar

E
D1

T
D2

R2

D6
R6

Figura3.2.7TabladeanlisisLR(0)

1. Loprimeroquesehadehacer,esintroducirenlapilaelestado0.Elprimersmbolo
delacadenadeentrada,esnum.Comosepuedeverenlatabladeanlisis,enesa

34 C A P T U L O 3. U N C O M P I L A D O R

posicinhayundesplazamientoalestado3.

2. Seaadeelsmbolonumalapilayseextraedelacadenadeentrada.Seaadeel
estado S3. En este estado, se Reduce (Tnum). En el estado 0, si entra una T, se
desplazaalestado2.

3. Seextraendelapiladoselementos,yaquesolohayunsmboloenlaparteizquierda
de la produccin (Tnum). Despus, se aade el smbolo T y el estado S2.
Si se encuentra en el estado S2, se vuelve a reducir, en este caso ET.
Seguidamente,sedebedesplazaryaqueenlatabladeanlisis,desdeelestadoS0
conelsmboloE,sedesplazahaciaelestadoS1.

4. SeaadenenlapilaelsmboloEyelestadoS1.Ahora,entraelsmbolo+.Deesta
manera,seDesplazahaciaelestadoS5.

5. Seacumulanenlapila,elsmbolo+yS5.Enestepaso,sevuelvealeerunsmbolode
lacadenadeentrada,num.Portanto,hayquerealizarundesplazamientohaciaS6.

6. UnavezaadidonumyS6,sehadereducirTnumydesplazaralestadodondese
haproducidolareduccinS3.

7. Seextraedelapilalosdosltimosvaloresintroducidos,yseaadeTyS3.Eneste
paso,sereduceEE+T,ysedesplazaEalestado1.

8. Comolapartederechadelaproduccinreducida,EE+T,tienetreselementos,se
handeextraer3*2=6elementosdelapila.Despus,seaadeEyS1.Ahora,entrael
ltimoelementodelacadenadeentrada$,quehacedesplazaralestado4.

9. Seamplalapila,con$yS4.Porltimo,sereducelaproduccininicialSE$.

10. El anlisis ha finalizado correctamente porque en el estado 4, columna smbolo $,


aparecelaaccinAceptar.

C A P T U L O 3. U N C O M P I L A D O R 35

Pasos
1
2
3
4
5
6
7
8
9
10

Pila
S0
S3,num,S0
S2,T,S0
S1,E,S0
S5,+,S1,E,S0
S6,num,S5,+,S1,E,S0
S3,T,S5,+,S1,E,S0
S1,E,S0
S4,$,S1,E,S0
S,S0

Cadena
num+num$
+num$
+num$
num$
$
$
$
$

Acciones
Desplaza(num,S3)
Reduce(Tnum)yDesplaza(T,S2)
Reduce(ET)yDesplaza(E,S1)
Desplaza(+,S5)
Desplaza(num,S6)
Reduce(Tnum)yDesplaza(T,S3)
Reduce(EE+T)yDesplaza(E,1)
Desplaza($,S4)
Reduce(SE$)
Aceptar

Figura3.2.8AnalizadorLR(0)

Enestemomento,secreaunautmataLR(0)conlagramticaquesemuestraenlaFigura
3.2.10,peroenestecasoseproduceunconflictoenelestado2delautmata,dondetienea
suvezunelementoadesplazarSxbyunelementoareducirBx.Porestemotivo,se
crealatcnicaLR(1)queintentaresolveresteconflictorestringiendolareduccinutilizando
smbolosdeadelanto.
SA|xb
AaAb|B
Bx

Figura3.29Gramticaparamostrartodoslosmtodos

36 C A P T U L O 3. U N C O M P I L A D O R

$
S A$
S1

S0
A

S A$
x
S xb
A aAb
A B
B x
a

S A$
S2
b

S xb
B x

A aAb
A aAb
A B
B x

S xb

B x

S7
A aAb

AB

S5

S3

S9

S6
S8

AaAb

S4

Figura3.2.10AutmataLR(0)conconflictoDesplazarReducir

3.2.5.1.4 A NLISIS LR (1)

El anlisis sintctico LR (1) incrementa de manera importante la potencia del anlisis


sintctico LR (0) al utilizar el smbolo de adelanto en la cadena de entrada para dirigir sus
acciones.Estaaccinlarealizadedosmaneras:

Laprimera,consultaeltokendeentradaantesdeundesplazamientoparaasegurar
queexisteunatransicinapropiada.

La segunda, utiliza un conjunto de smbolos de adelanto, para decidir si se ha de


efectuarunareduccinono.

SedemuestraelanlisisLR(1)apartirdelagramticaquesemuestraenlaFigura3.2.10.Se
aplicaestagramticaporqueesLR(1)yLALR(1).

Es sencillo demostrar que esta gramtica no es LL (1) ya que x se encuentra en


PRIMEROS (B) y, como consecuencia, en PRIMEROS (A). Se produce un conflicto
porqunosabesireducirSAoavanzaraSxb.

C A P T U L O 3. U N C O M P I L A D O R 37

Como se ha explicado antes, tampoco es una gramtica LR (0) porqu, como se


muestra en la Figura 3.2.11, en el estado S2 se produce un conflicto Desplazar
Reducir.

ElanlisisLR(1)sebasaenconservarelsmboloadelantadoespecificoconcadaelemento.
Deestamanera,unelementoLR(1)seescribiras:N{},dondeeselconjuntode
smbolosquepuedeseguiralsmbolonoterminal.Cuandoelpuntohaalcanzadoelfinal
delelemento,N {},entonceselelementosepuedereducirexitosamentesiempre
ycuandoelsmbolodeadelantoenesemomentosea,sinoesignorado.[9]
Slosecalculanlossmbolosdeadelantoparalasproduccionesquehansidoevaluadaspor
la clausura. Las producciones que no han sido evaluadas por la clausura mantienen el
smbolo de adelanto. Para calcular los smbolos de adelanto, hay que tener en cuenta dos
situaciones:

CONJUNTODEPRODUCCIONESDELESTADOINICIAL
Enestecaso,elconjuntodesmbolosdeadelantoseencuentraenelestadoinicial
S0,talycomosepuedeverenlaFigura3.2.12.Tambin,contienesolountoken,el
defindecadena$,yaqueesteeseltokenquepuedeseguiralsmbolodeiniciodela
gramtica.

CONJUNTODEPRODUCCIONESDECUALQUIERESTADO

SidespusdelnoterminalN,hayunsmbolo,porejemplo,P N{},
entonceselconjuntodesmbolosadelantadosdelnuevoelementocreadoes
PRIMEROS {}, ya que esto es lo que puede continuar a cada uno de estos
elementosenestaposicinenconcreto.

Pero si por ejemplo, se tiene P N {}, no se puede calcular los


PRIMEROS porqu no hay ningn smbolo despus del no terminal N. Por
esto,secogecomosmbolodeadelanto{}.

La definicin de PRIMEROS, para poder incluir el conjunto de smbolos adelantados, se


explicadetalladamenteenelapartado6.2delanexo.
AhoraseexplicacmosecreaelestadoS0yS5deautmatamostradoenlaFigura3.2.12.

38 C A P T U L O 3. U N C O M P I L A D O R

EnelestadoS0,primerohayqueaadirlaregladeinicioS'S{$},perocomoelsiguiente
smboloaanalizaresunnoterminal,hayqueagregaralestadotodaslasproduccionesdonde
laparteizquierdadelaproduccincoincidaconelnoterminalS.Enestecaso,sonS Ay
Sxb.Unavezobtenidasestasproduccionessecalculasusmbolodeadelanto.
S'S{$}

Despus del no terminal S, no hay ningn smbolo ms. Por este motivo, no se pueden
calcularlosPRIMEROSyhayqueaadircomosmbolodeadelanto{$}.Portanto,aSAy
Sxbselesdebeaadirelsmbolodeadelanto{$}.
SA{$}
Sxb{$}

Una vez calculado sus smbolos de adelanto, hay que volver a mirar si estas producciones
contienenunnoterminaldespusdelpunto,comoocurreenelcasodeSA{$},dondeA
esunnoterminal.Porestemotivo,sedebenaadirtodaslasqueempiecenporA,AaA
byAB.Despusdeaadirlas,secalculasusmbolodeadelanto.
SA{$}

Ocurre como en el caso anterior, despus del no terminalA, no hay ningn smbolo y, por
tanto,nosepuedencalcularlosPRIMEROS.Porestarazn,hayqueaadircomosmbolode
adelanto{$}.
AaAb{$}
AB{$}

Finalmente,sucedeigualconA B{$},quecontieneelsmbolonoterminalB.Seaadea
laclausura,Bx,quetambintienecomosmbolodeadelanto{$}.
AsescomoseobtieneelestadoS0:
S0={AaAb{$}
AaAb{$}
AB{$}
Bx{$}}

ElestadoS5,secomportadiferenteporquehayunsmboloadelantadoAaAb{$}.

C A P T U L O 3. U N C O M P I L A D O R 39

Enestecaso,comodespusdelpuntohayunnoterminalA,hayqueagregaralestadotodas
lasproduccionesqueempiecenporA,quesonAaAbyAB.Unavezaadidas,hay
quecalcularsusmbolodeadelanto.
AaAb{$}

En este caso, s se pueden calcular los PRIMEROS porque, despus del no terminal A, se
encuentra b. Como consecuencia de producirse PRIMEROS (b)= {b}, el smbolo de adelanto
{b}seaadealasproduccionesanteriormentecargadas.
AaAb{b}
AB{b}

Ahora,alanalizarA B{b},comoelsiguientesmboloBesunnoterminal,tambinhay
queagregartodaslasproduccionesquecontenganB.Enltimolugar,secompletaelestado
S5 con B x. Al no haber ningn smbolo despus del no terminal B, se debe de coger
comosmbolodeadelanto{b}.
Finalmente,elestadoS5quedadelasiguienteforma:
AaAb{$}
AaAb{b}
AB{b}

Bx{b}

SepuedecomprobarqueelconflictoDesplazarReducirqueseproducaenelanlisisLR(0)
hadesaparecido.Ahora,elestadoS4tienequedesplazarenbyreduciren$.Enelrestode
estadosnosemuestraningunaalteracin,portanto,lagramticaesLR(1).
LadiferenciarespectoalatabladelanlisisLR(0)seproduceenlaaccindeReduccin.

REDUCCIN
En vez de consultar los estados finales del autmata, se utilizan los smbolos de
adelantodelasproduccionesdereduccin.SielestadofinalSfysuproduccines
N {1 n}, la accin de reduccin solo se aadir en las casillas
correspondientesalascolumnasdelossmbolosdeadelanto{1n}.Cuandose
reduce la expresin A B {b}, en el estado S12 de la Figura 3.2.12, se puede

40 C A P T U L O 3. U N C O M P I L A D O R

comprobar que en la tabla de anlisis Figura 3.2.13, en la fila 12 se reduce la regla


AB{b},enlacolumnadondeapareceelsmbolodeadelantob.

ACEPTACIN
LaproduccininicialnoseexpresaEE$,sinoEE{$}.Elsmbolodefinalde
cadena$noaparecedeformaexplcita,sinocomosmbolodeadelanto.Portanto,la
accin de aceptacin se escribe en la casilla (Si, $), siempre que en el estado Si,
aparezcalaproduccinEE{$}.[10]

S1

S' S {$}

S2
S A {$}

S0

S'S{$}
A{$}
S
S xb{$}
A aAb{$}
AB{$}
B x{$}

B
x

S3

A B {$}

S6

S4

S x b{$}
S x {$}

S xb {$}

S7
a

S5
A
A a Ab{$}
A aAb{b}
A B{b}
B x{b}

a
B

A aAb
{$}

b
A aAb {$}

A a Ab{b}
A aAb{b}
A B{b}
B x{b}

A
A aAb{b}

S9

B
x

S8

A B {b}

S12

S13

B x {b}

Figura3.2.11AutmataLR(1)

S10

S11
A aAb {b}

C A P T U L O 3. U N C O M P I L A D O R 41

Estados
0
1
2
3
4
5
6
7
8
9
10
11
12
13

a
D5

D9

D9

D6

D8

D11
R11
R12
R13

x
D4

D13

D13

Aceptar
R2
R3
R4

R6

R8

S
D1

A
D2

D7

D10

B
D3

D12

D12

Figura3.2.12TabladeAnlisisdelAutmataLR(1)

UnavezcreadalatabladeanlisisLR(1)mostradaenlaFigura3.2.13.Seanalizalacadena
deentradaaxb$.
ElanlisisesmuyparecidoaldelLR(0),lonicoquesehadetenerencuentaeselsmbolo
deadelantoalahoradereducirunaproduccin.Porejemplo,lareduccindelestado11y12
seproducecuandoelsmbolodeadelantodelasproduccionesseaigualaldelacadenade
entrada.
1. ComoenelanlisisdelLR(0),seaadeenunprimermomentoelestado0.Sientra
elsmboloaexisteundesplazamientoaS5.

2. Secargaenlapilaelprimersmbolodelacadenaayseaadeelestado5.Sevuelve
aleerotrosmboloxysedesplazaaS13.

3. Seagregaenlapilaxyelestado13.EnestemomentoseproduceunareduccinB
x {b}. Como b es el smbolo de adelanto hay que mirar en la fila 13, columna b.
Despus,reduciraBydesplazarBalestado12.

42 C A P T U L O 3. U N C O M P I L A D O R

4. Se extraen dos elementos de la pila porqu la parte izquierda de la produccin a


reducirsolocontieneunelemento,Bx.Acontinuacin,seaadeByS12.Eneste
momentosereduceAB,yaqueelsmbolodeadelantocoincideconb.Luego,se
desplazaelsmboloAalestadoS7.

5. Seextraendoselementosdelapila,porlamismaraznqueenelpasoanterior,yse
aadelareduccindelareglaAysuestadoS7.Ahora,seleeelsiguientesmbolode
lacadenadeentradabysedesplazaaS8.

6. Unavezagregadoslosltimoselementos,seproduceunareduccinAaAbyse
desplazaalestado2paraavanzarelsmboloA.

7. ComolareduccindeanteseraAaAb,ahorahayqueextraer3*2=6elementos
delapilayadicionarAyS2.SevuelveareducirporlaproduccinSAydesplazar
elsmboloSalestado1.

8. Ahora slo falta comprobar que el smbolo de adelanto $, corresponde al ltimo


smbolo de la cadena $ .Por tanto, solo queda reducir para obtener la produccin
inicial.Reduce(SS$)

9. Lacadenahasidoaceptada

Pasos
1
2
3
4
5
6
7
8
9

Pila
S0
S5,a,S0
S13,x,S5,a,S0
S12,B,S5,a,S0
S7,A,S5,a,S0
S8,b,S7,A,S5,a,S0
S2,A,S0
S1,S,S0
S,S0

Cadena
axb$
xb$
b$
b$
b$
$
$
$

Acciones
Desplaza(a,S5)
Desplaza(x,S13)
Reduce(Bx)yDesplaza(B,S12)
Reduce(AB)yDesplaza(A,S7)
Desplaza(b,S8)
Reduce(AaAb)yDesplaza(A,S2)
Reduce(SA)yDesplaza(S,S1)
Reduce(SS$)
Aceptar

Figura3.2.13AnalizadorLR(1)

C A P T U L O 3. U N C O M P I L A D O R 43

3.2.5.1.5 A NLISIS LAR (1)

Al examinar a fondo los estados del autmata LR (1), mostrados en la Figura 3.2.12, se
observa que hay algunos elementos que son muy parecidos a otros conjuntos.
Concretamente,losestadosS5S9sonidnticossiseignoranlossmbolosdeadelantoylo
mismoocurreconS3S12,S7S10yS8S11.Porestemotivo,seintentareducireltamao
delautmataagrupandoestosestados,yasreducireltamaodelatabladeanlisis.Esun
proceso iterativo en el que dos estados se transforman en uno solo siempre que sean
equivalentes.Laequivalenciadeestadossebasaenlassiguientescondiciones:

Slodebendiferirenlossmbolosdeadelantodelasproducciones.Elestadoquese
obtienealunirlosdosestadosequivalentes, contiene encadacasolaunin delos
smbolosdeadelanto.

Elnuevoestadoagrupadodebemantenerlastransicionesdelautmata.

Elprocesoseterminacuandonosepuedanagruparmsestados.
SevanairagrupandolosestadosunoaunohastaformarelautmataLALR(1),mostradoen
laFigura3.2.15.

E S T A D O S S3 S12
Laasociacinesposibleporqulaconfiguracindelosdosestadosslosediferencia
enlossmbolosdeadelanto.LasdostransicionesquellegandesdeS0aS3ydesdeS5
yS9aS12puedenllegaralnuevoestadoS4.Donde:
S3,S12=S4={AB{$,b}}

E S T A D O S S7 S10
Porlasmismasrazonesqueenelcasoanteriorsepuedenjuntarestosdosestadosy
suresultadoes:
S7,S10=S7={AaAb{$,b}}

E S T A D O S S8 S11
Enestasituacinambosestadostienentransicionesdesalida,cosaquenosehaba

44 C A P T U L O 3. U N C O M P I L A D O R

producidoenloscasosanteriores.Launinesposibleporqulasdoslleganalmismo
estado S7, S10=S7. Por eso, se mantiene la transicin en la generacin del nuevo
estado.
S8,S11=S8={AaAb{$,b}}

Esmuyimportanteelordenenelqueserealizanlasuniones.SiseintentaunirlosestadosS8
yS11antesqueS7yS10launinnoesposible.Perocomoesunprocesoiterativo,estono
debedepreocupar,tardeotempranoseunificarnlaparejaS7yS10yluegoS8yS11.[10]
Finalmente, elautmata resultante detodasestasunificacioneseselautmatadelanlisis
LALR(1)ysemuestraenlasiguientefigura:

S1

S' S {$}

S0

S2

S x b{$}
S x{$}

S' S${$}
S
A{$}
S xb{$}
A aAb{$}
A
B{$}
B x{$}

S A {$}

A B {$,b}

S4

A a Ab{$,b}
A aAb{b}
A B{b}
B x{b}

S8

S7

S5

S6

S3

S xb {$}

A aAb{$,b}

x
B x {b}

S9

Figura3.2.14AutmataLALR(1)

A aAb {$,b}

C A P T U L O 3. U N C O M P I L A D O R 45

LacreacindelatabladeanlisisdelautmataLALR(1)semuestraenlaFigura3.2.16yse
construyeexactamenteigualquelatabladeLR(1).
Estados
0
1
2
3
4
5
6
7
8
9

a
D5

D5

D6
R4

D8
R8
R9

x
D3

D9

Aceptar
R2
R3
R4

R6

R8

S
D1

A
D2

D7

B
D4

D4

Figura3.2.15TabladeAnlisisdelAutmataLALR(1)

UnavezcreadalatabladeanlisisLALR(1)mostradaenlaFigura3.2.16.Seanalizalacadena
deentradaaxb$.
ComoyaseexplicarontodoslospasosenelanlisisLR(1),aqunoseexpresarnyaqueson
muyparecido.
Pasos
1
2
3
4
5
6
7
8
9

Pila
S0
S5,a,S0
S9,x,S5,a,S0
S4,B,S5,a,S0
S7,A,S5,a,S0
S8,b,S7,A,S5,a,S0
S2,A,S0
S1,S,S0
S,S0

Cadena
axb$
xb$
b$
b$
b$
$
$
$

Acciones
Desplaza(a,S5)
Desplaza(x,S9)
Reduce(Bx)yDesplaza(B,S4)
Reduce(AB)yDesplaza(A,S7)
Desplaza(b,S8)
Reduce(AaAb)yDesplaza(A,S2)
Reduce(SA)yDesplaza(S,S1)
Reduce(SS$)

Figura3.2.16AnalizadorLALR(1)

46 C A P T U L O 3. U N C O M P I L A D O R

3.3

A NALIZADOR S EMNTICO

Las fases de anlisis semntico y generacin de cdigo estn fuertemente enlazadas y,


normalmente, son coordinadas por el anlisis sintctico. El anlisis semntico est dirigido
porlasintaxis,yaqueeselanalizadorsintcticoelquevainvocandolasrutinasalanalizador
semntico cuando las va necesitando. As pues, el compilador verifica la coherencia
semntica de un programa y a la vez lo traduce al lenguaje mquina o a una versin
intermedia.

rbol
Sintctico

Analizador
Semntico

rbol
Sintcticocon
atributos

Figura3.3.1AnalizadorSemntico

Unavezrealizadoelanlisislxicoysintctico,elanalizadorsemnticorecibecomoentrada
el rbol sintctico del programa (vase Figura 3.3.1). El anlisis semntico genera como
salida, en el caso de no detectar errores, un rbol sintctico con anotaciones semnticas o
atributos.Estosatributosseempleanparacomprobarqueelprogramaessemnticamente
correcto.
Para que los smbolos de una gramtica pueden adquirir significado, se les asocia
informacin(atributos)yalasproduccionesgramaticalesselesasocianaccionessemnticas,
que sern cdigo en un lenguaje de programacin y cuya tarea es evaluar los atributos y
tratar dicha informacin para llevar a cabo las tareas de traduccin. Por este motivo, las
gramticas libres de contexto no son suficientes para realizar el anlisis semntico. Es
necesario,portanto,definiruntipodegramticamsrica,comolasgramticasdeatributos.
[3]

C A P T U L O 3. U N C O M P I L A D O R 47

G RAMTICADEATRIBUTOS

3.3.1

Lasgramticaslibresdecontextoseamplanparapoderdefinirlasemnticadeunlenguaje
deprogramacin.
LagramticadeatributosGA,esunatripleta(G,A,R)donde:

G,esunagramticalibredecontextoG=(T,N,S,P).(VasePg.18)

CadasmbolodelagramticaS,yaseaterminalcomonoterminaltieneasociadoun
conjuntofinitodeatributosA,ycadaatributounconjuntodevalores.Elvalordeun
atributodescribeunapropiedaddependientedecontextodelelementoencuestin.
Por ejemplo, la especificacin X(a,b,c), seala que el no terminal X, tiene tres
atributosa,b,yc.

Cada produccin puede tener asociada una serie de acciones R, que indican cmo
calcularlosvaloresdelosatributosenfuncindelosvaloresdelosatributosdelos
nodosvecinos.Lacorrespondenciaentraatributosyvaloresesesttica,esdecir,un
atributodeunnodoslopuedetomarunvalordeterminado.[8]

Unaaccinsemnticanosoloesunaasociacinaunsmbolo,sinoquetambinselepuede
aadircdigoaunaregla.Enlosejemplosquesevanamostraracontinuacin,lasacciones
se van a representar entre llaves y, para acceder a los atributos, cada smbolo no terminal
tieneasociadotrescampos,elnombredelsmbolonom,eltipodelsmbolotipoyelvalordel
atributoval.Lossmbolosterminales,tienentrescampos,elnombredelsmbololexnom,el
tipodelsmbololextipoyelvalordelatributolexval,yaqueseobtienendelanalizadorlxico.
Se muestra un pequeo ejemplo, donde se escribe por pantalla el valor del atributo del
smboloE1yT.
E1E2+T{cout.print(E1.val,T.lexval)}

48 C A P T U L O 3. U N C O M P I L A D O R

T IPOSDEATRIBUTOS

3.3.2

Losatributospuedenserdedosclases,segnquienlesproporcionasuvalor.

ATRIBUTOSSINTETIZADOS
Se calculan a partir de los valores de atributos de los nodos hijos en cualquier
subrbolqueaparezcan.Portanto,setratadeunainformacinqueasciendeporel
rboldurantesurecorrido.[2]
Enlasiguientegramticatodoslosatributossonsintetizados:
EE{E.val=E.val}
EE+T{E.val=E.val+T.val}
ET{E.val=T.val}
TT*F{T.val=T.val*F.val}
TF{T.val=F.val}
Fnum{F.val=num.lexval}

E'

10

10

10

E
6

T
T

F
4

Figura3.3.2AtributosSintetizados

C A P T U L O 3. U N C O M P I L A D O R 49

ATRIBUTOSHEREDADOS
Se calculan a partir de los valores de atributos del nodo padre o de los nodos
hermanos.Setratadeunainformacindescendentedeunladoalotrodelsubrbol.
[2]
Enelejemplosiguiente,aparecenatributosheredados:
DLT{L.tipo=T.tipo}
Tentero{T.tipo=entero.tipolex}
Lreal{T.tipo=real.tipolex}
LL,id{L.tipo=L.tipo,id.tipolex=L.tipo}
Lid{id.tipolex=L.tipo}

real

Figura3.3.3AtributosHeredados

Siunatributoessintetizadooheredadodebeserlosiempreentodaslasproducciones.Los
atributos terminales son siempre sintetizados y sus valores vienen siempre dados por el
analizadorlxico.Encambio,losheredadossirvenamenudoparaexpresardependenciaen
elcontextoenelqueaparecen.

50 C A P T U L O 3. U N C O M P I L A D O R

3.4

G ENERACINDECDIGO

Es una fase del compilador que se explicar de manera general para dar una idea global
sobresufuncionamiento.
La generacin de cdigo es la ltima fase del compilador y se encarga de convertir un
programa sintctica y semnticamente correcto en una serie de instrucciones para que
puedanserinterpretadasporunamquina.ComosemuestraenlaFigura3.4.1,laentrada
delgeneradordecdigoesunrbolsintcticoconatributos,dondelasalidaesunlenguaje
objeto,queconsigaserdesarrolladoporunamquina.[4]

rbol
Sintcticocon
atributos

Generadorde
cdigo

LenguajeObjeto

Figura3.4.1GeneradordeCdigo

La mquina destino puede ser un microprocesador, una mquina virtual, un lenguaje


intermedio, etc. La generacin de cdigo es aplicada para crear programas de forma
automticaevitandoquelosprogramadorestenganqueescribircdigo.

Captulo4
DESARROLLO
En este captulo, se comenta todo el desarrollo del proyecto. Para ello se usa el lenguaje
Cosel y el mdulo Com, que es un generador de compiladores basado en analizadores
descendentes.
Comosehapodidoverenelcaptulo3,eldesarrollodelproyectoconsisteprincipalmenteen
dos etapas. La primera consiste en crear un analizador ascendente partiendo del mdulo
Comparaelanlisisdescendente.Estaeslapartemsimportantedelproyecto,yaquehay
quedesarrollarelanalizadorascendenteLALR(1).Lasegundaetapadeldesarrolloconsiste
en permitir al generador de compiladores Com la introduccin de atributos y acciones
semnticas,quesernrealizadasmedianteCosel.

4.1

L XICO

Enelapartadodeanlisislxico,lonicoqueseharealizadoesaplicarunScannerqueya
existapreviamentesobreelgeneradordecompiladoresComdeCosel.Paradeestaforma
poderleertodoslossmbolosdelacadenadeentrada.

4.2

S INTCTICO

Se parte del modulo Com para el anlisis descendente. El objeto gramtica es muy til, ya
que permite obtener todos los smbolos terminales y no terminales; las producciones, los
anulables,losprimeros,etc.Todoestoeslabaseparacrearunanalizadorascendente.
Loprimeroquesehaceenelanlisissintcticoespensarcomoalmacenarcadaunodelos
estados del autmata LR (1). Una forma de hacerlo es aadir a la GramaticaBNF una
estructurallamadaEstatsformadaporloscampos:
TypeEstat(NumEstat,Produc,Arestes)

52 C A P T U L O 4. D E S A R R O L L O

NumEstat:Elnmerocorrespondienteacadaestado.

Produc:Lasproduccionesquecontienecadaestado.

Arestes:Lastransicionesquevandeunestadoaotro.

PerotambinhayquecrearunaestructuraProducconlossiguientescampos:
TypeProduc(Valor,Punt,SimboloDeAvance,Final)

Valor:Elvalordelaproduccin.

Punt:Laposicindelpuntodentrodelaproduccin.

SmbolosDeAvance:Lossmbolosdeadelantocorrespondientesalaproduccin.

Final:EsunbooleanoqueretornaTruesilaproduccinhasidofinalizadayFalsesino
lohasido.

YArestesconloscorrespondientescampos:

TypeEstat(EstatAbans,Valor,EstSeg)

EstAbans:Estadoanterioralestadocreado(noutilizado).

Valor:Valordelaaristaosmboloconelcualsehacreadoelnuevoestado.

EstSeg:Elnuevoestadocreado.

Alobjetogramtica,selehanaadidotrescampos,elcorrespondientealaestructuraEstats,
elcampoNumEst,delaestructuraEstatsyelcampoTablaLALR,dondesealmacenalatabla
deanlisisascendenteLALR(1).
Type[public]GramaticaBNF(
Inicial, Terminals, NoTerminals, Regles, Produccions,
MaxNoTer, Diccionari, Anullables, Primers, Seguents,
Estats,NumEst,TablaLALR)

C A P T U L O 4. D E S A R R O L L O 53

A UTMATA LR (1)

4.2.1

ParaintroducirlaexplicacinsobreelautmataLR(1),sevaaexponerlospasosrealizados
por el mdulo Com. Estos no son otros que pasar de BNF a Producciones, clculo de
anulables y clculo de primeros. Todas estas funciones son necesarias, para la
implementacindelautmata.
Una vez obtenida toda la estructura para almacenar todos los campos del autmata, se
empiezaaconstruirelautmata.
SeinicializalalistadeestadosenlistavacayNumEstacero,porquinicialmentenoexiste
ningnestado.
Sehadebuscarenelconjuntodesmbolosnoterminales,elquecorrespondeconelsmbolo
inicial de la gramtica (CodInicial). Luego, se examina en todas las producciones de la
gramticalaquecorrespondeconCodInicial.Silaencuentra,secrealanuevaproduccincon
la estructura mencionada arriba, si no provoca un error. Esto funciona correctamente en
gramticas que tengan una nica produccin para el smbolo inicial. Para que funcione
correctamente con todas las gramticas se tendra que generar un smbolo inicial
automticamente.
Se llama a CrearClausura para completar las producciones que pueda haber en un estado.
Luego, se llama a CrearEstado, para crearlo a partir del conjunto de producciones de la
clausuray,porltimo,seaadenlastransiciones.
Elcdigobsicoparacrearelautmataes:
gl.Estats=[];
gl.NumEst=0;

varCodInicial=Found(p<gl.diccionari,p[1]==gl.Inicial.Exp.Function)

p[0];

varInicio=Found(p<gl.Produccions,p[0].cat==CodInicial)
[Prod(p,0,[EOF],False)];

varListaProducciones=gl.CrearClausura(Inicio);

54 C A P T U L O 4. D E S A R R O L L O

varEstat=gl.CrearEstado(ListaProducciones);
gl.Transiciones(Estat);
gl.Estats=reverse(gl.Estats);

Ahoraseexplicancadaunadelasfuncionesdeestealgoritmo.

4.2.1.1

C REAR P RODUCCIN I NICIAL

Primeramente,hayqueobtenerelsmboloinicialdelagramtica.Sebuscaelsmboloinicial
hastaencontrarlo,perosinoloencuentra,seretornaError.Unavezencontradoelsmbolo
inicialsecreasuproduccindelsiguientemodo:
Inicio=[Prod(p,0,[EOF],False)]

Dondepeselvalordelaproduccininicial,elvalordelpuntoseencuentraoriginalmenteen
laposicin0,elsmbolodeadelantoesunalistaquecontienefinaldefichero[EOF],porque
yanohayningnsmbolodeadelantomsycomolaproduccinnohasidocompletada,el
valordelbooleanoesFalse.

4.2.1.2 C REAR C LAUSURA

En la funcin CrearClausura, se establece el conjunto de producciones que contendr el


estadoapartirdeunaproduccin.
Sielpuntodelaproduccin,estsituadojustodelantedeunnoterminalE,hayqueaadiral
conjunto de producciones todas las producciones que empiecen por el no terminal E. Se
realizaestaoperacinreiteradamentehastaquenoseencuentrenmsproduccionesdonde
elpuntoestesituadodelantedeunnoterminal.
Paracalcularlossmbolosdeadelanto,hayquetenerencuentadossituaciones:

CONJUNTODEPRODUCCIONESDELESTADOINICIAL
Enestecasoelconjuntodesmbolosdeadelantoesunalistaquecontieneelsmbolo
de fin de cadena [EOF], ya que es el smbolo que sigue al smbolo de inicio de la
gramtica.

C A P T U L O 4. D E S A R R O L L O 55

CONJUNTODEPRODUCCIONESDECUALQUIERESTADO
Cadavezqueseaadaunaproduccin,hayquecalcularsusmbolodeadelanto.Hay
dosposibilidades:

CuandoexisteunsmbolodespusdelnoterminalN,porejemplo,PN
{}. Entonces, el conjunto de smbolos adelantados del nuevo elemento
creadoserPRIMEROS{},yaqueestoesloquepuedecontinuaracadauno
deestoselementos,enparticularenestaposicinenconcreto.

Pero si por ejemplo, se tiene P N {}, como no se puede calcular los


PRIMEROS, ya que no hay ningn elemento despus del no terminal N, se
cogecomosiguienteelsmbolodeadelanto{}.

AhorasemostrarelalgoritmodelafuncinCrearClausura:
Fun[public]gl:GramaticaBNF.CrearClausura(ListaProducciones)=>
{
ProcAgregarProduccion(produccion)=>
{
if(ListaProd.MemberP(Produccion))return;
ListaProd=produccion::ListaProd;
if(!produccion.final&&
TypeP(NoTerminalLALR,Produccion.valor[1][Produccion.punt
]))
{
for(p<gl.Produccions,
Produccion.valor[1][Produccion.punt].cat==p[0].cat
)
{
avance=PrimersDe(produccion.valor[1].tail
(produccion.punt+1),
produccion.SimbolosDeAvance);
AgregarProduccion(Prod(p,0,avance,0>=p[1].length);
}
}
}
for(p<ListaProducciones)
AgregarProducciones(p);
returnreverse(ListaProd)
}

56 C A P T U L O 4. D E S A R R O L L O

4.2.1.3 C REAR E STADO

Unavezseobtieneelconjuntodeproducciones,hayquecomprobarque,sialadelantarel
puntodecadaunadelasproduccionesdelaclausura,sehadegenerarunnuevoestadooya
existeunoconlasmismasproduccionesqueelquesequierecrear.
Parapoderhacerestacomprobacinsemirasiexisteunestadoconlasmismasproducciones
que el que se va ha crear. Si ese estado ya existe, simplemente se aaden los smbolos de
adelantodelaactualproduccinyseretornaunatupla(Estado,False).Mientrasquesino
existe,secreaunnuevoestado,seincrementaelnmerodelestado,seaadeenelcampo
Producel conjuntodeproduccionesestablecidasencrear clausurayseponecomoarestes
unalistavaca.Porltimo,seretornaunatuplacon(EstadoNuevo,True).
As,cuandosecreanlastransicionessesabesihayqueaadirlasaristasono,dependiendo
sielsegundovalordelretornoesTrueoFalse.
Ahora, se muestra el cdigo de la funcin CrearEstado, donde ListaProducciones es un
parmetro que representa el conjunto de producciones, una vez hecha la clausura. Con el
procedimiento AadirAdelanto, se aaden los smbolos de adelanto a las producciones
igualesquecontengandiferentessmbolosdeadelanto.
Fun[public]gl:GramaticaBNF.CrearEstado(ListaProducciones)=>
{
Search(e<gl.Estats,CompararProducciones(e.Produc,ListaProduccione
s)){

AnadirAdelanto(ListaProducciones,e.Produc);

returne,false;

}
else{

varEstado=Estat(gl.NumEst,ListaProducciones,[]);

gl.Estats=estado::gl.Estats;

++gl.NumEst;

returnEstado,true;

}
}

C A P T U L O 4. D E S A R R O L L O 57

4.2.1.4 C REAR T RANSICIONES

Unavezseobtieneelestado,solofaltaaadirsustransiciones.Paraesto,hayquecrearun
procedimiento, que cree una lista de aristas de cada uno de los estados que se vayan
creando.Enesteapartadohayquetenerencuentavariosaspectos:

Si en el conjunto de producciones hay ms de una produccin que tienen el punto


delantedelmismosmbolo,slopuedeaparecerunavezestaaristaenlalista.

Si existe una produccin dentro del conjunto de producciones que el punto haya
llegadoalfinal,noseaadelaarista.

Unavezyasehaconstruidolalistadearistas,sehandecrearlosnuevosestadoscon
lasproduccionescorrespondientes.Esenestemomentocuandosecrealaestructura
arestes,enlaqueseaadeelnmerodelestadoquesehabacreado,elsmbolode
laaristayelnmerodelestadoquesehadecrear.Portanto,laestructuraarestes
tienelasiguienteestructura:
Arestes(NumEstatAnterior,ValorArista,NumEstaSiguiente)

SielestadosehacreadonuevohayqueaadiralcampoAristalaestructuraArestes
y, adems, el conjunto de producciones que sean compatibles con la arista. Por
tanto,laestructuradeEstates:
Estat(NumEstat,ConjuntoProducciones,[Arestes(NumEstatAnte
rior,ValorArista,NumEstaSiguiente)])

Al crear el nuevo estado, se llama a la funcin CrearClausura (nuevaproduccion).Se


crean reiteradamente estados que ya tienen como parmetro el conjunto de
producciones correspondiente a ese estado. Al crear un estado, como se ha visto
anteriormente,seretornaelnuevoestadoyunavariablebooleananuevo,queindica
sisehacreadoelestadonuevooyaexistapreviamente.Deestaforma,sloenel
caso de ser nuevo, se llama a la funcin transiciones, para que complete al estado
aadiendolasaristascorrespondientes.
Acontinuacin,semuestraelcdigodelprocedimientoTransiciones,quetienecomo
parmetro estado, la primera variable de la tupla retornada por la funcin
CrearEstado.

58 C A P T U L O 4. D E S A R R O L L O

proc[public]gl:GramaticaBNF.Transiciones(estado)=>
{

varlpro=estado.produc;
while(lpro!=[]){
varp=lpro.head;
varresto=if(p.final)[]elsep.valor[1].tail(p.punt);

if(resto==[]){
lpro=lpro.tail;
}
else{
varsym=resto.head.cat;
varlprotran=[p1|p1<
lpro,p1.valor[1].tail(p1.punt)!=[],p1.valor[1].tai
l(p1.punt).head.cat==sym];
lpro=lprolprotran;
lprotran=[prod(p.valor,p.punt+1,p.SimbolosDeAvance,p.pun
t+1>=p.valor[1].length)|p<lprotran];
var|nuevoestado,nuevo|=gl.CrearEstado(gl.CrearClausura(l
protran));
estado.Arestes=Aresta(estado.numestat,sym,nuevoestado.nu
mestat)::estado.Arestes;
if(nuevo)

gl.transiciones(nuevoestado);

}
}
}

4.2.1.5 V ERESTADOS

ElprocedimientoVerEstados,esunaformaderepresentarmsvisualmenteelautmataLR
(1).
EnlaFigura4.2.1sepuedenvertodoslosestadosdelautmataLR(1),delaFigura3.2.12,sin
aplicarlafuncinVerEstados,esdecir,cadaestadoesunaestructuraformadaporelnmero
del estado, el conjunto de las producciones y la lista de aristas, que ya se han explicado
anteriormente.

C A P T U L O 4. D E S A R R O L L O 59

Estat(NumEst,Prod(Valor,Punt,SimbolosDeAvance,Final),
[Aresta(EstAbans,Valor,EstSeg)])

Estat(0,[Prod((0,[1]),0,[[]],False),Prod((1,[xi,bi]),0,[[]],Fal
se),Prod((1,[2]),0,[[]],False),Prod((2,[3]),0,[[]],False),Prod(
(3,[4]),0,[[]],False),Prod((4,[xi]),0,[[]],False),Prod((3,[ai,2
,bi]),0,[[]],False)],[Aresta(0,ai,7),Aresta(0,4,6),Aresta(0,3,5
),Aresta(0,2,4),Aresta(0,xi,2),Aresta(0,1,1)])

Estat(1,[Prod((0,[1]),1,[[]],True)],[])

Estat(2,[Prod((1,[xi,bi]),1,[[]],False),Prod((4,[xi]),1,[[]],Tr
ue)],[Aresta(2,bi,3)])

Estat(3,[Prod((1,[xi,bi]),2,[[]],True)],[])

Estat(4,[Prod((1,[2]),1,[[]],True)],[])

Estat(5,[Prod((2,[3]),1,[[]],True)],[])

Estat(6,[Prod((3,[4]),1,[[]],True)],[])

Estat(7,[Prod((3,[ai,2,bi]),1,[[]],False),Prod((2,[3]),0,[bi],F
alse),Prod((3,[4]),0,[bi],False),Prod((4,[xi]),0,[bi],False),Pr
od((3,[ai,2,bi]),0,[bi],False)],[Aresta(7,ai,13),Aresta(7,xi,12
),Aresta(7,4,11),Aresta(7,3,10),Aresta(7,2,8)])

Estat(8,[Prod((3,[ai,2,bi]),2,[[]],False)],[Aresta(8,bi,9)])

Estat(9,[Prod((3,[ai,2,bi]),3,[[]],True)],[])

Estat(10,[Prod((2,[3]),1,[bi],True)],[])

Estat(11,[Prod((3,[4]),1,[bi],True)],[])

Estat(12,[Prod((4,[xi]),1,[bi],True)],[])

Estat(13,[Prod((3,[ai,2,bi]),1,[bi],False),Prod((2,[3]),0,[bi],
False),Prod((3,[4]),0,[bi],False),Prod((4,[xi]),0,[bi],False),P
rod((3,[ai,2,bi]),0,[bi],False)],[Aresta(13,ai,13),Aresta(13,xi
,12),Aresta(13,4,11),Aresta(13,3,10),Aresta(13,2,14)])

60 C A P T U L O 4. D E S A R R O L L O

Estat(14,[Prod((3,[ai,2,bi]),2,[bi],False)],[Aresta(14,bi,15)])

Estat(15,[Prod((3,[ai,2,bi]),3,[bi],True)],[])

Figura4.2.1EstadosdelautmataLR(1)

EnlaFigura4.2.2selogravertodoslosestadosyaristasdelautmataLR(1),representados
enlaFigura3.2.12deunaformamsvisual,aplicandolafuncinVerEstados.Acontinuacin,
semuestralanotacindecmoserepresentaelautmata.

Estado:NumEst

ProduccionIzquierdaProduccionDerecha{Simboloadelanto}

Aristas

EstadoActualSimboloEstadoSiguiente

C A P T U L O 4. D E S A R R O L L O 61
ESTADO:0
<Si>><Si_1>{<SCHAR:EOF>}
<Si_1>>xibi{<SCHAR:EOF>}
<Si_1>><ao>{<SCHAR:EOF>}
<ao>><ao_1>{<SCHAR:EOF>}
<ao_1>><bo>{<SCHAR:EOF>}
<bo>>xi{<SCHAR:EOF>}
<ao_1>>ai<ao>bi{<SCHAR:EOF>}
ARISTAS
0ai>7
0<bo>>6
0<ao_1>>5
0<ao>>4
0xi>2
0<Si_1>>1

ARISTAS
7ai>13
7xi>12
7<bo>>11
7<ao_1>>10
7<ao>>8

ESTADO:8
<ao_1>>ai<ao>bi{<SCHAR:EOF>}
ARISTAS
8bi>9

ESTADO:9
<ao_1>>ai<ao>bi{<SCHAR:EOF>}

ESTADO:10
<ao>><ao_1>{bi}

ESTADO:11
<ao_1>><bo>{bi}

ESTADO:12
<bo>>xi{bi}

ESTADO:13
<ao_1>>ai<ao>bi{bi}
<ao>><ao_1>{bi}
<ao_1>><bo>{bi}
<bo>>xi{bi}
<ao_1>>ai<ao>bi{bi}
ARISTAS
13ai>13
13xi>12
13<bo>>11
13<ao_1>>10
13<ao>>14

ESTADO:1
<Si>><Si_1>{<SCHAR:EOF>}

ESTADO:2
<Si_1>>xibi{<SCHAR:EOF>}
<bo>>xi{<SCHAR:EOF>}
ARISTAS
2bi>3

ESTADO:3
<Si_1>>xibi{<SCHAR:EOF>}

ESTADO:4
<Si_1>><ao>{<SCHAR:EOF>}

ESTADO:5
<ao>><ao_1>{<SCHAR:EOF>}

ESTADO:6
<ao_1>><bo>{<SCHAR:EOF>}

ESTADO:7
<ao_1>>ai<ao>bi{<SCHAR:EOF>}
<ao>><ao_1>{bi}
<ao_1>><bo>{bi}
<bo>>xi{bi}
<ao_1>>ai<ao>bi{bi}

ESTADO:14
<ao_1>>ai<ao>bi{bi}
ARISTAS
14bi>15

ESTADO:15
<ao_1>>ai<ao>bi{bi}

Figura4.22AutmataLR(1)enCOSEL

62 C A P T U L O 4. D E S A R R O L L O

A UTMATA LALR (1)

4.2.2

SepuedeobservarqueenelautmataLR(1)hayestadosquecontienenproduccionesmuy
parecidas, en las que slo se diferencian los smbolos de adelanto. Por esta razn, se crea
unafuncindenominadaCompararProducciones,parapasardeLR(1)aLALR(1)yaspoder
reducireltamaodelautmata,agrupandoestosestadostansimilares.
Primero,secompruebaquelasproduccionesdelosestadosseanigualesaunquecontengan
diferentessmbolosdeadelanto.Despus,secreaunnuevoestadomanteniendolasmismas
producciones y, en el campo de smbolos de adelanto, simplemente se aaden todos los
smbolosdeadelantoquehabaenlosestadosantesdeagrupar.Esunprocesoiterativoque
terminacuandonosepuedanapilarmsestados.
En la siguiente Figura se puede ver, la lista de todos los estados del autmata LALR (1)
representadoenlaFigura3.2.15.
Estat(0,[Prod((0,[1]),0,[[]],False),Prod((1,[xi,bi]),0,[[]],Fal
se),Prod((1,[2]),0,[[]],False),Prod((2,[3]),0,[[]],False),Prod(
(3,[4]),0,[[]],False),Prod((4,[xi]),0,[[]],False),Prod((3,[ai,2
,bi]),0,[[]],False)],[Aresta(0,ai,7),Aresta(0,4,6),Aresta(0,3,5
),Aresta(0,2,4),Aresta(0,xi,2),Aresta(0,1,1)])

Estat(1,[Prod((0,[1]),1,[[]],True)],[])

Estat(2,[Prod((1,[xi,bi]),1,[[]],False),Prod((4,[xi]),1,[[]],Tr
ue)],Aresta(2,bi,3)])

Estat(3,[Prod((1,[xi,bi]),2,[[]],True)],[])

Estat(4,[Prod((1,[2]),1,[[]],True)],[])

Estat(5,[Prod((2,[3]),1,[bi,[]],True)],[])

Estat(6,[Prod((3,[4]),1,[bi,[]],True)],[])

Estat(7,[Prod((3,[ai,2,bi]),1,[bi,[]],False),Prod((2,[3]),0,[bi
],False),Prod((3,[4]),0,[bi],False),Prod((4,[xi]),0,[bi],False)

C A P T U L O 4. D E S A R R O L L O 63

,Prod((3,[ai,2,bi]),0,[bi],False)],[Aresta(7,ai,7),Aresta(7,xi,
10),Aresta(7,4,6),Aresta(7,3,5),Aresta(7,2,8)])

Estat(8,[Prod((3,[ai,2,bi]),2,[[]],False)],[Aresta(8,bi,9)])

Estat(9,[Prod((3,[ai,2,bi]),3,[[]],True)],[])

Estat(10,[Prod((4,[xi]),1,[bi],True)],[])

Figura4.2.3EstadosLALR(1)

Y en la siguiente Figura 4.2.4 se muestra el autmata LALR (1) despus de llamar a


VerEstados.

ESTADO:0

ESTADO:5

<Si>><Si_1>{<SCHAR:EOF>}
<Si_1>>xibi{<SCHAR:EOF>}
<Si_1>><ao>{<SCHAR:EOF>}
<ao>><ao_1>{<SCHAR:EOF>}
<ao_1><bo>{<SCHAR:EOF>}
<bo>>xi{<SCHAR:EOF>}
<ao_1>>ai<ao>bi{<SCHAR:EOF>}

<ao>><ao_1>{bi,<SCHAR:EOF>}

ARISTAS

ESTADO:7

0ai>7
0<bo>>6
0<ao_1>>5
0<ao>>4
0xi>2
0<Si_1>>1

<ao_1>>ai<ao>bi{bi,
<SCHAR:EOF>}

ESTADO:1
<Si>><Si_1>{<SCHAR:EOF>}

ESTADO:2
<Si_1>>xibi{<SCHAR:EOF>}
<bo>>xi{<SCHAR:EOF>}
ARISTAS
2bi>3

ESTADO:3
<Si_1>>xibi{<SCHAR:EOF>}

ESTADO:6
<ao_1>><bo>{bi,<SCHAR:EOF>}

<ao>><ao_1>{bi}
<ao_1>><bo>{bi}
<bo>>xi{bi}
<ao_1>>ai<ao>bi{bi}
ARISTAS
7ai>7
7xi>10
7<bo>>6
7<ao_1>>5
7<ao>>8

ESTADO:8
<ao_1>>ai<ao>bi
{<SCHAR:EOF>}
ARISTAS
8bi>9

ESTADO:9

64 C A P T U L O 4. D E S A R R O L L O

<ao_1>>ai<ao>bi.{<SCHAR:EOF>}

ESTADO:4

<Si_1>><ao>{<SCHAR:EOF>}

ESTADO:10

<bo>>xi{bi,<SCHAR:EOF>}

Figura4.2.4AutmataLALR(1)enCOSEL

T ABLADEANLISIS

4.2.3

UnavezyaestconstruidoelautmataLALR(1),hayquecrearlatabladeanlisis,peroen
vez de crearla como se muestra en la Figura 3.2.13, se crear un vector de listas llamado
SparceArray.Aunqueseamslentoalrealizarunabsqueda,noconsumetantamemoria,ya
que no existen posiciones vacas en la matriz. Gracias a este vector de listas, tambin se
puederepresentarelautmataLR(1).
Paracrearestevector,primerosecreantresnuevasestructuras,correspondientesalestado
delautmatayalasaccionesReduceyDesplaza.

ESTADOPILA
Slo muestra el estado del autmata donde se encuentra en este momento.
FormadosoloporuncampoEstado.

TypeEstadoPila(Estado);

DESPLAZA
Es una estructura formada por dos campos: el primero, llamado smbolo, indica el
smboloquesehadeleerparapoderdesplazarlaproduccinyelsegundo,estado,
quemuestraelestadodestino.
TypeDesplaza(simbolo,estado);

C A P T U L O 4. D E S A R R O L L O 65

REDUCE
Es una estructura que tiene tres campos: el primero, denominado smbolo, que
muestra el smbolo que se ha de leer para reducir la produccin. El segundo,
SimbolosRegla, que corresponde al tamao de la parte derecha de la produccin,
para saber cuntos elementos se han de extraer de la pila. Y el tercero,
SimboloReduccion,eselsmbolodelaizquierdadelaproduccin,porelcualsehade
sustituirelantiguosmboloconsuestado.
TypeReduce(simbolo,SimbolosRegla,SimboloReduccion);

UnavezsesabecomosonlasestructurasDesplaza,ReduceyEstadoPila,secreaelvectorde
listas.

Si se produce un desplazamiento se aade en el vector la estructura Desplaza, con


susdosrespectivoscampos,elsmboloquesehaledoyelestadosiguiente.

Si se produce una reduccin hay que agregar en el vector de anlisis, la estructura


Reduceconsuscorrespondientescampos,explicadosanteriormente.

Una vez obtenido el vector de anlisis, que se muestra en la Figura 4.2.5 a partir de las
accionesproducidasenelautmataLALR(1).Sehaderealizarelanalizadorascendente.

([Desplaza(1,1),Desplaza(xi,2),Desplaza(2,4),Desplaza(3,5),Desplaza(4
,6),Desplaza(ai,7)],[Reduce(<SCHAR:EOF>,1,0)],[Reduce(<SCHAR:EOF>,1,4
),Desplaza(bi,3)],[Reduce(<SCHAR:EOF>,2,1)],[Reduce(<SCHAR:EOF>,1,1)]
,[Reduce(<SCHAR:EOF>,1,2),Reduce(bi,1,2)],[Reduce(<SCHAR:EOF>,1,3),Re
duce(bi,1,3)],[Desplaza(2,8),Desplaza(3,5),Desplaza(4,6),Desplaza(xi,
10),Desplaza(ai,7)],[Desplaza(bi,9)],[Reduce(<SCHAR:EOF>,3,3)],[Reduc
e(bi,1,4)])

Figura4.2.5Vectordelistasdeanlisis

66 C A P T U L O 4. D E S A R R O L L O

4.2.4

A NALIZADOR LALR (1)

SiseempiezaenelestadoS0y,comoentrada,seleeelprimersmbolodelacadenaSi,hay
quebuscarenelvectordelistasycomprobarsihayalgunaaccinparael smboloSienel
estadoS0.Siexiste,simplementehayquemirarcualdelasdosestructurases:
Elsmbolodeadelantoseobtieneapartirdelalecturadelacadenadeentrada.Estesmbolo
correspondealsiguientesmboloaleer.Deestamanera,elanalizadorescapazdesaberqu
direccintomar.Elsmbolodeadelantoseaadeenlapilaenelmomentodedesplazary,se
ha de extraer de la pila a la hora de reducir. En el siguiente desplazamiento se vuelve a
aadir.

D E S P L A Z A ( S M B O L O , E S T A D O )
En caso de encontrar la estructura Desplaza (smbolo, estado), quiere decir que, el
smboloactualdelacadenadeentrada,esunodelosqueesperaunadelasreglasconla
parte derecha parcialmente analizadas. Por este motivo, se puede pasar a un nuevo
estadodelautmatayavanzarunaposicinenlacadenadeentrada,demaneraqueel
smboloactualpaseaserelsiguientealanalizado.Estoimplica:

Introducirenlapilaelcampoestadodelaestructuradesplaza.

Introducirenlapilaelnuevosmbolodeentrada.

R E D U C E ( S I M B O L O , S I M B O L O S R E G L A , S I M B O L O R E D U C C I O N )
Cuando se halla la estructura Reduce (Smbolo, SmbolosRegla, SmboloReduccion),
quieredecirquelaproduccinrepresentadaenelestadoactualsehadedesplazartoda
supartederechacontamaoSmbolosReglaysubstituirlaporelsmbolonoterminalde
laparteizquierdadelaproduccin(SmboloReduccion).Estoconlleva:
Sacardelapilatodalainformacinasociadaconlapartederechadelaregla,
correspondiente al tamao SimbolosRegla. Como al desplazar se almacena
tanto el estado como el smbolo de entrada, se tiene que extraer
2XSimbolosReglaelementos.
Introducirenlapilaelsmbolonoterminaldelaparteizquierdadelaregla
(SimboloReduccion).

C A P T U L O 4. D E S A R R O L L O 67

Alahoradebuscarenelvectordelistas,sinoseencuentraningncampoquecontengael
smboloqueseestleyendoenlacadenadeentrada,entoncesseproduceunerror.
Lacadenaesaceptadacuandosereducehastallegaralsmboloinicial,quecorrespondecon
elvalordelnoterminal0.
Proc[public]gl:GramaticaBNF.AnalizadorLALR(scan)=>
{
varSimboloAdelanto=unbound;
FunLeerSimbolo()=>
{
if(SimboloAdelanto!=unbound){
vartmp=SimboloAdelanto;
SimboloAdelanto=unbound;
returntmp;
}
var|cat,params...|=scan();
TerminalLALR(cat,params)
}
varPila=[LeerSimbolo(),EstadoPila(0)];
for(){
varSimboloActual=Pila.Head;
varEstadoActual=Pila.Tail.Head.Estado;
Search(p<gl.TablaLALR[EstadoActual],p.simbolo==simboloActual.cat)

switch(p){
Desplaza=>{
Pila=EstadoPila(p.Estado)::Pila;
Pila=LeerSimbolo()::Pila;
}
Reduce=>{
varsimboloReduccion=p.FuncionDeReduccion()(Pila);
for(i<1..p.SimbolosRegla*2+1)Pila=Pila.Tail;
Pila=simboloReduccion::Pila;
SimboloAdelanto=SimboloActual;
if(SimboloReduccion.cat==0){
return;
}
}

68 C A P T U L O 4. D E S A R R O L L O

}
}
else{
throw

SyntaxError("no encontrada la
",EstadoActual,"",simboloActual);

transicin

para

}
}
}

4.3

AADIRACCIONESSEMNTICAS

Enestaseccindeldesarrollo,unavezobtenidalaestructuradelanlisissintctico,sehade
poderrealizaraccionessemnticas.Paraello,sehandetenerclarostresconceptos.

Primero,sehadeobtenerlosvaloresdelosatributos.Cadasmbolodelagramtica
S,yaseaterminalonoterminaltieneasociadounconjuntofinitodeatributos.Como
semuestraenesteejemplo,parapoderhacerlasuma,antes,sehadesabercuales
sonlosvaloresdeb,cyd.
A(a)B(b)C(c)D(d){A.a=B.b+C.c+D.d}

Cada produccin puede tener asociada una accin semntica que indica cmo
calcular los valores de los atributos. Esta accin se sita al final de la produccin y
solamenteseaplicacuandolaproduccinsehacumplido.Comosepuedeverenel
casoanterior,laaccinA.a=B.b+C.c+D.dsloseproducecuandolareglahasido
completada.

Primero, hay que extraer los atributos de los smbolos porque, cuando se pasa de BNF a
producciones,sepierdentodoslosparmetrosylossmbolosdeaccin.
Para ello, hay que aadir en las estructuras de los smbolos terminales y no terminales un
campo denominado Parametres. De esta manera, se obtienen estos atributos como se
muestraacontinuacin.
Type[public,Print=Contents]NoTerminal(Exp,Parametres)

C A P T U L O 4. D E S A R R O L L O 69

Type[public,Print=Contents]Terminal(Cat,Parametres)

AlaadirelcampoParametresalaestructuradelossmbolosterminalesynoterminales,se
hamodificadoalgunaspartesdelcdigo,paraqueaceptenlanuevaestructura.
Portanto,lacuestinesquecadanoterminaldelagramticatengaasociadounatributo,y
se aplique la propagacin de estos atributos desde los terminales a los no terminales. Se
logradichapropagacin,reduciendounaregladeproduccincadavezquesequeseejecute
unaaccin.
En el anlisis sintctico slo se almacena en la pila una tupla con el estado y el smbolo.
Mientrasqueahora,parapoderaplicaraccionessemnticas,selehadeaadirunatuplacon
elestado,smboloyatributo.Deestamanera,unatributoesunainformacinasociadaaun
smbolotantoterminalcomonoterminal.Enelsiguienteejemplo,sepuedeverlapilaquese
usa en el anlisis sintctico, y la que se va a emplear para el semntico.

Smbolo
Atributo

Smbolo

Sn

Sn

...

...

Smbolo

Smbolo

Atributo

S0

S0

Figura4.3.1Pilaenanlisissintcticoysemntico

Paraalmacenarlaaccindecadaunadelasproducciones,hayqueaadiruncampomsala
estructuraproduccions,llamadoaccin.
Type Produccions(Parte Izquierda Produc, Parte derecha Produc,
Accion)

70 C A P T U L O 4. D E S A R R O L L O

F UNCINDEREDUCCIN

4.3.1

Parapoderrealizarloexplicadoanteriormente,hayquemodificarlafuncindecreartabla
deanlisis.

Parapoderejecutarunaaccinsemntica,hayqueaadirunafuncinannimaenel
campo SmboloReduccion de la estructura Reduce, que es la que realiza la accin
semntica.
TypeReduce(simbolo,SimbolosRegla,SimboloReduccion)

Lafuncindereduccinconstadetrespartes:
1. Declaracindelosatributosqueseencuentranenlapartederechadela
regla.
2. Realizacindelaaccinsemntica.
3. Construccin del smbolo no terminal de la izquierda de la regla
mediantelosatributosquesehabandeclarado.
Semuestraunpequeoejemplodondeserealizalaaccindev=a*b,paraello,como
sehaexplicado,primerosedeclaranlosatributosdelaparteizquierdadelareglay
se les asigna el valor correspondiente almacenado en la pila. Despus se realiza la
acciny,finalmente,seconstruyeelnoterminalconelvalorobtenidodelaaccin.
Vara=Pila.Head(6).Params[0];

Varb=Pila.Head(2).Params[0];

Varv=(a*b);

NoTerminalLALR(1,Vector(v))

Acontinuacin,semuestraelcdigodelafuncinCrearTablaAccion_Ir,dondesemuestrala
funcindereduccin.
Proc[public]gl:GramaticaBNF.CrearTablaAccion_Ir()=>
{
varMatriz=newvector[gl.Estats.length];
for(i<Matriz:Index)Matriz[i]=[];

C A P T U L O 4. D E S A R R O L L O 71
for(e<gl.Estats)
{
for(ar<e.arestes)
{
Matriz[e.NumEstat]=Desplaza(ar.valor,ar.EstSeg)
::Matriz[e.NumEstat];
}
for(ep<e.Produc,ep.Final)
{
for(sda<ep.SimbolosDeAvance)
{
//Funcindereducci
varp=ep.valor;
varres=newapply(`vector,p[0].params.length);
vardecs=<<{}>>;
for(i<p[0].params:Index){
varparam=p[0].params[i];
res.Arg(i)=param;
}
for(s<p[1],pos<0..;ip<s.params:Index){
vardec=<<var<s.params[ip]>=Pila.Head(<(p[1].Length
pos)*2>).Params[<ip>]>>;
decs=<<<decs>;<dec>>>;
}
var f=Eval(<< AFun(pila)=> { <decs>; <ep.valor[2]>;
NoTerminalLALR(<ep.valor[0].cat>,<res>)}>>);
Matriz[e.NumEstat]=Reduce(sda,ep.valor[1].length,f)::Matriz[
e.NumEstat];
}
}
}
gl.TablaLALR=Matriz;
}

SolamenteseaadealautmataLALR(1)delanlisissintctico,losatributosacadaunode
los smbolos (terminales y no terminales) y las acciones correspondientes al final de cada
produccin.
Seguidamente,semuestraunejemploconunagramticamuysencilla,donde@varv=a+b,
representalaaccinsemnticadelosatributosayb:

72 C A P T U L O 4. D E S A R R O L L O

Rule<ini(v)>::=<inicio(v)>

Rule<inicio(v)>::=<termino(a)>+<termino(b)>@varv=a+b;
Rule<termino(v)>::=numero#(v)

Lanotacinusadapararepresentarelautmataeslasiguiente,
Estado:NumerodelEstado

ProducIzquierdaProducDerecha{Adelanto}@(ACCION)

Aristas

EstadoActualSmboloEstadoSiguiente

Donde accin en vez de ser representada en forma de rbol, se muestra como una simple
operacin,paraqueseamscomprensible.Porejemplo,laaccin
Apply(Var,[],Apply(=,v,Apply(+,a,b)

Serepresentav=a+b

Elautmatageneradoapartirdeestagramticaeselqueseindicaacontinuacin:
ESTADO:0
<ini(v)>><Inicio(v)>{EOF}@(InstrNull)
<Inicio(v)>><termino(a)>+<termino(b)>{EOF}@(v=a+b)
<termino(v)>>Numero#(v){+}@(InstrNull)
ARISTAS
0Numero>5
0<termino>>2
0<Inicio>>1

ESTADO:1
<ini(v)>><Inicio(v)>{EOF}@(InstrNull)

ESTADO:2
<Inicio(v)>><termino(a)>+<termino(b)>{EOF}@(v=a+b)
ARISTAS
2+>3

ESTADO:3

C A P T U L O 4. D E S A R R O L L O 73

<Inicio(v)>><termino(a)>+<termino(b)>{EOF}@(v=a+b)
<termino(v)>>Numero#(v){<EOF>}@(InstrNull)
ARISTAS
3Numero>5
3<termino>>4

ESTADO:4
<Inicio(v)>><termino(a)>+<termino(b)>{EOF}@(v=a+b)

ESTADO:5
<termino(v)>>Numero#(v){+,EOF}@(InstrNull)

Figura4.3.2AutmataLALR(1)conatributos

SepuedeverenlaFigura4.3.2,quelaaccinseaadeentodoslosestadosdondeaparecela
produccin
Rule<inicio(v)>::=<termino(a)>+<termino(b)>

Peroesta,sloseaplicacuandolaproduccinhafinalizado,esdecir,enelestado4.Ahora,
sevecmoactaelanalizadorLALR(1),cuandorecibecomoentrada10+5.
ElresultadodeCoselsemuestradeestaforma:
Pila>[TerminalLALR(Numero,Vector(10)),EstadoPila(0)]
Accion>Desplaza(Numero,5)

Parapoderverlospasosdeunaformamsclarasesimplificadelasiguienteforma,
Pila>[Numero(10),S0]
Accion>Desplaza(Numero,S5)

Ahora,semuestraelresultadodelaejecucindeformamsvisual:
Pila>[Numero(10),S0]
Accion>Desplaza(Numero,S5)

74 C A P T U L O 4. D E S A R R O L L O

Pila>[+(),S5,Numero(10),S0]
Accion>Reduce(+,1,FuncionAnonima)

Pila>[termino(10),S0]
Accion>Desplaza(termino,S2)

Pila>[+(),S2,Termino(10),S0]
Accion>Desplaza(+,S3)

Pila>[Numero(5),S3,+(),S2,Termino(10),S0]
Accion>Desplaza(Numero,S5)

Pila>[EOF(),S5,Numero(5),S3,+(),S2,Termino(10),S0]
Accion>Reduce(EOF,1,FuncionAnonima)

Pila>[Termino(5),S3,+(),S2,Termino(10),S0]
Accion>Desplaza(Termino,S4)

Pila>[EOF(),S4,Termino(5),S3,+(),S2,Termino(10),S0]
Accion>Reduce(EOF,3,FuncionAnonima)

Pila>[Inicio(15),S0]
Accion>Desplaza(Inicio,1)

Pila>[EOF(),S1,Inicio(15),S0]
Accion>Reduce(EOF,1,FuncionAnonima)

Aceptado[ini(15),S0]

Figura4.33AnlisisLALR(1)conatributos

C A P T U L O 4. D E S A R R O L L O 75

4.3.2

A TRIBUTOS H EREDADOS

En este proyecto slo se aplican atributos sintetizados. El nodo padre, puede obtener el
valor de un atributo cuando se efecta la reduccin. Por ejemplo, para que A obtenga el
valor de la suma, se ha de reducir la produccin y, en este momento, se aplica la accin
semnticaA.val=B.val+C.val.

ABC{A.val=B.val+C.val}

B.val

C.val

Reduccin
A A.val

A.val=B.val+C.val

En el caso de atributos heredados, calculados a partir del nodo padre o de los nodos
hermanos,elvalordeestosatributos noseencuentraenlapilahastaque nosereducela
produccin.
Enelejemplosiguiente,
ABC{C.val=A.val+B.val}

76 C A P T U L O 4. D E S A R R O L L O

NosepuedeobtenerelvalordeChastaquenosereduzcalaproduccin,ABC,perola
produccinnosepuedereducirporquefaltaelvalordeA.
YACCresuelveelproblema,mediantedesplazamientosnegativosenlapila.Puedenaparecer
varioscasos:

Acceso, como atributo heredado, al atributo (sintetizado) de un hermano por la


izquierda.
Unsmbolopuedeutilizarelatributosintetizadodeunhermanosuyoporqueyase
encuentraenlapila.[2]
Enelsiguienteejemplo:
AXY{Y.val=X.val}

DondeA.valyX.valsonatributossintetizadosyY.valesheredado.Sepuedeacceder
alvalordeX.valporquetodavaseencuentraenlapila.

Cima

Y.val

X.val

Y.val=X.val

Acceso,alatributoheredadodelnodopadre.SisesuponeAXY.
Los atributos heredados de A no pueden estar almacenados en A, ya que no se
reservaespacioparaAhastaquenosereduce,quitandoXeYdelapila.
Lasolucinesquelosatributosheredadosnosealmacenanconelsmbolosinocon
otrosmboloanteriorintroducido.Porejemplo,
AXY{X.val=A.val}

Inicio

Y.val

X.val

@1 A.h

$1
$0
$1

Reduccin
Inicio

A.val

@1 A.h

$0
$1

C A P T U L O 4. D E S A R R O L L O 77

De esta forma, los atributos X e Y pueden heredar los atributos de A accediendo a


desplazamientosnegativos,respectoaInicio.

Captulo5
CONCLUSIONES
Gracias a este proyecto se ha aprendido a crear un generador de compilador basado en
analizadoresascendentes.Todoesteprocesohaservidoparaconoceryentendercadauna
delasfasesdeuncompilador,enespecialalanlisissintcticoLALR(1).
Hayquedestacar,todoslosconocimientosadquiridosconlautilizacindeCosel.Tambin
estaexperienciahaservidoparaponerapruebalosconocimientosadquiridosdurantetoda
lacarrera.
Finalmentelosobjetivoslogradoshansido:
S I N T C T I C O : Se ha conseguido ampliar el modulo Com para examinar un analizador
ascendenteLALR(1).ParaellosehatenidoquecrearunaautmataLALR(1),crearunatabla
deanlisis,quecontienetodaslasaccionesquepuedegenerarlagramticay,finalmente,el
analizadorLALR(1),quecompruebasisepuedecrearelanalizadorapartirdelagramtica
ascendenteLALR(1)ysiunacadenadeentradaesaceptadaporelanalizador.
S E M N T I C O : Se ha logrado aadir a la gramtica de entrada, atributos y acciones a las
producciones.Portanto,elanalizadorascendenteescapazdedeclararestosatributos,para
poder aplicar estas acciones. Pero slo es capaz de aadir atributos sintetizados, no
heredados.
Como lneas futuras se puede considerar la posibilidad de aadir a la gramtica atributos
heredados,parapodertratarlosyfinalizarlageneracindelcompiladorascendente.

Captulo6
ANEXO
6.1 E XPRESIONES R EGULARES

Unaexpresinregularesunafrmulaquedescribeunposibleconjuntoinfinitodecadenas,
que se ajustan a un determinado patrn. Donde , representa una expresin regular que
representalasecuenciavaca.
Laexpresinregularmsbsicaesunpatrnqueseleccionasolouncarcter.Porejemplo,
elpatrna,queseleccionaelcarctera.[9]
Existentrespatronesbsicos:

C O N C AT E NAC I N
Seproduceunaconcatenacinentredoscaracteresayb.abdondeaAybB.

UNIN
Esteoperando|separaalternativas.Porejemplo,ab|cdseleccionaabobc.

R E P E T I C I N

b?:indicauncarcterbopcional
b*:indicaunaposiblesecuenciavacadecaracteresb.Porejemplo,{,b,bb,bbb,..
.}
b+:indicaunaposiblesecuenciadacaracteresb.Porejemplo,{b,bb,bbb,...}

82 C A P T U L O 6. A N E X O

6.2 C LCULODE A NULABLES

Paratodagramticaesposibledefiniranulablescomoelconjuntodesmbolosnoterminales,
A,quepuedederivar,enunoomspasos,enlapalabravaca().
Se aplica el siguiente algoritmo para encontrar el conjunto de smbolos anulables de la
gramtica.
AnulablesS ={ANoTerminal|A}
Repetir

AnulablesS

=AnulablesS U{ANoTerminal|A , , ,
i1..m AnulablesS }

HastaqueAnulablesS ==AnulablesS

Se muestra un pequeo ejemplo, para una mejor comprensin, donde los smbolos en
maysculassonnoterminalesylosqueestnenminsculasonterminales.[9]
Apartirdelasiguientegramtica:
IDIA

Bg

DCA

Af

Ih

CAB

SepuedeverqueenelprimerpasolossmbolosAyBderivanen.
Enelsegundopaso,secompruebaqueCderivaenAB,portantoCderivatambinen.
ComoelsmboloDcontieneCyAqueyasonanulables,Dtambinloes.Enelsiguientepaso,
secompruebaquenohayningnsmboloquederivenideA,B,CniD.Portantoelconjunto
semantieneigualqueelanterior,yyasehafinalizado.[7]
Anulables ={A,B}
Anulables ={A,B,C}
Anulables ={A,B,C,D}
Anulables ={A,B,C,D}

C A P T U L O 6. A N E X O 83

6.3 C LCULODEPRIMEROS

Siesunacadenadesmbolosgramaticales,seconsideraPRIMEROS()comoelconjunto
determinalesqueinicianlascadenasderivadasde.
Para calcular PRIMEROS () basta con seguir las siguientes reglas para cada regla de
produccindelagramtica:

1.
2.

PRIMEROS()={}

3.

PRIMEROS(A),dondeAesunnoterminal.Hayqueseguirelsiguientealgoritmo:

PRIMEROS(a)={a},dondeaperteneceaunsmboloterminalyesunasubcadena
desmbolos,tantoterminalescomonoterminales.

SiAAnulableentoncesP (A)={}
SiNoP (A)={}

RepetirParacadaProduccintalque:AdeG

(A)=P (A)UPRIMEROS()

HastaqueAnoterminal:P (A)==P

(A)

Se mostrar un ejemplo para ver el clculo detallado de los PRIMEROS, para la siguiente
gramticaquedescribeoperacionesaritmticas:
ITB

Fx

TFC

C*FC|/FC|

B+TB|TB|

Como los smbolos B y C son anulables en el primer paso se aade (B)= (C)= {},
mientrasqueelrestoesconjuntovacio.Elrestodepasossedemuestraenlasiguientetabla.
[7]

84 C A P T U L O 6. A N E X O

Pasos
0
1
2
3
4

P(I)

{x}
{x}

P(T)

{x}
{x}
{x}

P(B)
{}
{,+,}
{,+,}
{,+,}
{,+,}

P(F)

{x}
{x}
{x}
{x}

P(C)
{}
{,*,/}
{,*,/}
{,*,/}
{,*,/}

PortantolosPRIMEROSson:
PRIMEROS(I)={x}

PRIMEROS(F)={x}

PRIMEROS(T)={x}

PRIMEROS(C)={,*,/}

PRIMEROS(B)={,+,}

6.4 E JEMPLOSDEL A NALIZADORASCENDENTE LALR (1)

1. AnlisisLALR(1)apartirdelagramticaquesemuestraenlaFigura3.2.10concadena
deentradaaxb.
Pila>[ai(),S0]
Accion>Desplaza(ai,S8)

Pila>[xi(),S8,ai(),S0]
Accion>Desplaza(xi,S11)

Pila>[bi(),S11,xi(),S8,ai(),S0]
Accion>Reduce(bi,1,FuncionAnonima)

Pila>[bo(),S8,ai(),S0]
Accion>Desplaza(bo,S7)

Pila>[bi(),S7,bo(),S8,ai(),S0]
Accion>Reduce(bi,1,FuncionAnonima)

Pila>[ao1(),S8,ai(),S0]
Accion>Desplaza(ao1,S6)

Pila>[bi(),S6,ao1(),S8,ai(),S0]

C A P T U L O 6. A N E X O 85

Accion>Reduce(bi,1,FuncionAnonima)

Pila>[ao(),S8,ai(),S0]
Accion>Desplaza(ao,S9)

Pila>[bi(),S9,ao(),S8,ai(),S0)]
Accion>Desplaza(bi,S10)

Pila>[EOF(),S10,bi(),S9,ao(),S8,ai(),S0]
Accion>Reduce(EOF,3,FuncionAnonima)

Pila>[ao1(),S0]
Accion>Desplaza(ao1,S6)

Pila>[EOF(),S6,ao1(),S0]
Accion>Reduce(EOF,1,FuncionAnonima)

Pila>[ao(),S0]
Accion>Desplaza(ao,S5)

Pila>[EOF(),S5,ao(),S0)]
Accion>Reduce(EOF,1,FuncionAnonima)

Pila>[Si1(),S0]
Accion>Desplaza(Si1,S2)

Pila>[EOF(),S2,Si1(),S0]
Accion>Reduce(EOF,1,FuncionAnonima)

Pila>[Si(),S0]
Accion>Desplaza(Si,S1)

Pila>[EOF(),S1,Si(),S0]
Accion>Reduce(EOF,1,FuncionAnonima)

Aceptado[ini(),S0]

86 C A P T U L O 6. A N E X O

2. AnlisisLALR(1)apartirdelagramticaquesemuestraenlaFigura3.2.10concadena
deentradaax.Enestecaso,lacadenadeentradaesrechazadaporelanalizadorLALR
(1),debidoaquenoesaceptadaporlagramticaascendente.

Pila>[ai(),S0]
Accion>Desplaza(ai,S8)

Pila>[xi(),S8,ai(),S0]
Accion>Desplaza(xi,S11)

Pila>[EOF(),S11,xi(),S8,ai(),S0]
Errorinline27Fromeja.csl
LoadedFrominit.csl
LoadedFromInicializationinit
aixi
^<SyntaxError:0342625C>
EXCEPTION<SyntaxError:0342625C>:noencontradalatransicinpara
11TerminalLALR(<SCHAR:EOF>,Vector())

3. A partir de la gramtica que se muestra a continuacin, se representa el anlisis de la


cadena10+5+3.

ini(v)E(v)

E(v)T(v)

E(v)E(a)>+T(b)@varv=a+b;
T(v)numero#(v)

Pila>[Numero(10),S0]
Accion>Desplaza(Numero,S4)

Pila>[+(),S4,Numero(10),S0]
Accion>Reduce(+,1,FuncionAnonima)

Pila>[T(10),S0]
Accion>Desplaza(T,S5)

C A P T U L O 6. A N E X O 87

Pila>[+(),S5,T(10),S0]
Accion>Reduce(+,1,FuncionAnonima)

Pila>[E(10)),S0]
Accion>Desplaza(E,S1)

Pila>[+(),S1,E(10),S0]
Accion>Desplaza(+,S2)

Pila>[Numero(5),S2,+(),S1,E(10),S0]
Accion>Desplaza(Numero,S4)

Pila>[+(),S4,Numero(5),S2,+(),S1,E(10),S0)]
Accion>Reduce(+,1,FuncionAnonima)

Pila>[T(5),S2,+()),S1),E(10),S0]
Accion>Desplaza(T,S3)

Pila>[+(),S3,T(5),S2,+(),S1,E(10),S0]
Accion>Reduce(+,3,FuncionAnonima)

Pila>[E(15),S0]
Accion>Desplaza(E,S1)

Pila>[+(),S1,E,(15),S0]
Accion>Desplaza(+,S2)

Pila>[Numero(3),S2,+(),S1,E(15),S0]
Accion>Desplaza(Numero,S4)

Pila>[EOF(),S4,Numero(3),S2,+(),S1,E(15),S0)]
Accion>Reduce(EOF,1,FuncionAnonima)

Pila>[T(3),S2,+(),S1,E(15),S0]
Accion>Desplaza(T,S3)

88 C A P T U L O 6. A N E X O

Pila>[EOF(),S3),T(3),S2,+(),S1),E(15),S0)]
Accion>Reduce(EOF,3,FuncionAnonima)

Pila>[E(18),S0]
Accion>Desplaza(E,S1)

Pila>[EOF(),S1),E(18),S0]
Accion>Reduce(EOF,1,FuncionAnonima)

Aceptado[ini(18),S0]

BIBLIOGRAFA
[1] http://www.monografias.com/trabajos11/compil/compil.shtml#cla

[2] Jos Antonio Jimenez Milln, Compiladores y Procesadores de Lenguaje.


Publicaciones Universidad de Cdiz: Textos bsicos Universitarios: 2004.

[3] KennethC.Louden,ConstruccindeCompiladores.PrincipiosyPrcticas:Thomsom
Paraninfo,S.A.

[4] Aho,A.V.,Sethi,R.Ullman,J.D.,CompiladoresPrincipios,tcnicasyherramientas:
AddisonWesleyIberoamericana,S.A.:1990.

[5] http://www.cvc.uab.es/shared/teach/a20364/teoria/tema2.pdf

[6] SergioGlvezRojas,MiguelngelMoraMata,JAVAatope:Traductoresy
CompiladoresconLEX/YACC,JFLEX/CUPyJAVACC.UniversidaddeMlaga:2005.

[7] http://www.cvc.uab.es/shared/teach/a20364/teoria/tema3.pdf

[8] G.SnchezDueas,J.A.ValverdeAndreu,Compiladoreseintrpretes.Unenfoque
pragmtico.Madrid:ED.DiazSantos:1984.

[9] DickGrune,HenriE.Bal,CerielJ.H.JacobsyKoenG.Langendoen,Diseode
compiladoresmodernos.Espaa:McGrawHill:2007.

[10]ManuelAlfonsecaMoreno,MarinadelaCruzEcheanda,AlfonsoOrtegadela
Puente,EstrellaPulidoCaabate,Compiladoreseintrpretes:teorayprctica.
UniversidadAutnomadeMadrid:PearsonPrenticeHall:2006

NDICE
A
accionessemnticas,46

gramticaslibresdecontexto,16

anlisisascendente,19
anlisisdescendente,19
analizadorlxico,14
analizadorsemntico,46
analizadorsintctico,16,31
rbolsintctico,16,18,46
aristas,57
atributos,46
atributosheredados,49
atributossintetizados,48

B
Bison,4

LALR(1),26,62
lenguajedealtonivel,2
lenguajeensamblador,2
lenguajemquina,2
LEX/FLEX,5

Ll
LL(k),25

L
LR(0),26,27
LR(1),26,36
LR(k),25

C
clausura,37,55

compilador,3,13,14

parser,16

ConflictoDesplazarReduccin,30

pila,32

ConflictoReduccinReduccin,30

PRIMEROS,37
producciones,17

D
derivacin,17,20
derivacinporlaizquierda,20
desplazar,24

punto,23

R
reduccin,20,39
reducir,24

E
expresionesregulares,15

G
generacindecdigo,46,50
gramticasdeatributos,46

reglas,17

S
scanner,2,14,51
smbolodeadelanto,26
smboloinicial,17


smbolosdeadelanto,35,37

tabladesmbolos,14

smbolosgramaticales,17

token,15

smbolosnoterminales,17

traduccin,13

smbolosterminales,16,23

transicin,29

SLR(1),26

transiciones,57

T
tabladeanlisis,31,64

Y
YACC,3

Firmado:LaiaFelipMolina
Bellaterra,18deSeptiembrede2009


RESUMEN

El objetivo fundamental de este proyecto consiste en crear un generador de compilador,


basado en analizadores ascendentes. Como base para hacer este analizador se usar el
lenguaje Cosel y el mdulo Com, que es un generador de compiladores basado en
analizadores descendentes y que actualmente se est utilizando en las prcticas de la
asignaturadeCompiladoresI.Elnuevogenerador,quetienecomoentradaunagramtica,ha
decomprobarsiesunagramticaascendenteLALR(1)yanalizarunacadenadeentradade
smbolosusandodichagramtica.
RESUM

Lobjectiu fonamental daquest projecte consisteix en crear un generador de compilador,


basat en analitzadors ascendents. Com a base per fer aquest analitzador sutilitzar el
llenguatgeCoselielmdulCom,quesungeneradordecompiladorsbasatenanalitzadors
descendents i que, actualment, sest utilitzant en les practiques de lassignatura de
CompiladorsI.Elnougenerador,quetcomentradaunagramtica,hadecomprovarsis
una gramtica ascendent LALR (1) i analitzar una cadena dentrada de smbols utilitzant
aquestagramtica.
ABSTRACT

The main objective of this project consists of creating a compiler generator based on
ascendinganalyzers.Tomakethisparser,wewillusetheCosellanguageandCommodule.
Thismoduleisacompilergeneratorbasedondescendinganalyzersandisbeingusedinthe
practiceofCompilersI.Thenewgenerator,whichtakesasinputagrammar,ithastocheckif
itisaLALR(1)ascendinggrammarandanalyzeaninputstringofsymbolsusingthegrammar.

S-ar putea să vă placă și