Está en la página 1de 455

Gua prctica de ANTLR 2.7.

2
Versin 1.0 (Septiembre 200!
Alumno Tutor de proyecto
Enrique Jos Garca Cota
(+34) 666901806
enriqueinformatico@a!oo"es
Jos #ntonio $roano Jimne%
(+34) 9&4&&'(((
troano@)si"us"es
E"$"*" +e ,n-eniera ,nform.tica +e )a /ni0ersi+a+ +e *e0i))a"
1e2artamento +e 3en-ua4es *istemas ,nform.ticos"
Gua prctica de ANTLR 2.7.2 Agradecimientos
Agradecimientos
#-ra+e%co a mi tutor5 Jose #ntonio $roano5 que me !aa +a+o tota) )i6erta+ 2ara e)e-ir e)
formato +e) 2roecto"
#s mismo quiero a-ra+ecer a) equi2o +e +esarro))o +e #7$385 es2ecia)mente a $erence 9arr5
e) tiem2o esfuer%o que !an +e+ica+o a +esarro))ar esta !erramienta mantener satisfec!a a una
e:tensa comuni+a+ +e usuarios5 comuni+a+ a )a que tam6in esto a-ra+eci+o"
Esto mu a-ra+eci+o a )os +esarro))a+ores +e )a suite +e ofim.tica ;2en;ffice"or-5 sin cuo
2rocesa+or +e te:tos (Writer) me !a6ra mu 2enoso re+actar este +ocumento" Este
a-ra+ecimiento se e:tien+e a to+as )as asociaciones +esarro))a+ores que contri6uen con e)
mo0imiento +e) soft<are )i6re5 e) c=+i-o a6ierto )os est.n+ares accesi6)es 2or to+os5 en
es2ecia) a 8ic!ar+ *ta))man )a >*>"
9or ?)timo +eseo mostrar mi -ratitu+ a mi fami)ia ami-os5 que me !an a2oa+o en to+o
momento5 a 9etra5 que !a teni+o muc!sima 2aciencia"
ndice de contenido
ndice de contenido
Captulo 1:
Prembulos.............................................................................................1
Seccin 1.1: Introduccin..........................................................................................................2
1.1.1: Objetivos LeLi y antlraux.......................................................................................................... 2
1.1.2: Requisitos.................................................................................................................................... 2
1.1.3: n!oque....................................................................................................................................... 2
1.1.": structura.................................................................................................................................... 3
1.1.#: $otaci%n...................................................................................................................................... "
Seccin 1.2: Breve repaso a la teora de compiladores......................................................... 6
1.2.1: &once'tos b(sicos: so!t)are y *ard)are.................................................................................... +
1.2.2: ,n 'oco de *istoria...................................................................................................................... -
1.2.3: nsambladores y com'iladores................................................................................................... .
1.2.": /nt0r'retes y m(quinas virtuales................................................................................................. 1
1.2.#: l 'roceso de com'ilaci%n.......................................................................................................... 1
1.2.+: 2&om'iladores de com'iladores3............................................................................................... 12
Seccin 1.3: Algoritmos de anlisis....................................................................................... 1
1.3.1: La sintaxis 4$5....................................................................................................................... 1#
1.3.2: 26e arriba a abajo37 Anali8adores recursivos descendentes..................................................... 11
1.3.3: 26e abajo a arriba37 anali8adores LR......................................................................................... 23
1.3.": &om'araci%n entre LR9:; y LL9:;.............................................................................................. 2#
Seccin 1.!: "onclusin.......................................................................................................... 2#
Captulo 2:
Presentacin de ANTLR......................................................................29
Seccin 2.1: Introduccin........................................................................................................31
2.1.1: <=u0 es y c%mo !unciona A$>LR?........................................................................................... 31
2.1.2: @ro'%sito y estructura de 0ste ca'Atulo..................................................................................... 31
Seccin 2.2: $os anali%adores en A&'$(.............................................................................. 33
2.2.1: s'eci!icaci%n de gram(ticas con A$>LR................................................................................ 33
2.2.2: La 8ona de c%digo nativo.......................................................................................................... 3"
Seccin 2.3: $os )lu*os de in)ormacin..................................................................................3
2.3.1: 5lujo de caracteres.................................................................................................................... 3#
2.3.2: 5lujo de >o:ens......................................................................................................................... 3#
2.3.3: Los AB>s................................................................................................................................... 3.
Seccin 2.!: (eglas +B&, e-tendidas................................................................................... !!
2.".1: /ntroducci%n............................................................................................................................... ""
2.".2: 6eclarando variables locales en una regla................................................................................ ""
2.".3: ,tili8ando las etiquetas.............................................................................................................. "+
2.".": @asando 'ar(metros a una regla.............................................................................................. "+
2.".#: 6evolviendo valores en una regla............................................................................................. "-
2.".+: ,tili8ando rangos de caracteres en el anali8ador l0xico........................................................... ".
2.".-: ,tili8ando 'atrones (rbol en el anali8ador sem(ntico............................................................... ".
Seccin 2.: "onstruccin de los AS's..................................................................................
2.#.1: &om'ortamiento 'or de!ecto..................................................................................................... #C
2.#.2: l su!ijo de enrai8amiento 9D;.................................................................................................... #1
2.#.3: Bu!ijo de !iltrado 9E;.................................................................................................................... #2
2.#.": 6esactivando la construcci%n 'or de!ecto................................................................................. #3
2.#.#: &onstruyendo el AB> en una acci%n......................................................................................... #3
2.#.+: &asos en los que la construcci%n 'or de!ecto no basta............................................................ ##
Seccin 2.6: Anali%adores de la /icrocalculadora............................................................... 6
2.+.1: l !ic*ero Ficro&alc.g y el 'aquete microcalc.......................................................................... #+
2.+.2: l anali8ador l0xico................................................................................................................... #+
2.+.3: l anali8ador sint(ctico.............................................................................................................. #-
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota &
ndice de contenido
2.+.": $ivel sem(ntico......................................................................................................................... #.
2.+.#: l !ic*ero Ficro&alc.g............................................................................................................... #1
2.+.+: Generando los anali8adores de Ficro&alc................................................................................ +1
Seccin 2.0: +*ecutando /icrocalc........................................................................................ 62
2.-.1: La clase &alc............................................................................................................................. +2
2.-.2: &lase &alc re!inada................................................................................................................... +3
2.-.3: ,tili8ando microcalc.................................................................................................................. +#
Seccin 2.#: "onclusin.......................................................................................................... 60
Captulo 3:
LeLi: un Lenguaje Limitado................................................................68
Seccin 3.1: Introduccin........................................................................................................61
Seccin 3.2: &ivel l2-ico.......................................................................................................... 0.
3.2.1: 4lancos...................................................................................................................................... -C
3.2.2: &omentarios.............................................................................................................................. -C
3.2.3: Literales..................................................................................................................................... -C
3.2.": /denti!icadores........................................................................................................................... -C
3.2.#: @alabras reservadas.................................................................................................................. -1
Seccin 3.3: &iveles sintctico 3 semntico......................................................................... 02
3.3.1: &aracterAsticas b(sicas de LeLi................................................................................................. -2
3.3.2: &lases es'eciales del lenguaje................................................................................................. -2
3.3.3: 6eclaraci%n de una clase.......................................................................................................... -3
3.3.": F0todos de una clase................................................................................................................ -3
3.3.#: &onstructores............................................................................................................................ -"
3.3.+: F0todos abstractos................................................................................................................... -+
3.3.-: HariablesI atributos y 'ar(metros.............................................................................................. -+
3.3..: x'resiones............................................................................................................................... -1
Seccin 3.!: Instrucciones de $e$i........................................................................................ #6
3.".1: Be'araci%n de instrucciones...................................................................................................... .+
3.".2: Asignaciones............................................................................................................................. .+
3.".3: 4ucles : mientrasI *acerJmientrasI desde................................................................................. .+
3.".": &ondicionales: si....................................................................................................................... .-
3.".#: /nstrucci%n volver...................................................................................................................... .-
Seccin 3.: 4tros aspectos de $e$i..................................................................................... ##
3.#.1: Kerencia de clases.................................................................................................................... ..
3.#.2: Gesti%n de la memoria.............................................................................................................. .1
Seccin 3.6: "onclusin.......................................................................................................... 1.
Captulo 4:
Anlisis lxico de LeLi........................................................................91
Seccin !.1: Introduccin........................................................................................................12
Seccin !.2: +structura general del anali%ador ................................................................... 13
".2.1: &uer'o del !ic*ero..................................................................................................................... 13
".2.2: Keader: l 'aquete leli.............................................................................................................. 13
".2.3: O'ciones del anali8ador............................................................................................................ 13
".2.": Lona de to:ens.......................................................................................................................... 1"
Seccin !.3: 5ona de reglas.................................................................................................... 16
".3.1: MArg*E......................................................................................................................................... 1+
".3.2: 4lancos...................................................................................................................................... 1-
".3.3: /denti!icadores........................................................................................................................... 11
".3.": BAmbolos y o'eradores............................................................................................................ 1C1
".3.#: nteros y reales....................................................................................................................... 1C2
".3.+: &omentarios............................................................................................................................ 1C2
".3.-: Literales cadena...................................................................................................................... 1C+
Seccin !.!: "ompilando el anali%ador................................................................................ 1.0
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota &&
ndice de contenido
Seccin !.: +*ecucin: presentacin de la clase 'ool..................................................... 1.#
".#.1: /ntroducci%n............................................................................................................................. 1C.
".#.2: &lase >ool im'rimiendo el !lujo 2to:ens3................................................................................. 1C.
".#.3: jem'lo................................................................................................................................... 1C1
Seccin !.6: A6adiendo el nom7re de )ic8ero a los to9ens.............................................. 11.
".+.1: La incongruencia de antlr.&ommon>o:en............................................................................... 11C
".+.2: >o:ens *omog0neos y *eterog0neos...................................................................................... 11C
".+.3: Fodi!icaciones en la clase >ool.............................................................................................. 112
".+.": Begundo 'roblema.................................................................................................................. 113
Seccin !.0: +l )ic8ero $e$i$e-er.g......................................................................................116
Seccin !.#: "onclusin........................................................................................................ 12.
Captulo 5:
Anlisis sintctico de LeLi................................................................121
Seccin .1: Introduccin......................................................................................................122
Seccin .2: :e)inicin del anali%ador sintctico............................................................... 123
#.2.1: O'ciones del anali8ador.......................................................................................................... 123
#.2.2: /m'ortando los to:ens............................................................................................................. 123
#.2.3: Lona de to:ens........................................................................................................................ 12"
Seccin .3: 5ona de reglas.................................................................................................. 126
#.3.1: @rograma................................................................................................................................. 12+
#.3.2: 6e!inici%n de clases................................................................................................................. 12+
#.3.3: A8Ncar sint(ctica..................................................................................................................... 12-
#.3.": 6e!inici%n de atributos............................................................................................................. 131
#.3.#: 6e!inici%n de m0todos............................................................................................................. 131
#.3.+: x'resiones............................................................................................................................. 133
#.3.-: /nstrucciones............................................................................................................................ 13-
Seccin .!: ,ic8ero $e$i;arser.g....................................................................................... 1!2
Seccin .: "ompilacin del anali%ador............................................................................. 1!1
Seccin .6: +*ecucin: modi)icaciones en la clase 'ool.................................................. 1.
#.+.1: /ntroducci%n............................................................................................................................. 1#C
#.+.2: /nter'retando la lAnea de comandos: el 'aquete antlraux.cl'arse........................................... 1#C
#.+.3: La lAnea de comandos inicial: el m0todo leli.>ool.LeeL&9;...................................................... 1#3
#.+.": l m0todo leli.>ool.im'rimeAyuda9;........................................................................................ 1#"
#.+.#: l nuevo m0todo main............................................................................................................ 1#"
#.+.+: l m0todo leli.>ool.trabaja9;.................................................................................................... 1##
Seccin .0: 4tros aspectos de los AS's............................................................................161
#.-.1: 5(bricas de AB>s.................................................................................................................... 1+1
#.-.2: AB>s *eterog0neos................................................................................................................. 1+1
Seccin .#: "onclusin........................................................................................................ 16!
Captulo 6:
Recuperacin de errores...................................................................165
Seccin 6.1: Introduccin......................................................................................................160
+.1.1: Bituaci%n.................................................................................................................................. 1+-
+.1.2: La controversia........................................................................................................................ 1+-
+.1.3: 5ases....................................................................................................................................... 1+.
+.1.": Gesti%n de errores en bison y !lex........................................................................................... 1+.
+.1.#: rrores en anali8adores recursivos descendentes.................................................................. 1+1
+.1.+: rrores como exce'ciones...................................................................................................... 1+1
+.1.-: Fanejadores de exce'ciones.................................................................................................. 1-C
Seccin 6.2: +strategias de recuperacin........................................................................... 102
+.2.1: /ntroducci%n............................................................................................................................. 1-2
+.2.2: strategia basada en B/G,/$>.......................................................................................... 1-3
+.2.3: &onjuntos @R/FRO y B/G,/$>....................................................................................... 1-"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota &&&
ndice de contenido
+.2.": strategia basada en @R/FRO O B/G,/$>..................................................................... 1-"
+.2.#: A'rovec*ando el modo '(nico................................................................................................ 1-#
+.2.+: >o:ens de sincronismo ........................................................................................................... 1-+
+.2.-: /m'lementaci%n en A$>LR..................................................................................................... 1-.
+.2..: >ram'as 'ara exce'ciones..................................................................................................... 1.1
+.2.1: Retardo en el tratamiento de errores....................................................................................... 1."
Seccin 6.3: Implementacin < =erencia de gramticas.................................................... 1#1
+.3.1: l 'roblema............................................................................................................................. 1.1
+.3.2: @resentando la *erencia de gram(ticas en A$>LR................................................................ 1.1
+.3.3: Kerencia A$>LR EP Kerencia java.......................................................................................... 11C
+.3.": LAnea de comandos................................................................................................................. 113
+.3.#: <&%mo se relaciona todo esto con la R?.............................................................................. 113
+.3.+: /m'ortaci%n de vocabulario..................................................................................................... 113
Seccin 6.!: "ontrol de mensa*es: $a clase $ogger.......................................................... 11
+.".1: l 'roblema............................................................................................................................. 11#
+.".2: La clase Logger del 'aquete antlraux...................................................................................... 11+
Seccin 6.: /e*orando los mensa*es de error...................................................................111
+.#.1: /ntroducci%n............................................................................................................................. 111
+.#.2: &ambiando el idioma de los mensajes de error...................................................................... 111
+.#.3: Alias de los to:ens................................................................................................................... 2C1
Seccin 6.6: Aplicacin en el compilador de $e$i.............................................................. 2.
+.+.1: Acotaci%n del 'roblema: el !ic*ero de errores......................................................................... 2C#
+.+.2: A'licando los sAmbolos de sincronismo................................................................................... 2C+
+.+.3: &olocando las tram'as 'ara exce'ciones............................................................................... 2C1
+.+.": Retardando el tratamiento de errores...................................................................................... 212
+.+.#: rrores !recuentes acentuaci%n............................................................................................ 21"
+.+.+: l resultado.............................................................................................................................. 211
Seccin 6.0: "digo............................................................................................................... 221
+.-.1: 5ic*ero LeLiLexer.g................................................................................................................. 221
+.-.2: 5ic*ero LeLi@arser.g............................................................................................................... 22#
+.-.3: 5ic*ero LeLirrorRecovery@arser.g........................................................................................ 232
Seccin 6.#: "ompilando 3 e*ecutando el anali%ador.........................................................2!.
+...1: &om'ilaci%n............................................................................................................................. 2"C
+...2: jecuci%n................................................................................................................................. 2"C
Seccin 6.1: "onclusin........................................................................................................ 2!3
Captulo 7:
Anlisis semntico de LeLi...............................................................244
Seccin 0.1: Introduccin......................................................................................................2!0
-.1.1: rrores sem(nticos est(ticos................................................................................................... 2"-
-.1.2: rrores sem(nticos din(micos................................................................................................. 2#C
-.1.3: AQadiendo in!ormaci%n l0xica a los AB>s............................................................................... 2#C
Seccin 0.2: Iterador simple de r7oles...............................................................................23
-.2.1: strategia de im'lementaci%n del an(lisis sem(ntico............................................................. 2#3
-.2.2: structura del !ic*ero de gram(tica......................................................................................... 2#"
-.2.3: Regla raA8: @rograma.............................................................................................................. 2#"
-.2.": 6e!inici%n de clases................................................................................................................. 2#"
-.2.#: 6e!inici%n de atributos............................................................................................................. 2##
-.2.+: x'resiones............................................................................................................................. 2#+
-.2.-: /nstrucciones............................................................................................................................ 2#-
-.2..: &%digo com'leto del iterador................................................................................................... 2#.
-.2.1: Los errores de construcci%n del AB>....................................................................................... 2+2
Seccin 0.3: +l sistema >m7ito?:eclaracin?'ipo.............................................................. 263
-.3.1: /ntroducci%n............................................................................................................................. 2+3
-.3.2: @resentaci%n de el sistema RmbitoS6eclaraci%nS>i'o 9A6>;................................................... 2+3
-.3.3: /m'lementaci%n del sistema A6>: el 'aquete antlraux.context.............................................. 2++
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota &'
ndice de contenido
-.3.": La clase antlraux.context.Bco'e.............................................................................................. 2+.
-.3.#: La clase antlraux.context.6eclaration..................................................................................... 2-2
-.3.+: l sistema de ti'os 9antlraux.context.ty'es.T;......................................................................... 2-3
-.3.-: AB>s es'eciali8ados............................................................................................................... 2-1
-.3..: Resumen................................................................................................................................. 2.3
Seccin 0.!: A:' 3 $e$i.........................................................................................................2#!
-.".1: /ntroducci%n............................................................................................................................. 2."
-.".2: Las declaraciones en LeLi....................................................................................................... 2."
-.".3: Los (mbitos en LeLi................................................................................................................ 2."
-.".": l sistema de ti'os de LeLi...................................................................................................... 2.+
Seccin 0.: "ompro7acin de tipos < ;rimera pasada..................................................... 212
-.#.1: &om'robaci%n de ti'os en dos 'asadas.................................................................................. 212
-.#.2: 6e!inici%n del anali8ador......................................................................................................... 21"
-.#.3: 5ase 1: &reaci%n de (mbitos................................................................................................... 21+
-.#.": 5ase 2: @re'araci%n de las ex'resiones.................................................................................. 3C2
-.#.#: 5ase 3: @re'araci%n de los ti'os............................................................................................. 3C3
-.#.+: 5ase ": @re'araci%n del (mbito global.................................................................................... 3C"
-.#.-: 5ic*ero LeLiBymbol>ree@arser.g............................................................................................ 3C-
-.#..: $otas !inales sobre el anali8ador............................................................................................. 31+
Seccin 0.6: "ompro7acin de tipos @ segunda pasada...................................................310
-.+.1: /ntroducci%n............................................................................................................................. 31-
-.+.2: 6e!inici%n del anali8ador......................................................................................................... 31-
-.+.3: 5ase 1 Fantener el (mbito actual ....................................................................................... 311
-.+.": 5ase 2: Adici%n de las variables locales a los (mbitos........................................................... 322
-.+.#: 5ase 3: x'resiones................................................................................................................ 322
-.+.+: 5ase ": Accesos...................................................................................................................... 331
-.+.-: 5ic*ero LeLi>y'e&*ec:>ree@arser.g...................................................................................... 3"1
-.+..: $otas !inales sobre el anali8ador............................................................................................. 3#.
Seccin 0.0: "ompilacin 3 e*ecucin................................................................................. 31
-.-.1: &om'ilaci%n............................................................................................................................. 3#1
-.-.2: jecuci%n................................................................................................................................. 3#1
Seccin 0.#: "onclusin........................................................................................................ 36!
Captulo 8:
Generacin de cdigo.......................................................................365
Seccin #.1: Introduccin......................................................................................................360
..1.1: $o generaremos c%digo.......................................................................................................... 3+-
..1.2: structura del ca'Atulo............................................................................................................. 3+-
Seccin #.2: $as /Auinas....................................................................................................36#
..2.1: 6e!iniciones............................................................................................................................. 3+.
..2.2: &om'onentes 'rinci'ales........................................................................................................ 3+.
..2.3: Uuego de %rdenes.................................................................................................................... 3-C
..2.": Las otras m(quinas................................................................................................................. 3-"
Seccin #.3: Bestin de la memoria..................................................................................... 306
..3.1: 6e!inici%n................................................................................................................................. 3-+
..3.2: 6ivisi%n cl(sica de la memoria................................................................................................ 3-+
..3.3: Acerca de la 'ila...................................................................................................................... 3-.
..3.": Acerca del motAculo................................................................................................................. 3.+
..3.#: Acerca del o!!set...................................................................................................................... 311
Seccin #.!: "digo intermedio............................................................................................31
..".1: /ntroducci%n............................................................................................................................. 31#
..".2: @ro'osiciones.......................................................................................................................... 31#
..".3: Objetivos y ventajas del c%digo intermedio............................................................................. 31+
Seccin #.: Beneracin de instrucciones 3 e-presiones.................................................310
..#.1: /ntroducci%n............................................................................................................................. 31-
..#.2: /nstrucciones condicionales..................................................................................................... 31-
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota '
ndice de contenido
..#.3: 4ucles...................................................................................................................................... 31.
..#.": /nstruccionesSex'resiones....................................................................................................... 311
Seccin #.6: 4ptimi%acin de cdigo................................................................................... !.2
..+.1: /ntroducci%n............................................................................................................................. "C2
..+.2: O'timi8aciones inde'endientes de la m(quina objetivo......................................................... "C2
..+.3: O'timi8aciones de'endientes de la m(quina objetivo............................................................ "C"
..+.": @ortabilidad vs. e!iciencia........................................................................................................ "C+
Seccin #.0: /iscelnea........................................................................................................ !.#
..-.1: /ntroducci%n............................................................................................................................. "C.
..-.2: Fa'eado de ti'os.................................................................................................................... "C.
..-.3: LibrerAas y ti'os b(sicos del sistema....................................................................................... "1C
Seccin #.#: "onclusin........................................................................................................ !12
Captulo 9:
Conclusiones......................................................................................413
Seccin 1.1: Introduccin......................................................................................................!1!
Seccin 1.2: A&'$( 3 el anlisis l2-ico............................................................................... !1
1.2.1: La 'rimera im'resi%n............................................................................................................... "1#
1.2.2: ,sabilidad................................................................................................................................ "1#
1.2.3: !iciencia................................................................................................................................. "1#
1.2.": @restaciones............................................................................................................................ "1+
1.2.#: &arencias................................................................................................................................. "1+
1.2.+: &onclusi%n............................................................................................................................... "1-
Seccin 1.3: A&'$( 3 el anlisis sintctico........................................................................ !1#
1.3.1: La 'rimera im'resi%n............................................................................................................... "1.
1.3.2: ,sabilidad................................................................................................................................ "1.
1.3.3: !iciencia................................................................................................................................. "1.
1.3.": @restaciones............................................................................................................................ "1.
1.3.#: &arencias................................................................................................................................. "11
1.3.+: &onclusi%n............................................................................................................................... "11
Seccin 1.!: A&'$( 3 el anlisis semntico....................................................................... !2.
1.".1: La 'rimera im'resi%n............................................................................................................... "2C
1.".2: ,sabilidad................................................................................................................................ "2C
1.".3: !iciencia................................................................................................................................. "2C
1.".": @restaciones............................................................................................................................ "2C
1.".#: &arencias................................................................................................................................. "21
1.".+: &onclusi%n............................................................................................................................... "22
Seccin 1.: "onclusiones )inales....................................................................................... !23
1.#.1: Bobre A$>LR.......................................................................................................................... "23
1.#.2: Bobre el manejo de los AB>s.................................................................................................. "23
1.#.3: Bobre la e!iciencia................................................................................................................... "23
1.#.": Bobre el !uturo de A$>LR....................................................................................................... "2#
1.#.#: <Ferece la 'ena A$>LR?....................................................................................................... "2#
1.#.+: 5inal......................................................................................................................................... "2+
Apndice A: Referencias...................................................................427
Apndice B: Glosario.........................................................................428
Apndice C: Cuestiones tcnicas....................................................435
Seccin ".1: Instalacin de A&'$( so7re CindoDs........................................................... !36
Seccin ".2: Internacionali%acin......................................................................................... !3#
&.2.1: l 'roblema.............................................................................................................................. "3.
&.2.2: 6e!ensa de la internacionali8aci%n.......................................................................................... "3.
&.2.3: ditando los !ic*eros................................................................................................................ "3.
&.2.": Recom'ilando.......................................................................................................................... "31
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota '&
ndice de contenido
Seccin ".3: Interaccin de A&'$( con otros programas................................................. !!1
&.3.1: G$, macsSVemacs............................................................................................................... ""1
&.3.2: La 'lata!orma cli'se.............................................................................................................. ""2
&.3.3: Otros 'rogramas...................................................................................................................... ""3
Apndice D: Contenido del CD-ROM...............................................445
ndice de ilustraciones
&lustraci(n 1.1 !structura de este documento..................................................................................)
&lustraci(n 1.2 *n ordenador muy +sico........................................................................................ ,
&lustraci(n 1.- .uncionamiento de un ensam+lador....................................................................... /
&lustraci(n 1.) .uncionamiento de un compilador.......................................................................... /
&lustraci(n 1.0 !structura +sica de un compilador..................................................................... 1
&lustraci(n 1., !structura de un A1T sencillo............................................................................... 11
&lustraci(n 1.7 %omparaci(n de las 2erramientas......................................................................... 1)
&lustraci(n 1./ Aut(mata LR para una gramtica de ) reglas..................................................... 20
&lustraci(n 2.1 .uncionamiento de ANTLR................................................................................... -1
&lustraci(n 2.2 3rimer 4lu5o de in4ormaci(n6 caracteres............................................................... -0
&lustraci(n 2.- .lu5o de to7ens entre el le8er y el parser...............................................................-,
&lustraci(n 2.) .lu5o 9i:"uierda; y r+ol 9derec2a; de in4ormaci(n.............................................-/
&lustraci(n 2.0 &ntercam+io de A1Ts entre las di4erentes partes de un compilador.................. -<
&lustraci(n 2., =9A > %;................................................................................................................... -<
&lustraci(n 2.7 =9A > =9% ? !;;....................................................................................................... -<
&lustraci(n 2./ @r+ol limitado 9derec2a; y corriente 9i:"uierda;................................................. )2
&lustraci(n 2.< =9A3BCA1 &?!NT &?!NT;.................................................................................. 0
&lustraci(n 2.1 A1T para una e8prBsuma simpli4icada............................................................... 0
&lustraci(n 2.11 @r+ol degenerado para e8prBproducto............................................................... 01
&lustraci(n 2.12 @r+ol degenerado para e8prBsuma..................................................................... 01
&lustraci(n 2.1- =9A =9> % ?;;.........................................................................................................02
&lustraci(n 2.1) A1T del +ucle D2ile...............................................................................................0-
&lustraci(n 0.1 @r+ol A1T con dia+etes sintctica.......................................................................12/
&lustraci(n 0.2 @r+ol A1T desea+le...............................................................................................12/
&lustraci(n 0.- A1T de un acceso.................................................................................................. 1-7
&lustraci(n 0.) A1T degenerado de un acceso..............................................................................1-7
&lustraci(n 0.0 'entana 1E&NG mostrando el A1T de FGola mundoF....................................10/
&lustraci(n ,.1 Recuperaci(n de errores en el reconocimiento................................................... 1,7
&lustraci(n ,.2 3ila de llamadas antes y despu$s de recuperar un error................................... 17/
&lustraci(n ,.- Relaci(n 5err"uica de las e8cepciones de ANTLR........................................... 1<<
&lustraci(n ,.) A1T sin recuperaci(n de errores......................................................................... 2,
&lustraci(n ,.0 A1T con la recuperaci(n de errores 4uncionando.............................................. 22
&lustraci(n 7.1 Anlisis semntico dividido en su+tareas............................................................20-
&lustraci(n 7.2 !s"uema de clases para el anlisis semntico.....................................................20)
&lustraci(n 7.- #erar"ua de antlrau8.conte8t.%onte8t!8ception.............................................. 2,7
&lustraci(n 7.) @m+itos y enmascaramiento................................................................................ 27
&lustraci(n 7.0 ?o+le ordenamiento de las declaraciones en los m+itos.................................. 271
&lustraci(n 7., A1Ts sin mostrar in4ormaci(n adicional............................................................ 2/2
&lustraci(n 7.7 A1Ts con in4ormaci(n adicional mostrada......................................................... 2/2
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota '&&
ndice de contenido
&lustraci(n 7./ !s"uema de pa"uetes de antlrau8.conte8t..........................................................2/-
&lustraci(n 7.< Relaci(n entre LeLiType y LeLiCetaType........................................................ 2<
&lustraci(n 7.1 A1T de un acceso................................................................................................ --1
&lustraci(n 7.11 A1T de un FGola mundoF..................................................................................-,)
&lustraci(n /.1 La Hltima 4ase del proceso.................................................................................... -,7
&lustraci(n /.2 !s"uema de una %3*........................................................................................... -,/
&lustraci(n /.- ?ivisi(n clsica de la memoria............................................................................. -7,
&lustraci(n /.) Tpica lnea de c(digo........................................................................................... -77
&lustraci(n /.0 Arden en varias lneas de memoria..................................................................... -77
&lustraci(n /., %omportamiento de la pila con gosu+.................................................................-7<
&lustraci(n /.7 !stado inicial de la m"uina................................................................................ -/1
&lustraci(n /./ 'a a empe:ar a e5ecutarse 42................................................................................-/1
&lustraci(n /.< 3rimeros preparativos de 42................................................................................. -/2
&lustraci(n /.1 Listo para e5ecutar 42..........................................................................................-/2
&lustraci(n /.11 Las vta+les........................................................................................................... -/)
&lustraci(n /.12 &nstancias de una clase apuntando a su descriptor..........................................-/0
&lustraci(n /.1- Contculo con 0 elementos alo5ados.................................................................. -//
&lustraci(n /.1) Contculo con segmentos li+res y ocupados..................................................... -//
&lustraci(n /.10 ?isposici(n en memoria de 3ersona.................................................................. -<-
&lustraci(n /.1, Lugar del c(digo intermedio.............................................................................. -<,
&lustraci(n /.17 ?esenrollado de un +ucle....................................................................................)0
&lustraci(n /.1/ !l 4ormato de nHmero 4lotante de -2 +its del &!!!......................................... )/
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota '&&&
Captulo 1:
Prembulos
El lenguaje es el vestido de los pensamientos
*amue) Jo!nson
Captulo 1:
Prembulos.............................................................................................1
Seccin 1.1: Introduccin..........................................................................................................2
1.1.1: Objetivos LeLi y antlraux.......................................................................................................... 2
1.1.2: Requisitos.................................................................................................................................... 2
1.1.3: n!oque....................................................................................................................................... 2
1.1.": structura.................................................................................................................................... 3
1.1.#: $otaci%n...................................................................................................................................... "
Seccin 1.2: Breve repaso a la teora de compiladores......................................................... 6
1.2.1: &once'tos b(sicos: so!t)are y *ard)are.................................................................................... +
1.2.2: ,n 'oco de *istoria...................................................................................................................... -
1.2.3: nsambladores y com'iladores.................................................................................................. .
1.2.": /nt0r'retes y m(quinas virtuales................................................................................................. 1
1.2.#: l 'roceso de com'ilaci%n.......................................................................................................... 1
Lenguaje..............................................................................................................................................................1
5ases del 'roceso de com'ilaci%n....................................................................................................................1C
1.2.+: 2&om'iladores de com'iladores3............................................................................................... 12
Seccin 1.3: Algoritmos de anlisis....................................................................................... 1
1.3.1: La sintaxis 4$5....................................................................................................................... 1#
Reglas b(sicas : 4$5........................................................................................................................................1#
4$5.................................................................................................................................................................. 1-
Acciones............................................................................................................................................................. 1.
Otros..................................................................................................................................................................11
1.3.2: 26e arriba a abajo37 Anali8adores recursivos descendentes..................................................... 11
Loo:a*ead W 1...................................................................................................................................................21
nriqueciendo el algoritmo: 'redJLL9:;.............................................................................................................21
1.3.3: 26e abajo a arriba37 anali8adores LR......................................................................................... 23
l loo:a*ead......................................................................................................................................................2"
/m'lementaci%n.................................................................................................................................................2"
1.3.": &om'araci%n entre LR9:; y LL9:;.............................................................................................. 2#
@otencia.............................................................................................................................................................2#
Helocidad...........................................................................................................................................................2+
5acilidad de uso................................................................................................................................................. 2-
Seccin 1.!: "onclusin.......................................................................................................... 2#
Gua prctica de ANTLR 2.7.2 v 1. 1
%aptulo 16 3rem+ulos 1ecci(n 1.16 &ntroducci(n
Becci%n 1.1: /ntroducci%n
1.1.1: Objetivos LeLi y antlraux
Este +ocumento 2reten+e 2resentar )a !erramienta #7$385 una !erramienta escrita en 4a0a
+e+ica+a a) +esarro))o +e intr2retes" 9o+ra consi+erarse como un tutoria) so6re +ic!a
!erramienta"
3a estrate-ia que se 0a a se-uir 2ara )o-rar este 2ro2=sito ser. )a +e +esarro))ar5 comentan+o
ca+a 2aso5 un com2i)a+or 2ara un )en-ua4e +e una en0er-a+ura me+ia" 1ic!o )en-ua4e se ))amar.
3e3i@ )as +iferentes fases +e su +esarro))o conformar.n e) !i)o ar-umenta) +e este )i6ro"
9ara)e)amente a) +esarro))o +e) com2i)a+or +e 3e3i se +esarro))ar. una )i6rera +e c)ases
-enricas5 que a) no estar +irectamente re)aciona+as con 3e3i 2o+r.n ser uti)i%a+as en otros
+esarro))os con #7$38" E) nom6re +e esta )i6rera ser. ant)rau:"
$anto e) com2i)a+or +e 3e3i como )a )i6rera ant)rau: ir.n inc)ui+os en e) C1A8;B que
acom2aCa a este +ocumento" 9ara 0ersiones m.s recientes +e ant)rau:5 cons?)tese e) sitio
2ttp6IIantlrau8.source4orge.net" Es 2osi6)e (aunque im2ro6a6)e) que a2are%can nue0as
0ersiones +e 3e3i@ si se +a e) caso5 stas estar.n +is2oni6)es en mi sitio <e6 2ersona)5
2ttp6IIimaginatica.us.esIJenri"ue"
1.1.2: Requisitos
1a+o que )as !erramientas m.s 2o2u)ares en +esarro))o +e intr2retes (es2ecia)mente +e
com2i)a+ores) son 6ison++ f)e:++5 )as com2arar con #7$38 en m.s +e una ocasi=n" 9or )o
tanto es +esea6)e5 aunque no im2rescin+i6)e5 que e) )ector )os cono%ca +e antemano"
# 2esar +e que en este ca2tu)o se !ace una intro+ucci=n a )a teora +e com2i)a+ores5 es
recomen+a6)e que e) )ector a ten-a ciertos conocimientos +e com2i)a+ores antes +e enfrentarse
a este +ocumento"
E) ?nico requisito im2rescin+i6)e ser. tener un conocimiento 6.sico +e) )en-ua4e 4a0a5 que ser. e)
uti)i%a+o 2ara im2)ementar tanto e) com2i)a+or +e 3e3i como )a )i6rera ant)rau:" $am6in ser.n
necesarios conocimientos re)aciona+os con )a 2ro-ramaci=n orienta+a a o64etos5 como )a
!erencia o e) 2o)imorfismo"
1.1.3: n!oque
# )a !ora +e escri6ir un )i6ro so6re cua)quier tema tcnico !a muc!as formas +e 2resentar )a
informaci=n a) )ector5 o DenfoquesE" #)-unos +e )os enfoques que m.s me mo)estan sonF
X E) enfoque Dmatem.ticoAforma)EF E) )en-ua4e que se em2)ea 2ara 2resentar )a informaci=n es
+e) esti)o +e D aBcD/ ac=n E" En ocasiones este )en-ua4e es e) m.s in+ica+o 2ara
2resentar un conce2to5 2ero esto rara 0e% ocurre en e) .m6ito +e )os com2i)a+ores" /n
+ocumento t2icamente matem.ticoAforma) sera aque) que +efine e) con4unto 98,BE8; +e
una re-)a con sm6o)os matem.ticos"
X D;rienta+o a +ia-ramasEF )a maora +e )os conce2tos se 2resentan en forma +e +ia-ramas con
muc!os crcu)os f)ec!as5 2resumi6)emente 2orque faci)itan )a com2rensi=n +e conce2tos" 3os
+ia-ramas son 2otentes !erramientas 2ara fi4ar conce2tos5 2ero 2or )o -enera) no son 6uenas
2ara +efinir)os@ 2ara eso es me4or usar 2a)a6ras frases" /n te:to orienta+o a +ia-ramas es
aque) que +efine )os +iferentes ti2os +e re-)as G7> uti)i%an+o +ia-ramas +e f)u4o"
X DGuas +e referenciaEF son )ista+os mu 0o)uminosos +e +atos que no sir0en 2ara a2ren+er5
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2
%aptulo 16 3rem+ulos 1ecci(n 1.16 &ntroducci(n
sino 2ara 6uscar +eta))es 2articu)ares so6re a)-o que a se conoce"
En o2osici=n a estos enfoques5 mi o64eti0o es tratar +e uti)i%ar un enfoque ti2o Dtutoria) +e
2ro-ramaci=nE" ,ntentar usar )en-ua4e natura) en com6inaci=n con c=+i-o cuan+o sea 2osi6)e"
$ratar +e que to+os )os conce2tos se interre)acionen +e manera que e) +ocumento 2ue+a )eerse
ca2tu)o a ca2tu)o +e una forma m.s o menos amena5 uti)i%an+o un tono m.s 2r=:imo a) )ector
+e )o que es !a6itua) en )a 6i6)io-rafa e:istente"
9or ?)timo5 tratar 2or to+os )os me+ios +e no uti)i%ar ecuaciones matem.ticas5 sino que +efinir
)os conce2tos uti)i%an+o )en-ua4e natura)5 a2o.n+ome en c=+i-o5 e4em2)os a)-?n que otro
+ia-rama 2ara fi4ar conocimientos"
1.1.": structura
E) te:to estar. +i0i+i+o se-?n )a usua) estructura en ca2tu)os5 ca+a uno 0ersan+o so6re )as
materias que se 2resentan a continuaci=n"
#ctua)mente uste+ est. )een+o e) ca2tu)o +e D9re.m6u)osE" En este ca2tu)o 2resentar
someramente )a teora actua) +e intr2retes com2i)a+ores" 3os conce2tos que +efinir ser.n
an.)isis ):ico5 sint.ctico sem.ntico5 recu2eraci=n +e errores5 -eneraci=n +e c=+i-o
a)-oritmos 335 2re+A335 38 3#38" *i a)-uno +e e))os )e resu)ta e:traCo o no )o recuer+a
c)aramente )e su-iero que ec!e un 0ista%o a este +ocumento" En otro caso5 2ue+e 2asar
+irectamente a) ca2tu)o '"
En e) se-un+o ca2tu)o se 2resenta )a !erramienta #7$38 +e una manera 6re0e" *i no conoce
#7$385 +e6era ec!ar)e un 0ista%o antes +e continuar" 7o se 2reocu2e5 no ser. una )ista
intermina6)e +e ca2aci+a+es tcnicas +e #7$38"
/no +e )os +eta))es que !e o6ser0a+o )een+o )os tutoria)es +e #7$38 que se encuentran 2or )a
re+ es que )a maora uti)i%an un )en-ua4e Dsim2)eEF una Dca)cu)a+oraE5 un D)ista+o +e )i6rosE
1
5
etc" Estos )en-ua4es son +emasia+o )imita+os 2ara tratar to+os )os temas que son necesarios a)
crear un com2i)a+or rea)5 o a) menos Drea)istaE5 como son e) mane4o +e .m6itos o )a orientaci=n a
o64etos
'
" 9or )o tanto e:aminar #7$38 me+iante e) uso +e un )en-ua4e un 2oco menos sim2)e"
En e) ca2tu)o 3 +efinir +ic!o )en-ua4e en )os sucesi0os e:2on+r )os ana)i%a+ores ):ico (ca2"
4) sint.ctico (ca2" &)"
En e) ca2tu)o 6 2resentar a)-unas estrate-ias 2ara im2)ementar )a recu2eraci=n +e errores
sint.cticos son #7$38" 1efinir conce2tos conoci+os en e) .m6ito +e )os intr2retes5 como )os
con4untos 98,BE8; *,G/,E7$E5 o )os toHens +e sincronismo" #+em.s aCa+ir nue0os
conce2tos como )as tram2as 2ara e:ce2ciones e) retraso +e tratamiento +e errores"
E) an.)isis sem.ntico5 que ser. ))e0a+o a ca6o 2or varios ana)i%a+ores sint.cticos5 se e:2on+r. en
e) ca2tu)o ("
E) ca2tu)o 8 se centrar. en )a -eneraci=n +e c=+i-o"
E) ca2tu)o 95 e) ?)timo ser. una )ista +e )as conc)usiones que !aa o6teni+o so6re #7$38"
*e-ui+amente a2arecen )a 6i6)io-rafa un -)osario +e trminos en )os a2n+ices # G"
En e) a2n+ice C +iscuto cuestiones tcnicas so6re #7$38 como son )a insta)aci=n5
recom2i)aci=n e interacci=n con otros 2ro-ramas (es2ecia)mente ,1Es)"
9or ?)timo5 en e) a2n+ice 1 +eta))o e) conteni+o +e) C1A8;B que acom2aCa a esta o6ra"
1 *a)0o a)-unas !onrosas e:ce2ciones5 2or su2uesto"
' *i 6ien )a orientaci=n a o64etos que se im2)ementar. ser. tremen+amente sim2)e"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -
%aptulo 16 3rem+ulos 1ecci(n 1.16 &ntroducci(n
1.1.#: $otaci%n
*e-uir )a si-uiente notaci=nF
X Esto es te:to norma)"
X 3os fra-mentos +e c=+i-o re2resentaciones +e )a interfa% +e coman+os uti)i%ar.n )etra
courier new e ir.n +e)imita+os con )neas" *e 2o+r.n seCa)ar %onas +e c=+i-o +e es2ecia)
inters con un som6rea+o uti)i%an+o )etras en ne-ritaF
/* Ejemplo de cdigo */
class HolaMundo
{
public static void main(String args[])
{
System.out.println(Hola mundo); // Cdigo resaltado
}
}
X 3os trminos en otros i+iomas o conce2tos im2ortante ir.n en cursiva"
X Este +ocumento se or-ani%a en ca2tu)os5 secciones5 a2arta+os 5 si e) asunto )o requiere5
su6a2ar+a+os" Es +ecir5 )a estructura +e) +ocumento es )a si-uienteF
Ilustracin 1.1 Estructura de este documento
X ;casiona)mente 2o+r.n encontrarse fra-mentos +e te:to en )os que e) usuario +e6e 2restar
es2ecia) atenci=n (2or e4em2)o5 a) !a6)arse +e un error que 2ue+e cometerse)" Estos
fra-mentos ir.n seCa)i%a+os +e )a manera si-uienteF
3os 2.rrafos re2resenta+os +e esta forma sir0en 2ara in+icar una informaci=n que
merece es2ecia) atenci=n 2or 2arte +e) )ector"
X #)-unas secciones +e) +ocumento son tra+ucciones +e 2artes +e )os manua)es +e #7$38 o +e
artcu)os re)aciona+os con )" Estos fra-mentos ir.n 2rece+i+os +e una anotaci=n como )a
si-uienteF
Las secciones precedidas con una anotacin como sta son extractos de manuales o artculos.
Es +ecir5 e) te:to que uste+ est. )een+o en estos momentos +e6era +e ser una tra+ucci=n o
co2ia +e a)-?n )i6ro o manua)" 3a anotaci=n 2rece+ente +e6era in+icar con 2recisi=n e)
ori-en +e) te:to"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )
Ca2tu)o
*ecciones
#2arta+os
*u6a2arta+os
Captulo 6: El retorno del jedi
Seccin 6.1: Introduccin
Seccin 6.2: Regreso a Tatoonie
Iace muc!o tiem2o5 en una -a)a:ia )e4ana5 mu )e4ana"""
6.2.1: Ena carta para Fa77a
3a 2e)cu)a comien%a en )as +esrticas tierras +e $atoonie" 81A1' C3A9; 0an a
entre-ar a Ja66a e) Iutt una carta +e 3uHe *<a)Her"""
6.2.!: $a 8uda
=an Solo
*o)o se-ua cie-o tras su traum.tica D+escon-e)aci=nE" #u+a+o 2or 3eia5 a sin
+isfra%5 trata6a +e orientarse en )a oscuri+a+"""
$u9e S93Dal9er
$ras )uc!ar contra un rancor5 3uHe tam6in es !ec!o 2risionero con+ena+o a
muerte"""
...
%aptulo 16 3rem+ulos 1ecci(n 1.16 &ntroducci(n
E) fina) +e ca+a una +e estas secciones se marcar. con & asteriscos5 asF
*****
X # )a !ora +e escri6ir este +ocumento5 no tena c)aro si uti)i%ar e) 2)ura) +e cortesa o un tono
m.s 2ersona) en 2rimera 2ersona (es un 2roecto +e fin +e carrera5 2ero a )a 0e% 2reten+o que
sea un tutoria) so6re #7$38 so6re )os com2i)a+ores)" Esta )uc!a interna a?n se mantiene5
2or )o que a 0eces uti)i%ar )a 2rimera o2ci=n (+icien+o cosas como DIemos 0istoE o Desto )o
im2)ementaremos asE) a 0eces )a se-un+a (DJo )o !a-o as5 2ero uste+ +e6era !acer)o +e
esta otra maneraE)"
X 1e i-ua) manera5 me referir in+i0i+ua)mente a) )ector5 a sea en se-un+a (D/ste+ 2ue+e !acer
esto asE) o tercera 2ersona (DE) )ector +e6e sa6er que"""E)5 aunque tam6in 2o+r +iri-irme a
to+o e) co)ecti0o +e 2otencia)es )ectores (D)os que no se2an c=mo !acer esto5 que re0isen )a
secci=n anteriorE)"
X /n a2unte fina)5 esta 0e% en cuanto a )os nom6res +e )as c)ases en 4a0aF !a +os maneras +e
!acer referencia a )as c)ases +e) +ic!o )en-ua4e@ 2or un )a+o est. e) Dnom6re com2)etoE +e )a
c)ase5 que inc)ue to+os )os 2aquetes su6 2aquetes +e )a c)ase" Esta nomenc)atura 2ue+e ser
mu com2)ica+a +e uti)i%ar5 2orque tien+e a -enerar nom6res mu )ar-os (2or e4em2)o5 en una
ocasi=n ten+remos que uti)i%ar )a c)ase antlraux.context.types.CommonType)" #s que en
muc!as ocasiones uti)i%ar e) Dnom6re re+uci+oE5 que 2ermite referirse a )a c)ase uti)i%an+o
?nicamente su nom6re (es +ecir5 escri6ir sim2)emente CommonType)" Es mu im2ro6a6)e que
un nom6re +e una c)ase se re2ita en m.s +e un 2aquete5 as que esta me+i+a no +e6era su2oner
nin-?n 2ro6)ema"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 0
%aptulo 16 3rem+ulos 1ecci(n 1.26 >reve repaso a la teora de compiladores
Becci%n 1.2: 4reve re'aso a la teorAa de com'iladores
1.2.1: &once'tos b(sicos: so!t)are y *ard)are
/n com2i)a+or es5 mu a grosso modo5 Dun 2ro-rama que sir0e 2ara !acer otros 2ro-ramas5
me+iante e) uso +e un )en-ua4e +e 2ro-ramaci=nE" /n 2ro-rama es Duna serie +e =r+enes en )a
memoria +e un or+ena+orE"
/n or+ena+or es )a uni=n +e una o m.s uni+a+es +e memoria5 una o m.s uni+a+es +e c.)cu)o
uno o m.s re-istros +e c.)cu)o interme+ios5 uni+os entre s 2or una serie +e 6uses +e
informaci=n5 +e ta) manera que e) con4unto sea ca2a% +e e4ecutar 2ro-ramas5 co+ifica+os en
forma +e instrucciones en )a memoria"
Ilustracin 1.2 n ordenador mu! "#sico
3a memoria es una %ona en )a que se a)macena )a informaci=n" 3os micro2rocesa+ores actua)es
0ienen +ota+os +e una uni+a+ +e memoria5 fsicamente +entro +e) 2rocesa+or5 que se ))ama
memoria cac!" Esta memoria es 6astante m.s r.2i+a que )a memoria 8#B5 6astante m.s
2equeCa" Ia +i0ersas tcnicas que 2ermiten -uar+ar en )a memoria cac! )os +atos m.s
uti)i%a+os +e )a 8#B5 incrementan+o enormemente )a 0e)oci+a+ +e 2rocesa+o" 7o o6stante5
cuan+o )a memoria cac! no contiene un +ato necesita+o tiene que recurrir a )a 8#B
con0enciona)5 o inc)uso a) +isco +uro5 si e) sistema o2erati0o est. uti)i%an+o tcnicas +e
s$apping"
9ara ace)erar )os accesos +e memoria se uti)i%a tam6in una %ona +e memoria e:trema+amente
r.2i+a +i0i+i+a en Dre-istrosE" E) n?mero +e re-istros +e ca+a m.quina su ca2aci+a+ +e2en+e
+e ca+a mo+e)o"
3a %ona en )a que se rea)i%an )os c.)cu)os se sue)e ))amar /#3 (/ni+a+ #ritmtico K 3=-ica)" 9or
)o -enera) )a /#3 tra6a4a +irectamente con )os re-istros en )u-ar +e acce+er +irectamente a )a
memoriaF sue)e ser m.s r.2i+o"
9or ?)timo5 to+os )os com2onentes +e un micro2rocesa+or est.n uni+os 2or )neas +e transmisi=n
+e informaci=n ))ama+as D6usesE" 3as caractersticas m.s im2ortantes +e un 6us son su 0e)oci+a+
+e transmisi=n (que en )os 6uses internos +e un 2rocesa+or es a)tsima) su ca2aci+a+5 es +ecir5
e) n?mero +e 6its simu)t.neos que 2ue+en transmitir" Cuan+o se +ice que Dun 2rocesa+or es +e
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota ,
Bemoria
C.)cu)o
(/#3)
8e-istros
%aptulo 16 3rem+ulos 1ecci(n 1.26 >reve repaso a la teora de compiladores
64 6itsE se sue)e !acer referencia a )a ca2aci+a+ +e )os 6uses internos"
3os 2ro-ramas que un or+ena+or +e6e e4ecutar se a)macenan co+ifica+os en )a memoria en forma
+e n?meros 6inarios" 3a forma +e co+ificar )a informaci=n tam6in 0ara se-?n e) mo+e)o +e )a
m.quina5 aunque e:isten a)-unas re-)as -enera)esF )os 6its m.s si-nificati0os sue)en co+ificar e)
ti2o +e o2eraci=n (suma5 resta) que )a /#3 +e6e rea)i%ar" E) resto +e )os 6its se uti)i%an 2ara
co+ificar )os Do2eran+osE5 es +ecir5 )os re-istros o +irecciones +e memoria que se 0an a uti)i%ar
en )a o2eraci=n" 3os c=+i-os 6inarios +e )as o2eraciones sue)en a-ru2arse 2resentarse en
!e:a+ecima)" #s5 e) n?mero D0:>>#CE 2o+ra si-nificar 2ara un 2rocesa+or 2rocesa+or Dtoma e)
0a)or +e) re-istro #5 s?ma)e e) +e) re-istro G -uar+a e) resu)ta+o en #E"
Genera)mente a) so2orte fsico (/#35 6uses5 memoria + otros +is2ositi0os5 como )a fuente +e
a)imentaci=n o e) tec)a+o) +e) or+ena+or se )e ))ama %ard$are5 mientras que a )os 2ro-ramas que
se a)macenan en su memoria se )e ))ama so&t$are"
1.2.2: ,n 'oco de *istoria
En )os a)6ores +e )a 2ro-ramaci=n no !a6a nin-?n ti2o +e a6stracci=n" 3a D2ro-ramaci=nE en
aque) entonces era com2)etamente +iferente a como )a conocemos a!ora" En -enera) e) !ar+<are
2ro2orciona6a un me+io +e escri6ir c=+i-os !e:a+ecima)es en su memoria5 una 0e% en memoria
)os c=+i-os eran 2rocesa+os"
E) 2rimer or+ena+or 2ersona) que 4am.s se 0en+i= fue e) B,$* #3$#,8 8800" Esta 2ie%a +e
tecno)o-a 0ena equi2a+a con '&6 f)amantes "!tes (no5 no '"!tes) +e memoria 8#B K
am2)ia6)es5 eso s5 a '5 45 8 Le incuso 1' MGN
Con )a confi-uraci=n 2or +efecto no se 2o+a !acer muc!o" 7o 2o+a conectarse a una te)e0isi=n5
no +is2ona +e nin-?n +is2ositi0o +e sa)i+a a e:ce2ci=n +e 3& 3E1s en su 2arte fronta)"
$am2oco e:ista nin-?n tec)a+o5 )a intro+ucci=n +e c=+i-os !e:a+ecima)es se rea)i%a6a
uti)i%an+o a)-unas D2a)ancasE5 que a) ser acciona+as mo+ifica6an e) 0a)or +e )os 6its en )a
memoria5 mostr.n+ose e) cam6io en )os 3E1s"
3a 2rimera e0o)uci=n fueron )os ensam6)a+ores" En )u-ar +e escri6ir e) c=+i-o +irectamente en
6inario5 e) 2ro-rama+or uti)i%a6a nemotcnicos" #s5 se 2as= +e escri6ir D0:>>#CE a escri6ir
a)-o 2areci+o a D#11 #5GE (suma )os re-istros # G5 -uar+a e) resu)ta+o en #)" 9ara e))o era
necesario contar con un a2arato e:tra5 ))ama+o te)eti2o" Este arti)u-io esta6a +ota+o +e un
tec)a+o5 en0ia6a )a 2u)saci=n +e tec)as a) #)tair" 9or su2uesto5 !aca fa)ta un ensam6)a+or" E)
ensam6)a+or era un 2ro-rama que 2ermita tra+ucir e) )en-ua4e Dcon nemotcnicosE5 que a )a
sa%=n tam6in se ))am= ensam6)a+or5 en c=+i-o 6inario inter2reta6)e 2or )a m.quina" 3os
nemotcnicos no ais)an a) 2ro-rama+or +e) !ar+<are@ 2ara 2ro-ramar en )en-ua4e ensam6)a+or es
necesario conocer )a m.quina tan 6ien como cuan+o se 2ro-rama +irectamente en c=+i-o
m.quina" *in em6ar-o5 2ara un ser !umano norma) resu)ta muc!o m.s c=mo+o uti)i%ar )os
nemotcnicos que e) c=+i-o 6inario +e )a m.quina K que +es+e entonces se +enomina
sim2)emente Dc=+i-o m.quinaE"
9ara 2o+er uti)i%ar un ensam6)a+or era necesario contar5 a) menos5 con )a am2)iaci=n +e memoria
+e 4MG" #!ora 6ien5 con 4MG a era 2osi6)e uti)i%ar un )en-ua4e +e 2ro-ramaci=n +e m.s a)to
ni0e)F e) G#*,C"
G#*,C 2ro2orciona6a un ()imita+o) entorno +e 2ro-ramaci=n que 2ermita Di-norarE e)
!ar+<are" Conocien+o una serie +e conce2tos a6stractos5 cua)quiera 2o+ra escri6ir soft<are
2ara e) #)tair" ADD A,B 2as= a con0ertirse en 3E$ speed=speed+aux"
Con una am2)iaci=n +e 8MG se 2o+a e4ecutar 8M G#*,C" 8M G#*,C 2ro2orciona6a un 4ue-o +e
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 7
%aptulo 16 3rem+ulos 1ecci(n 1.26 >reve repaso a la teora de compiladores
instrucciones m.s -ran+e que 4M G#*,C" 9or ?)timo5 E:ten+e+ G#*,C so)amente funciona6a
con e) m=+u)o +e 1'MG"
E:ten+e+ G#*,C fue e) 2rimer soft<are comercia) que +esarro))= un ta) Gi)) Gates"
1.2.3: nsambladores y com'iladores
/n ensam6)a+or es a su 0e% un 2ro-rama" 1ic!o 2ro-rama se encar-a +e tra+ucir
autom.ticamente e) )en-ua4e ensam6)a+or (ADD A, B) a c=+i-o Dm.quinaE (0xFFAC)"
Ilustracin 1.( )uncionamiento de un ensam"lador
/n ensam6)a+or es un 2ro-rama re)ati0amente sim2)e5 +a+o que tra+ucir )os nemotcnicos a
c=+i-o m.quina es una acci=n mu +irecta"
3os com2i)a+ores5 2or re-)a -enera)5 se )imitan a tra+ucir un )en-ua4e +e 2ro-ramaci=n +e a)to
ni0e) a ensam6)a+or5 +es2us un ensam6)a+or se encar-a +e -enerar e) c=+i-o m.quina" #)
)en-ua4e +e a)to ni0e) que +efine un 2ro-rama +e soft<are se )e sue)e ))amar Dc=+i-o fuenteE"
Ilustracin 1.* )uncionamiento de un compilador
Con e) G#*,C +e) #)tair se-ua sien+o senci))o tra+ucir" E) )en-ua4e +e 2ro-ramaci=n a?n
recor+a6a 6astante )a m.quina su6acente"
Con e) tiem2o5 no o6stante5 )os )en-ua4es +e 2ro-ramaci=n !an i+o e0o)ucionan+o m.s m.s5
aCa+ien+o m.s m.s a6stracci=n5 +e manera que !o en +a es 2osi6)e encontrar 2ro-rama+ores
que +esconocen 2or com2)eto )a arquitectura +e )a m.quina so6re )a que est.n 2ro-raman+o
3
"
3os )en-ua4es com2i)a+os m.s uti)i%a+os fueron5 2rimeramente5 >;8$8#75 m.s tar+e C"
E) incremento +e )a a6stracci=n +e )as 2restaciones +e )os )en-ua4es +e 2ro-ramaci=n
re2ercuten en )a com2)e4i+a+ +e )os com2i)a+ores5 que ca+a 0e% tienen que rea)i%ar m.s tareas
2ara 2o+er fina)mente Dtra+ucirE a c=+i-o ensam6)a+or" *e !i%o necesario +i0i+ir )os 2ro-ramas
en 0arias uni+a+es +e com2i)aci=n in+e2en+ientes (usua)mente fic!eros +e c=+i-o +iferentes)"
Esta +i0isi=n 2ermita recom2i)ar una so)a +e )as uni+a+es +e com2i)aci=n sin tener que
recom2i)ar e) resto5 a )a 0e% que 2ermiti= )a a2arici=n +e D)i6rerasE5 2ermitien+o a un
2ro-rama+or a2ro0ec!ar e) c=+i-o escrito 2or otros"
9ara o6tener un e4ecuta6)e que +e2en+a +e m.s +e una uni+a+ +e com2i)aci=n se !aca necesaria
una fase m.s5 en )a que se Den)a%a6anE )as +iferentes 2artes 2ara formar e) 2ro-rama fina)" Esta
?)tima fase no )a rea)i%a6a e) com2i)a+or5 sino una !erramienta e:terna ))ama+a Den)a%a+orE
3 OPu 2orcenta4e +e 2ro-rama+ores +e 4a0a conoce )a arquitectura +e )a m.quina 0irtua) +e 4a0aQ
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota /
#11 #5G
B;R #5C
$GE C51
JB9 S'10T
0:>>#C
0:>#1#
0:>69E
0:101'
Ensam6)a+or
#11 #5G
B;R #5C
$GE C51
JB9 S'10T
0:>>#C
0:>#1#
0:>69E
0:101'
Ensam6)a+or 3E$ s2ee+Us2ee++au:
,> s2ee+VU)imit $IE7 G;$; '10
Com2i)a+or
%aptulo 16 3rem+ulos 1ecci(n 1.26 >reve repaso a la teora de compiladores
(lin+er)" 1a+o que nosotros tra6a4aremos con una ?nica uni+a+ +e com2i)aci=n no uti)i%aremos
en)a%a+ores5 as que )os i-noraremos a 2artir +e a!ora"
1.2.": /nt0r'retes y m(quinas virtuales
3os )en-ua4es +e 2ro-ramaci=n que requieren ser tra+uci+os 2or com2i)a+or a c=+i-o m.quina se
))aman D)en-ua4es com2i)a+osE" En o2osici=n a )os )en-ua4es com2i)a+os encontramos )os
)en-ua4es inter2reta+os"
3os 2ro-ramas escritos en )en-ua4es inter2reta+os no se tra+ucen !asta e) momento +e ser
e4ecuta+os" 9ara e4ecutar)os es necesario que un soft<are a+iciona)5 ))ama+o Dintr2reteE5 )os )ea5
e4ecute )as instrucciones que en e))os se co+ifican"
/n 2ro-rama escrito en un )en-ua4e inter2reta+o se e4ecutar.5 2or tanto5 m.s )entamente que su
equi0a)ente com2i)a+o5 2rinci2a)mente 2orque ten+r. que estar com2artien+o e) !ar+<are con e)
intr2rete"
G#*,C !a si+o tra+iciona)mente un )en-ua4e inter2reta+o5 aunque !an e:isti+o tantas 0ersiones
+e G#*,C que es mu +ifci) ase-urar que to+as sean inter2reta+as"
/n conce2to 2areci+o a) +e )os )en-ua4es inter2reta+os )o encontramos en )as m.quinas 0irtua)es"
/na m.quina 0irtua) es un Dsimu)a+orEF sir0e 2ara simu)ar un or+ena+or +entro +e otro
or+ena+or"
Consi+rese e) si-uiente escenarioF nosotros +is2onemos +e un 9C con0enciona) 5 en un ataque
+e nosta)-ia5 +eseamos e4ecutar so6re ) un 2ro-rama +iseCa+o 2ara e) WX *2ectrum 48H +e
*inc)air5 que a )a sa%=n fue escrito en G#*,C 2ara e) s2ectrum 48H" *i +is2usiramos +e) c=+i-o
fuente en G#*,C +e) soft<are5 2o+ramos 6uscar un com2i)a+or 2ara nuestro or+ena+or +e)
mismo 2ro-rama5 o6ten+ramos un e4ecuta6)e 2ara e) 9C"
7o o6stante5 ima-nese e) )ector que no +is2one +e) c=+i-o fuente5 sino so)amente +e) c=+i-o
m.quina +e) *2ectrum" #?n !a una manera +e e4ecutar e) soft<areF !a que 6uscar un 2ro-rama
que inter2rete e) c=+i-o m.quina +e) *2ectrum como si se tratara +e un )en-ua4e inter2reta+o en
e) 9C" 1ic!o 2ro-rama e:iste5 se ))ama emu)a+or
4
"
;tro e4em2)o +e m.quina 0irtua) )o encontramos en )a m.quina 0irtua) +e 4a0aF 4a0a es un
)en-ua4e que5 a) com2i)arse5 -enera un c=+i-o m.quina 2ara una m.quina Dine:istenteE" 3os
fic!eros Y"c)ass son instrucciones en c=+i-o m.quina 2ensa+as 2ara e4ecutarse so6re una
m.quina 0irtua)F ca+a sistema o2erati0o +is2one +e su 2ro2io Demu)a+orE +e )a m.quina 0irtua)
+e 4a0a5 as es como se consi-ue que 4a0a sea un )en-ua4e ca2a% +e e4ecutarse en 0arias
2)ataformas" Ro)0eremos a este 2unto m.s a+e)ante"
1.2.#: l 'roceso de com'ilaci%n
$engua*e
$o+o )en-ua4e +e 2ro-ramaci=n est. forma+o 2or un con4unto +e Dsm6o)os 6.sicosE5 que se
a-ru2an 2ara formar )os e)ementos +e un D0oca6u)arioE5 +e )a misma manera que en )a )en-ua
es2aCo)a )as )etras se a-ru2an 2ara formar )as 2a)a6ras" 3os sm6o)os +e )os )en-ua4es +e
2ro-ramaci=n son )os caracteres que forman e) c=+i-o5 a sus D2a)a6rasE )es ))amaremos to+ens"
3as Dre-)asE +e un )en-ua4e in+ican c=mo 2ue+en o no a-ru2arse )os +iferentes toHens" # estas
re-)as se )as ))ama Dre-)as sint.cticasE" Es frecuente que e) 0oca6u)ario se +efina im2)citamente a)
4 3a 2osesi=n +e emu)a+ores en -enera) no constitue +e)ito5 2ero s sue)e ser)o estar en 2osesi=n +e co2ias no )e-timas +e)
soft<are +e m.quinas emu)a+as"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota <
%aptulo 16 3rem+ulos 1ecci(n 1.26 >reve repaso a la teora de compiladores
+efinir )as re-)as sint.cticas +e un )en-ua4e" #) con4unto +e re-)as sint.cticas +e un )en-ua4e se )a
))ama D-ram.ticaE"
E) con4unto +e )as re-)as sint.cticas +e) caste))ano es )a -ram.tica caste))ana"
9or ?)timo5 un )en-ua4e sue)e ir acom2aCa+o +e ciertas re-)as que com2)ementan a )as re-)as
sint.cticas" En e) )en-ua4e natura) uti)i%amos )a )=-ica )a memoria 2ara sa6er si una frase tiene
Dsenti+oE" 9or e4em2)o5 aunque en es2aCo) )a frase DE) se+iento 6e6i= un 0aso +e tierraE es
2erfectamente 0.)i+a a ni0e) -ramatica)5 +etectamos un error -racias a nuestro senti+o com?n"
,ases del proceso de compilacin
3o 2rimero que +e6e !acer un com2i)a+or es com2ro6ar que )a informaci=n que se )e suministra
2ertenece a su )en-ua4e (no !a errores ):icos5 sint.cticos ni sem.nticos)" *i es as5 e) intr2rete
+e6e re2resentar +e a)-una manera )a informaci=n que )e se )e suministr= 2ara 2o+er tra6a4ar con
e))a5 fina)mente tra+ucir +ic!a informaci=n a c=+i-o m.quina"
/n esquema +e +ic!o funcionamiento es e) que se muestra en )a si-uiente fi-ura"
C=+i-o
fuente
#n.)isis
sem.ntico
#n.)isis
sint.ctico
#n.)isis
):ico
Caracteres
$oHens
#*$
#*$
Generaci=n
+e c=+i-o
C=+i-o
m.quina
Ilustracin 1., Estructura "#sica de un compilador
# 2rimera 0ista 2o+emos +istin-uir que !a +os ti2os +e e)emento en +ic!o -r.ficoF )os
De)ementos acti0osE (fi-uras cerra+as) )os Df)u4os +e +atosE5 re2resenta+os como f)ec!as que
unen )os +iferentes e)ementos acti0os" *i entre )os e)ementos acti0os D#E DGE !a una f)ec!a
))ama+a DCE5 eso quiere +ecir que D#E 2ro+uce e) f)u4o +e +atos DCE5 que es usa+o 2or DGE"
#na)icemos 6re0emente ca+a e)emento ca+a f)u4oF
X C=+i-o fuenteF Es informaci=n a)macena+a en )a memoria +e un or+ena+or" *ue)e tratarse +e
uno o 0arios fic!eros +e te:to5 norma)mente en e) +isco +uro +e )a m.quina
&
" En estos fic!eros
!a cierta informaci=n cuo fin es 2ro0ocar ciertas acciones en una m.quina o64eti0o (que 2ue+e
no ser )a que est. Dinter2ret.n+o)osE)" 9ara e))o5 )os fic!eros son )e+os +e) +isco 2asa+os a )a
memoria5 conforman+o e) f)u4o +enomina+o DCaracteresE
6
"
X #n.)isis ):icoF Esta fase tiene que 0er con e) D0oca6u)arioE+e) que !a6).6amos m.s arri6a" E)
2roceso +e an.)isis ):ico a-ru2a )os +iferentes caracteres +e su f)u4o +e entra+a en to+ens. 3os
toHens son )os sm6o)os ):icos +e) )en-ua4e@ se aseme4an muc!o a )as 2a)a6ras +e) )en-ua4e
natura)" 3os toHens est.n i+entifica+os con sm6o)os (tienen Dnom6resE) sue)en contener
informaci=n a+iciona) (como )a ca+ena +e caracteres que )os ori-in=5 e) fic!ero en e) que est.n
)a )nea +on+e comien%an5 etc)" /na 0e% son i+entifica+os5 son transmiti+os a) si-uiente ni0e) +e
an.)isis" E) 2ro-rama que 2ermite rea)i%ar e) an.)isis ):ico es un ana)i%a+or ):ico" En in-)s se
)e sue)e ))amar scanner o lexer"
& L3os fic!eros 6inarios que se inter2retan tam6in e:istenN
6 Pue tam6in 2o+ra ser un f)u4o +e 6tes"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1
%aptulo 16 3rem+ulos 1ecci(n 1.26 >reve repaso a la teora de compiladores
9ara e4em2)ificar c=mo funciona un )e:er 0amos a usar un e4em2)oF 1a+o e) fra-mento +e c=+i-o
ima-inario si-uiente5 que 2o+ra ser0ir 2ara contro)ar un ro6ot en una f.6rica +e coc!es (2or
sim2)ici+a+5 su2onemos que es e) or+ena+or que rea)i%a e) an.)isis es e) +e) 2ro2io ro6ot5 es
+ecir5 no !a com2i)aci=n cru%a+a)F
Apretar (tuercas);
Pintar(chasis+ruedas);
E) ana)i%a+or ):ico +e) ro6ot 2ro+ucira )a si-uiente serie +e toHensF
RES_APRETAR PARENT_AB NOMBRE PARENT_CE PUNTO_COMA
RES_PINTAR PARENT_AB NOMBRE SIM_MAS NOMBRE PARENT_CE PUNTO_COMA
X #n.)isis sint.cticoF En )a fase +e an.)isis sint.ctico se a2)ican )as re-)as sint.cticas +e) )en-ua4e
ana)i%a+o a) f)u4o +e toHens" En caso +e no !a6erse +etecta+o errores5 e) intr2rete re2resentar.
)a informaci=n co+ifica+a en e) c=+i-o fuente en un Zr6o) +e *inta:is #6stracta5 que no es m.s
que una re2resentaci=n ar6=rea +e )os +iferentes 2atrones sint.cticos que se !an encontra+o a)
rea)i%ar e) an.)isis5 sa)0o que )os e)ementos innecesarios (si-nos +e 2untuaci=n5 2arntesis) son
e)imina+os" En a+e)ante ))amaremos #*$ a )os Zr6o)es +e *inta:is #6stracta"
E) c=+i-o que 2ermite rea)i%ar e) an.)isis sint.ctico se ))ama Dana)i%a+or sint.cticoE" En in-)s se
)e ))ama parser5 que si-nifica Ditera+orE o +irectamente anal!-er (Dana)i%a+orE)"
Continuan+o con e) e4em2)o anterior5 e) an.)isis ):ico +e) ro6ot 2ro+ucira un #*$ como e)
si-uienteF
PROGRAMA
INST_APRETAR INST_PINTAR
NOMBRE: tuercas EXPRESIN
+
NOMBRE: chasis NOMBRE: ruedas
Ilustracin 1.. Estructura de un /01 sencillo
E) ro6ot !a i+entifica+o +os instrucciones5 una +e Da2retarE otra +e D2intarE" 3os toHens +e) ti2o
D7;BG8EE tienen informaci=n a+iciona)" 9ara o2erar so6re 0arios o64etos a )a 0e% (como so6re
e) c!asis )as rue+as) se 2ue+en escri6ir 0arios nom6res uni+os 2or e) sm6o)o [+["
X #n.)isis sem.nticoF E) an.)isis sem.ntico +e) .r6o) #*$ em2ie%a 2or +etectar inco!erencias a ni0e)
sint.ctico en e) #*$" *i e) #*$ su2era esta fase5 es corriente enriquecer)o 2ara rea)i%ar un nue0o
an.)isis sem.ntico" Es +ecir5 es corriente efectuar 0arios an.)isis sem.nticos5 ca+a uno centra+o en
as2ectos +iferentes" 1urante stos an.)isis e) .r6o) es enriqueci+o mo+ifica+o"
Cua)quier !erramienta que rea)ice un an.)isis sem.ntico ser. ))ama+a Dana)i%a+or sem.nticoE en
este te:to" En )a 6i6)io-rafa in-)esa sue)en referirse a )os ana)i%a+ores sem.nticos como tree
parsers (o Ditera+ores +e .r6o)esE)"
En e) caso +e nuestro ro6ot5 2o+ramos consi+erar que aunque e) c!asis +e un coc!e se 2ue+a
2intar5 )as rue+as no son D2inta6)esE" 9or )o tanto se emitira un mensa4e +e error (a 2esar +e que e)
c=+i-o suministra+o fuese -ramatica)mente 0.)i+o) no continuara e) an.)isis" ,ma-inemos a!ora
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 11
%aptulo 16 3rem+ulos 1ecci(n 1.26 >reve repaso a la teora de compiladores
que e) o2erario +e) ro6ot se +a cuenta +e su error sustitue Drue+asE 2or D))antasE5 que s es
reconoci+o 2or e) ro6ot como a)-o que se 2ue+e 2intar" En ta) caso5 +a+a )a sim2)ici+a+ +e) #*$5
no es necesario enriquecer)o +e nin-una forma5 2or )o que se 2asara a )a si-uiente fase"
X Generaci=n +e c=+i-oF En esta fase se uti)i%a e) #*$ enriqueci+o5 2ro+ucto +e) 2roceso +e
an.)isis sem.ntico5 2ara -enerar c=+i-o m.quina" 7uestro ro6ot5 una 0e% e)imina+o e) error
sint.ctico +etecta+o5 -enerara e) c=+i-o 6inario necesario 2ara a2retar 2intar )os e)ementos
a+ecua+os5 2u+ien+o ser uti)i%a+o en e) futuro" 1ic!o c=+i-o (en ensam6)a+orA2araAro6ot) sera
2areci+o a) si-uienteF
mientras queden tuercas sin apretar
busca tuerca sin apretar.
aprieta tuerca.
sumergir chasis en pozo de pintura.
colocar llanta1 bajo ducha de sulfato. Esperar. Despejar ducha.
colocar llanta2 bajo ducha de sulfato. Esperar. Despejar ducha.
colocar llanta3 bajo ducha de sulfato. Esperar. Despejar ducha.
colocar llanta4 bajo ducha de sulfato. Esperar. Despejar ducha.
Desconectar.
L8ecor+emos que e) c=+i-o anterior est. co+ifica+o en 6inario5 to+o -enera+o a 2artir +e +os
)neas +e c=+i-o fuenteN E) com2i)a+or es un D2uenteE entre e) o2erario e) ro6ot5 que -enera 2or
e) ser !umano to+o e) c=+i-o re2etiti0o en 6inario insertan+o cuan+o es necesario e)ementos
au:i)iares (como )a or+en +e +escone:i=n5 que e) o2erario 2o+ra o)0i+arse +e intro+ucir)" Como
0emos e) uso +e )os com2i)a+ores aumenta )a 2ro+ucti0i+a+"
En este +ocumento nos 0amos a centrar en )as tres 2rimeras fases +e) an.)isis5 que son )as cu6iertas
2or #7$38 +e una manera no0e+osa con res2ecto a )os enfoques anteriores" /na 0e% rea)i%a+o e)
an.)isis sem.ntico5 )a -eneraci=n +e c=+i-o no se +iferenciar. muc!o +e como se !ara
anti-uamente"
1.2.+: 2&om'iladores de com'iladores3
3os com2i)a+ores son )as !erramientas que sir0en 2ara !acer 2ro-ramas5 2ero tam6in son
2ro-ramas"
OC=mo se !ace5 entonces5 un com2i)a+orQ
En )a 2rimera 2oca +e )a 2ro-ramaci=n5 no era inusua) 0er ensam6)a+ores construi+os
+irectamente en c=+i-o m.quina" 1e to+as maneras en cuanto e) 2rimer ensam6)a+or +ecente
a2areca5 to+o e) mun+o 2ro-rama6a en ensam6)a+or" 3os 2rimeros com2i)a+ores +e 6asic
esta6an5 2or )o tanto5 +esarro))a+os en ensam6)a+or"
8.2i+amente )a 2otencia +e )os or+ena+ores +e )os nue0os )en-ua4es 2ermiti= escri6ir )os
ensam6)a+ores com2i)a+ores en )en-ua4es +e a)to ni0e)" Io en +a e) ensam6)a+or se usa mu
2untua)mente5 en contro)a+ores +e !ar+<are en ciertas rutinas -r.ficas" E) resto +e) soft<are es
escrito en )en-ua4es +e 2ro-ramaci=n +e m.s a)to ni0e)5 como C5 C++ o 4a0a"
Ro)0ien+o a) 2asa+o5 )a maora +e) soft<are em2e%= a escri6irse en )en-ua4es +e m.s a)to ni0e)5
)a misma suerte corrieron )os com2i)a+ores"
#s5 cuan+o G4arne *tron-strou2 cre= e) 2rimer com2i)a+or +e C++5 )o !i%o 2ro-raman+o en un
)en-ua4e Dinterme+ioE entre C C++5 ))ama+o DC con ;64etosE (2 $it% 3"4ects)" E) com2i)a+or
+e) )en-ua4e C con ;64etos esta6a !ec!o en C5 e) 2rimer com2i)a+or +e C++ esta6a !ec!o en C
<it! ;64ects5 que 2r.cticamente no se uti)i%= 2ara otra cosa" ;tros com2i)a+ores +e C++ !an
si+o construi+os +irectamente en C5 L a)-unos com2i)a+ores +e C++ !an si+o escritos
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 12
%aptulo 16 3rem+ulos 1ecci(n 1.26 >reve repaso a la teora de compiladores
+irectamente en C++N
Ja fuera en ensam6)a+or o con uti)i%an+o un )en-ua4e interme+io5 e) 2ro6)ema +e escri6ir un
com2i)a+or Da manoE es que !a que rea)i%ar muc!as tareas mu re2etiti0as" /no no 2ue+e e0itar
tener )a im2resi=n +e que to+o se 2o+ra automati%ar enormemente"
Cuan+o se !i%o 2atente esta necesi+a+ +e automati%aci=n a2arecieron )as 2rimeras !erramientas
+e au+a a )a construcci=n +e com2i)a+ores" 3o que !acen estas !erramientas es -enerar c=+i-o
en un )en-ua4e +e 2ro-ramaci=n (C5 C++ m.s tar+e 4a0a) 2ara a!orrar a) 2ro-rama+or )a 2arte
re2etiti0a +e )a 2ro-ramaci=n +e com2i)a+ores5 2u+ien+o ste +e+icarse a) +iseCo"
Rarias uni0ersi+a+es construeron !erramientas +e este ti2o5 2ero fueron yacc lex )as que m.s
se !an e:ten+i+o5 ))e-an+o a consi+erarse Dest.n+aresE a )a !ora +e rea)i%ar un com2i)a+or"
#) 2rinci2io +e )os (05 *te2!en C" Jo!nson +esarro))= yacc (5et /not%er 2ompiler 2ompiler)
)a6oratorios Ge))5 usan+o un +ia)ecto 2orta6)e +e) )en-ua4e C" yacc es una !erramienta ca2a% +e
-enerar un ana)i%a+or sint.ctico en C a 2artir +e una serie +e re-)as +e sinta:is que +e6e cum2)ir"
1ic!as re-)as se es2ecifican en un )en-ua4e mu senci))o"
yacc se a2oa en )a !erramienta lex 2ara e) an.)isis ):ico" lex fue +esarro))a+a 2or Eric
*c!mi+t" lex tam6in fue +esarro))a+o en C5 tam6in -enera un ana)i%a+or en C"
lex yacc sir0ieron como 6ase a flex bison5 que se consi+eran sus !ere+eras" flex bison
son +os 2ro+uctos +e )a >*> ()ree 0o&t$are )oundation)" #ctua)mente son )as !erramientas m.s
uti)i%a+as en e) +esarro))o +e com2i)a+ores"
flex ()ast LE6ical anal!sis) es e) Dre)e0oE +e lex" >ue im2)ementa+o 2or Rern 9ar:son
Me0in Gon-5 6as.n+ose en )a im2)ementaci=n ori-ina) +e Jef 9osHan%er5 con muc!a au+a +e
Ran Jaco6son"
bison fue escrito 2rinci2a)mente 2or 8o6ert Cor6ett@ 8ic!ar+ *ta))man )o !i%o com2ati6)e con
yacc" \i)fre+ Iansen +e )a Carne-ie Be))on /ni0ersit )e aCa+i= otras 2restaciones como )os
)itera)es ca+ena +e m.s +e un car.cter"
Buc!o !a ))o0i+o +es+e que 6ison f)e: fueron escritos" #!ora e) 2roceso +e com2i)aci=n est.
m.s forma)i%a+o@ se a+mite am2)iamente que es necesario crear un .r6o) +e sinta:is a6stracta si
se quiere rea)i%ar un an.)isis sem.ntico correctamente" Es necesario crear recorrer +e una forma
estan+ari%a+a )os .r6o)es +e sinta:is a6stracta" Rarias uni0ersi+a+es5 entre e))as )a +e *e0i))a5
uti)i%an !erramientas 2ara )a construcci=n mane4o +e .r6o)es +e sinta:is a6stracta (hecta
esa)5 2ero nin-una !a com2arti+o e) :ito +e flex bison"
#7$38 es un soft<are +esarro))a+o en 4a0a 2or 0arios in+i0i+ua)es5 aunque )a i+ea inicia) )as
+ecisiones 2rinci2a)es +e +iseCo son +e $erence 9arr" En su 2roecto +e fin +e carrera5 $erence
2resenta6a una manera eficiente +e im2)ementar )os ana)i%a+ores 33 (m.s a+e)ante e:2)icaremos
)o que son)" 3os !a))a%-os 2resenta+os en esta tesis fueron )os que )e ))e0aron a im2)ementar
9CC$*5 que 2ue+e consi+erarse como )a Dsemi))aE +e #7$38"
9CC$* 2ermite -enerar ana)i%a+ores ):icos sint.cticos" 9ara recorrer )os .r6o)es +e sinta:is
a6stracta5 se +esarro))= un 2ro-rama com2aCero ))ama+o *;8CE8E8"
#7$38 !a sufri+o +os reescrituras com2)etas +es+e su inicio5 inc)uen+o e) cam6io +e) )en-ua4e
+e 2ro-ramaci=n uti)i%a+o (inicia)mente fue C) 0arios cam6ios +e nom6re" 3a 0ersi=n actua)
('"("') +ata +e enero +e '003" Es e) resu)ta+o +e unir 9CC$* *;8CE8E8 en un ?nico
soft<are"
Gracias a esta uni=n5 mientras que f)e: 6ison son !erramientas +e+ica+as a una so)a fase +e)
an.)isis5 #7$38 es ca2a% +e actuar a tres ni0e)es a )a 0e% (cuatro si tenemos en cuenta )a
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1-
%aptulo 16 3rem+ulos 1ecci(n 1.26 >reve repaso a la teora de compiladores
-eneraci=n +e c=+i-o)F
Ilustracin 1.7 2omparacin de las %erramientas
E) uso +e una so)a !erramienta 2ara to+os )os ni0e)es tiene 0arias 0enta4as" 3a m.s im2ortante es
)a Destan+ari%aci=nEF con #7$38 6asta con com2ren+er e) 2ara+i-ma +e an.)isis una 0e% 2ara
2o+er im2)ementar to+as )as fases +e an.)isis" Con flex+bison es necesario com2ren+er sa6er
uti)i%ar !erramientas com2)etamente +iferentes (f)e: est. 6asa+o en aut=matas finitos
+eterministas 6ison en un ana)i%a+or 3#38@ 2ero m.s so6re sto en )a si-uiente secci=n)5
a+em.s +e necesitar +e otras !erramientas 2ara rea)i%ar e) an.)isis sem.ntico"
Bostrar otras 0enta4as +e uti)i%ar #7$38 en )u-ar +e )os mto+os m.s Dtra+iciona)esE a )o
)ar-o +e) )i6ro"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1)
#n.)isis
sem.ntico
#n.)isis
sint.ctico
#n.)isis
):ico
f)e:
6ison
#7$38
Generaci=n
+e c=+i-o
%aptulo 16 3rem+ulos 1ecci(n 1.-6 Algoritmos de anlisis
Becci%n 1.3: Algoritmos de an(lisis
1.3.1: La sintaxis 4$5
(eglas 7sicas : B&,
En )a secci=n anterior !emos menciona+o que )os )en-ua4es 2ue+en ser es2ecifica+os me+iante un
con4unto +e re-)as que ))amaremos -ram.tica" En este a2arta+o 0eremos c=mo 0amos a
es2ecificar )as -ram.ticas"
1efiniremos )as -ram.ticas uti)i%an+o un )en-ua4e es2ecia)5 ))ama+o EG7>" EG7> es una
e:tensi=n +e) )en-ua4e G7>"
/na -ram.tica es un con4unto +e reglas" $o+a re-)a comien%a con un nom"re (o D2arte
i%quier+aE) se-ui+o 2or e) car.cter +e )os +os 2untos DFE" # continuaci=n a2arece e) cuerpo (o
D2arte +erec!aE) +e )a re-)a" $o+as )as re-)as terminan con e) car.cter +e 2unto coma D@E"
nombre : cuerpo ;
3as re-)as 2ue+en ser +e tres ti2osF a)ternati0as5 enumeraciones referencias a sm6o)os 6.sicos
+e) 0oca6u)ario o a otras re-)as"
E) ti2o +e re-)a m.s f)e:i6)e es )a a)ternati0a" 3as a)ternati0as sir0en 2ara e:2resar De)ecci=n entre
0arias o2cionesE" 3as +iferentes o2ciones +e )a re-)a se se2aran con un car.cter +e 6arra 0ertica)
D]E" 9or e4em2)o5 2ara in+icar que Dun 2erroE 2ue+e ser Dun fo:terrierE o Dun canic!eE o Dun
c!uc!oE 2o+emos escri6ir a)-o as"
perro: FOXTERRIER | CANICHE | CHUCHO ;
Iemos su2uesto que )os nom6res +e ti2os +e 2erro son sm6o)os 6.sicos +e) 0oca6u)ario"
/ti)i%aremos ma?scu)as 2ara referirnos a )os sm6o)os +e) 0oca6u)ario" #qu5 )a re-)a D2erroE se
satisface cuan+o en )a entra+a a2arecen e) sm6o)o FOXTERRIER5 CANICHE o CHUCHO
7
"
1a+o que es 2osi6)e insertar caracteres +e se2araci=n en cua)quier 2arte +e )a -ram.tica5 es usua)
insertar sa)tos +e )nea en )as a)ternati0as5 2ara faci)itar )a )ecturaF
perro: FOXTERRIER
| CANICHE
| CHUCHO
;
3a 6arra 0ertica) es un o2era+or intro+uci+o 2or como+i+a+" *i es necesario5 una re-)a con
a)ternati0as 2ue+e +efinirse tam6in as
8
F
perro: FOXTERRIER ;
perro: CANICHE ;
perro: CHUCHO ;
#+em.s sm6o)os +e) 0oca6u)ario5 se 2ue+en uti)i%ar otras re-)as" 9or e4em2)o5 o6sr0ese c=mo
se uti)i%a )a re-)a perro en )a re-)a cuadrpedoF
( Es usua) que )os sm6o)os termina)es5 es2ecia)mente )os toHens en e) ana)i%a+or sint.ctico5 se escri6an con ma?scu)as5
mientras que )os nom6res +e )as re-)as se escri6en con min?scu)as"
8 Esta sinta:is no 2ue+e em2)earse en #7$385 2ero s en 6ison"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 10
%aptulo 16 3rem+ulos 1ecci(n 1.-6 Algoritmos de anlisis
cuadrpedo : perro
| gato
| caballo
;
perro : ... /* definir perro */ ;
gato : ... /* definir gato */ ;
caballo : ... /* definir caballo */ ;
;6sr0ese que !emos inc)ui+o comentarios +e) esti)o +e C" #+mitiremos e) uso +e comentarios
+e una so)a )nea (con )a +o6)e 6arra5 D^^E) o +e 0arias )neas (entre D^YE DY^E)"
;tro ti2o +e re-)a mu uti)i%a+o es )a enumeracin" /na enumeraci=n no es m.s que una )ista
or+ena+a +e referencias (a otras re-)as o a e)ementos +e) 0oca6u)ario)" *ir0e 2ara reconocer
series +e e)ementos" 3os e)ementos sim2)emente se escri6en unos +etr.s +e otros5 en e) or+en
+esea+o5 se2ara+os 2or es2acios5 retornos +e carro o ta6u)aciones"
frase: EL cuadrpedo se_mova DEPRISA;
se_mova : CORRIA
| GALOPABA
;
En este caso )os sm6o)os 6.sicos +e) )en-ua4e son EL5 DEPRISA5 CORRIA GALOPABA (a+em.s +e
)os nom6res +e 2erros cita+os anteriormente)" frase se_mo0a son re-)as +e )a -ram.tica"
3a re-)a DfraseE 2ermite reconocer muc!as entra+as" 9or e4em2)o reconocer. )a entra+a DEL
FOXTERRIER CORRIA DEPRISAE5 tam6in DEL PERCHERN GALOPABA DEPRISAE5 asumien+o
que )a re-)a Dcua+r?2e+oE a+mita FOXTERRIER PERCHERN" 7=tese que otras entra+as no
ten+r.n tanto senti+o@ 2or e4em2)o5 si Dcua+r?2e+oE a+mite GATO_SIAMS5 entonces )a entra+a
DEL GATO_SIAMS GALOPABA DEPRISAE ser. consi+era+a 0.)i+a
9
"
En G7> es 2osi6)e uti)i%ar enumeraciones como su6 re-)as +e a)ternati0asF
frase: EL perro PERSEGUIA AL gato
| EL caballo COME PIENSO
| UN cuadrpedo TIENE CUATRO PATAS
;
9or ?)timo !a6)emos +e )os 2atrones re2etiti0os" 3os 2atrones re2etiti0os sir0en 2ara reconocer
Duno o m.s e)ementosE o Dcero o m.s e)ementosE"
En G7> )os 2atrones re2etiti0os +e6en im2)ementarse con )a recursi=n5 es +ecir5 con una re-)a
que se ))ame a s misma" 9or e4em2)o5 2ara reconocer una ))ama+a a una funci=n con una )ista +e
cero o m.s 2ar.metros5 !a6a que escri6ir a)-o asF
llamada: NOMBRE PARENT_AB listaParametros PARENT_CE ;
listaParametros : parametro listaParametros // regla recursiva
| /* nada */
;
parametro : ENTERO | NOMBRE ;
*u2onien+o que ENTERO re2resente cua)quier n?mero entero5 NOMBRE cua)quier i+entifica+or5
PARENT_AB e) 2arntesis a6ierto (D(E) PARENT_CE e) 2arntesis cerra+o (D)E)5 ten+remos que )a
re-)a anterior 2ermitir. reconocer entra+as como f(x)5 max(a,10) o getMousePos()" 7=tese
que 2ara 2o+er im2)ementar este con4unto +e re-)as !emos teni+o que uti)i%ar una a)ternati0a
0aca" *i se +esea que )as ))ama+as a funciones no 2ue+an tener 0a)ores 0acos5 es +ecir5 que su
9 Es +ecir5 sint.cticamente 0.)i+a" 3a inco!erencia aqu 2resenta+a es +e ti2o sem.ntico5 +e6era ser reconoci+a en )a fase +e
an.)isis sem.ntico"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1,
%aptulo 16 3rem+ulos 1ecci(n 1.-6 Algoritmos de anlisis
)ista +e 2ar.metros sea +e uno o m.s en )u-ar +e +e cero o m.s5 !a que escri6ir )o si-uienteF
llamada: NOMBRE PARENT_AB listaParametros PARENT_CE ;
listaParametros : parametro listaParametros
| parametro
;
parametro : ENTERO | NOMBRE ;
+B&,
En G7> no se 2ermite e) uso +e a)ternati0as como su6 re-)as +e una enumeraci=n" EG7> si )o
2ermite" 9ara e))o es recomen+a6)e uti)i%ar 2arntesisF
orden: PINTAR (RUEDAS|CHASIS) DE (AZUL|AMARILLO|VERDE);
7o con0iene a6usar +e esta ca2aci+a+5 2orque aunque )as su6 re-)asAenumeraciones se entien+en
mu 6ien5 )as su6 re-)asAa)ternati0as oscurecen muc!o e) senti+o +e )as re-)as" 3a re-)a anterior
se com2ren+era me4or asF
orden: PINTAR partePintable DE color ;
partePintable : RUEDAS|CHASIS ;
color : AZUL|AMARILLO|VERDE ;
3as su6 re-)as5 a+em.s5 a+miten cua)quier ni0e) +e enrai%amiento en EG7> (2ue+e insertarse una
su6 re-)a +entro +e una su6 re-)a !asta +on+e se +esee)"
#+em.s +e )a ca2aci+a+ +e Dsu6 re-)i%aci=nE5 EG7> su2era am2)iamente a G7> en e)
reconocimiento +e 2atrones re2etiti0os" 9ara e))o intro+uce +os o2era+ores nue0os F)a clausura
positiva (que se re2resenta con e) sm6o)o D+E) cierre de 'leene (que se re2resenta con e)
asterisco5 DYE)" Estos +os o2era+ores se em2)ean en con4unci=n con )os 2arntesis 2ara in+icar
re2etici=n" 3a c)ausura 2ositi0a in+ica Dsto se re2ite una o m.s 0ecesE mientras que e) cierre +e
M)eene in+ica Dcero o m.s 0ecesE" 9ara e) e4em2)o anterior +e )a ))ama+a a funci=n 2o+emos
escri6ir
llamada: NOMBRE PARENT_AB (parametro)* PARENT_CE ;
parametro : ENTERO | NOMBRE ;
si +eseamos Dcero o m.s 2ar.metrosE
llamada: NOMBRE PARENT_AB (parametro)+ PARENT_CE ;
parametro : ENTERO | NOMBRE ;
si +eseamos Duno o m.sE"
9or su2uesto5 tam6in 2o+emos uti)i%ar )a recursi=n (una re-)a 2ue+e ))amarse a s misma)
aunque en )a maora +e )os casos 6astar. con )os cierres c)ausuras"
1a+a )a natura)e%a mu)tiAsu6Are-)a +e EG7>5 se 2ue+en insertar o2ciones e inc)uso otras
c)ausuras +entro +e una c)ausura" En otras 2a)a6ras5 se 2ue+en escri6ir re-)as como )a si-uienteF
regla : (UN ( perro | gato ) NO ES UN caballo ) +
;
Esta re-)a reconoce una o m.s frases ne-an+o que 2erros o -atos sean ca6a))os" 9or e4em2)o5
ser0ira 2ara reconocer entra+as como DUN CANICHE NO ES UN PERCHERN UN PEQUINS NO
ES UN PURASANGREE"
#ni+ar m.s +e 3 ni0e)es +e re-)as es 2osi6)e (Linc)uso se 2ue+e escri6ir to+o un ana)i%a+or en una
so)a re-)aN)5 2ero no es recomen+a6)e 2orque )a -ram.tica resu)tante sera e:trema+amente +ifci)
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 17
%aptulo 16 3rem+ulos 1ecci(n 1.-6 Algoritmos de anlisis
+e mane4ar"
EG7> 2ermite +os ti2os a+iciona)es +e su6 re-)asF )a o2ciona)i+a+ )a ne-aci=n"
/na su6 re-)a o2ciona) se re2resenta con e) o2era+or +e o2ciona)i+a+5 que es )a interro-aci=n
([Q[)" 7orma)mente se uti)i%a en con4unci=n con )os 2arntesis" 3a su6 re-)a o2ciona) es una re-)a
que D2ue+e estar o 2ue+e no estar en )a entra+aE" 9or e4em2)oF
regla : UN perro (GRANDE)? NO ES UN caballo ;
Esta re-)a a+mite )a entra+a D/7 C#7,CIE 7; E* /7 9/8#*#7G8EE tam6in D/7
C#7,CIE GRAN?! 7; E* /7 9/8#*#7G8EE" Es +ecir5 DG8#71EE 2ue+e DestarE o Dno
estarE en )a entra+a" Es Do2ciona)E" E) o2era+or +e o2ciona)i+a+ no est. )imita+o a sm6o)os
6.sicos +e) )en-ua4eF se 2ue+e insertar su6 re-)as5 referencias a otras re-)as5 etc"
# ni0e) +e im2)ementaci=n5 #7$38 con0ierte )as re-)as o2ciona)es en a)ternati0as con una
a)ternati0a 0aca" #s5 #7$38 re2resenta internamente e) e4em2)o anterior +e esta maneraF
regla : UN perro (GRANDE | /*nada*/) NO ES UN caballo ;
E) sm6o)o +e )a ne-aci=n es )a ti)+e +e )a C ([`[)" *ir0e 2ara in+icar que se es2era una entra+a que
sea Dcua)quier entra+a que 7; satisfa-a esta re-)aE" 7orma)mente se uti)i%a en )os ana)i%a+ores
):icos" 9or e4em2)o5 una re-)a sim2)e 2ara reconocer comentarios en e) ana)i%a+or ):ico ser.
10
F
comentario : "/*"
(~("*/"))*
"*/" ;
/n comentario comien%a con )a ca+ena D^YE5 se-ui+o +e cero o m.s 0eces (e) cierre +e M)eene)
cua)quier cosa que no sea )a ca+ena +e terminaci=n5 DY^E" >ina)mente !a una ca+ena +e
terminaci=n"
Estos son )os o2era+ores 6.sicos +e EG7>@ #7$38 uti)i%a un +ia)ecto +e EG7> que aCa+e
a)-unos m.s@ )os iremos 2resentan+o conforme nos !a-an fa)ta"
Acciones
3a sinta:is EG7> sir0e 2ara +efinir )a 2arte Dana)ticaE +e )os reconoce+ores" Gastan )as re-)as
EG7> 2ara com2ro6ar )a a+ecuaci=n +e una entra+a"
7o o6stante5 en )a 2r.ctica5 un reconocimiento se rea)i%a con una intenci=n 2r.ctica que 0a m.s
a)). +e )a com2ro6ar que )a entra+a se a+a2ta a unas re-)as sint.cticas" 9or e4em2)o5 en muc!as
ocasiones +eseamos tra+ucir (a c=+i-o m.quina o a otra cosa) e) c=+i-o fuente" 9ara 2o+er ))e0ar
a trmino )a tra+ucci=n5 tanto G7> como EG7> intro+ucen un nue0o ti2o +e e)ementosF )as
acciones"
3as acciones son 2e+a%os +e c=+i-o nati0o que +e6en e4ecutarse a) ))e-ar a e))as" Est.n se2ara+as
2or ))a0es +e) resto +e) c=+i-o5 asF
r : A {System.out.println(Ha llegado una A);}
| B {System.out.println(Ha llegado una B);}
;
*i a) ana)i%a+or +efini+o 2or )a re-)a r se )e 2asa )a entra+a D#GG#E5 se o6ten+r. )a si-uiente
sa)i+a 2or )a conso)aF
10 Esta re-)a no tiene en cuenta )os sa)tos +e )nea"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1/
%aptulo 16 3rem+ulos 1ecci(n 1.-6 Algoritmos de anlisis
Ha llegado una A
Ha llegado una B
Ha llegado una B
Ha llegado una A
#unque es )o usua)5 )as acciones no tienen 2or qu estar a) fina) +e una re-)a@ 2ue+en estar
me%c)a+as con )os sm6o)os nom6res +e re-)as5 2ara ser in0oca+as cuan+o e) ana)i%a+or )as
encuentre"
$anto 6ison como #7$38 so2ortan re-)as (aunque5 como 0eremos5 6ison tiene a)-unos
2ro6)emas +e am6i-ae+a+ con e))as)"
/na +e )as 2rinci2a)es funciones +e una acci=n es )a +e tra6a4ar con informaci=n sint.ctica que se
asocia a )os e)ementos +e su re-)a (2rinci2a)mente .r6o)es #*$)"
En 6ison e) tra6a4o con .r6o)es +entro +e )as acciones es mu e:2)cito" 9rimero se +e6e +ec)arar
qu ti2o +e informaci=n sem.ntica -uar+ar. ca+a re-)a (uti)i%an+o %type)" 7o se 2ro2orciona
nin-?n ti2o +e im2)ementaci=n D2or +efectoE +e )os .r6o)es" 9ara referenciar )a informaci=n
sem.ntica +e una re-)a en 6ison se uti)i%an )os Dcomo+inesE +e) car.cter +o)ar (b)"
%type <ArbolSA> regla A B // ArbolSA debe ser implementado
...
regla: A B C {$$=f($1,$3);} ;
En e) c=+i-o anterior5 escrito se-?n )a notaci=n +e 6ison5 se est. es2ecifican+o que De) ArbolSA
+e )a re-)a r se o6tiene a) a2)icar )a funci=n f so6re )os ArbolSA +e A BE"
#7$38 es +iferente en 0arios as2ectos" 9ara em2e%ar5 )a construcci=n +e un .r6o) #*$ se
rea)i%a 2or +efecto (se 2ue+e +esacti0ar con )a o2ci=n buildAST -)o6a) o )oca)mente a una
re-)a)" #+em.s #7$38 2ro2orciona una im2)ementaci=n 2or +efecto +e )os .r6o)es (que
tam6in 2ue+e cam6iarse -)o6a) o )oca)mente)5 una manera estan+ari%a+a +e recorrer)os
11
"
Cuan+o se +esea referenciar e) .r6o) +e una re-)a5 6asta con uti)i%ar una etiqueta +e sm6o)o" 3a
etiqueta +e un sm6o)o a2arece +e)ante +e )5 unin+ose a ) con e) car.cter +e )os +os 2untos
([F[)" 1e esta forma5 e) c=+i-o equi0a)ente a) anterior en #7$38 ser. e) si-uienteF
r: a:A B c:C {#r = f (#a,#c);} ;
En ste caso se !an uti)i%a+o +os etiquetas5 a c" Como 2ue+e 0erse5 )a informaci=n +e )a re-)a
tam6in 2ue+e referenciarse uti)i%an+o )a ca6e%a +e )a re-)a" 7=tese que a 0eces es necesario
co)ocar e) car.cter a)mo!a+i))a +e)ante +e )as referencias en )a acci=n (!acer)o o no si-nifica
acce+er a +iferentes o64etos@ m.s so6re esto cuan+o sea necesario)"
4tros
#+em.s +e )as re-)as 6.sicas )as acciones5 #7$38 2ermite uti)i%ar 2re+ica+os sint.cticos
sem.nticos5 +e0o)0er 0a)ores +es+e )as re-)as 2asar)es 2ar.metros" 9resentar )os 2re+ica+os
sint.cticos en m.s a6a4o5 e) resto +e )as funciona)i+a+es cuan+o sean necesarias"
1.3.2: 26e arriba a abajo37 Anali8adores recursivos descendentes
/daptacin del artculo 8Exactl! 19:: $ords a"out compilers; disponi"le en %ttp<==$$$.antlr.org.
3os a)-oritmos +e an.)isis ))ama+os D+e arri6a a a6a4oE son )os a)-oritmos +e an.)isis m.s
intuiti0os" 9or e4em2)o5 su2on-amos que se +esea co+ificar un ana)i%a+or (sint.ctico) 2ara )a
si-uiente -ram.ticaF
11 9ara m.s informaci=n so6re construcci=n recorri+o +e .r6o)es +e informaci=n sint.ctica5 0anse )os ca2tu)os 6 ("
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1<
%aptulo 16 3rem+ulos 1ecci(n 1.-6 Algoritmos de anlisis
expresion : factor ;
factor : termino ( "+" termino )* ;
termino : atomo ( "*" atomo )* ;
atomo : "(" expresion ")"
| ENTERO
| IDENDIFICADOR
;
1on+e ENTERO e IDENTIFICADOR son a6re0iaturas que sim6o)i%an res2ecti0amente Dcua)quier
enteroE Dcua)quier i+entifica+orE5 +e0ue)tas a+ecua+amente en forma +e toHens 2or e) ni0e)
):ico"
*u2on+remos que e) an.)isis ):ico a est. rea)i%a+o5 nos +e0ue)0e un f)u4o +e toHens con )os
es2acios fi)tra+os con to+a )a informaci=n necesaria 2ara enteros e i+entifica+ores" Ca+a toHen
ser. +e0ue)to 2or un mto+o que ))amaremos Dsi-uiente$oHenE5 que +e0o)0er. )os enteros
ENTERO, IDENTIFICADOR, PARENTAB, PARENTCER, PRODUCTO SUMA.
Como 0eremos5 es muc!o m.s senci))o rea)i%ar e) an.)isis si e) resu)ta+o +e siguienteToken es
a)macena+o en una 0aria6)e5 ca+a 0e% que un nue0o toHen es i+entifica+o" # esta 0aria6)e )a
))amaremos D0aria6)e +e )ooHa!ea+E5 como 0eremos tiene muc!a im2ortancia"
$enemos que encontrar c=mo co+ificar e) an.)isis sint.ctico" $ras 2ensar)o un 2oco5 )o m.s
)=-ico es co+ificar e) reconocimiento +e ca+a re-)a en una funci=n in+e2en+iente"
9or e4em2)o5 e) mto+o en 4a0a 2ara ana)i%ar un .tomo ser. 2areci+o a) si-uienteF
public void atomo()
{
switch ( tokenActual ) {
case LPAREN : // -> "(" expr ")"
tokenActual = siguienteToken();
expresion();
if ( TokenActual != PARENTAB ) error;
tokenActual = siguienteToken();
break;
case ENTERO : // -> ENTERO
tokenActual = siguienteToken();
break;
case IDENTIFICADOR : // -> IDENTIFICADOR
tokenActual = siguienteToken();
break;
default :
error (falta PARENTAB, ENTERO O IDENTIFICADOR);
break;
}
}
3os ana)i%a+ores 2ro-rama+os +e esta forma se ))aman anali-adores recursivos descendentes"
*****
3os ana)i%a+ores recursi0os +escen+entes son un con4unto +e mto+os mutuamente recursi0os
(que se ))aman unos a otros)"
# )a !ora +e +eterminar qu a)ternati0a uti)i%ar5 nuestro ana)i%a+or se 6asa en e) si-uiente sm6o)o
que !a en )a entra+a" # +ic!o sm6o)o se )e ))ama sm6o)o +e loo+a%ead" 1a+o que so)amente
necesita un sm6o)o5 +ecimos que e) )ooHa!ea+ es 1"
3os ana)i%a+ores recursi0os +escen+entes se ))aman D+e arri6a a a6a4oE 2orque5 si se mira e)
an.)isis que rea)i%an +e forma ar6=rea5 em2ie%an con )a Dra%E +e +ic!o .r6o) 0an D!acia a6a4oE5
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2
%aptulo 16 3rem+ulos 1ecci(n 1.-6 Algoritmos de anlisis
i+entifican+o estructuras ca+a 0e% m.s sim2)es !asta ))e-ar a )os sm6o)os termina)es5 u D!o4as +e)
.r6o)E"
3os ana)i%a+ores recursi0os +escen+entes entran tam6in +entro +e )a cate-ora +e 33(1)5 que
si-nifica que )a entra+a se recorre +e +erec!a a i%quier+a uti)i%an+o un sm6o)o +e )ooHa!ea+"
$oo9a8ead G 1
3os ana)i%a+ores 33(1) +e6en 2o+er 2re+ecir qu 2atr=n coinci+ir. con )a entra+a uti)i%an+o
?nicamente e) 2rimer toHen que 2o+ra ser uti)i%a+o en ca+a a)ternati0a" #) con4unto +e )os
2rimeros toHens +e ca+a a)ternati0a +e una re-)a se )e ))ama 98,BE8;(re-)a)" #s5
>?I@E?3atomo={>/?EA1/B B EA1E?3 B IDEA1I)I2/D3?} "
Cuan+o )os con4untos 98,BE8; +e )as +iferentes a)ternati0as +e una re-)a no son +is4untas5 se
+ice que !a una am6i-ae+a+5 o que )a -ram.tica no es +eterminista" Es +ecir5 que a) re2etirse
uno +e )os toHens a) 2rinci2io +e m.s +e una a)ternati0a5 no es 2osi6)e sa6er cu.) +e )as +os
a)ternati0as es )a que se +e6e se-uir uti)i%an+o un so)o sm6o)o +e )ooHa!ea+"
9or e4em2)o5 )a si-uiente -ram.tica es am6i-ua so6re e) toHen # con un )ooHa!ea+ +e 1F
a : A B C ;
a : A D E ;
1a+o que )as +os a)ternati0as +e )a re-)a a comien%an con #5 un ana)i%a+or 33(1) no 2o+ra sa6er
cua) +e )as +os a)ternati0as uti)i%ar" *i e) ana)i%a+or 2u+iera D0erE e) toHen +e +es2us +e )a #5
entonces no !a6ra nin-?n 2ro6)ema"
E) conce2to +e 33(1) 2ue+e e:ten+erse a 33(H)5 con HV1" #s5 con un ana)i%a+or 33(') no
ten+ra +ificu)ta+es con )a -ram.tica anterior" H es )a )etra 2or antonomasia 2ara !a6)ar +e)
)ooHa!ea+"
Cuan+o 2ara una -ram.tica +a+a se 2ue+e +efinir un ana)i%a+or 33(H) sin am6i-ae+a+es como )a
anterior5 se +ice que +ic!a -ram.tica es 33(H)" /n )en-ua4e 2ara e) que e:iste una -ram.tica 33
(H) tam6in se ))ama 33(H)"
Cuan+o e) )ooHa!ea+ no es suficiente 2ara reconocer una re-)a5 e:isten +i0ersos 2roce+imientos
2ara +escom2oner)a" #)-unos +e e))os son )a factori%aci=n +e 2refi4os comunes )a e)iminaci=n
+e )a recursi=n" E) 2ro6)ema +e estos 2roce+imientos es que transforman )a -ram.tica +e manera
que )a resu)tante es menos com2rensi6)e 2ara )os seres !umanos"
+nriAueciendo el algoritmo: pred<$$H9I
Ja !emos 0isto )os fun+amentos te=ricos m.s 6.sicos +e )os ana)i%a+ores 33(H)" Esta 0isi=n +e6e
com2)etarse con )o que sa6emos +e )a 2r.ctica"
/na +e )as 2rimeras cosas que sa6emos +e )a 2r.ctica es que en )os )en-ua4es +e 2ro-ramaci=n
!a un ni0e) sem.ntico que 0iene +es2us +e) sint.ctico" /ti)i%an+o !.6i)mente )a informaci=n
sem.ntica +e un )en-ua4e 2o+emos e0itar incrementar H sin caer en am6i-ae+a+es" Consi+rese e)
si-uiente e4em2)oF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 21
%aptulo 16 3rem+ulos 1ecci(n 1.-6 Algoritmos de anlisis
instruccion : bucle
| asignacion
| break PUNTO_COMA
;
asignacion : IDENT ASIG espresion PUNTO_COMA;
bucle : MIENTRAS PARENT_AB expresion PARENT_CE listaInstrucciones ;
listaInstrucciones : LLAVE_AB (instruccion)* LLAVE_CE ;
En este caso estamos +icien+o que una instrucci=n 2ue+e ser un 6uc)e5 o una asi-naci=n o )a
2a)a6ra reser0a+a D6reaHE5 que so)amente sir0e 2ara sa)ir +e un 6uc)e"
E) 2ro-rama+or 2ue+e +esear restrin-ir e) uso +e break instrucciones uti)i%a+as en )os 6uc)es5 +e
manera que )a 2a)a6ra reser0a+a so)amente se 2u+iera uti)i%ar +entro +e un 6uc)e5 +etect.n+ose
un error en caso contrario" /na 2rimera o2ci=n sera uti)i%ar re-)as +iferentes 2ara )as
instruccines +e +entro fuera +e )os 6uc)es5 asF
instruccion : bucle
| asignacion
;
instruccion_bucle : instruccion
| break PUNTO_COMA
;
bucle : MIENTRAS PARENT_AB expresion PARENT_CE listaInstrucciones_bucle
;
listaInstrucciones_bucle : LLAVE_AB (instruccion_bucle)* LLAVE_CE ;
asignacion : IDENT ASIG espresion PUNTO_COMA;
*in em6ar-o #7$38 ofrece otra 2osi6i)i+a+F )os predicados sem#nticos" 9o+emos uti)i%ar una
0aria6)e que in+ique si )a instrucci=n que estamos reconocien+o est. +entro +e un 6uc)e o no"
*u2on-amos que +ic!a 0aria6)e se +ec)ara en )a %ona +e c=+i-o nati0o +e) ana)i%a+or como
miem6ro +e )a c)ase" En ta) caso 2o+ra im2)ementarse asF
{
int nivelBucle = 0 ; // break ser vlido si nivelBucle > 0
}
instruccion : bucle
| asignacion
| {nivelBucle>!" break PUNTO_COMA
;
bucle : MIENTRAS PARENT_AB expresion PARENT_CE
{ nivelBucle##; !
listaInstrucciones
{ nivelBucle$$; !
;
#) a)-oritmo +e an.)isis 33(H) que uti)i%a este ti2o +e 2re+ica+os se )e ))ama 2re+A33(H)"
9re+A33(H) 2ue+e a+em.s uti)i%ar otro ti2o +e 2re+ica+os5 que a 2esar +e !a6er +e4a+o 2ara e)
fina) no +e6en consi+erarse menos im2ortantesF )os predicados sint#cticos"
Consi+rese )a si-uiente -ram.ticaF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 22
%aptulo 16 3rem+ulos 1ecci(n 1.-6 Algoritmos de anlisis
a : (A)* B
| (A)* C
;
*ea cua) sea e) )ooHa!ea+ em2)ea+o5 e) a)-oritmo 33(H) com?n siem2re encontrar. una
am6i-ae+a+ (2ara una entra+a en )a que # se re2ita m.s +e H 0eces5 no 2o+r. e)e-ir entre )a
2rimera )a se-un+a re-)a)" *e +ice entonces que esta -ram.tica es noA33(H) 2ara to+o H"
*in em6ar-o 2)antemonos escri6ir )a -ram.tica +e esta otra formaF
a : ( (A)* B )=> (A)* B
| (A)* C
;
3o que se !a aCa+i+o +e)ante +e )a 2rimera a)ternati0a +e )a re-)a es un predicado sint#ctico"
cste en concreto 2ermite a) ana)i%a+or +eci+ir a)-o que a nosotros nos 2arece o60ioF que 2ara
e)e-ir )a 2rimera o2ci=n" En otras 2a)a6ras5 el predicado sint#ctico est# extendiendo el
loo+a%ead %asta donde %ace &alta (en este caso in+efini+amente)"
1.3.3: 26e abajo a arriba37 anali8adores LR
Extrado del artculo 8Exactl! 19:: $ords a"out compilers; en %ttp<==$$$.antlr.org.
E) a)-oritmo 38 es un a)-oritmo +e an.)isis D+e a6a4o a arri6aE (o "ottomCup) +e6i+o a) or+en en
e) que ana)i%a e) f)u4o +e sm6o)os +e entra+aF em2ie%a 2or )os sm6o)os Dm.s termina)esE +e )a
-ram.tica5 que 2ue+en 0erse como D!o4asE +e) .r6o) +e an.)isis5 0a construen+o no+os ca+a
0e% m.s com2)e4os !asta ))e-ar a )a re-)a ra%"
/na manera sim2)e +e i)ustrar e) a)-oritmo 38 es consi+eran+o un )en-ua4e sim2)e como e) +e )a
si-uiente -ram.ticaF
a : A B C
| A B D
;
9or como+i+a+ 0amos a reformu)ar)a +e esta otra manera
1'
F
a : A B C ;
a : A B D ;
/n ana)i%a+or 38 consta +e una D2i)a +e sm6o)osE en )a que 2ue+e Da2i)ar +esa2i)arE )os
sm6o)os que )e ))e-an 2or )a entra+a )as Dca6e%asE +e )as re-)as +e )a -ram.tica que ana)i%a" En
nuestro caso sera ca2a% +e a2i)ar +esa2i)ar #5G5C51 a"
G.sicamente5 )o que !ace e) a)-oritmo 38 es ir Dconsumien+oE sm6o)os +e )a entra+a 5
intentan+o !acer corres2on+er )os e)ementos a2i)a+os con a)-una +e )as re-)as +e )a -ram.tica5
2ara !acer una sustituci=n"
Como e4em2)o5 su2on-amos que )a entra+a que se )e suministra a) fic!ero es D#G1E" E)
a)-oritmo transcurrira entonces +e )a si-uiente maneraF
1" E) ana)i%a+or DconsumeE # +e )a entra+a"
'" Como # es e) 2rinci2io +e )as +os a)ternati0as 2osi6)es5 se consume e) si-uiente sm6o)o5 que
resu)ta ser G"
3" 1e nue0o estamos ante e) mismo 2ro6)emaF )as +os a)ternati0as comien%an 2or #G5 as que se
1' Esta sinta:is no es 0.)i+a en #7$385 2ero s en 6ison"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2-
%aptulo 16 3rem+ulos 1ecci(n 1.-6 Algoritmos de anlisis
consume e) si-uiente sm6o)o +e )a entra+a5 es +ecir5 1"
4" En este 2unto e) ana)i%a+or a est. en +is2osici=n +e i+entificar )a entra+a actua) con )a
se-un+a a)ternati0a5 as que e)imina )os tres sm6o)os (#G1) +e )a 2i)a en su )u-ar co)oca
una a"
#) 2roceso +e DconsumoE +e un sm6o)o se )e ))ama +es2)a%amiento Ds%i&tE" /n +es2)a%amiento
consiste 2ues en retirar un sm6o)o +e )a entra+a a2i)ar)o en )a 2i)a +e sm6o)os"
#) 2roceso +e Dsustituci=n +e unos sm6o)os 2or )a 2arte +erec!a +e una re-)aE se )e +enomina
re+ucci=n DreduceE" /na re+ucci=n consiste en +esa2i)ar a)-unos sm6o)os +e )a 2i)a a2i)ar )a
2arte +erec!a +e una re-)a"
*****
+l loo9a8ead
E:isten -ram.ticas m.s com2)e4as que )a que !emos uti)i%a+o como e4em2)o en )as que no es
2osi6)e a0eri-uar qu re-)a se +e6e a2)icar miran+o ?nicamente e) conteni+o +e )a 2i)a@ a 0eces es
necesario tener en cuenta 0arios e)ementos +e )a entra+a antes +e 2o+er !acer una re+ucci=n" #)
n?mero +e e)ementos que !a que tener en cuenta se )e ))ama tam6in loo+a%ead5 tam6in se
re2resenta con )a )etra H" # )as -ram.ticas 38 con un )ooHa!ea+ H se )es +enomina 38(H)"
1a+o que en e) e4em2)o nos !a 6asta+o con mirar )os e)ementos +e )a 2i)a 2ara !acer )as
re+ucciones5 2o+emos conc)uir que )a -ram.tica +e e4em2)o es 38(0)"
Implementacin
# un ni0e) mu 6.sico 2o+emos +ecir que tanto 38 como 33 2ue+en im2)ementarse usan+o
aut=matasF en )as +os im2)ementaciones a2arecen Desta+osE5 2ara 2asar +e esta+o a esta+o5
DtransicionesE" 3a +iferencia est. 2ues en c=mo est.n co+ifica+os +ic!os esta+os transiciones"
En 33 es senci))oF ca+a esta+o es una funci=n que re2resenta una a)ternati0a" 3as transiciones a
otros esta+os se so)ucionan con un sim2)e DswitchE (o una serie +e DifAe)seAifEs ani+a+os5 si
HV1)" Ca+a re-)a EG7> se corres2on+e un0ocamente a un esta+o +e) aut=mata5 +e manera que
e) n?mero +e esta+os +e) aut=mata no aumenta si-nificati0amente a) crecer e) )ooHa!ea+ (aunque
)a com2)e4i+a+ +e )as com2ro6aciones a rea)i%ar en ca+a aut=mata s que aumenta
e:2onencia)mente con H)" 3as transiciones se re2resentan con ))ama+as a mto+os"
En o2osici=n a 335 +on+e so)amente es 2osi6)e estar reconocien+o una re-)a ca+a 0e%5 )a
natura)e%a +e) a)-oritmo 38 sus +eri0a+os !ace 2osi6)e que5 en un instante +etermina+o5 una
entra+a 2ue+a satisfacer 0arias re-)as simu)t.neamente" Ca+a esta+o +e un ana)i%a+or 38
contiene +e esta manera 0arias re-)as que D2or e) momentoE son cum2)i+as 2or )a entra+a" E)
D-ra+o +e satisfacci=nE +e ca+a re-)a se re2resenta con un car.cter es2ecia)5 un 2unto (["[) que
comien%a estan+o a) 2rinci2io +e) cuer2o +e )a re-)a !asta ))e-ar a) e:tremo +erec!o5 momento en
e) que se consi+era que )a entra+a satisface com2)etamente )a re-)a" 3as transiciones entre
esta+os son o2eraciones +e consumici=n +e e)ementos en )a entra+a"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2)
%aptulo 16 3rem+ulos 1ecci(n 1.-6 Algoritmos de anlisis
Ilustracin 1.9 /utmata L? para una gram#tica de * reglas
En )a fi-ura anterior se muestra e) aut=mata 38 2ara un con4unto +e 4 re-)as sim2)es
(re2resenta+as en e) cua+ro)" 7=tese que e) )ooHa!ea+ +e )os esta+os tam6in es un e)emento
+iferencia+orF +os esta+os con )as mismas re-)as 2ero +iferentes con4untos +e e)ementos en e)
)ooHa!ea+ se consi+eran +os esta+os +iferentes"
E) n?mero +e esta+os +e un aut=mata 38 es e)e0a+oF aumenta e:2onencia)mente a) crecer e)
n?mero +e re-)as a) aumentar e) )ooHa!ea+"
3a im2)ementaci=n m.s com?n +e) aut=mata 38 es una ta6)a 6i+imensiona) en )a que se co+ifican
)as transiciones5 sien+o )os esta+os )as fi)as +e )a ta6)a5 )os sm6o)os )as co)umnas" *i en )a
casi))a en )a que interseccionan e) sm6o)o * e) esta+o E1 a2arece una E'5 eso quiere +ecir que
si e) ana)i%a+or se encuentra en e) esta+o E1 en )a entra+a a2arece e) sm6o)o *5 entonces se
re+uce se 2asa a) esta+o E'" /na transici=n se im2)ementa +e una forma mu eficiente@ se trata
sim2)emente +e cam6iar e) 0a)or +e un 2untero"
9or esta im2)ementaci=n a )os ana)i%a+ores 38 se )es sue)e ))amar mane4ados por ta"las Dta"leC
drivenE"
3as am6i-ae+a+es en un ana)i%a+or 38 ocurren cuan+o en un esta+o +a+o 2ara una entra+a
+a+a e) ana)i%a+or es ca2a% +e !acer un +es2)a%amiento o una re+ucci=n" # esto se )e ))ama
con&licto s%i&tCreduce" 3os conf)ictos s!iftAre+uce no im2i+en que e) ana)i%a+or se -enere@ ste se
-enera5 con e) corres2on+iente mensa4e +e error5 co)oc.n+ose un com2ortamiento D2or +efectoE
a) ana)i%a+or cuan+o se ))e-a a se esta+o con esa entra+a (e) ana)i%a+or siempre despla-a o
siempre reduce)" *i ste es e) a+ecua+o5 )a -ram.tica funciona 2erfectamente5 2ero si se necesita
e) contrario estamos en un 2equeCo a2rieto"
Gison uti)i%a una 0ariante +e) a)-oritmo 38(1) ))ama+a 3#38(1)5 que re+uce ostensi6)emente e)
n?mero +e esta+os necesarios sin +isminuir +emasia+o )a 2otencia +e) an.)isis"
1.3.": &om'araci%n entre LR9:; y LL9:;
;otencia
3os ana)i%a+ores 38(H) son m.s 2otentes que )os ana)i%a+ores LL97; 2orque )a estrate-ia 38
uti)i%a un contexto m.s -ran+e" E) conte:to 2ara un ana)i%a+or 38(H) son to+as )as re-)as +e )a
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 20
S': .S , $
S : .Sa , $
S : .a , $
S : .bSb , $
S : .Sa , a
S : .a , a
S : .bSb , a
S': S. , $
S : S.a , $
S : S.a , a
S : Sa., $/a
S : a., a/b
S : b.Sb , $/a
S : .Sa , a/b
S : .a , a/b
S : .bSb , a/b
S : bS.b, $/a
S : S.a , a/b
S : bSb. , $/a S : Sa. , a/b
S
b
a
a
S
b a
S : b.Sb , a/b
S : .bSb , a/b
S : .Sa , a/b
S : .a , a/b
b
S : bS.b , a/b
S : S.a , a/b
S
S : bSb. , a/b
a
b
S': SaS
S : Sa
S : a
S : bSb
%aptulo 16 3rem+ulos 1ecci(n 1.-6 Algoritmos de anlisis
-ram.tica que concuer+an con )a entra+a que se est. 0ien+o" ,ntuiti0amenteF intenta !acer
coinci+ir 0arias a)ternati0as a )a 0e% 2os2one )a toma +e +ecisiones !asta que se !aa 0isto
suficiente entra+a" 9ara un ana)i%a+or 33 e) conte:to es menor@ est. restrin-i+o a )a secuencia +e
re-)as que a !an si+o ana)i%a+as )a 2osici=n +entro +e )a re-)a que se est. ana)i%an+o" 9or )o
tanto5 )os ana)i%a+ores 33(H) +e2en+en muc!o +e) )ooHa!ea+" 7=tese que )a -ram.tica uti)i%a+a
como e4em2)o 2ara e) a)-oritmo 38 es 38(0) 33(3)"
9or otro )a+o5 )os ana)i%a+ores predKLL97; (no so)amente 33(H)5 sino 2re+A33(H)) son m.s
2otentes que )os ana)i%a+ores 38(H) 2or 0arias ra%ones" 9rimeraF )os 2re+ica+os sem.nticos
2ue+en ser uti)i%a+os 2ara ana)i%ar )en-ua4es +e2en+ientes +e) conte:to" *e-un+aF )os
ana)i%a+ores 2re+A33(H) tienen )ooHa!ea+ i)imita+o" $erceraF aCa+ir acciones a una -ram.tica 38
2ue+e 2ro+ucir am6i-ae+a+es5 cosa que no ocurre con )os ana)i%a+ores 33(H)"
Jelocidad
9or )o -enera)5 un ana)i%a+or 33(H) es a)-o m.s )ento que su equi0a)ente 38"
#) aumentar e) )ooHa!ea+5 aumenta e:2onencia)mente )a com2)e4i+a+ +e) ana)i%a+or" J este
aumento !ace que e) com2i)a+or sea ca+a 0e% m.s -ran+e ()o que no im2orta +emasia+o) m.s
)ento ( esto s que im2orta)" Con )os or+ena+ores actua)es se 2ue+e tra6a4ar m.s o menos
c=mo+amente con un )ooHa!ea+ +e 3 o 4"
#7$38 usa una 0ersi=n am2)ia+a +e 33(H) ))ama+a 2re+A33(M)" E) a)-oritmo 2re+A33(H) fue
2resenta+o 2or 2rimera 0e% 2or $erence 9arr en su tesis +e fina) +e carrera" 3o 2rimero que !i%o
$erence fue un estu+io esta+stico so6re +iferentes -ram.ticas +e '0 )en-ua4es +e 2ro-ramaci=n
corrientes" 3o que +escu6ri= fue que m.s +e) 98d +e )as re-)as uti)i%a+as necesita6an +e un
)ooHa!ea+ 1"
3a i+ea que si-ui= a) an.)isis es c)araF $erence im2)ement= un ana)i%a+or con )ooHa!ea+ 0aria6)e5
que norma)mente tra6a4a con un 0a)or +e H 2equeCo (2or +efecto 1)5 am2)i.n+o)o so)amente en
)as re-)as que )o requeran" 9ara e))o aCa+i= 2re+ica+os (+e a! e) sufi4o D2re+E") es2ecia)es a )as
re-)as que necesita6an un )ooHa!ea+ maor" Esto aument= enormemente )a 2otencia +e)
a)-oritmo5 2u+in+ose )eer a)-unas -ram.ticas noA33(H) 2ara nin-?n H"
*in em6ar-o e) a)-oritmo se-ua sien+o +emasia+o )entoF En ca+a esta+o 2re+A33(H) es necesario
efectuar com2araciones con m
H
e)ementos5 sien+o m e) n?mero +e sm6o)os que 2o+an se-uir a
)a re-)a en )a entra+a (e) con4unto *,G/,E7$E +e )a re-)a)"
$erence +iseC= una nue0a manera +e ca)cu)ar e) con4unto *,G/,E7$E +e manera que e) n?mero
+e com2ro6aciones a rea)i%ar creca +e forma )inea) a) aumentar H5 en )u-ar +e +e forma
e:2onencia)" Es +ecir5 e) n?mero +e com2ro6aciones a rea)i%ar se !i%o mYH" Esta transformaci=n
+e) )ooHa!ea+ tiene e) incon0eniente +e que !ace que e) ana)i%a+or no sea 33(H) 2uro5 es +ecir5
que no reconoce to+as )as -ram.ticas 33(H)" #) ana)i%a+or 33(H) que uti)i%a e) )ooHa!ea+
mo+ifica+o +e $erence se )e ))ama *tron-A33(H)5 o *33(H)" 9or )o tanto5 e) a)-oritmo que uti)i%a
ant)r +e6era ))amarse 2re+A*33(H)" Iemos o60ia+o este !ec!o 2orque )as -ram.ticas +e )os
)en-ua4es +e 2ro-ramaci=n son en su -ran maora *33(H)"
#na)icemos a!ora e) a)-oritmo que uti)i%a 6ison" 3os or+ena+ores que e:istan cuan+o fue crea+o
acc5 e) 2re+ecesor +e 6ison5 no eran ca2aces +e Da-uantarE ni siquiera e) n?mero +e esta+os +e
una -ram.tica 38(1)" 9or )o tanto 2ara im2)ementar acc se uti)i%= un +eri0a+o +e 38(1)
))ama+o 3#38(1)" 3#38(1) uti)i%a menos esta+os que 38(1)5 2or )o tanto es menos 2otente"
7o o6stante5 )as -ram.ticas +e )os )en-ua4es +e 2ro-ramaci=n sue)en ser 3#38"
1e esta forma )os ana)i%a+ores 6asa+os en 6ison o6tienen una -ran ra2i+e% +e transici=n
(cam6ios en un 2untero so6re una ta6)e) un n?mero re)ati0amente 6a4o +e esta+os5 a) uti)i%arse
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2,
%aptulo 16 3rem+ulos 1ecci(n 1.-6 Algoritmos de anlisis
como a)-oritmo +e an.)isis 3#38 estar fi4a+o e) )ooHa!ea+ a 1
13
"
Como me+ia se o6ser0a un incremento +e a)re+e+or '0d en e) tiem2o +e com2i)aci=n +e un
com2i)a+or 33 frente a su equi0a)ente 385 +isminuen+o esta +iferencia a) aumentar e) n?mero
+e esta+os"
*in em6ar-o esta me+ici=n es 6astante te=ricaF su2one un an.)isis sin acciones" Como seCa)an )os
crea+ores +e 3/#
14
5 )a com2)e4i+a+ +e )as acciones tam6in !a +e ser teni+a en cuenta a )a !ora
+e e0a)uar )a 0e)oci+a+" 3/# es un 2roecto que comen%= sien+o +esarro))a+o con 6ison f)e:5
2ero que a) ca6o +e) tiem2o se +eci+i= uti)i%ar aut=matas recursi0os +escen+ientes !ec!os a
mano (mu simi)ares a )os que -enera #7$38)" /na +e )as ra%ones que +ieron 2ara e))o es e)
mane4o +e atri6utos !ere+a+os sinteti%a+osF )as 2ecu)iari+a+es +e) a)-oritmo 38 )es o6)i-aron a
uti)i%ar una 2i)a +e +atos5 en )a que a2i)a6an )a informaci=n que +e6an 2asar a )as su6 re-)as"
/ti)i%an+o #7$38 se 2rescin+e +e +ic!a 2i)aF )as 0aria6)es )oca)es5 2ar.metros 0a)ores
+e0ue)tos 2or )as re-)as )a !acen com2)etamente innecesaria"
En casos como e) anterior una transici=n entre esta+os 33 2ue+e ser inc)uso m.s r.2i+a que una
entre esta+os 38F mientras que 38 se uti)i%a una 2i)a D!ec!a a manoE5 33 usa )a 2ro2ia 2i)a +e
e4ecuci=n +e) 2ro-rama5 que sue)e estar m.s o2timi%a+a"
,acilidad de uso
3as caractersticas +e )os a)-oritmos 38(H) 2re+A33(H) !acen que )a forma +e tra6a4ar con e))os
sea +iferente"
/n ana)i%a+or 38(H) ocu)ta m.s informaci=n +e c=mo act?a a) 2ro-rama+or@ ste sim2)emente se
)imita a escri6ir )as re-)as5 e) 2ro-rama funciona" E) 2ro-rama+or no necesita conocer e)
a)-oritmo 38(H) 2ara escri6ir una -ram.tica" ;casiona)mente e) -enera+or +e ana)i%a+ores
comunicar. conf)ictos +e s!iftAre+uce5 2ero 2or re-)a -enera) se 2ue+en i-norar sin maor
2ro6)emaF )a acci=n 2or +efecto +e) -enera+or sue)e ser )a correcta" 1e esta forma es mu norma)
que un com2i)a+or 38 ten-a 0arios conf)ictos s!iftAre+uce5 so6re to+o si se trata +e un
com2i)a+or 3#38(1)"
/n ana)i%a+or 2re+A33(H) requiere5 sin em6ar-o5 un 2oco m.s +e atenci=n@ en cuanto e)
2ro-rama+or escri6a +os 2ro+ucciones con e) mismo con4unto 98,BE8; e) ana)i%a+or se ne-ar.
a com2i)ar@ ser. necesario incrementar e) )ooHa!ea+5 6ien su6ien+o H o 6ien aCa+ien+o
2re+ica+os sint.cticos a +ic!as re-)as" csto !ace que escri6ir con #7$38 sea (un 2oco) m.s
)a6orioso que !acer)o con 6ison" 1e to+as formas !a que tener en cuenta que en m.s +e) 98d
+e )as ocasiones no necesitaremos aumentar H"
#+em.s5 arre-)ar estos conf)ictos es muc!os m.s f.ci) que arre-)ar un conf)icto s!iftAre+uce +e
un com2i)a+or 38" Como un ana)i%a+or 33 no com2i)a si tiene conf)ictos5 es m.s Dse-uroE que
un ana)i%a+or 38 (en e) que es 2osi6)e -enerar un ana)i%a+or con conf)ictos)"
;tro 2unto interesante +e )a faci)i+a+ +e uso son )as accionesF en 385 )as acciones intro+ucen
nue0os esta+os en )a ta6)a +e esta+os que 2ue+en aCa+ir inco!erencias" En otras 2a)a6ras5 un
reconoce+or 38 sin conf)ictos 2ue+e +e4ar +e funcionar correctamente a) aCa+ir)e acciones" 3os
reconoce+ores 335 sin em6ar-o5 son im2ermea6)es a ste ti2o +e 2ro6)emas"
>ina)mente5 e) c=+i-o -enera+o +e un aut=mata recursi0o +escen+ente es f.ci)mente )e-i6)e 2or
un !umano5 a) corres2on+erse ca+a re-)a con un esta+o" /no 2ue+e !acerse una i+ea mu e:acta
+e )o que est. !acien+o e) ana)i%a+or en ca+a instante5 2orque -enera un c=+i-o 2areci+o a) que
una 2ersona -enerara a) im2)ementar e) com2i)a+or a mano"
13 /n )ooHa!ea+ tan 2equeCo tiene e) incon0eniente +e )a 2r+i+a +e 2otenciaF 2re+A*33(H) reconoce m.s )en-ua4es que 3#38(1)
14 3/# es un )en-ua4e em6e6i6)e )i6re que se +esarro))a con #7$38" *u sitio oficia) es <<<")ua"or-
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 27
%aptulo 16 3rem+ulos 1ecci(n 1.)6 %onclusi(n
Becci%n 1.": &onclusi%n
En este ca2tu)o !e e:2)ica+o a)-unos conce2tos so6re com2i)a+ores" 7o era mi intenci=n !acer)o
+e una manera ri-urosa o forma)@ muc!as cosas !an si+o so6reenten+i+as o +irectamente
i-nora+as" /na +isertaci=n +e este tamaCo se sa)+ra com2)etamente +e )os 2ro2=sitos +e este
+ocumento" *i e) )ector +esea am2)iar sus conocimientos en e) tema )e recomien+o que )ea otros
te:tos m.s es2ecia)i%a+os (2ue+e encontrar a)-unos en )a 6i6)io-rafa")
En e) ca2tu)o si-uiente 0o a +e4ar +e )a+o )a D0isi=n -enera) so6re )os com2i)a+oresE que !e
teni+o en este ca2tu)o 0o a concentrarme en #7$385 e:2)ican+o c=mo se tra6a4a con )"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2/
Captulo 2:
Presentacin de ANTLR
La mayora de las ideas fundamentales de la ciencia son esencialmente sencillas y, por regla
general pueden ser expresadas en un lenguaje comprensible para todos
#)6ert Einstein
Captulo 2:
Presentacin de ANTLR......................................................................29
Seccin 2.1: Introduccin........................................................................................................31
2.1.1: <=u0 es y c%mo !unciona A$>LR?........................................................................................... 31
2.1.2: @ro'%sito y estructura de 0ste ca'Atulo..................................................................................... 31
Seccin 2.2: $os anali%adores en A&'$(.............................................................................. 33
2.2.1: s'eci!icaci%n de gram(ticas con A$>LR................................................................................ 33
2.2.2: La 8ona de c%digo nativo.......................................................................................................... 3"
Seccin 2.3: $os )lu*os de in)ormacin..................................................................................3
2.3.1: 5lujo de caracteres.................................................................................................................... 3#
2.3.2: 5lujo de >o:ens......................................................................................................................... 3#
La clase antlr.>o:en..........................................................................................................................................3+
La clase antlr.&ommon>o:en...........................................................................................................................3+
La inter!a8 antlr.>o:enBtream...........................................................................................................................3-
&onstruyendo y ejecutando el anali8ador.........................................................................................................3-
2.3.3: Los AB>s................................................................................................................................... 3.
Bituaci%n de los AB>s........................................................................................................................................ 3.
$otaci%n.............................................................................................................................................................31
$odos del AB>: La inter!a8 antlr.collections.AB>.............................................................................................31
Las clases antlr.4aseAB> y antlr.&ommonAB>..............................................................................................."1
&onstrucci%n y obtenci%n de AB>s en un anali8ador......................................................................................."2
Seccin 2.!: (eglas +B&, e-tendidas................................................................................... !!
2.".1: /ntroducci%n............................................................................................................................... ""
2.".2: 6eclarando variables locales en una regla................................................................................ ""
2.".3: ,tili8ando las etiquetas.............................................................................................................. "+
2.".": @asando 'ar(metros a una regla.............................................................................................. "+
2.".#: 6evolviendo valores en una regla............................................................................................. "-
2.".+: ,tili8ando rangos de caracteres en el anali8ador l0xico........................................................... ".
2.".-: ,tili8ando 'atrones (rbol en el anali8ador sem(ntico............................................................... ".
Seccin 2.: "onstruccin de los AS's..................................................................................
2.#.1: &om'ortamiento 'or de!ecto..................................................................................................... #C
2.#.2: l su!ijo de enrai8amiento 9D;.................................................................................................... #1
2.#.3: Bu!ijo de !iltrado 9E;.................................................................................................................... #2
2.#.": 6esactivando la construcci%n 'or de!ecto................................................................................. #3
2.#.#: &onstruyendo el AB> en una acci%n......................................................................................... #3
2.#.+: &asos en los que la construcci%n 'or de!ecto no basta............................................................ ##
Seccin 2.6: Anali%adores de la /icrocalculadora............................................................... 6
2.+.1: l !ic*ero Ficro&alc.g y el 'aquete microcalc.......................................................................... #+
2.+.2: l anali8ador l0xico................................................................................................................... #+
2.+.3: l anali8ador sint(ctico.............................................................................................................. #-
2.+.": $ivel sem(ntico......................................................................................................................... #.
2.+.#: l !ic*ero Ficro&alc.g............................................................................................................... #1
2.+.+: Generando los anali8adores de Ficro&alc................................................................................ +1
Seccin 2.0: +*ecutando /icrocalc........................................................................................ 62
2.-.1: La clase &alc............................................................................................................................. +2
2.-.2: &lase &alc re!inada................................................................................................................... +3
2.-.3: ,tili8ando microcalc.................................................................................................................. +#
Seccin 2.#: "onclusin.......................................................................................................... 60
Gua prctica de ANTLR 2.7.2 v 1. 2<
Gua prctica de ANTLR 2.7.2 v 1. -
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.16 &ntroducci(n
Becci%n 2.1: /ntroducci%n
2.1.1: <=u0 es y c%mo !unciona A$>LR?
#7$38 es un 2ro-rama est. escrito en 4a0a5 2or )o que se necesita a)-una m.quina 0irtua) +e
4a0a 2ara 2o+er e4ecutar)o" Es soft<are )i6re5 )o que quiere +ecir que a) +escar-ar)o +e )a 2.-ina
oficia) (2ttp6IIDDD.antlr.org) o6ten+remos tanto )os fic!eros com2i)a+os *.class como e)
c=+i-o fuente en forma +e fic!eros *.java"
#7$38 es un generador de anali-adores" Buc!a -ente ))ama a estas !erramientas compiladores
de compiladores
1,
5 +a+o que au+ar a im2)ementar com2i)a+ores es su uso m.s 2o2u)ar" *in
em6ar-o tienen otros usos" #7$385 2or e4em2)o5 2o+ra ser0ir 2ara im2)ementar e) intr2rete +e
un fic!ero +e confi-uraci=n"
#7$38 es ca2a% +e -enerar un ana)i%a+or ):ico5 sint.ctico o sem.ntico en 0arios )en-ua4es
(4a0a5 C++ Ce en su 0ersi=n '"("') a 2artir +e unos fic!eros escritos en un )en-ua4e 2ro2io"
1ic!o )en-ua4e es 6.sicamente una serie +e re-)as EG7> un con4unto +e construcciones
au:i)iares"
Ilustracin 2.1 )uncionamiento de /A1L?
#7$38 -enera ana)i%a+ores 2re+A33(H)5 ) mismo uti)i%a un ana)i%a+or 2re+A33(H) 2ara )eer
)os fic!eros en )os que est.n escritas )as re-)as EG7>" #7$38 a+mite acciones en sus re-)as5
a+em.s +e otras 2restaciones como 2aso +e 2ar.metros5 +e0o)uci=n +e 0a)ores o !erencia +e
-ram.ticas"
2.1.2: @ro'%sito y estructura de 0ste ca'Atulo
E) 2ro2=sito +e este ca2tu)o es i)ustrar e) funcionamiento +e #7$38 im2)ementan+o un
intrprete (que no un com2i)a+or) 2ara un )en-ua4e mu senci))oF e) +e una ca)cu)a+ora sim6=)ica"
3a ca)cu)a+ora ser. ca2a% +e rea)i%ar o2eraciones aritmticas sim2)es (suma5 resta5 mu)ti2)icaci=n
+i0isi=n) con n?meros enteros o con +ecima)es5 e im2rimir. e) resu)ta+o 2or 2anta))a" 3os
c.)cu)os )os intro+ucir. e) usuario 2or )a conso)a5 )a ca)cu)a+ora )os 2resentar. 2or 2anta))a" 3a
2rece+encia +e )os o2era+ores 2o+r. cam6iarse me+iante e) uso +e 2arntesis"
9o+emos +efinir +os -ran+es 6)oques en este ca2tu)o" 3as secciones '"'5 '"35 '"4 '"& son m.s
6ien te=ricas" 9re2aran e) terreno 2ara e) se-un+o 6)oque5 forma+o 2or )as secciones '"6 '"(5 en
)as que uti)i%amos )o a2ren+i+o en e) 2rimer 6)oque 2ara im2)ementar r.2i+amente )a
microca)cu)a+ora"
Ia +os maneras +e )eer este ca2tu)o" Ca+a uno +e6e +eci+ir cu.) uti)i%ar +e2en+ien+o +e qu
ti2o +e )ector sea"
X DE) corre+or +e fon+oEF Consiste en ir )een+o to+as )as secciones5 una tras otra5 !asta e) fina)"
1& Rer e) ca2tu)o anterior 2ara una +escri2ci=n m.s +eta))a+a +e )os com2i)a+ores +e com2i)a+ores"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -1
a : b|c|d ;
b : X Y Z ;
c : Z Z ;
d : X Z ;
void a()
{
case(X)
...
}
#7$38
8e-)as EG7> C=+i-o 4a0a^C++^Ce
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.16 &ntroducci(n
8equiere una -ran resistencia5 2ues e) 2rimer 6)oque +e teora es 6astante +enso"
X DE) a0entureroEF Es e) que em2ie%a )een+o 2or )a secci=n '"65 intentan+o enten+er)o to+o
6as.n+ose en su senti+o com?n" /ti)i%ar. e) 2rimer 6)oque +e secciones como consu)ta cuan+o
se que+e atasca+o"
#?n se me ocurre un tercer ti2oF
X DE) corre+or arre2enti+oEF Es e) que em2ie%a en e) or+en in+ica+o5 2ero antes +e terminar con
)a teora5 e:!austo5 +eci+e comen%ar a )eer )a secci=n '"65 a 2artir +e a! 0a Dinterca)an+oE
teora 2r.ctica"
Estos son )os ti2os +e )ector que se me !an ocurri+o5 2ero se-uro que !a m.s" 7o im2orta e)
or+en@ )o que im2orta es 2o+er )eer to+o e) ca2tu)o" Pue ca+a cua) )o !a-a como me4or 2ue+a"
8ecur+ese que m.s a+e)ante se 0an a em2)ear )os conce2tos 0istos aqu"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -2
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.26 Los anali:adores en ANTLR
Becci%n 2.2: Los anali8adores en A$>LR
Ja mencionamos que #7$38 -enera sus ana)i%a+ores a 2artir +e unos fic!eros +e entra+a en )os
que se es2ecifica e) funcionamiento +e +ic!os ana)i%a+ores me+iante e) uso +e re-)as EG7>"
9ara 2o+er com2ren+er )os ana)i%a+ores necesitaremos conocer )a sinta:is +e +ic!os fic!eros +e
entra+a"
2.2.1: s'eci!icaci%n de gram(ticas con A$>LR
3os fic!eros con )os que tra6a4a #7$38 tienen )a terminaci=n Y"-5 en a+e)ante )os ))amaremos
&ic%eros de especi&icacin de gram#ticas o5 +irectamente5 &ic%eros de gram#ticas"
/n fic!ero +e -ram.tica contiene )a +efinici=n +e uno o 0arios ana)i%a+ores" Ca+a uno +e estos
ana)i%a+ores se tra+ucir. a c=+i-o nati0o (4a0a5 C++ o Ce5 +e2en+ien+o +e ciertas o2ciones) en
forma +e c)ases" Es +ecir5 2or ca+a ana)i%a+or +escrito en e) fic!ero +e -ram.ticas se -enerar.
una c)ase"
$o+o fic!ero +e -ram.tica tiene )a si-uiente estructuraF
header{
/* opciones de cabecera */
}
options
{
/* opciones generales a todo el fichero */
}
// A continuacin la definicin de el(los) analizadore(s).
Ca6eceraF Esta %ona es o2ciona) (2ue+e a2arecer o no)" 1e)imita+a 2or )as 2artcu)as Dheader fE
DgE5 en esta %ona inc)uimos e)ementos en c=+i-o nati0o (4a0a5 C++ o Ce) que +e6en 2rece+er a
)a +efinici=n +e )as +iferentes c)ases +e )os ana)i%a+ores" Esta secci=n se uti)i%a 2ara inc)uir otros
fic!eros (import e einc)u+e)5 +efinir e) 2aquete a) que 2ertenecer. )a c)ase +e) ana)i%a+or
(package) etc"
X ;2ciones -enera)es +e) fic!eroF Esta %ona es o2ciona)" 9ermite contro)ar a)-unos 2ar.metros
+e #7$38 me+iante Do2cionesE" 3as o2ciones se re2resentan como asi-naciones F
nombreOpcion=valor;" *e uti)i%an muc!o en #7$38" 3as o2ci=n m.s im2ortante +e esta
%ona es )a que 2ermite e)e-ir e) )en-ua4e nati0o en e) que se -enerar.n )os ana)i%a+ores
(4a0a5C++5Ce)" *u 0a)or 2or +efecto es D4a0aE" 1a+o que 0amos a -enerar reconoce+ores en
4a0a5 no necesitaremos esta %ona" En e) manua) +e #7$38 a2arecen to+as )as o2ciones que se
2ue+en inc)uir en esta %ona"
$ras )as o2ciones -enera)es +e) fic!ero 0ienen )as +efiniciones +e ana)i%a+ores" Es mu com?n
que en un mismo fic!ero se es2ecifiquen 0arios ana)i%a+ores (en )a maora +e )os e4em2)os que
acom2aCan a #7$38 se uti)i%a esta tcnica)" *in em6ar-o tam6in es 2osi6)e +efinir ca+a
ana)i%a+or en un fic!ero5 so6re to+o cuan+o se trata +e ana)i%a+ores e:tensos
16
"
1a+o que nuestro )en-ua4e en este ca2tu)o ser. mu senci))o5 +efiniremos )os tres ana)i%a+ores
en e) mismo fic!ero"
En #7$385 ca+a ana)i%a+or tiene )a si-uiente estructuraF
class nombreAnalizador extends tipoAnalizador; // definicin del analizador
16 /ti)i%ar 0arios fic!eros requiere un tra6a4o es2ecia) (im2ortar e:2ortar 0oca6u)arios)" B.s informaci=n so6re esto en )os
ca2tu)os & 6"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota --
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.26 Los anali:adores en ANTLR
options {
/* Zona de opciones del analizador*/
}
tokens {
/* Zona de definicin de tokens */
}
{
/* Zona de cdigo nativo */
}
/* Zona de reglas */
1efinici=n +e) ana)i%a+orF En )a 2rimera )nea +efinimos e) nom6re +e) ana)i%a+or
(nombreAnalizador) su ti2o (tipoAnalizador)" E) ti2o 2ue+e ser. Lexer 2ara ana)i%a+ores
):icos5 Parser 2ara ana)i%a+ores sint.cticos TreeParser 2ara ana)i%a+ores sem.nticos"
Wona +e o2cionesF Esta %ona es o2ciona)5 aunque casi siem2re interesa uti)i%ar)a" En esta %ona se
+efinen 2ro2ie+a+es mu im2ortantes +e) ana)i%a+orF se +efine e) )ooHa!ea+ (H)5 si se 0a a -enerar
un #*$ o no5 en e) caso +e 9arsers $ree9arsers5 )a im2ortaci=n^e:2ortaci=n +e 0oca6u)ario5 )a
acti0aci=n^+esacti0aci=n +e) tratamiento autom.tico +e errores etc" 9ara m.s informaci=n
cons?)tese e) manua) +e #7$38"
Wona +e +efinici=n +e toHensF Esta %ona es o2ciona)" 9ermite +efinir nue0os toHens5 que se
aCa+en a )os que se !aan im2orta+o en )a %ona +e o2ciones +e) ana)i%a+or"
Wona +e c=+i-o nati0oF (Rer m.s a6a4o)
Wona +e +efinici=n +e re-)asF En esta %ona se encontrar.n )as re-)as que +efinir.n )a -ram.tica"
*e a+miten re-)as EG7> e:ten+i+as (2ara m.s informaci=n so6re )as re-)as EG7> e:ten+i+as5
0ase )a secci=n +e+ica+a a e))as en este mismo ca2tu)o)"
2.2.2: La 8ona de c%digo nativo
7o !a que o)0i+ar que 2ara #7$38 cua)quier ana)i%a+or es una instancia +e una c)ase" En
ocasiones es mu ?ti) +ec)arar mto+os atri6utos 2ara +ic!a c)ase"
9ara aCa+ir mto+os 0aria6)es a una c)ase +e un ana)i%a+or 6asta con escri6ir)os5 entre )a %ona
+e o2ciones )a %ona +e re-)as5 entre llaves" 9or e4em2)o5
class MyParser extends Parser; // definicin de un analizador sintctico
options {...}
tokens {...}
{
private Strin% a& Hola ; '' atributo privado
public void imprimir(Strin% s) '' m(todo p)blico
{ System.out.println(s); !
!
regla1 : i:IDENT { imprimir(i.getText()); } ;
regla2 : e:ENTERO { imprimir(a+e.getText()); } ;
En este e4em2)o !emos aCa+i+o un atri6uto un mto+o a )a c)ase" 9o+ramos !a6er aCa+i+o
otros" $am6in 2o+ramos !a6er inc)ui+o uno o 0arios constructores" Como 2ue+e 0erse5 estos
e)ementos son +irectamente uti)i%a6)es en )as acciones +e )as re-)as"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -)
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.-6 Los 4lu5os de in4ormaci(n
Becci%n 2.3: Los !lujos de in!ormaci%n
Ja sa6emos qu ti2os +e ana)i%a+ores !a ():ico5 sint.ctico o sem.ntico)" 9ero Oc=mo se
transmite )a informaci=n entre )os +iferentes ni0e)esQ En esta secci=n res2on+eremos a esa
2re-unta"
$erence 9arr !a or-ani%a+o )a informaci=n +e una manera mu interesante que merece ser
e:2)ica+a"
(Como siem2re5 me 0o a referir a )a 0ersi=n en Ja0a +e )os ana)i%a+ores)"
2.3.1: 5lujo de caracteres
E) 2rimer f)u4o que 0o a e:2)icar es e) que mo+e)a )a entra+a +e +atos +es+e e) e:terior !asta )a
2rimera fase +e) com2i)a+or5 es +ecir5 a) ana)i%a+or ):ico" En otras 2a)a6ras5 0o a e:2)icar qu
es 2ara #7$38 e) f)u4o que en e) 2rimer ca2tu)o ))am DCaracteresE"
Ilustracin 2.2 >rimer &lu4o de in&ormacin< caracteres
9ara #7$38 e) f)u4o caracteres es5 sim2)emente Dcua)quier su6c)ase +e java.io.InputStreamE"
3o m.s norma) es uti)i%ar un f)u4o +e caracteres 2ro0inentes +e un fic!ero (con un
FileInputStream) 2ero 2ue+en uti)i%arse otras fuentes5 como una ca+ena
(StringBufferStream) o una 2.-ina <e6 (URL.openStream)"
E) InputStream que 2ro2orciona )os caracteres a) ana)i%a+or ):ico se )e 2asa como 2ar.metro
en su constructor"
/n 2equeCo incon0eniente +e uti)i%ar ste mto+o es que se 2ier+e e) conce2to +e Dfic!eroE@ )os
+atos +e) fic!ero +e te:to 2er+uran en forma +e f)u4o FileInputStream5 pero no ocurre as con
el nom"re del &ic%ero" cste 2ue+e ser es2ecifica+o con )a funci=n setFilenameF
// Convertir el nombre de fichero en un flujo
FileInputStream fis = newFileInputStream(fileName);
// Crear el lexer utilizando dicho flujo
LeLiLexer lexer = new LeLiLexer(fis);
// Proporcionar adems el nombre de fichero al analizador
lexer.setFilename(f);
2.3.2: 5lujo de >o:ens
En ste caso estamos !a6)an+o +e) f)u4o +e informaci=n e:istente entre e) ni0e) ):ico sint.ctico5
es +ecir5 e) f)u4o que anteriormente !emos ))ama+o D$oHensE"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -0
C=+i-o
fuente
#n.)isis
):ico
Caracteres
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.-6 Los 4lu5os de in4ormaci(n
Ilustracin 2.( )lu4o de to+ens entre el lexer ! el parser.
$a clase antlr.'o9en
3os toHens se re2resentan en #7$38 uti)i%an+o una c)ase ))ama+a antlr.Token" Ie aqu e)
c=+i-o nte-ro +e +ic!a c)ase (sa)0o 2or a)-unos comentarios)F
public class Token {
// constants
public static final int MIN_USER_TYPE = 3;
public static final int INVALID_TYPE = 0;
public static final int EOF_TYPE = 1;
public static final int SKIP = -1;

// each Token has at least a token type
int type=INVALID_TYPE;

// the illegal token object
public static Token badToken =
new Token(INVALID_TYPE, "");

public Token() {;}
public Token(int t) { type = t; }
public Token(int t, String txt) {
type = t; setText(txt);
}
public void setType(int t) { type = t; }
public void setLine(int l) {;}
public void setColumn(int c) {;}
public void setText(String t) {;}

public int getType() { return type; }
public int getLine() { return 0; }
public int getColumn() { return 0; }
public String getText() {...}
}
Esta c)ase est. Dcasi 0acaE@ no !a una 0er+a+era im2)ementaci=n +e )os mto+os K est.n a!
2ara ser so6reescritos 2or una su6c)ase"
# 2esar +e ser casi una interfa%5 esta c)ase nos +a una i+ea +e c=mo se tratan )os toHens en
#7$38F un toHen es un Dti2oE (un entero) un te:to (una ca+ena) una )nea co)umna (sen+os
enteros)" Esta c)ase 6ase -aranti%a que siem2re que uti)icemos un toHen en #7$38 2o+remos
o6tener estas informaciones"
$a clase antlr."ommon'o9en
3a c)ase antlr.Token 2or s misma no es mu 2r.ctica +e6i+o a sus Dmto+os 0acosE" E)
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -,
#n.)isis
):ico
#n.)isis
sint.ctico
$oHens
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.-6 Los 4lu5os de in4ormaci(n
ana)i%a+or sint.ctico no )a uti)i%ar. +irectamente 2ara re2resentar )os toHens@ en su )u-ar se uti)i%a
una su6c)ase +e antlr.Token ))ama+a antlr.CommonToken" *u c=+i-o es e) si-uienteF
public class CommonToken extends Token {
// most tokens will want line, text information
int line;
String text = null;

public CommonToken() {}
public CommonToken(String s) { text = s; }
public CommonToken(int t, String txt) {
type = t;
setText(txt);
}
public void setLine(int l) { line = l; }
public int getLine() { return line; }
public void setText(String s) { text = s; }
public String getText() { return text; }
}
Esta c)ase no !ace m.s que re))enar )os D!uecosE que fa)tan en su su2erc)ase"
/no +e )os D!uecosE que CommonToken no im2)ementa es )a conser0aci=n +e) nom6re
+e fic!ero (fi)ename) en e) toHen (CommonToken no tiene nin-?n atri6uto ))ama+o
Dfi)enameE5 )os mto+os getFilename setFilename no !acen na+a o +e0ue)0en
nu)))"
B.s a+e)ante en e) ca2tu)o +e an.)isis ):ico 0eremos c=mo so)ucionar esto"
$a inter)a% antlr.'o9enStream
3a c)ase antlr.CharScanner (+e )a que !ere+an )os ana)i%a+ores ):icos que !acemos en
#7$38) im2)ementa )a interfa% antlr.TokenStream" E) c=+i-o com2)eto +e esta interfa% es e)
si-uienteF
package antlr;
/* ANTLR Translator Generator
* Project led by Terence Parr at http://www.jGuru.com
* Software rights: http://www.antlr.org/RIGHTS.html
*
* $Id: //depot/code/org.antlr/main/main/antlr/TokenStream.java
*/
public interface TokenStream {
public Token nextToken() throws TokenStreamException;
}
#s que )o ?nico que tiene que !acer e) ana)i%a+or sint.ctico es ir ))aman+o a) mto+o nextToken
+e) ana)i%a+or ):ico"
"onstru3endo 3 e*ecutando el anali%ador
9or eso e) constructor 2rinci2a) +e cua)quier ana)i%a+or sint.ctico -enera+o 2or #7$38 toma
como ?nico 2ar.metro un o64eto que cum2)a )a interfa% antlr.TokenStream" 9or e4em2)o5
nuestro ana)i%a+or ):icoF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -7
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.-6 Los 4lu5os de in4ormaci(n
// Crear un analizador sintctico utilizando el lxico
LeLiParser parser = new LeLiParser(lexer);
Como ocurra anteriormente5 e) nom6re +e) fic!ero es irrecu2era6)e 2or e) ana)i%a+or5 con )o que
+e nue0o es necesario 2as.rse)o a) ana)i%a+orF
// Proporcionar el nombre del fichero al analizador sintctico
parser.setFilename(fileName);
/na consecuencia mu interesante +e esta arquitectura es que 2o+emos uti)i%ar cua)quier c)ase
que im2)emente )a interfa% antlr.TokenStream como ana)i%a+or ):ico@ si no nos -usta )a
im2)ementaci=n con aut=matas 33 +e) ana)i%a+or ):ico5 2o+emos uti)i%ar nuestra 2ro2ia
im2)ementaci=n" Gastar. que cum2)a )a interfa% 2ara 2o+er 2as.rse)a a) ana)i%a+or sint.ctico en )a
construcci=n"
9ara que un ana)i%a+or sint.ctico comience a ana)i%ar una entra+a5 es necesario ))amar
e:2)citamente a) mto+o +e )a 2rimera c)ase que se !a +ec)ara+o" # +ic!a c)ase tam6in se )e
))ama Dre-)a inicia)E o Dre-)a ra%E"
*i )a re-)a ra% +e nuestro com2i)a+or se ))ama D2ro-ramaE5 entonces 2ara iniciar e) an.)isis
sint.ctico so6re una entra+a ser. necesario escri6ir a)-o asF
parser.programa();
En ese momento e) ana)i%a+or sint.ctico comen%ar. a 2e+ir toHens a) ana)i%a+or ):ico5 !acien+o
que ste a su 0e% comience a consumir caracteres +e )a entra+a"
2.3.3: Los AB>s
Situacin de los AS's
3os #*$s (/"stract 0!ntax 1rees5 o Zr6o)es +e *inta:is #6stracta) sir0en 2ara mane4ar )a
informaci=n sem.ntica +e un c=+i-o" 3a forma m.s eficiente +e mane4ar )a informaci=n
2ro0inente +e un )en-ua4e +e 2ro-ramaci=n es )a forma ar6=rea@ 2or so )a estructura +e +atos
e)e-i+a es un .r6o)" #+em.s5 construen+o #*$s a 2artir +e un te:to 2o+emos o60iar muc!a
informaci=n irre)e0ante@ si un #*$ se construe 6ien5 no !a6r. que tratar con sm6o)os +e
2untuaci=n o a%?car sint.ctica en e) ni0e) sem.ntico"
#) contrario que )os f)u4os5 una estructura en .r6o) 2ue+e es2ecificar )a re)aci=n 4er.rquica entre
)os sm6o)os +e una -ram.tica"
Ilustracin 2.* )lu4o Di-FuierdaE ! #r"ol Dderec%aE de in&ormacin
3os #*$s 2ue+en inter0enir en 0arias fases +e) an.)isisF como 2ro+ucto +e) an.)isis sint.ctico5
como e)emento interme+io en sucesi0os an.)isis sem.nticos como entra+a 2ara )a -eneraci=n +e
c=+i-o" 9o+emos 0isua)i%ar)o -r.ficamente +e )a si-uiente maneraF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -/
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.-6 Los 4lu5os de in4ormaci(n
Ilustracin 2., Intercam"io de /01s entre las di&erentes partes de un compilador
&otacin
1raducido del manual en ingls de /A1L?. )ic%ero trees.%tm. @uc%as modi&icaciones.
3a forma norma) +e re2resentar un .r6o) en #7$38 uti)i%a una notaci=n 6asa+a en 3,*9" 9or
e4em2)oF
#(A B C)
Es un .r6o) con LAM en la ra:5 )os !i4os G C"
#
G C
Ilustracin 2.. GD/ B 2E
E) e)emento que !ace +e ra% en e) .r6o) e(X J W) es e) que a2arece 2rimero5 es
+ecir5 DXE"
Esta notaci=n 2ue+e ani+arse 2ara +escri6ir .r6o)es +e estructuras m.s com2)e4as" #sF
#(A B #(C D E))
8e2resenta e) si-uiente .r6o)F
Ilustracin 2.7 GD/ B GD2 D EEE
*****
&odos del AS': $a inter)a% antlr.collections.*S+
Ja !e esta6)eci+o que un #*$ a)macena )a informaci=n sem.ntica en una estructura ar6=rea"
Pue+a 2or ac)arar cmo se a)macena +ic!a informaci=n"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -<
#n.)isis
sem.ntico 1
#n.)isis
sint.ctico
#*$
Generaci=n
+e c=+i-o
#n.)isis
sem.ntico n
#*$ 1
"""
#*$ nA1
#*$ enriqueci+o
#n.)isis sem.ntico
#
G C
1 E
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.-6 Los 4lu5os de in4ormaci(n
9ara #7$385 un .r6o) #*$ es cua)quier c)ases que im2)emente )a interfa%
antlr.collections.AST" Ro a e:2)icar)a 6re0emente" 9or como+i+a+ me referir a )os
mto+os +e )a interfa% como si a estu0ieran im2)ementa+os5 es +ecir5 en )u-ar +e escri6ir Deste
mto+o +e6er. !acer estoE escri6ir Deste mto+o !ace stoE" 9ero tn-ase en cuenta que es una
manera +e !a6)ar"
/na ac)araci=n 2re0iaF )a interfa% es minimal5 2or sa ra%=n so)amente a)macena +os +atos en
ca+a no+oF un te:to un entero5 que se uti)i%ar.n 2ro6a6)emente 2ara re2resentar un toHen" 7o
o6stante e) usuario es )i6re +e aCa+ir m.s +atos en ca+a no+o am2)ian+o )a interfa%"
9aso a e:2)icar e) fic!ero en e) que se +efine antlr.collections.AST5 )nea a )nea"
package antlr.collections;
import antlr.Token;
public interface AST {
public void addChild(AST c);
$ras )as +ec)araciones +e 2aquete e im2ortaciones +e )a interfa%5 encontramos e) 2rimer
mto+o5 addChild" cste sir0e 2ara DaCa+ir un !i4o 2or e) fina) +e )a )ista +e !i4os (2or )a
+erec!a)E"
public boolean equals(AST t);
public boolean equalsList(AST t);
public boolean equalsListPartial(AST t);
public boolean equalsTree(AST t);
public boolean equalsTreePartial(AST t);
cste con4unto +e mto+os sir0en 2ara com2arar .r6o)es #*$ entre s"
X E) 2rimero +e e))os (equals) no es Drecursi0oE@ !ace una com2araci=n a ni0e) +e te:to +e)
no+o (toString) a ni0e) +e ti2o +e informaci=n entre )os +os"
X E) se-un+o (equalsList) )os com2ara5 a+em.s5 estructura)mente (recursi0amente)" ,nc)ue
!ermanos e !i4os"
X E) tercero (equalsListPartial) com2rue6a si t es una 0ersi=n aumenta+a +e) .r6o) que
))ama a) mto+o" Es +ecir5 si t es e) #*$ ))ama+or con a)-unas .r6o)es m.s co)-an+o +e
a)-unas !o4as"
X E) cuarto (equalsTree) es como equa)s3ist sa)0o que su2one que e) .r6o) tiene una ?nica ra%
(no es +e-enera+o)" Es +ecir5 i-nora )os !ermanos"
X E) ?)timo mto+o (equalsTreePartial) !ace un equalsListPartial(t) so6re e) .r6o)
su2onien+o que es )a ra% +e) .r6o) (i-noran+o )os !ermanos)"
public ASTEnumeration findAll(AST tree);
public ASTEnumeration findAllPartial(AST subtree);
Estos +os mto+os im2)ementan 6?sque+as" E) 2rimero +e0ue)0e to+os )os su6.r6o)es que son
equalsList(tree) mientras que e) se-un+o +e0ue)0e )os que son equalsListPartial(tree)"
public AST getFirstChild();
public AST getNextSibling();
Estos +os mto+os 2ermiten )a Dna0e-aci=nE 2or e) .r6o)" getFirstChild +e0o)0er. e) 2rimer
!i4o +e) #*$5 mientras que getNextSibling +e0o)0er. e) D!ermanoE (e) si-uiente !i4o +e) 2a+re
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.-6 Los 4lu5os de in4ormaci(n
+e) no+o) +e) .r6o)" #m6os mto+os +e0ue)0en null si no !a !i4os^!ermanos" 7=tese que )a
interfa% so)amente 2re0ee )a na0e-aci=n D+e arri6a a a6a4oE +e Di%quier+a a +erec!aE"
public String getText();
public int getType();
Estos +os mto+os sir0en 2ara o6tener )a ?nica informaci=n estrictamente necesaria 2ara )os
#*$sF un entero (ti2o) una ca+ena (te:to)" En )os no+os #*$s como mnimo !a un te:to un
ti2o +e no+o" 9or +efecto estas informaciones se o6ten+r.n +e $oHens" 7o o6stante5 2o+emos
!acer que se o6ten-an +e cua)quier forma5 siem2re cuan+o im2)ementemos getText
getType"
Esta informaci=n es im2ortanteF to+o no+o #*$ tiene (a) menos) un ti2o un te:to5
se o6tienen con )os mto+os getType getText" Es mu com?n iniciar +ic!os
0a)ores con un Token(que tam6in 2osee un ti2o un te:to)" 9ero !a que tener
2resente que )as +os c)ases son +iferentesF un #*$ no tiene 2or qu contener un
$oHen@ un #*$ 2ue+e tener un ti2o o un te:to +iferente a )os +e cua)quier toHen"
public int getNumberOfChildren();
1e0ue)0e e) n?mero +e !i4os +e) #*$"
public void initialize(int t, String txt);
public void initialize(AST t);
public void initialize(Token t);
1i0ersos mto+os +e inicia)i%aci=n (a que en una interfa% no 2ue+en es2ecificarse constructores
o6)i-atorios5 se !a o2ta+o 2or esta so)uci=n)"
public void setFirstChild(AST c);
public void setNextSibling(AST n);
public void setText(String text);
public void setType(int ttype);
Bto+os +e mo+ificaci=n +e) 2rimer !i4o5 e) !ermano 2or )a +erec!a5 e) te:to e) ti2o +e) $oHen
+e )a ra%"
public String toString();
public String toStringList();
public String toStringTree();
}
Bto+os 2ara con0ertir a ca+enas" E) 2rimero +e e))os no es recursi0o5 +e0o)0ien+o so)amente
informaci=n so6re e) toHen +e )a ra%" E) se-un+o o6tiene recursi0amente una re2resentaci=n en
una so)a )nea to+o e) .r6o)5 uti)i%an+o una sinta:is mu 2areci+a a )a +e) )en-ua4e 3,*9" E) ?)timo
mto+o es i+ntico a) anterior5 2ero so)amente tiene en cuenta e) 2rimer !i4o +e) #*$"
En resumen5 )a interfa% 2ro2orciona mto+os 2ara aCa+ir !i4os5 6uscar5 con0ertir a ca+enas
com2arar" #+em.s est.n )os mto+os getText() getType()5 2ara o6tener e) te:to ti2o +e
un no+o"
$as clases antlr.BaseAS' 3 antlr."ommonAS'
Ja !e +ic!o que #7$38 2ermite uti)i%ar como .r6o) cua)quier c)ase que im2)emente
a+ecua+emante antlr.Collections.AST" 3a c)ase que se uti)i%a 2ara -enerar e) #*$ en e)
ana)i%a+or sint.ctico se 2ue+e es2ecificar me+iante )a o2ci=n ASTLabelType en )a secci=n
options +e) ana)i%a+or" E) 0a)or 2or +efecto +e ASTLabelType es antlr.CommonAST"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )1
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.-6 Los 4lu5os de in4ormaci(n
antlr.CommonAST es )a im2)ementaci=n 2or +efecto que #7$38 ofrece 2ara )os #*$s" Esta
c)ase no se )imita a im2)ementar com2)etamente antlr.Collections.AST5 sino que aCa+e
muc!a funciona)i+a+ e:tra (como seria)i%aci=n :m) o co+ificaci=n 2ara transmitir 2or internet)"
*in em6ar-o no es en antlr.CommonAST +on+e esta funciona)i+a+ se im2)ementa5 sino en suc)ase
2a+re5 antlr.BaseAST" En esta c)ase a6stracta se im2)ementan to+os )os mto+os +e
antlr.Collections.AST e:ce2to )os re)aciona+os con )a informaci=n conteni+a en )as races
(que tienen una im2)ementaci=n 2or +efecto en antlr.CommonAST)"
*i 6ien es 2osi6)e uti)i%ar una c)ase !ec!a +es+e cero que im2)emente antlr.Collections.AST
2ara )os com2i)a+ores5 )o m.s usua) es uti)i%ar +irectamente antlr.CommonAST o 6ien uti)i%ar una
su6c)ase +e antlr.BaseAST"
/no +e )os incon0enientes +e uti)i%ar )as im2)ementaciones +e #*$s 2ro2orciona+as 2or #7$38
es que )a 0isi=n que se tiene +e) .r6o) es mu re+uci+a@ ca+a no+o so)amente tiene constancia +e
su 2rimer !i4o +e su D!ermanoE" Es +ecir5 se tra6a4a con un .r6o) como e) +e )a i%quier+a en )a
si-uiente fi-uraF
Ilustracin 2.9 Hr"ol limitado Dderec%aE ! corriente Di-FuierdaE
Bientras que )o usua) es tener m.s referencias5 +e manera que ca+a no+o conoce a todos sus
!i4os a+em.s a su 2a+re sus !ermanos5 como ocurre en e) +e )a i%quier+a" En )os comentarios
+e antlr.BaseAST se !ace referencia a que Drecorrer )os .r6o)es es m.s f.ci) as si tienen esta
estructuraE5 aunque 2ienso que con una estructura con m.s en)aces no se !a6ra 2er+i+o nin-una
faci)i+a+"
1e to+as maneras5 en )a maora +e )as o2eraciones que se rea)icen con .r6o)es 6asta con un
recorri+o a6a4o^+erec!a" *=)amente !e +escrito su funcionamiento interno 2orque es con0eniente
tener)o en cuenta a )a !ora +e tra6a4ar con #*$s" 9or e4em2)oF
X *i a un .r6o) se )e 0an a insertar sucesi0amente 0arios !i4os5 es m.s eficiente -uar+ar e) ?)timo
))amar a setNextSibling que uti)i%ar addChild en e) 2a+re"
X Cuan+o un #*$ D#E se !ace !i4o +e otro #*$ DGE (B.addChild(A)) to+os )os !ermanos +e
# se !ar.n tam6in !i4os +e G"
X Cuan+o un #*$ D#E se fi4a como 2rimer !i4o +e otro #*$ DGE ( B.setFirstChild(A) )
to+os )os !i4os que G tu0iera 2re0iamente se 2er+er.n (sien+o sustitui+os 2or )os !ermanos +e
#)
"onstruccin 3 o7tencin de AS's en un anali%ador
9ara que un ana)i%a+or ):ico (o sem.ntico) -enere un #*$ a 2artir +e )a entra+a5 es necesario
que )a o2ci=n +e) ana)i%a+or buildAST est acti0a+a" Es +ecir5 en e) ana)i%a+or en cuesti=n
+e6emos encontrar a)-o como stoF
class MiParser extends Parser/TreeParser; // Parser que construye ASTs
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )2
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.-6 Los 4lu5os de in4ormaci(n
options{ build*S+&true; }
...
/na 0e% e) an.)isis !aa aca6a+o es 2osi6)e o6tener e) #*$ -enera+o uti)i%an+o e) mto+o
getAST()" E) .r6o) as o6teni+o es e) que se uti)i%ar. en e) an.)isis sem.ntico"
AST ast = parser.%et*S+();
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )-
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.)6 Reglas !>N. e8tendidas
Becci%n 2.": Reglas 4$5 extendidas
2.".1: /ntroducci%n
#7$38 uti)i%a un ti2o +e re-)as que ))amaremos EG7> e:ten+i+as" 3as re-)as EG7> e:ten+i+as
se +iferencian +e )as re-)as EG7> en )os si-uientes as2ectosF
X 9ue+en tener acciones
X 9ue+en tener 2re+ica+os sint.cticos sem.nticos
X 9ue+en em2e%ar con una acci=n5 2ara +ec)araci=n +e 0aria6)es )oca)es"
X 3os e)ementos +e )a re-)a son uti)i%a6)es en e) cuer2o +e )as acciones5 2ara e))o se uti)i%an
DetiquetasE"
X 9ue+en +e0o)0er 0a)ores
X 9ue+en tomar 2ar.metros
X 9ue+en co+ificar ran-os +e caracteres en e) ana)i%a+or ):ico
X 9ue+en co+ificar 2atrones .r6o) en e) ana)i%a+or sem.ntico
X 9ue+en uti)i%arse o2era+ores es2ecia)es 2ara construir e) #*$ (0ase secci=n +e+ica+a a )os
#*$s en este mismo ca2tu)o)
Ja !emos e:2)ica+o qu son )as acciones )os 2re+ica+os sint.cticos sem.nticos en e) ca2tu)o
anterior" Ramos a 0er e) resto +e )os 2untos"
3as funciona)i+a+es que 0o a e:2)icar 2ue+en uti)i%arse en cua)quier ana)i%a+or
-enera+o 2or #7$38 (a sea ):ico5 sint.ctico o sem.ntico)" 7o o6stante5 2or
sim2)ici+a+5 )os e4em2)os que 0o a uti)i%ar 0an a ser )os +e un ana)i%a+or sint.ctico"
Esta secci=n es tanto informati0a como +e consu)ta" En e))a se e:2)ican )a maora +e )as
0isicitu+es +e )a -ram.tica +e #7$38" *i en a)-?n momento no com2ren+e )a construcci=n +e
una re-)a5 )o m.s 2ro6a6)e es que se e:2)ique en esta secci=n" 3os ?nicos e)ementos sint.cticos
que no se e:2)ican aqu sonF
X 3a !erencia +e -ram.ticas5 que se e:2)icar. cuan+o se uti)ice5 en e) ca2tu)o 6"
X 3os 2re+ica+os sint.cticos sem.nticos5 que se e:2)icaron e) ca2tu)o 1"
X 3os o2era+ores +e construcci=n +e) #*$5 que se e:2)ican en )a si-uiente secci=n"
2.".2: 6eclarando variables locales en una regla
/n error que !e cometi+o muc!o a) 2rinci2io +e mi a2ren+i%a4e con #7$38 !a si+o intentar
+ec)arar 0aria6)es )oca)es +entro +e una acci=n Dnorma)E" Consi+rese 2or e4em2)o )a re-)a que
a2arece en e) si-uiente fic!eroF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota ))
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.)6 Reglas !>N. e8tendidas
// Fichero BananaParser.g
header { package leli; } // paquete leli (para poder importar el vocabulario)
class BananaParser extends Parser;
options { importVocab=LeLiLexerVocab; } // importa el vocabulario lxico de
LeLi
regla1 : {Strin% a;! i:IDENT {a=i.getText();} ;
Este ana)i%a+or5 es mu sim2)e 2ero sir0e 2ara i)ustrar 2erfectamente e) 2ro6)ema" #7$38
com2i)ar. BananaParser.g sin 2ro6)emas
1(
5 -eneran+o e) ana)i%a+or en BananaParser.java"
*in em6ar-o5 cuan+o intentemos com2i)ar este se-un+o fic!ero5 4a0a emitir. un error5 in+ican+o
que )a 0aria6)e DaE no !a si+o +ec)ara+a"
E) 2ro6)ema est. 2ro0oca+o en su ra% 2or )a forma que tiene #7$38 +e ana)i%ar )a -ram.tica"
#+em.s +e) esta+o Dnorma)E5 ant)r tiene un esta+o es2ecia)5 ))ama+o guessing (o Da+i0inan+oE)5
en e) que entra en ciertos momentos 2ara 0er si una re-)a es a2)ica6)e o no (concretamente
mientras se e0a)?a un 2re+ica+o sint.ctico)" 9ero )as re-)as no se est.n reconocien+o rea)mente"
En rea)i%a+ se est. D2ro6an+o a 0er si se 2ue+en reconocerE" 9or )o tanto5 )as acciones no se
+e6en e4ecutar5 as que to+as )as acciones 0an 2rece+i+as +e un if(!guessing) 2areci+o a stoF
public void regla1()
{
try{
if(!guessing) {
String a;
}
Token i = match(IDENT);
if(!guessing){
a = i.getText();
}
}catch (RecognitionException ex)
{ ... }
}
En 4a0a5 una 0aria6)e +ec)ara+a +entro +e) cuer2o +e un if es e)imina+a cuan+o ste se aca6a"
9or )o tanto5 )a +ec)araci=n String a no tiene nin-?n efecto5 efecti0amente )a 0aria6)e a no
2ue+e encontrarse en e) se-un+o if"
En ste caso )a o2ci=n es mu f.ci) +e arre-)ar" Gastara con +ec)arar a +entro +e su misma
acci=nF
regla1 : i:IDENT {String a=i.getText();} ;
E) 2ro6)ema ))e-a cuan+o queremos uti)i%ar )a misma 0aria6)e en +os acciones" 9or e4em2)o5 asF
regla2 : i:IDENT {a=i.getText();}
| e:LIT_ENTERO {a=e.getText();}
;
#7$38 2ermite es2ecificar una ti2o es2ecia) +e acci=n que se e4ecuta siempre (est o no e)
ana)i%a+or en esta+o guessing) a) 2rinci2io +e )a re-)a" En e))a es 2osi6)e +ec)arar 0aria6)es cuo
.m6ito ser. to+o e) mto+o" 9ara e))o 6asta +ec)arar )as acciones a la i-Fuierda de los dos
puntos5 en )u-ar +e a )a +erec!aF
1( *u2onien+o que en e) mismo fic!ero !aa un ana)i%a+or ):ico en e) que se +efina D,1E7$E"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )0
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.)6 Reglas !>N. e8tendidas
regla2 { Strin% a; ! : i:IDENT {a=i.getText();}
| e:LIT_ENTERO {a=e.getText();}
;
En resumenF
*e 2ue+en rea)i%ar acciones +ec)arar 0aria6)es )oca)es antes +e entrar en )a fase +e
reconocimiento +e una re-)a" 9ara e))o !a que co)ocar )as acciones i%quier+a +e )os
+os 2untos en )a +efinici=n +e )a re-)a"
2.".3: ,tili8ando las etiquetas
*e 2ue+en co)ocar etiquetas en )os +istintos e)ementos +e una re-)a5 tanto en toHens como en
referencias a otras re-)as" /na etiqueta no es m.s que un nom6re que se )e +a a un e)emento +e )a
re-)a" *e co)oca +e)ante +e +ic!o e)emento se2ara+a con +os 2untos ([F[)"
Consi+rese e) si-uiente e4em2)o +e re-)a sint.cticaF
llamada: i:IDENT PARENT_AB e:expresion PARENT_CE ;
En e) e4em2)o anterior5
X i es una etiqueta +e un toHen5 mientras que
X e es una etiqueta +e una referencia a otra re-)a"
En un ana)i%a+or ):ico no !a +iferencias entre DtoHenE Dreferencia a otra re-)aE"
3as etiquetas nos sir0en 2ara 2o+er uti)i%ar informaci=n im2ortante +e )os +iferentes e)ementos
+e ca+a re-)a en )as acciones 2re+ica+os sem.nticos" #s5 en )as acciones 2re+ica+os
sem.nticos5 sien+o etiqueta una etiqueta cua)quiera5 2o+remos escri6irF
X etiqueta F En )as acciones +e un ana)i%a+or sint.ctico5 uti)i%ar una etiqueta sin m.s sir0e 2ara
!acer referencia a) to7en que re2resenta" ; m.s forma)mente5 a )a instancia +e )a c)ase
antlr.Token Ao a)-una +e sus su6c)asesA que !a si+o uti)i%a+a 2ara re2resentar e) toHen en
cuesti=n" En )os ana)i%a+ores sem.nticos re2resenta un no+o #*$ ()a instancia +e una c)ase
que im2)ementa )a interfa% #*$ que re2resenta e) no+o #*$)"
// Imprime un identificador
regla : i:IDENT {System.out.println(i.getText());} ;
X #etiqueta F 3a etiqueta 2rece+i+a +e) car.cter a)mo!a+i))a (e)5 sir0e 2ara referenciar el A1T
-enera+o 2or un ana)i%a+or sint.ctico o sem.ntico que est -eneran+o un nue0o #*$ a 2artir
+e etiqueta" $o+os )os mto+os +e )a interfa% antlr.collections.AST ser.n 2or tanto
in0oca6)esF
// Imprime un AST en forma de cadena
regla : e:expresion {System.out.println(#e.toStringList());} ;
2.".": @asando 'ar(metros a una regla
/na e0o)uci=n e0i+ente +e) aut=mata recursi0o +escen+ente es 2o+er 2asar 2ar.metros a )os
mto+os que re2resentan )as re-)as" En #7$38 a una re-)a se )e aCa+en 2ar.metros uti)i%an+o
)os corc!etes" 3os 2ar.metros +e una re-)a 2ue+en uti)i%arse tanto en )as acciones como en )os
2re+ica+os sem.nticos
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota ),
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.)6 Reglas !>N. e8tendidas
regla,int a-
: {a<0}? IDENT
| {a==0)? RES_ENTERO
| {a>0}? RES_REAL
| RES_CADENA {System.out.println(valor de a: + a); }
;
3a re-)a +e) e4em2)o anterior sir0e 2ara conocer 0arias cosas5 +e2en+ien+o +e) 0a)or +e su
2ar.metro entero a" *i a es menor que 05 2ue+e reconocer un IDENT o una ca+ena" *i a es i-ua) a
05 un entero o una ca+ena" *i a es maor que 05 un rea) o una ca+ena" *i )a entra+a es una ca+ena
)a reconoce siem2re5 se im2rime 2or 2anta))a e) 0a)or +e a"
*e 2ue+en uti)i%ar e)ementos etiqueta+os como 2ar.metros +e otras re-)as" 9or e4em2)oF
lista_idents[AST tipo] : (IDENT)+
{ ... }
;
// Pasa como parmetro el AST generado por tipo a lista_idents
declaracion : t:tipo lista_idents [.t];
2.".#: 6evolviendo valores en una regla
E) ti2o +e )os mto+os +e) aut=mata recursi0o +escen+ente -enera+o 2or #7$38 es 2or +efecto
void" *in em6ar-o se 2ue+e !acer que una re-)a +e0ue)0a un 0a)or 2ara 2o+er uti)i%ar)o en otros
sitios" 9ara e))o !a que uti)i%ar )a 2a)a6ra reser0a+a returnsF
regla3 returns ,Strin% a-
: i:IDENT {a=i.getText();}
| e:LIT_ENTERO {a=e.getText();}
;
regla3 ser. i+ntica a regla2 sa)0o 2or que +e0o)0er. )a 0aria6)e a su ti2o ser.5
consecuentemente5 String en )u-ar +e void"
9ara 2o+er uti)i%ar e) 0a)or +e0ue)to 2or una re-)a 6asta con +ec)arar una 0aria6)e que -uar+e
+ic!o 0a)or (2or e4em2)o como se in+ica en e) a2arta+o anterior) asi-nar)e e) 0a)or con e)
o2era+or DUE"
regla4 {String mens} : mens&regla3 {System.out.println(mens);} ;
L7o !a que confun+ir to+o )o anterior con )as 0aria6)es que se uti)i%an 2ara -uar+ar
)os 0a)ores que +e0ue)0en )as re-)as con )a c).usu)a returnsNF
expresion returns [float f] : ... ;
programa
{ float result; }
: result&e/expresion
{
System.out.println(AST: + #e.toStringList());
System.out.println(result: + result);
}
;
En e) e4em2)o anterior5 resu)t sir0e 2ara -uar+ar e) 0a)or +e0ue)to 2or expresion5 mientras que
#e sir0e 2ara referenciar e) #*$ que !a crea+o"
>recuentemente )os 0a)ores +e0ue)tos +e6en ser inicia+os" 9ue+en inicarse en )a +ec)araci=n
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )7
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.)6 Reglas !>N. e8tendidas
returnsF
expresion returns [float f&] : ... ;
/n ?)timo a2unteF en )as re-)as +e )os ana)i%a+ores ):icos5 es con0eniente )imitar e) uso +e )a
c).usu)a returns +e) 2aso +e 2ar.metros)as re-)as +ec)ara+as como protected
18
@ )as re-)as
2?6)icas no +e6eran 2asar o +e0o)0er 0a)ores 2ues )os ana)i%a+ores +e ni0e)es 2osteriores no
2o+r.n recu2erar)os (2ues se )imitan a uti)i%ar )a interfa% TokenStream ))aman+o a nextToken)"
2.".+: ,tili8ando rangos de caracteres en el anali8ador l0xico
3os ana)i%a+ores ):icos uti)i%an re-)as EG7> 2ara reconocer a-ru2ar en toHens ran-os +e
caracteres" 9or )o tanto5 es necesario 2o+er intro+ucir ran-os reconocimiento +e caracteres
in+i0i+ua)es en e) ana)i%a+or" #sF
class MiLexer extends Lexer;
OP_MAS : '+'; // Carcter individual
ENTERO : (00..010)+ ; // Rango de caracteres
#+em.s es 2osi6)e es2ecificar ca+enas 2a)a6ras reser0a+as@ )o 0eremos en e) ca2tu)o 4"
2.".-: ,tili8ando 'atrones (rbol en el anali8ador sem(ntico
3os ana)i%a+ores sem.nticos 2ue+en uti)i%ar en sus re-)as cua)quier construcci=n +e )os otros
ana)i%a+ores (e:ce2to ran-os +e caracteres o caracteres in+i0i+ua)es) a+em.s una e:c)usi0aF e)
2atr=n .r6o)"
Esta seccin es una traduccin li"re de algunos pasa4es del manual de /A1L?. )ic%ero sor.%tml
3a -ram.tica +e es2ecificaci=n +e ana)i%a+ores sem.nticos
19
se 6asa en )a -ram.tica EG7> con
acciones 2re+ica+os sint.cticos sem.nticos incrusta+os"
regla : alternativa1
| alternativa2
...
| alternativaN
;
1on+e ca+a a)ternati0a es una enumeraci=n +e e)ementos" Ca+a uno +e estos e)ementos 2ue+e
ser cua)quiera +e )os 2resentes en )as -ram.ticas +e )os ana)i%a+ores sint.cticos (toHens5
referencias a otros re-)as5 cierres""") 2ero a+em.s se aCa+e un nue0o ti2o +e e)ementoF e) patrn
#r"ol5 que tiene )a si-uiente formaF
#( token-raz hijo1 hijo2 ... hijoN )
9or e4em2)o5 e) si-uiente 2atr=n .r6o) reconoce un sim2)e #*$ con e) toHen OP_MAS como ra%
+os LIT_ENTEROs como !i4osF
#( OP_MAS LIT_ENTERO LIT_ENTERO)
3a ra% +e) 2atr=n .r6o) tiene que ser una referencia a un toHen5 2ero )os !i4os 2ue+en ser su6
re-)as" 9or e4em2)o5 )a estructura com?n si-entonces-sino 2o+ra re2resentarse asF
18 B.s informaci=n so6re re-)as 2rote-i+as en e) ca2tu)o 4"
19 En )a +ocumentaci=n se )es ))ama treeparsers5 o itera+ores +e .r6o)es"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )/
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.)6 Reglas !>N. e8tendidas
#( RES_SI expresion listaInstruciones (listaInstrucciones)? )
/n conce2to im2ortante a tener en cuenta a) es2ecificar 2atrones .r6o) es que e) reconocimiento
no se %ace de manera exactaB sino de manera su&iciente" $an 2ronto como un #*$ satisface un
2atr=n5 es reconoci+o5 sin im2ortar cu.nto +e) .r6o) que+a 2or reconocer" 9or e4em2)o5 e) 2atr=n
#(A B) reconocer. cua)quier .r6o) m.s -ran+e5 como #(A (#B #C) #D)"
*i se +esea +iferenciar entre .r6o)es con estructura 2areci+a (2or e4em2)o5 si )os +os .r6o)es
2ue+en ser reconoci+os +e manera suficiente5 aunque no e:acta) es 2osi6)e mo+ificar H5 aunque
+a+a )a 2ro2ia natura)e%a +e )os #*$s (que requieren un toHen como ra%) norma)mente se +e4a
HU15 se recurre a )os 2re+ica+os sint.cticos"
*u2on-amos que uti)i%amos e) toHen ;9_BE7;* como 6ase tanto 2ara )as su6stracciones
norma)es entre n?meros ('A1) como 2ara e) cam6io +e si-no (A6)" # )a !ora +e reconocer )os
#*$s ten+ramos que uti)i%ar un 2re+ica+o sint.ctico 2ara +iferenciarF
expresion : #(OP_MENOS expresion expresion)=> #( OP_MENOS expresion expresion )
| #(OP_MENOS expresion)
...
;
E) or+en +e )os e)ementos es im2ortanteF )a 2rimera a)ternati0a tiene que ser siem2re D)a m.s
-ran+eE"
3os 2re+ica+os sem.nticos funcionan e:actamente i-ua) que en )os otros ni0e)es"
YYYYY
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )<
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.06 %onstrucci(n de los A1Ts
Becci%n 2.#: &onstrucci%n de los AB>s
3a funci=n 2rinci2a) +e) ana)i%a+or ):ico es construir e) #*$" E) cometi+o +e a)-unos
ana)i%a+ores sem.nticos tam6in 2ue+e ser )a construcci=n +e) #*$" En esta secci=n
e:2)icaremos c=mo se construe un #*$" 3as e:2)icaciones que +aremos ser.n 0.)i+as tanto 2ara
un ana)i%a+or sint.ctico como uno ):ico ()os o2era+ores funcionan +e )a misma forma en )os +os
ti2os +e ana)i%a+ores)" *in em6ar-o )os e4em2)os que 0o a uti)i%ar ser.n +e un ana)i%a+or
sint.ctico"
2.#.1: &om'ortamiento 'or de!ecto
3a o2ci=n buildAST acti0a +esacti0a )a construcci=n +e) .r6o) #*$5 en e) caso +e) ana)i%a+or
sint.ctico5 )a transformaci=n +e) .r6o) en e) ana)i%a+or sem.ntico"
3os D)a+ri))osE con )os que #7$38 construe )os #*$s son )os toHens (aunque ste
com2ortamiento 2or +efecto 2ue+e mo+ificarse e:ten+erse)" Consi+eremos 2or e4em2)o una
0ersi=n sim2)e +e )a e:2resi=n +e) 2ro+uctoF
expr_producto : IDENT OP_PRODUCTO IDENT ;
3o que se !ace con )as e:2resiones 6inarias ( unarias) es co)ocar como ra% +e) #*$ -enera+o e)
o2era+or (en nuestro caso5 OP_PRODUCTO) 2ara 2o+er i+entificar e) ti2o +e e:2resi=n5 como
!i4os )os o2eran+os" Es +ecir5 se +e6era -enerar un #*$ como steF
;9_98;1/C$;
,1E7$ ,1E7$
Ilustracin 2.I GD3>J@/0 IDEA1 IDEA1E
8e2ito que )os e)ementos 6.sicos +e construcci=n +e #*$s son )os toHens" /na re-)a 2ue+e5
a+em.s +e tener toHens5 !acer referencia a otras re-)as" 9or e4em2)o5 en e) si-uiente con4unto +e
re-)asF
expr_producto : IDENT OP_PRODUCTO IDENT ;
expr_suma : expr_producto OP_SUMA expr_producto ;
expr_suma !ace referencia a expr_producto en +os ocasiones" 3o que se !ace es sustituir estas
referencias 2or e) .r6o) corres2on+iente" Es +ecir5 e) .r6o) 2ara expr_suma +e6era estar forma+o
2or +os .r6o)es expr_producto enrai%a+os con un OP_SUMA" #)-o asF
Ilustracin 2.1: /01 para una exprJsuma simpli&icada
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 0
;9_98;1/C$;
,1E7$ ,1E7$
;9_98;1/C$;
,1E7$ ,1E7$
;9_*/B#
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.06 %onstrucci(n de los A1Ts
7=tese no o6stante que no !e +ic!o que se construan asF !e +ic!o que de"eran construirse as"
9or +es-racia5 ta) como est.n escritas )a re-)as anteriores5 no ocurrir. as" E))o im2)icara que
#7$38 !a6ra si+o ca2a% +e +e+ucir 2or s so)o )as re)aciones 4er.rquicas entre )os toHens"
#7$38 no es tan )isto"
E) com2ortamiento 2or +efecto +e #7$38 con res2ecto a )os toHens es crear un #r"ol
degenerado con todos ellos"
E) conce2to +e D.r6o) +e-enera+oE 2ue+e ser +ifci) +e enten+er" 3os .r6o)es +e-enera+os5
carecen +e no+o ra%" *on una secuencia +e no+os D!ermanosE sin ra% que )os i+entifique" cste
ti2o +e .r6o) 2ue+e im2)ementarse -racias a que )os no+os +e )os #*$s +e ant)r D-uar+anE un
en)ace con su !ermano 2or )a +erec!a" cstos en)aces a2arecen en )nea +iscontinua"
9or consi-uiente e) .r6o) que se crear. 2ara expr_producto ser.F
;9_98;1/C$; ,1E7$ ,1E7$
Ilustracin 2.11 Hr"ol degenerado para exprJproducto
9or e:tensi=n5 e) #*$ 2ara e:2r_suma ser. tam6in +e-enera+oF
Ilustracin 2.12 Hr"ol degenerado para exprJsuma
2.#.2: l su!ijo de enrai8amiento 9D;
Est. c)aro que es necesario 2o+er es2ecificar a #7$38 qu toHens 0an a uti)i%arse como ra% +e
un .r6o)" 9ara e))o se uti)i%a e) su&i4o de enrai-amiento5 que se re2resenta con un acento
circunf)e4o (h)" Cuan+o a2arece co)oca+o tras un toHen5 se est. in+ican+o a #7$38 que Duti)ice
ese toHen 2ara enrai%ar e) .r6o) que !asta a!ora !a construi+oE" Es +ecir5 2ara que nuestras
e:2resiones funcionen a+ecua+amente !a que aCa+ir e) sufi4o tras )os +os o2era+oresF
expr_producto : IDENT OP_PRODUCTO^ IDENT ;
expr_suma : expr_producto OP_SUMA^ expr_producto ;
*i +entro +e una misma re-)a !a 0arios toHens suce+i+os con e) sufi4o +e enrai%amiento5 se 0an
!acien+o a)ternati0amente races5 +e forma que se crean su6A.r6o)es" 9or e4em2)o5 )a re-)aF
a: A^ B^ C D
-enerar. e) .r6o) #(A #(B C D))" cste .r6o) tiene una ra% en #5 )ue-o un s=)o !i4o que tiene
una ra% en G5 fina)mente +os !o4as5 C 1" Es +ecirF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 01
;9_98;1/C$; ,1E7$ ,1E7$ ;9_98;1/C$; ,1E7$ ,1E7$ ;9_*/B#
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.06 %onstrucci(n de los A1Ts
Ilustracin 2.1( GD/ GDB 2 DEE
E) sufi4o +e enrai%amiento so)amente 2ue+e se-uir a toHens (que si-uiera a una
referencia a una re-)a no ten+ra senti+o@ no se 2ue+e enrai%ar con un .r6o) +e m.s +e
un no+o)"
Cuan+o un Token se uti)i%a como ra%5 se crea un nue0o #*$ se inicia)i%a con )os +atos +e)
toHen" En )a im2)ementaci=n 2or +efecto se crea un CommonAST5 so)amente se D-uar+anE e)
te:to e) ti2o +e) toHen" 3a instancia +e Token no se -uar+a en e) #*$@ so)amente se co2ian
a)-unos 2ar.metros +e sta"
2.#.3: Bu!ijo de !iltrado 9E;
3a informaci=n que +e6e -uar+ar en )os #*$s es )a mnima im2rescin+i6)e@ en muc!os casos no
es necesario -uar+ar to+os )os toHens +e una re-)a5 2ues a)-unos no a2ortan informaci=n
sem.ntica (a 2esar +e que sint.cticamente ten-an un 2a2e) 2rimor+ia))"
E) su&i4o de &iltrado (car.cter N) sir0e e:actamente 2ara eso5 2ara fi)trar" Cua)quier sm6o)o
suce+i+o 2or N ser. i-nora+o a )a !ora +e rea)i%ar e) #*$" E) car.cter +e fi)tra+o 2ue+e se-uir
tanto a toHens como a referencias a otras re-)as"
,ma-inemos 2or e4em2)o un 6uc)e <!i)e +e C" 3a re-)a que )o re2resentara sera a)-o asF
listaInst : ... ; // Una lista de instrucciones
bucleWhile: RES_WHILE PARENT_AB expr PARENT_CE
LLAVE_AB listaInst LLAVE_CE
;
*u2on+remos que lista_inst es una re-)a a +efini+a que +e0ue)0e un .r6o) forma+o 2or una
serie +e instrucciones enrai%a+as con e) toHen ima-inario LISTA_INST
'0
"
9ara e) #*$ +e) 6uc)e ten+r. como ra% )a 2a)a6ra reser0a+a RES_WHILE5 ten+r. +os !i4osF )a
e:2resi=n +e sa)i+a (su2onemos que e) .r6o) +e expr a se conoce) )a )ista +e instruccionesF
'0 B.s a6a4o e:2)icar que 2ara 2o+er tener una )ista +e estas caractersticas ser. necesario enrai%ar con un toHen ima-inario"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 02
#
C
G
1
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.06 %onstrucci(n de los A1Ts
Ilustracin 2.1* /01 del "ucle $%ile
En otras 2a)a6ras5 tenemos !acer RES_WHILE ra% +e) .r6o) (uti)i%an+o e) o2era+or +e
enrai%amiento) tenemos que fi)trar to+as )as ))a0es 2arntesis5 que no a2ortan informaci=n
sem.ntica" 3o !aremos asF
bucleWhile: RES_WHILE^ PARENT_AB! expr PARENT_CE!
LLAVE_AB! listaInst LLAVE_CE!
;
2.#.": 6esactivando la construcci%n 'or de!ecto
Ja 0imos que es 2osi6)e acti0ar +esacti0ar )a construcci=n autom.tica +e) #*$ con )a o2ci=n
+e) ana)i%a+or buildAST (2onin+o)a a false se +esacti0a )a construcci=n5 2onin+o)a a true
se acti0a)"
Con buildAST acti0a+a5 a+em.s5 es 2osi6)e +esacti0ar )a construcci=n )oca)mente en una re-)a"
9ara e))o se uti)i%a e) o2era+or +e fi)tra+o" 9ue+e !acerse +e +os formasF
X co)oc.n+o)o tras )a 2arte i%quier+a (nom6re) +e )a re-)a se +esacti0a )a construcci=n 2or
+efecto +e #*$s 2ara esa re-)aF
regla ! : A B C ; // desactiva la construccin para toda la regla
X co)oc.n+o)o +e)ante +e una o2ci=n se +esacti0a )a construcci=n +e) #*$ 2ara esa o2ci=n"
regla : opcion1
| ! opcion2 // desactiva la construccin para la opcin 2
| opcion3
;
E) .r6o) resu)tante +e una re-)a o su6 re-)a 2rece+i+as con e) 2refi4o +e +esacti0aci=n +e )a
construcci=n ser. un .r6o) 0aco" # efectos +e )a construcci=n +e) #*$5 ser. como si )as entra+as
que -eneraron estas re-)as nunca !u6ieran e:isti+o"
2.#.#: &onstruyendo el AB> en una acci%n
Es 2osi6)e construir e) #*$ +e una re-)a u o2ci=n en una acci=n" Esto es es2ecia)mente ?ti)
cuan+o se !a +esacti0a+o )a construcci=n 2or +efecto +e) #*$" 9or e4em2)o5 2ara construir a
mano )a e:2resi=n sim2)ifica+a +e) 2ro+uctoF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 0-
8E*_\I,3E
3,*$#_,7*$
e:2r
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.06 %onstrucci(n de los A1Ts
expr_producto ! : // desactivamos la construccin por defecto
e1:IDENT op:OP_PRODUCTO e2:IDENT
{
#expr = new antlr.CommonAST(#op);
expr.addChild(#e1);
#e1.setNextSibling(#e2);
}
7=tese que !emos teni+o que aCa+ir etiquetas a )os +iferentes e)ementos +e )a re-)a 2ara 2o+er
referenciar)os en )a acci=n"
E) mto+o anterior es 2oco uti)i%a+o" 1e acuer+o con e) manua) +e #7$385 es me4or uti)i%ar una
factora" E) c=+i-o necesario 2ara !acer)o es mu )ar-o te+ioso +e escri6ir5 as que no )o
mostrar aqu" #+em.s5 #7$38 2ro2orciona una manera m.s a+ecua+a +e construir un #*$ en
)as acciones"
Este mto+o consiste en uti)i%ar una serie +e a6re0iaturas que construen e) #*$ +e )a manera
m.s a+ecua+a (a+em.s +e 2ermitir a )a re-)a 2ermanecer in+e2en+ente +e) )en-ua4e -enera+o)"
Estas a6re0iaturas sonF
X 3a +o6)e a)mo!a+i))a5 ##5 2ara re2resentar )a ra% +e )a re-)a actua)"
X 3a a)mo!a+i))a se-ui+a +e una serie +e .r6o)es entre 2arntesis5 ##(...)5 crea un .r6o) cua
ra% es e) 2rimer .r6o) )os +em.s son sus !i4os"
X 3a a)mo!a+i))a se-ui+a +e corc!etes5 ##[...]5 2ermite crear un no+o" 9ue+e es2ecificarse un
toHen o un toHen una ca+ena" Reremos c=mo uti)i%ar esta construcci=n un 2oco m.s
a+e)ante"
9or e4em2)o5 e) c=+i-o equi0a)ente a) anterior uti)i%an+o )as a6re0iaturas +e #7$38 es e)
si-uienteF
expr! : e1:ENTERO op:OP_MAS e2:ENTERO
{ ## = #(#op, #e1, #e2); }
Esta senci))a acci=n rea)i%a )a construcci=n com2)eta +e) .r6o)" 1e to+as maneras tn-ase
2resente que no es necesaria@ e) c=+i-o anterior es equi0a)ente a ste otro5 en e) que se a2ro0ec!a
)a construcci=n 2or +efecto +e #7$38F
expr : ENTERO OP_MAS^ ENTERO;
/na nota so6re e) sufi4o +e fi)tra+oF
En un ana)i%a+or sint.ctico5 una referencia a una re-)a que est se-ui+a 2or e) sufi4o
+e fi)tra+o sigue constru!endo el /015 sim2)emente ste no se aCa+e a )a re-)a 2a+re"
*in em6ar-o si-ue estan+o +is2oni6)e 2ara uti)i%arse en )as acciones"
Es +ecir5 en )a si-uiente re-)aF
a: regla1 regla2! regla3;
E) #*$ que se construe con regla2 no se inc)ue en e) #*$ +e a5 pero s se crea5 2u+in+ose
uti)i%ar en una acci=nF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 0)
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.06 %onstrucci(n de los A1Ts
a: r1:regla1 r2:regla2! r3:regla3
{ ## = #(#r1, #r2, #r3); }
;
2.#.+: &asos en los que la construcci%n 'or de!ecto no basta
3as acciones no so)amente 2ue+en crear com2)etamente e) .r6o) +e una acci=n@ tam6in 2ue+en
mo+ificar e) .r6o) que se crea autom.ticamente en una acci=n"
# menu+o 6astar. con ser0irse +e sufi4os 2ara construir )os #*$s" *in em6ar-o e:isten tres casos
6astante frecuentes en )os que )a me4or so)uci=n es 0a)erse +e )a construcci=n 2or +efecto
mo+ificar)a a+ecua+amente en una acci=n"
X Caso 1F 7in-uno +e )os sm6o)os +e )a re-)a es una ra% a+ecua+a5 +e6e uti)i%arse un toHen
ima-inario como ra%"
clase MyParser extends Parser;
tokens{
LLAMADA; // Un token imaginario
LISTA_IDENTS; // Otro (para el siguiente ejemplo)
}
llamada: IDENT PARENT_AB! lista_idents PARENT_CE!
{ ## = #( #[LLAMADA,"LLAMADA"], ## ); }
*i )a re-)a llamada no tu0iera acciones5 se o6ten+ra un .r6o) +e-enera+o (2ues nin-?n no+o
tiene e) sufi4o h) con un i+entifica+or !ermana+o +e )o que +e0ue)0a lista_idents" Esta
estructura no ofrece informaci=n suficienteF Oc=mo sa6er que se trata +e una llamadaQ /n
i+entifica+or se-ui+o +e una )ista +e i+entifica+ores 2ue+e ser casi cua)quier cosa (una ))ama+a5
un acceso o una +ec)araci=n +e 0aria6)es)" Es necesario a)-?n ti2o +e informaci=n
(2referentemente en )a ra% +e) .r6o)) que es2ecifique Desto es una ))ama+a5 no una +ec)araci=n o
un accesoE"
9recisamente sto es )o que se !ace en )a acci=n +e )a re-)a" 9rimero se crea un no+o ficticio (#
[LLAMADA, LLAMADA])" E) 2rimer 2ar.metro 2ro2orciona e) ti2o +e toHen 2ara e) .r6o)5
mientras que e) se-un+o es una ca+ena cua)quiera" *e sue)e uti)i%ar e) nom6re +e) toHen 2ara que
sea m.s f.ci) !acer e) +e6u-"
/na 0e% crea+o e) no+o ficticio5 se uti)i%a como ra% +e) .r6o) que se !a6a -enera+o
autom.ticamente" Esto es mu interesanteF e) 2ro2io .r6o) -enera+o (referencia+o con e)
como+n ##) 2ue+e ser reuti)i%a+o en su 2ro2ia re+efinici=n" En ste caso5 nos !a 0eni+o mu
6ien@ 2o+emos e)iminar )os 2arntesis en )a -eneraci=n 2or +efecto (con e) sufi4o +e fi)tra+o5 DNE)
)ue-o enrai%ar e) #*$ +e-enera+o resu)tante con e) no+o ficticio +e LLAMADA"
X Caso 'F )istas +e e)ementos5 a sean -enera+as 2or c)ausuras 2ositi0as o 2or cierres +e M)eene"
lista_idents: IDENT (COMA! IDENT)*
{ ## = #( #[LISTA_IDENTS,"LISTA_IDENTS"], ##); }
*i no tu0iera )a acci=n5 )a re-)a -enerara un .r6o) +e-enera+o consistente en una )ista +e
i+entifica+ores5 +e )on-itu+ 0aria6)e" Este ti2o +e .r6o)es es mu 2oco mane4a6)e5 as que se
enra%a con una ra% ficticia como )a +e) e4em2)o"
X Caso 3F Cuan+o es necesario co2iar ciertos no+os 2ara uti)i%ar)os en otros sitios" (Reremos
este ti2o +e com2ortamiento m.s a6a4o5 a) reso)0er e) 2ro6)ema +e) a%?car sint.ctica)"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 00
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.,6 Anali:adores de la Cicrocalculadora
Becci%n 2.+: Anali8adores de la Ficrocalculadora
2.+.1: l !ic*ero Ficro&alc.g y el 'aquete microcalc
Ia ))e-a+o e) momento +e em2e%ar con nuestra microca)cu)a+ora" Ramos a -enerar tres
ana)i%a+ores (uno ):ico5 uno sint.ctico uno sem.ntico) 2or ni0e)5 en 4a0a5 to+os en e) mismo
fic!ero"
# )a !ora +e +esarro))ar una nue0a a2)icaci=n en 4a0a es mu recomen+a6)e intro+ucir to+as )as
c)ases en un 2aquete 4a0a nue0o" 7osotros inc)uiremos to+os )os ana)i%a+ores en un 2aquete que
))amaremos microcalc"
E) comien%o +e) fic!ero MicroCalc.g ser.5 2or )o tanto5 e) si-uienteF
header {
package microcalc;
}
9ara que m.s tar+e e) intr2rete funcione ser. necesario que )os fic!eros en c=+i-o nati0o
-enera+os se encuentren situa+o en un +irectorio ))ama+o microca)c"
1a+o que -eneraremos c=+i-o 4a0a5 no ser. necesario mo+ificar )as o2ciones -)o6a)es +e)
fic!ero5 as que )as omitiremos" 9asaremos +irectamente a) ana)i%a+or"
2.+.2: l anali8ador l0xico
7uestro ana)i%a+or ):ico ser. senci))oF so)amente es ca2a% +e reconocer )os enteros )os rea)es5
)os o2era+ores aritmticos 6.sicos )os 2arntesis"
Comen%aremos +efinien+o e) ana)i%a+orF
class MicroCalcLexer extends Lexer ;
7o 0amos a uti)i%ar )a %ona +e o2ciones5 )a +e toHens o )a +e c=+i-o nati0o5 as que 2asaremos
+irectamente a )as re-)as"
3o 2rimero que se sue)e !acer en un ana)i%a+or ):ico es +efinir )os D6)ancosE" 3os 6)ancos son
caracteres que no tienen re)e0ancia a ni0e) sint.ctico5 2ero que sir0en 2ara +iferenciar unos
toHens +e otros" En nuestro caso nos estamos refirien+o a )os es2acios )os caracteres +e
ta6u)aci=n"
BLANCO : (' ' | '\t')
{ $setType(Token.SKIP); };
;6sr0ese )o que !acemos en )a acci=n" $setType es una acci=n es2ecia) que 2ermite mo+ificar
e) ti2o +e) toHen que estamos crean+o" E) ti2o Token.SKIP quiere +ecir que e) toHen no +e6e ser
2asa+o a) ni0e) sint.ctico"
Es usua) uti)i%ar caracteres en ma?scu)as 2ara +enominar )as re-)as +e )os ana)i%a+ores ):icos5
2orque -eneran toHens" B.s a+e)ante (en )os ni0e)es sint.ctico sem.ntico) ser. mu ?ti) 2ara
+iferenciar )os toHens +e )as referencias a re-)as"
3o si-uiente que 0amos a reconocer ser.n )os o2era+ores aritmticos )os 2arntesis" 3as re-)as
son mu f.ci)es +e enten+er5 no creo que requieran e:2)icaci=nF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 0,
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.,6 Anali:adores de la Cicrocalculadora
OP_MAS : '+';
OP_MENOS : '-';
OP_PRODUCTO : '*';
OP_COCIENTE : '/';
PARENT_AB : '(';
PARENT_CE : ')';#
9or ?)timo5 tenemos que +efinir )os n?meros" En nuestro )en-ua4e +e microca)cu)a+ora 0amos a
tratar to+os )os n?meros como f)otantes" 9ero e:ternamente +e6emos 2ermitir uti)i%ar enteros"
#s que nuestra +efinici=n +e NUMERO ser. asF
NUMERO : ('0'..'9')+ ('.' ('0'..'9')+)?;
#na)icemos )a entra+a" En 2rimer )u-ar 2o+emos tener 1 o m.s +-itos (caracteres +e) 0 a) 9)"
1es2us tenemos una su6 re-)a o2ciona) (tiene e) o2era+or [Q[)5 es +ecir5 que 2ue+e a2arecer o
no" 1ic!a re-)a reconoce e) car.cter +e) 2unto (["[) )ue-o 1 o m.s +-itos" #s conse-uimos que
)a re-)a recono%ca tanto enteros (sin +ecima)es) como rea)es (con +ecima)es)"
Esta era )a ?)tima re-)a que !a6a que +efinir en e) ana)i%a+or ):ico" 9asemos a) si-uiente ni0e)"
2.+.3: l anali8ador sint(ctico
E) o64eti0o +e) ana)i%a+or sint.ctico es reconocer 2atrones en e) f)u4o +e toHens que )e ))e-a +e)
ni0e) ):ico or-ani%ar )a informaci=n en un #*$"
E) ana)i%a+or sint.ctico comen%ar. asF
class MicroCalcParser extends Parser ;
1a+o que +eseamos uti)i%ar e) ni0e) sem.ntico5 0amos a !acer que e) ana)i%a+or construa e)
#*$F
options
{
buildAST = true;
}
7o uti)i%aremos )a %ona +e toHens o )a +e c=+i-o nati0o"
E) ana)i%a+or +e6e reconocer una serie +e e:2resiones aritmticas" 3a natura)e%a +e) a)-oritmo
33(H) !ace que reconocer correctamente +ic!as e:2resiones no sea tri0ia)5 2orque a) contrario
que en 6ison no es 2osi6)e +efinir 2riori+a+ en )os o2era+ores" Es +ecir5 ante )a si-uiente entra+aF
1+3*4/2
tenemos que encontrar una forma +e !acer que e) ana)i%a+or recono%ca 1+(3*(4/2))5 no
(1+3)*(4/2) o 1+(3*4)/2"
E) 2ro6)ema +e )as e:2resiones est. a mu estu+ia+o resue)to" 3a so)uci=n consiste en
comen%ar reconocien+o )as e:2resiones +e m.s 6a4a 2riori+a+ uti)i%an+o como Do2era+oresE )as
+e m.s a)ta 2riori+a+" 3os o2era+ores se co)ocan siem2re como races +e) #*$" 3as o2eraciones
+e suma5 que son )as +e m.s 6a4a 2riori+a+5 se reconoceran en 2rimer )u-arF
expresion : expSuma; //expresion es la regla base, la primera que se reconoce
expSuma : expResta (OP_SUMA^ expResta)*;
;6sr0ese que5en e) caso +e que a2are%ca un toHen OP_SUMA5 ste se uti)i%a como ra% +e) #*$"
expSuma se +efine en funci=n +e expResta5 cuo o2era+or tiene maor 2riori+a+" 1e )a misma
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 07
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.,6 Anali:adores de la Cicrocalculadora
forma5 se +efinir. expResta en funci=n +e expProducto expProducto en funci=n +e
expCociente"
expResta : expProducto (OP_MENOS^ expProducto)* ;
expProducto : expCociente (OP_PRODUCTO^ expCociente)* ;
expCociente : expBase (OP_COCIENTE^ expBase)* ;
Pue+a 2or 0er qu es expBase"
expBase es e) ti2o +e e:2resi=n +e m.s a)ta 2riori+a+" 9or )o tanto5 +e6e ser e) ?)timo en
e0a)uarse" 3o ?)timo que +e6e e0a)uarse son )os 2ro2ios n?meros )as e:2resiones entre
2arntesis" #s que expBase que+ar. asF
expBase : NUMERO
| PARENT_AB! expresion PARENT_CE!
;
(7=tese que )os 2arntesis no se inc)uen en e) #*$ K se uti)i%a e) o2era+or +e fi)tra+o)
E) ni0e) sint.ctico est. aca6a+o" 9asemos a) ni0e) sem.ntico"
2.+.": $ivel sem(ntico
7uestro ni0e) sem.ntico se )imitar. a rea)i%ar )os c.)cu)os aritmticos o2ortunos a 2artir +e) #*$5
+e0o)0ien+o e) resu)ta+o en un float"
Comen%aremos +efinien+o e) ana)i%a+orF
class MicroCalcTreeParser extends TreeParser ;
7o uti)i%aremos )a secci=n +e o2ciones5 )a +e toHens o )a +e c=+i-o nati0o" 9asemos5 2ues5 a )a
secci=n +e re-)as"
3a ?nica re-)a que 0a a tener e) ana)i%a+or sem.ntico es e:ce2cion" e:ce2cion +e0ue)0e un float
(inicia)mente con 0a)or 0"0)"
expresion returns [float result=0]
Como 0eremos5 en muc!as ocasiones 0amos a necesitar -uar+ar resu)ta+os 2arcia)es +e
De:2resiones !i4asE en sen+os f)otantes5 as que +ec)araremos +os 0aria6)es )oca)es5 izq der5
2ara -uar+ar )os resu)ta+os +e )os c.)cu)os +e) D!i4o +erec!oE e) D!i4o i%quier+oEF
expresion returns [float result=0]
{ float izq=0, der=0; } :
result ser. ca)cu)a+o a 2artir +e) #*$" 3os c.)cu)os ser.nF
X E) 0a)or +e) n?mero5 si e) #*$ es un NUMERO
X 3a suma +e )os !i4os i%quier+o +erec!o5 si )a ra% es OP_SUMA
X 3a resta +e )os !i4os i%quier+o +erec!o5 si )a ra% es OP_MENOS
X E) 2ro+ucto si )a ra% es OP_PRODUCTO
X E) cociente si )a ra% es OP_COCIENTE" En este ?)timo caso ten+remos en cuenta que e) +i0isor
2ue+e ser 0"
#s5 e) c=+i-o com2)eto +e expresion ser.F
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 0/
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.,6 Anali:adores de la Cicrocalculadora
expresion returns [float result=0]
{ float izq=0, der=0; }
: n:NUMERO
{ result = new Float(n.getText()).floatValue(); } // se devuelve el float
| #(OP_MAS izq=expresion der=expresion)
{ result = izq + der ; } // se suman izq y der
| #(OP_MENOS izq=expresion der=expresion)
{ result = izq - der ; } // se restan
| #(OP_PRODUCTO izq=expresion der=expresion)
{ result = izq * der ; } // se multiplican
| #(OP_COCIENTE izq=expresion der=expresion)
{
if(der==0.0)
throw new ArithmeticException("Divisin por cero");
result = izq / der; // se dividen (o se lanza una excepcin)
}
;
7=tese que 2o+ramos !a6er rea)i%a+o e) c.)cu)o en e) ni0e) sint.ctico" *in em6ar-o
esto no es aconse4a6)eF )a funci=n m.s a+ecua+a +e) ni0e) sint.ctico es construir e)
#*$"
2.+.#: l !ic*ero Ficro&alc.g
# continuaci=n se muestra un )ista+o com2)eto +e) fic!ero MicroCalc.g5 con a)-unos
comentarios e:2)icati0os aCa+i+os"
header {
package microcalc;
/*-----------------------------------------------*\
| Un intrprete para una microcalculadora |
| _____________________________________________ |
| |
| MICROCALC |
| _____________________________________________ |
| |
| Enrique J. Garcia Cota |
\*-----------------------------------------------*/
}
/** Analizador lxico de MicroCalc **/
class MicroCalcLexer extends Lexer ;
/** Ignorar los espacios en blanco **/
BLANCO : (' ' | '\t')
{ $setType(Token.SKIP); };
/** Operador suma **/
OP_MAS : '+';
/** Operador resta **/
OP_MENOS : '-';
/** Operador multiplicacin **/
OP_PRODUCTO : '*';
/** Operador cociente **/
OP_COCIENTE : '/';
/** Parntesis abierto **/
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 0<
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.,6 Anali:adores de la Cicrocalculadora
PARENT_AB : '(';
/** Parntesis cerrado **/
PARENT_CE : ')';
/** Nmero (real o decimal) **/
NUMERO : ('0'..'9')+('.' ('0'..'9')+)?;
/** Analizador sintctico de Microcalc **/
class MicroCalcParser extends Parser ;
options
{
buildAST = true; // Construir el AST
}
/** Regla raz **/
expresion : expSuma ;
/** Expresin suma (nivel 4) **/
expSuma : expResta (OP_MAS^ expResta)* ;
/** Expresin resta (nivel 3) **/
expResta : expProducto (OP_MENOS^ expProducto)* ;
/** Expresin producto (nivel 2) */
expProducto : expCociente (OP_PRODUCTO^ expCociente)* ;
/** Expresin cociente (nivel 1)**/
expCociente : expBase (OP_COCIENTE^ expBase)* ;
/** Expresin base (nivel 0) **/
expBase : NUMERO
| PARENT_AB! expresion PARENT_CE!
;
/** Analizador semntico de MicroCalc **/
class MicroCalcTreeParser extends TreeParser ;
/**
* Esta regla parsea el AST y devuelve el resultado de los clculos.
* Tambin es capaz de lanzar una excepcin si se encuentra una
* divisin por cero.
**/
expresion returns [float result=0]
{ float izq=0, der=0; }
: n:NUMERO
{ result = new Float(n.getText()).floatValue(); }
| #(OP_MAS izq=expresion der=expresion)
{ result = izq + der ; }
| #(OP_MENOS izq=expresion der=expresion)
{ result = izq - der ; }
| #(OP_PRODUCTO izq=expresion der=expresion)
{ result = izq * der ; }
| #(OP_COCIENTE izq=expresion der=expresion)
{
if(der==0.0)
throw new ArithmeticException("Divisin por cero");
result = izq / der;
}
;
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota ,
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.,6 Anali:adores de la Cicrocalculadora
2.+.+: Generando los anali8adores de Ficro&alc
/na 0e% !emos +efini+o e) fic!ero MicroCalc.g5 e) si-uiente 2aso ser. Dcom2i)ar)oE" 3os
fic!eros +e -ram.ticas se Dcom2i)anE cuan+o se tra+ucen 2ara -enerar e) c=+i-o nati0o (4a0a5
C++ o Ce) +e )os ana)i%a+ores"
3a com2i)aci=n )a rea)i%aremos uti)i%an+o )a )nea +e coman+os +e) sistema o2erati0o B*
\in+o<s" 9ara com2i)ar en cua)quier otro sistema o2erati0o )os 2asos ser.n mu simi)ares (una
0e% se !aa insta)a+o e) com2i)a+or +e 4a0a #7$38)"
9ara com2i)ar MicroCalc.g como 0amos a mostrar en este a2arta+o ser. necesario
que #7$38 est con0enientemente insta)a+o en e) CLASSPATH +e 4a0a" En e)
a2n+ice DCuestiones tcnicasE !a informaci=n so6re c=mo insta)ar #7$38"
3a forma m.s com?n +e com2i)ar un fic!ero +e -ram.ticas es me+iante )a si-uiente or+enF
C:\> java antlr.Tool path_del_fichero
#s5 si +eseamos com2i)ar e) fic!ero MicroCalc.g que se encuentra en e) +irectorio
C:\microcalc5 +e6eremos !acer a)-o asF
C:\> cd microcalc
C:\microcalc\> java antlr.Tool MicroCalc.g
#7$38 se 2on+r. entonces en funcionamiento" *i to+o !a i+o 6ien5 a2arecer.n 0arios fic!eros
+e e:tensi=n Y"4a0a en e) +irectorio c:\microcalcF
X MicroCalcLexer.java
X MicroCalcParser.java
X MicroCalcTreeParser.java
X MicroCalcLexerTokenTypes.java
3os tres 2rimeros fic!eros son )os ana)i%a+ores 2ro2iamente +ic!os" E) ?)timo es un interfa% 4a0a
que contiene to+os )os Dti2os +e toHensE +e) ana)i%a+or ):ico (m.s informaci=n so6re sto en e)
ca2tu)o 4)"
Pue+a un ?nico 2aso 2ara tener unos ana)i%a+ores com2)etamente funciona)esF com2i)ar )os
fic!eros Y"4a0a 2ara o6tener )os fic!eros Y"c)ass" Esto se rea)i%a +e )a misma manera que
com2i)amos cua)quier fic!ero Y"4a0a" 1a+o que 0amos a com2i)ar un 2aquete com2)eto5 )a
manera m.s senci))a +e !acer)o esF
C:\microcalc\> cd ..
C:\> java microcalc\*.java
Como !emos inc)ui+o to+os )os ana)i%a+ores +entro +e) 2aquete microca)c5 es
necesario que se )os fic!eros estn en un +irectorio ))ama+o microca)c 2ara que
2ue+an com2i)arse"
9ara 2o+er com2i)ar e) 2aquete microca)c5 ser. necesario que #7$38 se encuentre
en e) CLASSPATH"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota ,1
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.76 !5ecutando Cicrocalc
Becci%n 2.-: jecutando Ficrocalc
Iemos 2asa+o )a fase m.s +ifci) en e) +esarro))o +e microca)cF -enerar )os ana)i%a+ores +e) nue0o
micro)en-ua4e" *in em6ar-o to+a0a nos que+a un 2aso mu im2ortante 2or +arF !acer que )os
ana)i%a+ores DfuncionenE"
Ia6)an+o en )a 4er-a +e C C++5 +iramos que nos !ace fa)ta )a funci=n main" En )a 4er-a +e
4a0a5 nos !ace fa)ta e) mto+o main" *er. en +ic!o mto+o +on+e o6ten+remos +atos +e entra+a
+on+e se )os 2asaremos a )os ana)i%a+ores5 que ten+remos que !a6er crea+o"
2.-.1: La clase &alc
,nc)uiremos e) mto+o main en una nue0a c)ase5 +e )a que ser. en ?nico mto+o +is2oni6)e"
3)amaremos Calc a +ic!a c)ase5 as que )a im2)ementaremos en e) fic!ero Calc.java"
,nicia)mente )a c)ase Ca)c 2ermitir. )eer 2or )a entra+a est.n+ar un c.)cu)o a rea)i%ar5 e im2rimir.
e) resu)ta+o 2or )a 2anta))a5 terminan+o"
3a c)ase Calc formar. 2arte +e) 2aquete microcalc5 as que Calc.java comen%ar. asF
package microcalc;
1es2us 0en+r. )a secci=n +e im2ortaciones (con import)" 3a ?nica im2ortaci=n rea)mente
im2rescin+i6)e K aunque )ue-o aCa+amos m.s K ser. )a +e )a interfa% #*$ +e #7$38F
import antlr.collections.*S+;
public static void main(String args[])
{
Ie aqu un esquema +e )os 2asos que 0amos a rea)i%ar con CalcF
X 9aso 1F 3eer una ca+ena +e te:to 2or )a entra+a est.n+ar"
X 9aso 'F Construcci=n +e un ana)i%a+or ):ico 2ara +ic!a ca+ena"
X 9aso 3F Construcci=n +e un ana)i%a+or sint.ctico asocia+o a) ana)i%a+or ):ico"
X 9aso 4F 3an%ar e) an.)isis sint.ctico
X 9aso &F ;6tener e) #*$ construi+o en e) an.)isis sint.ctico"
X 9aso 6F Construir un ana)i%a+or sem.ntico
X 9aso (F 8ecorrer e) #*$ 2ara as o6tener e) 0a)or +e) c.)cu)o"
En su 0ersi=n inicia)5 Calc +e6er. )eer una )nea que e) usuario tec)ear." 1a+o que )os
ana)i%a+ores ):icos necesitan un f)u4o no una ca+ena 2ara constuirse5 -uar+aremos )a entra+a
en forma +e StringReader" *er. necesario im2ortar )as c)ases que 0amos a uti)i%ar"
...
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StringReader;
...
try
{
// PASO 1. Obtener una lnea de texto por la entrada estndard
BufferedReader in =
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota ,2
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.76 !5ecutando Cicrocalc
new BufferedReader(new InputStreamReader(System.in));
StringReader sbr = new StringReader(in.readLine());
1es2us crear. un ana)i%a+or ):ico a) que asociar. )a entra+aF
// PASO 2. Crear un analizador lxico para dicha entrada
MicroCalcLexer lexer = new MicroCalcLexer(sbr);
3ue-o un ana)i%a+or sint.ctico 2ara +ic!o ana)i%a+or ):ico" E) an.)isis se iniciar. ))aman+o a)
mto+o expresion() A )a re-)a ra% +e) an.)isis sint.ctico"
// PASO 3. Crear un analizador sintctico asociado al lxico
MicroCalcParser parser = new MicroCalcParser(lexer);
// PASO 4. Lanzar el anlisis lxico-sintctico
parser.expresion();
9or ?)timo5 crearemos un ana)i%a+or sem.ntico" 3)amaremos a) mto+o expresion +e +ic!o
ana)i%a+or 2as.n+o)e e) #*$ o6teni+o +e) ana)i%a+or sint.ctico" expresion +e0o)0er. e)
resu)ta+o +e )os c.)cu)os en forma +e float" ,m2rimiremos +ic!os resu)ta+osF
// PASO 5. Obtener el AST
AST ast = parser.getAST();
// PASO 6. Crear el analizador semntico
MicroCalcTreeParser treeParser = new MicroCalcTreeParser();
// PASO 7. Recorrer el AST
float result = treeParser.expresion(ast);
// Imprimimos el resultado
System.out.println("Resultado: " + result);
} catch (Exception e) {
e.printStackTrace(System.err);
}
}
2.-.2: &lase &alc re!inada
Ramos a !acer una ca)cu)a+ora un 2oco m.s ?ti)"
X En )u-ar +e 2o+er )eer una so)a 0e% )a entra+a5 !aremos que )a ca)cu)a+ora )ea una otra 0e% )a
entra+a est.n+ar5 )een+o ca+a )nea e im2rimien+o e) resu)ta+o 2or 2anta))a"
X E) 2roceso terminar. cuan+o e) usuario escri6a Dsa)irE" En caso +e que se intro+u%ca un 0a)or
incorrectamente constru+o5 )a ca)cu)a+ora +e6er. ser ca2a% +e 2e+ir una nue0a entra+a5 sin
que se a6orte )a e4ecuci=n +e) 2ro-rama"
9ara 2o+er rea)i%ar e) 2rimer 2unto 0amos a tener que uti)i%ar un 6uc)e +oA<!i)e5 en e) cua)
efectuaremos )os ( 2asos una otra 0e%" 3as 0aria6)es que uti)i%aremos )as crearemos fuera +e)
6uc)e 2ara -anar a)-o +e eficiencia5 aunque )as iniciaremos en e) 6uc)e"
En cuanto a) se-un+o 2unto5 )o que !aremos ser. ca2turar )as e:ce2ciones D+e reconocimientoE
+e #7$38" $o+as )as e:ce2ciones +e este ti2o son su6c)ases +e antlr.ANTLRException
'1
5 as
que 6astar. con ca2turar cua)quier e:ce2ci=n +e +ic!o ti2o en e) 6uc)e 2rinci2a)"
# continuaci=n se encuentra e) c=+i-o com2)eto +e )a nue0a c)ase CalcF
'1 B.s informaci=n so6re errores e:ce2ciones en e) ca2tu)o ( (8ecu2eraci=n +e errores)
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota ,-
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.76 !5ecutando Cicrocalc
package microcalc;
/*-----------------------------------------------*\
| Un intrprete para una microcalculadora |
| _____________________________________________ |
| |
| MICROCALC |
| _____________________________________________ |
| |
| Enrique J. Garcia Cota |
\*-----------------------------------------------*/
// Importar clases para leer en la entrada estndar
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StringReader;
// Importar AST
import antlr.collections.AST;
// Importar excepcines de ANTLR
import antlr.ANTLRException;
public class Calc
{
public static void main(String args[])
{
try
{
// Leer de la entrada
BufferedReader in =
new BufferedReader(new InputStreamReader(System.in));
// Iniciar variables que se utilizarn en el bucle
String entrada = null;
MicroCalcLexer lexer = null;
MicroCalcParser parser = null;
MicroCalcTreeParser treeParser = null;
AST ast = null;
float result = 0;
boolean bSalir = false;
// Comienza el bucle principal del mtodo
do
{
System.out.print("\n? ");
// PASO 1. Leer la entrada
entrada = in.readLine();
// PASO 1b. Si comienza con "salir", salir
if(entrada.startsWith("salir"))
bSalir=true;
else // si no...
{
try
{
// PASOS 2 y 3 Crear lexer y parser
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota ,)
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.76 !5ecutando Cicrocalc
lexer = new MicroCalcLexer(new StringReader(entrada));
parser = new MicroCalcParser(lexer);
// PASO 4. Lanzar el anlisis sintctico
parser.expresion();
// PASO 5. Obtener el AST
ast = parser.getAST();
// PASO 6. Crear el treeParser
treeParser = new MicroCalcTreeParser();
// PASO 7. Lanzar el anlisis semntico
result = treeParser.expresion(ast);
// Imprimir el resultado
System.out.println("Resultado: " + result);
// Capturar excepciones de ANTLR
}catch(ANTLRException re){
System.err.println( "No entend la entrada: '"+
entrada + "'");
System.err.println(re.getMessage());
}
// Capturar divisin por cero
catch(ArithmeticException ae)
{
System.err.println(ae.getMessage());
}
}
} while(!bSalir);
// Capturar otras excepciones
}catch (Exception e) {
e.printStackTrace(System.err);
}
}
Ie seCa)a+o +os %onas +e) c=+i-o que me 2arecen im2ortantesF
X 3a 2rimera5 2orque i)ustra c=mo !acemos 2ara sa)ir +e) 6uc)e K no mo+ificamos )os
ana)i%a+ores 2ara un sim2)e coman+o +e sa)i+a5 en )u-ar +e e))o com2ro6amos +irectamente si
)a entra+a comien%a con Dsa)irE"
X 3a se-un+a muestra c=mo ca2turar cua)quier e:ce2ci=n )an%a+a +urante e) reconocimiento +e
)os ana)i%a+ores o +urante su creaci=n" Este 6)oque catc! 2ermite ca2turar cua)quiera +e e))as5
+e4an+o 2asar otras como errores +e entra+a sa)i+a5 etc" #+em.s ca2turamos )os errores +e
+i0isi=n 2or cero (ca2turan+o ArithmeticException)"
2.-.3: ,tili8ando microcalc
/na 0e% -uar+a+o e) fic!ero Ca)c"4a0a en e) +irectorio cFimicroca)c5 so)amente !a que
recom2i)arF
c:\> javac microcalc\*.java
9ara conse-uir una microca)cu)a+ora com2)etamente funciona)"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota ,0
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2.76 !5ecutando Cicrocalc
*o)amente nos que+ar. e4ecutar )a ca)cu)a+ora" $enemos +os o2ciones"
3a 2rimera consiste en e4ecutar microca)c +es+e CFiV" *i e) +irectorio actua) (["[) se encuentra en
e) CLASSPATH5 2o+remos e4ecutar microca)c asF
c:\>java microcalc.Calc
En otro caso ten+remos que aCa+ir cFi a CLASSPATH" Esto 2ue+e !acerse 4usto antes +e in0ocar )a
microca)cu)a+oraF
c:\algun\sitio\> set CLASSPATH=%CLASSPATH%;C:\
c:\algun\sitio\> java microcalc.Calc
o 2ue+e !acerse en )a )nea +e coman+os con )a e:tensi=n Ac2F
c:\algun\sitio\> java -cp %CLASSPATH%;C:\ microcalc.Calc
Ie aqu una sesi=n con microca)cF
? 1+2
Resultado: 3
? 1+2*3
Resultado: 7
? (1+2)*3
Resultado: 9
? 3.0/2.0
Resultado: 1.5
? 4.5/(1-1)
Divisin por cero
? salir
c:\>
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota ,,
%aptulo 26 3resentaci(n de ANTLR 1ecci(n 2./6 %onclusi(n
Becci%n 2..: &onclusi%n
En este ca2tu)o !emos 0isto )os conce2tos esencia)es 2ara tra6a4ar con #7$38@ cua)quiera que
ten-a curiosi+a+ 2o+ra comen%ar a im2)ementar su 2ro2io com2i)a+or"
3os conce2tos que !emos 0isto sonF
X >unci=n +e #7$38 (2ara qu sir0e)
X E) f)u4o +e informaci=n entre )os ni0e)es +e an.)isis en #7$38
X EG7> e:ten+i+a
X Conce2to5 creaci=n recorri+o +e #*$s
X Com2i)aci=n e4ecuci=n +e un sistema +e an.)isis 6asa+o en #7$38
Buc!as cosas que+an 2or +ecir" cste es5 a) fin a) ca6o5 un ca2tu)o intro+uctorio5 en e) que se
2resentan )as ca2aci+a+es m.s 6.sicas +e #7$38" 9or Dca2aci+a+es 6.sicas +e #7$38E quiero
+ecir e) con4unto mnimo +e ca2aci+a+es que 2ermiten construir e4ecutar un intr2rete +e tres
ni0e)es ():ico5 sint.ctico sem.ntico)" #s que Lcui+a+oNF 2or ser D6.sicasE no tienen 2or qu ser
D)as ?nicas que mere%ca )a 2ena a2ren+erE"
En ca2tu)os 0eni+eros estu+iaremos otras ca2aci+a+es que5 si 6ien no son a6so)utamente
im2rescin+i6)es 2ara +esarro))ar ana)i%a+ores con #7$385 son tremen+amente ?ti)es" #)-unas
ser.n +e uso mu frecuente5 como )os 2re+ica+os sint.cticos sem.nticos@ otras ser.n menos
usua)es 2ero mu 2otentes5 como )a !erencia +e -ram.ticas"
Estu+iaremos )as funciones +e #7$38 que nos que+an 2or a2ren+er (a+em.s +e re2asar )as que
a !emos comen%a+o a uti)i%ar) en )os 2r=:imos ca2tu)os" 9ara e))o 0amos a uti)i%ar un e4em2)o
2r.cticoF 0amos a construir un com2i)a+or +e un )en-ua4e DserioE5 orienta+o a o64etos
fuertemente ti2a+o"
9ero antes +e6eremos +efinir +ic!o )en-ua4e"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota ,7
Captulo 3:
LeLi: un Lenguaje Limitado
Los lmites de mi lenguaje son los lmites de mi mente.
3u+<in \itt-enstein
Captulo 3:
LeLi: un Lenguaje Limitado................................................................68
Seccin 3.1: Introduccin........................................................................................................61
Seccin 3.2: &ivel l2-ico..........................................................................................................0.
3.2.1: 4lancos...................................................................................................................................... -C
3.2.2: &omentarios.............................................................................................................................. -C
3.2.3: Literales..................................................................................................................................... -C
3.2.": /denti!icadores........................................................................................................................... -C
3.2.#: @alabras reservadas.................................................................................................................. -1
Seccin 3.3: &iveles sintctico 3 semntico......................................................................... 02
3.3.1: &aracterAsticas b(sicas de LeLi................................................................................................. -2
3.3.2: &lases es'eciales del lenguaje................................................................................................. -2
La clase Bistema...............................................................................................................................................-2
La clase Objeto..................................................................................................................................................-2
La clase /nicio....................................................................................................................................................-3
3.3.3: 6eclaraci%n de una clase.......................................................................................................... -3
3.3.": F0todos de una clase................................................................................................................ -3
3.3.#: &onstructores............................................................................................................................ -"
3.3.+: F0todos abstractos................................................................................................................... -+
3.3.-: HariablesI atributos y 'ar(metros.............................................................................................. -+
>i'os b(sicos.....................................................................................................................................................-+
5orma general de declaraci%n...........................................................................................................................--
Atributos de una clase.......................................................................................................................................--
Hariables locales de un m0todo........................................................................................................................--
@ar(metros de un m0todo o constructor...........................................................................................................-.
3.3..: x'resiones............................................................................................................................... -1
x'resiones aritm0ticas....................................................................................................................................-1
x'resiones de com'araci%n.............................................................................................................................C
x'resiones l%gicas............................................................................................................................................C
Asignaciones...................................................................................................................................................... .C
x'resiones con cadenas...................................................................................................................................C
Acceso a variablesI atributos y 'ar(metros. nmascaramiento.......................................................................1
F0todos de los ti'os b(sicos.............................................................................................................................3
>rabajando con ti'os: convertir y es,n..............................................................................................................3
@rioridad en las ex'resiones..............................................................................................................................#
Seccin 3.!: Instrucciones de $e$i........................................................................................ #6
3.".1: Be'araci%n de instrucciones...................................................................................................... .+
3.".2: Asignaciones............................................................................................................................. .+
3.".3: 4ucles : mientrasI *acerJmientrasI desde................................................................................. .+
3.".": &ondicionales: si....................................................................................................................... .-
3.".#: /nstrucci%n volver...................................................................................................................... .-
Seccin 3.: 4tros aspectos de $e$i..................................................................................... ##
3.#.1: Kerencia de clases.................................................................................................................... ..
RaA8 del sistema: clase Objeto...........................................................................................................................1
3.#.2: Gesti%n de la memoria.............................................................................................................. .1
Seccin 3.6: "onclusin.......................................................................................................... 1.
Gua prctica de ANTLR 2.7.2 v 1. ,/
%aptulo -6 LeLi6 un Lengua5e Limitado 1ecci(n -.16 &ntroducci(n
Becci%n 3.1: /ntroducci%n
E) )en-ua4e que 0imos en e) ca2tu)o ' es e) t2ico e4em2)o que 2o+emos encontrar en un tutoria)
so6re #7$38 co)-a+o en )a re+F un )en-ua4e D2equeCoE que que+a mu )e4os +e un 0er+a+ero
)en-ua4e +e 2ro-ramaci=n" En este ca2tu)o +efinir un )en-ua4e m.s 2areci+o a )os Drea)esE5
esta6)ecien+o )a 6ase 2ara )os futuros ca2tu)os5 en )os cua)es )e iremos construen+o un
com2i)a+or"
E) )en-ua4e que 0amos a im2)ementar se ))ama 3en-ua4e 3imita+o5 o 3e3i"
7o intentaremos construir un su2erA)en-ua4e que re0o)ucione e) mun+o +e )a 2ro-ramaci=n" 3e3i
es un )en-ua4e orienta+o a o64etos5 2ero con muc!as )imitaciones5 inc)uen+o (2ero no
)imit.n+ose a)F
X 7o contem2)a e) mane4o +e ta6)as o +e otros ti2os +e +atos a6stractos (ta6)as !as!5 )istas""")
2ara mane4ar con4untos +e 0aria6)es"
X 7o !a DreferenciasE (2unteros) +e ti2o a)-uno" /na 0aria6)e a2unta a )a misma +irecci=n +e
memoria +es+e que se crea !asta que se +estrue"
X 7o !a 2asos +e 2ar.metro 2or 0a)or5 so)amente 2or referencia"
X 7o se 2ue+en re+efinir o2era+ores@ )os o2era+ores est.n reser0a+os a )os ti2os 6.sicos"
X 7o se contem2)a e) uso +e interfaces5 ni )a !erencia m?)ti2)e"
X 7o se contem2)a e) mane4o +e e:ce2ciones@ )os errores aritmticos (+es6or+amiento +e 2i)a5
+i0isi=n 2or cero) 2ro0ocan una 2ara+a irreme+ia6)e +e) 2ro-rama"
X 7o se contem2)a e) uso +e ti2os 2arametri%a+os (templates)
X 7o se contem2)a )a +istri6uci=n +e )as c)ases en 2aquetes )i6reras" En -enera) no se a+miten
com2i)aciones que in0o)ucren a m.s +e un fic!ero"
X 7o !a6r. un reco)ector +e 6asura 2ro2iamente +ic!oF to+as )as 0aria6)es5 e:ce2to )as +e0ue)tas
2or un mto+o5 ser.n +estru+as cuan+o se aca6e su .m6ito" 1a+o que no se 2ue+en uti)i%ar
referencias +e nin-?n ti2o5 no ser. necesario rea)i%ar nin-una otra o2eraci=n"
En este ca2tu)o +escri6iremos to+as )as caractersticas +e 3e3i" 9ara e))o em2e%aremos con )os
as2ectos ):icos +e) )en-ua4e5 una 0e% +efini+os 2asaremos a )os as2ectos sint.cticos
sem.nticos"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota ,<
%aptulo -6 LeLi6 un Lengua5e Limitado 1ecci(n -.26 Nivel l$8ico
Becci%n 3.2: $ivel l0xico
3e3i se 2arece muc!o a otros )en-ua4es conoci+os5 como C o 9I95 esto inc)ue e) ni0e) ):ico"
9or )o tanto no !a muc!as sor2resas"
3.2.1: 4lancos
E) car.cter +e es2acio5 )a ta6u)aci=n )os caracteres +e sa)to +e )nea
''
ser.n i-nora+os a 2artir
+e) ni0e) ):ico" 9ue+en ser uti)i%a+os 2ara !acer m.s f.ci) )a )ectura a) 2ro-rama+or"
3.2.2: &omentarios
3os comentarios ser.n simi)ares a )os +e C C++F a-ru2aciones +e )neas +e)imita+as 2or )as
ca+enas D^YE DY^E5 o )neas in+i0i+ua)es 2rece+i+as +e )a +o6)e 6arra (D^^E)F
// Estos comentarios solamente pueden ocupar una lnea.
/* Estos comentarios pueden ocupar una
o varias
lneas,
segn la necesidad del programador.
*/
3os comentarios +e 0arias )neas no pueden anidarse"
3.2.3: Literales
3as ca+enas se e:2resan uti)i%an+o )as +o6)es comi))as" 7o e:isten )os )itera)es car.cterF en su
)u-ar se usa una ca+ena +e )on-itu+ 1"
7o se a+miten ta6u)a+ores o sa)tos +e )nea o comi))as +entro +e )as ca+enas@ en )u-ar +e eso e)
)en-ua4e 2ro2orciona )as si-uientes 2a)a6ras reser0a+asF
X nlF Ca+ena con e) car.cter +e nue0a )nea"
X tabF Ca+ena con e) car.cter +e ta6u)aci=n"
X comF Ca+ena con )as comi))as (D)"
7o se a+miten caracteres +e esca2e5 ni siquiera 2ara es2ecificar caracteres unico+e"
7o e:isten )itera)es +e ti2o Dcar.cterE" /n car.cter entre +os comi))as ser. consi+era+o un )itera)
ca+ena"
3os )itera)es enteros se re2resentan uti)i%an+o )os +-itos +e) 0 a) 9" 7o se 2ue+en re2resentar
n?meros en octa) o !e:a+ecima) como en C++ o 4a0a"
9ara re2resentar canti+a+es no enteras est.n )os )itera)es f)otantes5 que se re2resentan como +os
series +e +-itos uni+os 2or e) car.cter 2unto (D"E)" 9ara re2resentar canti+a+es menores que )a
uni+a+ ser. o6)i-atorio comen%ar e) )itera) con e) +-ito 0" 7o ser. 2osi6)e uti)i%ar )a
nomenc)atura mantisaAe:2onente (:::e) +e C++ 4a0a"
3.2.": /denti!icadores
/n i+entifica+or 0.)i+o ser. cua)quier ca+ena +e caracteres5 +-itos e) car.cter +e su6raa+o5
siem2re cuan+o no sea una 2a)a6ra reser0a+a +e) )en-ua4e no em2iece 2or un +-ito"
'' 9or Dsa)tos +e )neaE enten+eremos e) car.cter in +e )inu:5 e) ir +e Bacintos! e) inir +e Bicrosoft"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 7
%aptulo -6 LeLi6 un Lengua5e Limitado 1ecci(n -.26 Nivel l$8ico
3.2.#: @alabras reservadas
3e3i es un )en-ua4e sensi6)e a )as ma?scu)as" $o+as )as 2a)a6ras reser0a+as +e6er.n escri6irse en
min?scu)as5 e:ce2to )os nom6res +e )os ti2os 6.sicos5 que tienen )a 2rimera )etra en ma?scu)a"
3as 2a)a6ras reser0a+as +e 3e3i son )as si-uientesF
X Entero
X Real
X Booleano
X Cadena
X cierto
X falso
X nl
X tab
X com
X clase
X extiende
X mtodo
X constructo
r
X atributo
X abstracto
X parmetro
X convertir
X mientras
X hacer
X si
X otras
X volver
X esUn
X y
X o
X no
X super
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 71
%aptulo -6 LeLi6 un Lengua5e Limitado 1ecci(n -.-6 Niveles sintctico y semntico
Becci%n 3.3: $iveles sint(ctico y sem(ntico
3.3.1: &aracterAsticas b(sicas de LeLi
3e3i ser. un )en-ua4e orientado a o+5etos 4uertemente tipado" *us caractersticas 6.sicas
ser.nF
X $o+a 0aria6)e +e6er. ser inicia)i%a+a antes +e su uti)i%aci=n (me+iante una asi-naci=n)"
X E) com2i)a+or ser. sensi6)e a )as ma?scu)as min?scu)as"
X 3os ti2os 6.sicos ser.n )os usua)es5 sa)0o 2or e) !ec!o +e que e) ti2o car.cter no e:istir."
X *e im2)ementar. )a !erencia +e c)ases a un ni0e) 6.sico (to+as )as funciones ser.n 0irtua)es5
menos )os constructores" 3a !erencia no 2o+r. ser m?)ti2)e)"
X *e im2)ementar.n mto+os atri6utos a6stractos"
X E) mane4o +e referencias ser. )imita+oF se 2ermitir. e) 2aso 2or referencia 2or 0a)or5 pero no
las asignaciones de re4erenciasF to+as )as asi-naciones ser.n D2or 0a)orE" 1e !ec!o5 no se
2ermiten asi-naciones entre instancias +e ti2os +efini+os 2or e) usuario"
X 3a 0i+a +e una 0aria6)e terminar. a) terminar e) entorno (iteraci=n5 con+ici=n5 funci=n o c)ase)
en e) que fue crea+a"
X E:istir. )a c)ase 6.sica Objeto"
X *e 2ermitir.n c)ases recursi0as"
X *e 2ermitir.n mto+os recursi0os"
Ciertas ca2aci+a+es que se +an en otros )en-ua4es +e 2ro-ramaci=n orienta+os a o64etos no se
im2)ementar.nF
X 7o se im2)ementar.n interfaces"
X 7o se 2o+r.n +efinir o2era+ores 2ara una c)ase"
X 7o !a6r. ocu)taci=n +e atri6utos" $o+os )os atri6utos +e una c)ase ser.n 2?6)icos5 a) i-ua) que
sus mto+os"
3.3.2: &lases es'eciales del lenguaje
$a clase Sistema
3a c)ase sistema ser. una c)ase +efini+a 2or +efecto que 2ro2orcionar. e) mto+o a6stracto
2o)im=rfico imprimeF
X mtodo abstracto imprime(Cadena mensaje)F ,m2rimir. mensa4e 2or 2anta))a"
X mtodo abstracto imprime(Booleano booleano)F ,m2rimir. cierto o falso 2or
2anta))a5 +e2en+ien+o +e) 0a)or +e booleano"
X mtodo abstracto imprime(Entero entero)F ,m2rimir. entero 2or 2anta))a"
X mtodo abstracto imprime(Real real)F ,m2rimir. real 2or 2anta))a"
$a clase 47*eto
$o+a c)ase crea+a 2or e) 2ro-rama+or !ere+ar. autom.ticamente +e )a c)ase ;64eto5 que
so)amente +is2one +e) mto+o asertoF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 72
%aptulo -6 LeLi6 un Lengua5e Limitado 1ecci(n -.-6 Niveles sintctico y semntico
X mtodo abstracto aserto(Booleano condicin; Cadena mensaje)F *i condicin es
falso5 se im2rimir. 2or 2anta))a mensaje se a6ortar. )a e4ecuci=n +e) 2ro-rama"
#) tratarse +e un mto+o a6stracto +e )a c)ase Objeto5 to+a c)ase crea+a 2or e) usuario 2o+r.
uti)i%ar)o +irectamente (2o+r. escri6irse aserto en )u-ar +e Objeto.aserto)"
$a clase Inicio
E) com2i)a+or 6uscar. una c)ase ))ama+a Inicio ()a 2rimera , ma?scu)a e) resto min?scu)as) 5
+entro +e ste un mto+o a6stracto ))ama+o inicio(con min?scu)as sin 2ar.metros)" cste ser.
e) mto+o que se in0oque a) e4ecutar )a a2)icaci=n"
3.3.3: 6eclaraci%n de una clase
E) esque)eto +e una +ec)araci=n +e c)ase es e) si-uienteF
clase NombreClase [extiende NombreClasePadre]
{
// Declaraciones de atributos y mtodos
}
3.3.": F0todos de una clase
/n mto+o +e una c)ase es un fra-mento +e c=+i-o5 en e) que se es2ecifica me+iante
instrucciones (m.s a+e)ante 0eremos qu son qu instrucciones 2ermite 3e3i) un a)-oritmo a
e4ecutar" 3e3i 2ermite tres ti2os +iferentes +e mto+os"
E) ti2o m.s usua) +e mto+o +e 3e3i es e) mto+o 6.sico" /n mto+o 6.sico tiene )a si-uiente
formaF
mtodo [Tipo] NombreMetodo( [ListaParametros] )
{
// Cuerpo del mtodo
}
1on+e ListaParametros es una )ista +e +ec)araciones +e 2ar.metros +e) mto+o (0er m.s
a6a4o)" 3a )ista +e 2ar.metros 2ue+e ser 0aca"
$i2o es e) nom6re +e) ti2o que +e0ue)0e e) mto+o" 7orma)mente se )e ))ama Dti2o +e) mto+oE"
*i un mto+o no +e0ue)0e na+a5 es +e ti2o 0aco5 2or )o que Tipo se omite" # )os mto+os que
no +e0ue)0an a)-o )es ))amaremos mtodos vacos 5 2or simetra a )os que +e0ue)0an a)-o )os
))amarenos no vacos"
En to+o mto+o no 0aco se +ec)arar. autom.ticamente una 0aria6)e +e) mismo ti2o +e) mto+o5
que 2o+r. ser mo+ifica+a o cam6ia+a" # esta 0aria6)e )a ))amaremos varia"le de retorno del
mtodo. 1ic!a 0aria6)e inicia)mente tomar. e) 0a)or 2or +efecto +e su ti2o" Esta manera +e
mane4ar )os 0a)ores +e retorno +e una funci=n es simi)ar a )a que uti)i%a Risua) Gasic" Re.mos)aF
mtodo Entero suma (Entero A; Entero B)
{
suma = A + B;
}
7o tiene muc!o misterio5 O0er+a+Q" Como a !emos +ic!o5 e) 0a)or +e )a 0aria6)e +e retorno +e)
mto+o a) iniciarse ste es e) 0a)or 2or +efecto" Es +ecir5 a) iniciarse e) mto+o suma e) 0a)or +e
)a 0aria6)e suma es 05 que es e) 0a)or 2or +efecto +e )os enteros"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 7-
%aptulo -6 LeLi6 un Lengua5e Limitado 1ecci(n -.-6 Niveles sintctico y semntico
1a+o que )as 0aria6)es +e mto+o +e6en 2o+er iniciarse con 0a)ores 2or +efecto5 )os
?nicos ti2os 0.)i+os 2ara )os mto+os son )os ti2os 6.sicos aque))os ti2os +efini+os
2or e) 2ro-rama+or que 2osean un constructor 2or +efecto"
9ero Oqu es un Dconstructor 2or +efectoEQ" Es m.s Oqu es un constructorQ"
3.3.#: &onstructores
1ecamos que 3e3i 2ro2orciona tres ti2os +iferentes +e mto+o" 9ues 6ien5 )os constructores son
e) se-un+o ti2o"
3os constructores 2ermiten crear instancias +e )a c)ase5 norma)mente se uti)i%an 2ara inicia)i%ar
)os atri6utos +e )a c)ase" En 3e3i )os constructores se +efinen con )a 2a)a6ra c)a0e constructor"
# continuaci=n se e4em2)ifica e) uso +e) constructor me+iante )a c)ase 9ersona5 que uti)i%aremos
re2eti+amente a )o )ar-o +e este ca2tu)o"
clase Persona
{
atributo Cadena Nombre, Apellidos;
constructor (Cadena Nombre; Cadena Apellidos)
{
atributo.Nombre = Nombre;
atributo.Apellidos = Apellidos;
}
}
(9ara m.s informaci=n so6re )a 2a)a6ra c)a0e Datri6utoE5 )ase e) a2arta+o DE:2resionesE5 un
2oco m.s a6a4o)
/na c)ase 2ue+e tener un n?mero i)imita+o +e constructores5 que +e6er.n +iferenciarse en su ti2o
+e 2ar.metros"
9ara 2o+er instanciar una c)ase (2ara 2o+er crear o64etos +e +ic!a c)ase) es necesario
que sta ten-a 2or )o menos un constructor"
3os constructores son mto+os 0acos (no +e0ue)0en 0a)or a)-uno) so)amente sir0e 2ara iniciar
)os atri6utos +e ca+a c)ase" 3os atri6utos que no sean inicia)i%a+os en e) constructor +e )a c)ase
tomar.n sus 0a)ores 2or +efecto"
Reamos entonces qu es e) constructor 2or +efecto"
/n constructor 2or +efecto es5 sim2)emente5 e) constructor +e una c)ase que carece +e
2ar.metros" /n nom6re m.s a+ecua+o sera Dconstructor sin 2ar.metrosE" Creo que su nom6re
0iene +e C++"
En C++5 to+as )as c)ases tienen im2)ementa+o e) constructor sin 2ar.metro" E) constructor se
))am=5 D2or +efectoE 2or eso5 2orque to+as )as c)ases )o tienen D2or +efectoE" E) 2ro-rama+or
2ue+e 2ro2orcionar su 2ro2io constructor 2or +efecto5 sim2)emente escri6ien+o un constructor
sin 2ar.metros"
3a inc)usi=n +e) constructor 2or +efecto !a si+o 2o)mica +es+e su inicio5 2rinci2a)mente 2or )o
que im2)icaF que to+a c)ase tiene unos 0a)ores D2or +efectoE" Esta afirmaci=n es
matem.ticamente fa)saF e:isten casos en )os que una instancia +e una c)ase no tiene senti+o
mientras que no se )e asi-nen unos 0a)ores )=-icos a sus 2ar.metros" 3os mto+os +e estas c)ases
sim2)emente no 2ue+en funcionar correctamente si )os atri6utos tienen 0a)ores D2or +efectoE5
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 7)
%aptulo -6 LeLi6 un Lengua5e Limitado 1ecci(n -.-6 Niveles sintctico y semntico
eso se tra+uce en errores que no se +etectan en tiem2o +e com2i)aci=n
'3
"
9or )o tanto5 en 3e3i no !a Dim2)ementaci=n 2or +efecto +e) constructor 2or +efectoEF e)
2ro-rama+or tiene que escri6ir e) constructor" Escri6ir e) constructor no con))e0a muc!o tra6a4o5
a que so)amente es necesario inicia)i%ar aque))os atri6utos que requieran una inicia)i%aci=n
es2ecia)5 )os +em.s tomar.n 0a)ores 2or +efectoF
clase Persona
{
atributo Cadena Nombre, Apellidos, Direccin;
constructor() // Constructor por defecto
{ } // Nombre, Apellidos y Direccin toman el valor
}
1e esta forma e) constructor 2or +efecto sir0e so6re to+o 2ara in+icar que )a c)ase 2ue+e
inicia)i%arse sin 2ar.metros5 a)-o que nunca +e6era !a6erse e:ten+i+o"
E) 0a)or 2or +efecto +e un o64eto +efini+o 2or e) usuario es e) que se o6tiene a) ))amar
a) constructor 2or +efecto +e +ic!o o64eto" *i )a c)ase +e +ic!o o64eto carece +e
constructor 2or +efecto5 entonces e) o64eto no tiene 0a)or 2or +efecto"
1e esta ?)tima a2reciaci=n o6ten+remos una curiosa consecuenciaF si una c)ase # tiene un
atri6uto +e )a c)ase G esta ?)tima no tiene constructor 2or +efecto5 entonces e) atri6uto +e c)ase
G +e6er. ser +e6i+amente inicia)i%a+o en to+os )os constructores +e # (o +e )o contrario 3e3i
-enerar. un error)"
/na ?)tima 2untua)i%aci=n so6re )os constructoresF 2ara iniciar )os atri6utos +e una c)ase que no
son 6.sicos se uti)i%a )a 2a)a6ra c)a0e constructorF
clase ClaseA
{
...
constructor(Entero e1; Entero e2) // nico constructor de ClaseA
{
...
}
}
clase ClaseB
{
atributo ClaseA a; // ClaseB posee un atributo de tipo ClaseA
constructor(Entero e1)
{
a.constructor(e1,0); // Utilizamos constructor para iniciar a
}
}
7=tese que si a no fuera inicia)i%a+o con su ?nico constructor en )a construcci=n +e C)aseG 3e3i
emitira un error"
7o est. 2ro!i6i+o in0ocar e:2)citamente a )os constructores +e un o64eto en e) cuer2o +e un
mto+o com?n (fuera +e )os constructores)" 1e esta forma 2ue+en reinicia)i%arse )os 0a)ores +e
un o64etoF
'3 9ara +etectar estos errores en tiem2o +e com2i)aci=n5 *cott Beers aconse4a6a en su DEffecti0e C++E +ec)arar e:2)citamente
como 2ri0a+o e) constructor 2or +efecto +e )as c)ases en )as que +ic!o constructor no +e6e ser uti)i%a+o"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 70
%aptulo -6 LeLi6 un Lengua5e Limitado 1ecci(n -.-6 Niveles sintctico y semntico
clase ClaseA {...}
clase ClaseB
{
atritubo ClaseA a;
constructor ...
mtodo reiniciar_a(Entero e1)
{
a.constructor(e1,0);
}
}
LCui+a+oN 8ecor+emos que )a manera +e +ec)arar 0aria6)es )oca)es o64eto es +iferenteF Tipo5
nombreVariable entre 2arntesis )os 2ar.metros +e) constructorF
mtodo cualquiera(Entero e1)
{
ClaseA a(e1,0); // crear variable local de tipo ClaseA llamada a
atributo.a.constructor(e1,0); // Reiniciar el atributo a
}
3.3.+: F0todos abstractos
Reamos a!ora e) tercer ?)timo ti2o +e mto+o a+miti+o 2or 3e3iF )os mto+os a6stractos"
Comien%an con )a ca+ena mtodo abstracto5 son como )os mto+os a6stractos usua)mente
encontra+os en C++ o Ja0a
'4
F
clase MiClaseAbstracta
{
mtodo abstracto sumar(Entero A, Entero B)
{
Sistema.imprime(La suma de + A + + + B + es + A + B + nl);
}
}
3os mto+os a6stractos son 2ro2ios +e )a c)ase en )a que son +ec)ara+os5 no necesitan
instancias +e +ic!a c)ase 2ara ser in0oca+os" 9or e4em2)o5 e) mto+os sumar +e) e4em2)o anterior
2ue+e ser in0oca+o asF
...
MiClaseAbstracta.sumar(1,2);
...
J e) resu)ta+o ser. que 2or 2anta))a a2arecer. e) mensa4eF
La suma de 1 y 2 es 3
En e) cuer2o +e un mto+o a6stracto so)amente se 2ue+en uti)i%ar )os atri6utos a6stractos +e )a
c)ase a )a que 2ertenecen (2ara m.s informaci=n so6re atri6utos a6stractos5 si-a )een+o")
3.3.-: HariablesI atributos y 'ar(metros
'ipos 7sicos
En 3e3i e:isten )os ti2os 6.sicos usua)es5 a sa6erF
'4 3os mto+os a6stractos +e Ja0a se ))aman mto+os est.ticos (usan )a 2a)a6ra c)a0e static)"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 7,
%aptulo -6 LeLi6 un Lengua5e Limitado 1ecci(n -.-6 Niveles sintctico y semntico
X EnteroF 3os n?meros enteros5 con si-no uti)i%an+o 3' 6its"
X RealF 7?meros rea)es (coma f)otante)" Equi0a)entes a) ti2o +ou6)e +e C"
X CadenaF Ca+enas +e caracteres" Este ti2o se 2arece muc!o a) ti2o String +e 4a0a@ tiene un
mto+o longitud() un mto+o subCadena()5 que son e:2)ica+os m.s a6a4o"
X BooleanoF E) ti2o 6oo)eano so)amente 2ue+e ser re2resenta+o con )os 0a)ores cierto
falso"
En 3e3i no !a ti2o car.cter5 en su )u-ar se uti)i%an ca+enas +e )on-itu+ 1"
En 3e3i no !a ta6)as"
,orma general de declaracin
En 3e3i )os atri6utos +e una c)ase5 )as 0aria6)es )oca)es +e un mto+o )os 2ar.metros se
es2ecifican +e )a misma formaF
NombreClase (listaDecs)+;
listaDec = NombreVariable ('=' expresin)?;
1on+e ListaDecs es una )ista +e +ec)araciones se2ara+as 2or comas"
Atri7utos de una clase
3os atri6utos +e c)ases se +ec)aran con )a 2a)a6ra reser0a+a atri"utoF
clase Empresa
{
atributo Cadena NIF;
}
clase Persona
{
atributo Cadena nombre, apellidos;
atributo Entero edad;
atributo Empresa empresa;
}
Es 2osi6)e +efinir atri6utos a6stractos +e una c)ase uti)i%an+o tam6in )a 2a)a6ra reser0a+a
abstractoF
clase Trabajador
{
atributo abstracto Entero EdadMnima = 18;
}
3os atri6utos a6stractos 2ue+en ser inicia)i%a+os a un 0a)or5 como en e) e4em2)o" 3os atri6utos no
a6stractos no 2ue+en ser inicia)i%a+os +e esta forma" Ese mismo efecto se consi-ue con un
constructor"
3os atri6utos mto+os ))ama+os Da6stractosE en 3e3i son )os mto+os D2ro2ios +e
)a c)ase en )a que se +ec)aranE5 no +e2en+en +e )a instancia" En otros )en-ua4es5
como C++ 4a0a5 se )es sue)e ))amar Dest.ticosE"
Jaria7les locales de un m2todo
3as 0aria6)es )oca)es +e un mto+o se +ec)aran uti)i%an+o )a forma -enera) +e +ec)araci=nF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 77
%aptulo -6 LeLi6 un Lengua5e Limitado 1ecci(n -.-6 Niveles sintctico y semntico
clase MiClase
{
mtodo miMtodo()
{
Entero A = 2, B;
Sistema.imprime(El valor de A es + A + y el de B es + B + nl);
}
}
3as 0aria6)es )oca)es 2ue+en ser +ec)ara+as en cua)quier 2arte +e) c=+i-o" *on +estrui+as a)
terminar su .m6ito (que en 3e3i es e) con4unto +e instrucciones entre [f[ [g[ en e) que se
+ec)araron)"
*i e) 2ro-rama+or no es2ecifica un 0a)or es2ecfico a) crear una 0aria6)e (2or e4em2)o5 en e) caso
anterior )a 0aria6)e # 0a)+r. ') se )e asi-nar. un 0a)or 2or +efecto (como en e) caso +e )a 0aria6)e
G5 que 2or +efecto 0a)+r. 0)" E) 0a)or 2or +efecto +e )os enteros rea)es es 05 e) +e )as ca+enas
es )a ca+ena 0aca e) +e )os 6oo)eanos es fa)so"
#) instanciar una c)ase es 2osi6)e que sea necesario 2asar 2ar.metros a su constructor" csto se
rea)i%a e:actamente i-ua) que en C++F
Persona GeorgeBush(George, Bush);
En 3e3i no !a 0aria6)es )oca)es est.ticas"
;armetros de un m2todo o constructor
3a +ec)araci=n +e )os 2ar.metros +e un mto+o se rea)i%a +e una forma simi)ar a C++F
clase Persona
{
atributo Cadena nombre, apellidos;
atributo Entero edad;
...
mtodo cumplirAos(Entero aos)
{
edad = edad + cantidad;
}
}
Ia que resa)tar una +iferencia im2ortante entre 3e3i C++F
En 3e3i )os 2ar.metros son 2asa+os 2or re4erencia5 e:ce2to )os )itera)es5 que son
2asa+os 2or co2ia"
/no +e )os usos m.s !a6itua)es +e) 2aso +e 2ar.metros 2or referencia es e) constructor co2iaF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 7/
%aptulo -6 LeLi6 un Lengua5e Limitado 1ecci(n -.-6 Niveles sintctico y semntico
clase Persona
{
atributo Cadena Nombre, Apellidos;
constructor (Persona p)
{
Nombre = p.Nombre;
Apellidos = p.Apellidos;
}
}
Como en )a maora +e )os )en-ua4es5 )as 0aria6)es 2asa+as 2or referencia a un mto+o 2ue+en ser
mo+ifica+as 2or +ic!o mto+o (2ue+en5 2or e4em2)o5 ser uti)i%a+as como 2ar.metros +e entra+aA
sa)i+a)"
9or ?)timo5 seCa)ar que )a se2araci=n entre 2ar.metros es un tanto +iferente que C++F se uti)i%a e)
2unto coma D@E 2ara se2arar 2ar.metros +e +istinto ti2o" 3os 2ar.metros +e) mismo ti2o
2ue+en reuti)i%ar e) nom6re +e su ti2o estar se2ara+os 2or comas" 9or e4em2)o5 un mto+o que
a+mite +os Enteros una Ca+ena ten+r. )a si-uiente es2ecificaci=nF
clase Parmetros
{
mtodo abstracto parmetros (Entero a,b; Cadena mensaje)
{
Sistema.imprime(Los enteros son + a + y + b + nl);
Sistema.imprime(El mensaje es + com + mensaje + com);
}
}
L#tenci=nN #unque se se2aren con 2unto coma en )a +ec)araci=n5 se se2aran con
comas e:c)usi0amente en )a ))ama+a"
clase Inicio
{
mtodo abstracto inicio()
{
// Aqu se separan con comas, no con punto y coma!
Parmetros.parmetros(1, 2, Un mensaje);
}
}
3.3..: x'resiones
+-presiones aritm2ticas
3as e:2resiones aritmticas son )as usua)es" *e rea)i%an entre enteros rea)es" 3os o2era+ores
que se uti)i%ar.n sonF + (mas)5 A (menos)5 Y (mu)ti2)icaci=n)5 ^ (+i0isi=n)5 h (2otencia)5 ++
(2ostincremento) AA(2ost+ecremento)"
E) ti2o +e )a e:2resi=n cam6iar. en funci=n +e )os ti2os que se usenF
X Entre Real Real5 )a e:2resi=n ser. siem2re +e ti2o Real.
X Entre Real Entero5 )a e:2resi=n ser. siem2re Real.
X Entre Entero Entero5 )a e:2resi=n ser. siem2re Entera5 sa)0o )a +i0isi=n5 que ser. Real"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 7<
%aptulo -6 LeLi6 un Lengua5e Limitado 1ecci(n -.-6 Niveles sintctico y semntico
+-presiones de comparacin
3os o2era+ores +e com2araci=n son )os mismos que en C C++5 a sa6erF UU (i-ua)+a+)5 j
(menor que)5 V (maor que)5 jU (menor o i-ua) que)5 VU (maor o i-ua) que) NU (+istinto +e)"
Estos o2era+ores son a2)ica6)es entre e:2resiones numricas +e cua)quier ti2o +e0ue)0en
siem2re un Goo)eano"
+-presiones lgicas
3os o2era+ores )=-icos son y5 o5 no" $ienen )a funci=n usua)" Ia tres cosas a +estacarF
X 3as e:2resiones )=-icas so)amente 2ue+en uti)i%ar su6e:2resiones +e ti2o 6oo)eano" En C se
2o+a !acer a)-o como if (entero)@ e) equi0a)ente +e +ic!a e:2resi=n en 3e3i es if
(entero!=0)
X 3a e0a)uaci=n +e )as con+iciones )=-icas ser. 2ere%osaF *i e) 2rimer trmino +e una e:2resi=n
DyEes fa)so5 no se e0a)uar. )a se-un+a 2arte +e )a e:2resi=n (que se consi+erar. fa)sa)"
,-ua)mente si e) 2rimer trmino +e una e:2resi=n DoE es cierto5 to+a )a e:2resi=n se
consi+erar. cierta5 sin e0a)uar )a se-un+a 2arte"
X E) o2era+or DoE no es e:c)usi0oF *i am6as 2artes +e una e:2resi=n DoEson ciertas5 )a e:2resi=n
ser. consi+era+a cierta (+e !ec!o5 so)amente se e0a)uar. )a 2rimera)"
Asignaciones
3as asi-naciones se rea)i%ar.n con e) o2era+or +e asi-naci=n (=)"
/n as2ecto im2ortante +e )as asi-naciones es que5 a) contrario que en C C++5 las
asignaciones no devuelven nada" 9or e4em2)o5 no ser. 2osi6)e !acer e=3+(a=b)"
7o e:isten o2era+ores aritmticoAasi-natorios como +U o AU" #unque s e:isten )os +e
2ostincremento(++) 2ost+ecremento(AA)" 3os o2era+ores +e 2ostincremento 2ost+ecremento
son a to+os )os efectos i+nticos a uti)i%ar una asi-naci=n (a++ es )o mismo que aUa+1)" 9or )o
tanto tam2oco stos +e0ue)0an na+a"
3as asi-naciones entre o64etos se !acen 2or co2ia5 es +ecir5 si se escri6e A=B5 sien+o # una
0aria6)e o64eto sien+o G una e:2resi=n que +e0ue)0a un o64eto +e una c)ase o su6c)ase +e #5
to+os )os 0a)ores +e atri6utos +e G se co2iar.n en )os +e #" 3o recomen+a6)e es que G sea +e)
mismo ti2o que #5 no una su6c)ase (2ues 2ara !acer uso +e )os atri6utos mto+os es2ecficos
+e )as c)ases +e6eremos !acer una con0ersi=n +e ti2os@ se-uir )een+o)
+-presiones con cadenas
3e3i 2ermite rea)i%ar ciertas o2eraciones con )as ca+enas" 3a m.s 6.sica +e to+as5 )a
concatenaci=n5 se rea)i%a con e) o2era+or +F
Cadena saludo = Hola + + mundo!;
Es 2osi6)e com2arar ca+enas con )os o2era+ores UU5 NU5 j5 V5 jU VU" 3a com2araci=n ser. +e
ti2o a)fanumrico5 6asa+a en e) c=+i-o #*C,, +e ca+a car.cter +e )a ca+ena"
9or ?)timo5 es 2osi6)e sumar cua)quier ti2o 6.sico a una ca+ena5 o6tenin+ose una nue0a ca+ena"
#) sumar una ca+ena aF
X /n Entero5 e) resu)ta+o es una ca+ena con +ic!o entero en su interior5 Dtra+uci+oE a
caracteres" En e) e4em2)o si-uiente )a ca+ena pelcula toma e) 0a)or D1' monosE"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota /
%aptulo -6 LeLi6 un Lengua5e Limitado 1ecci(n -.-6 Niveles sintctico y semntico
Cadena pelcula = 12 + monos;
X /n Real5 e) resu)ta+o es una ca+ena con +ic!o rea) en caracteres" 9or e4em2)oF
Cadena valorDePi = PI es + 3.14159; // valorDePi = PI es 3.14159
X /n Booleano5 a )a ca+ena se )e sumar. )a ca+ena DciertoE o DfalsoE5 +e2en+ien+o +e) 0a)or
+e +ic!o Booleano" 9or e4em2)oF
Cadena misterio = 1>2 es +(1>2); // misterio = 1>2 es falso
/na consecuencia interesante +e )o anterior 2o+emos +e+ucir que 2ara con0ertir un
Entero5 Real o Booleano en Cadena 6astar. con sumar)es )a ca+ena 0aca (DE)"
Acceso a varia7lesK atri7utos 3 parmetros. +nmascaramiento.
9ara uti)i%ar una 0aria6)e )oca)5 un atri6uto +e c)ase (tanto norma) como a6stracto) o un
2ar.metro +e un mto+o en una e:2resi=n 6asta con escri6ir su nom6re"
/ti)i%aremos +e nue0o )a c)ase Persona 2ara i)ustrar c=mo se uti)i%an"
clase Persona
{
atributo Cadena Nombre;
atributo Entero Edad;
constructor(...)
mtodo cambiar(Cadena Nombrep; Entero Edadp)
{
Entero Edadv = Edadp+1;
Edad = Ev;
Nombre = N;
}
}
En e) e4em2)o anterior se i)ustra 2erfectamente e) 2rinci2a) 2ro6)ema +e esta nomenc)aturaF e)
enmascaramiento +e 0aria6)es" E) 2ro-rama+or !a teni+o que cam6iar )os nom6res +e sus
0aria6)es5 aCa+ien+o una D2E min?scu)a en e) caso +e )os 2ar.metros o una D0Een e) caso +e )as
0aria6)es )oca)es5 2ara 2o+er !acer referencia sin 2ro6)emas a ca+a ti2o +e 0aria6)e"
Esta so)uci=n a2orta+a 2or e) 2ro-rama+or es una +e )as 2osi6)es5 2ero que+a )e4os +e ser )a
me4or@ a) no estar estan+ari%a+a )a so)uci=n +e este 2ro6)ema5 ca+a 2ro-rama+or 2o+ra uti)i%ar
una nomenc)atura +iferente" 9or eso 3e3i 2ro0ee un mecanismo +e D+esenmascaramiento +e
0aria6)esE" 9ara +esenmascarar 0aria6)es 6asta con se-uir +os re-)as"
3a 2rimera re-)a a se-uir es e) Dor+en +e enmascaramientoEF )a 0aria6)e que 2re0a)ece es D)a
?)tima en ser +ec)ara+aE" Es +ecir5 en este or+enF 0aria6)es )oca)es5 2ar.metros atri6utos +e una
c)ase" Reamos esto con un e4em2)oF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota /1
%aptulo -6 LeLi6 un Lengua5e Limitado 1ecci(n -.-6 Niveles sintctico y semntico
clase Persona
{
atributo Cadena Nombre;
constructor{...}
mtodo muestraEnmascaramiento(Cadena Nombre)
{
Cadena Nombre = Manuel;
Sistema.imprime(Nombre);
}
}
clase Inicio
{
mtodo abstracto inicio()
{
Persona Pedro(Pedro);
Pedro.muestraEnmascaramiento(Jos);
}
}
En este e4em2)o se im2rimir. DBanue)E 2or 2anta))a5 in+e2en+ientemente +e) 0a)or +e) 2ar.metro
2asa+o o +e) atri6uto" *i no e:istiera )a 0aria6)e )oca) Nombre en e) mto+o
muestraEnmascaramiento se im2rimira DJosE" >ina)mente5 si e) 2ar.metro tam2oco e:istiera5
se im2rimira e) atri6uto +e )a c)ase5 D9e+roE"
OC=mo !acer referencia en e) e4em2)o anterior a) atri6uto +e )a c)ase o a) 2ar.metroQ Iacien+o
uso +e )a se-un+a re-)aF )a 2a)a6ra c)a0e atributo sir0e 2ara !acer referencia a )os atri6utos +e
una c)ase5 )a 2a)a6ra c)a0e parmetro sir0e 2ara )os 2ar.metros" $ras e))as +e6e uti)i%arse e)
2unto5 i-ua) que en C++ o Ja0a se uti)i%a )a 2a)a6ra c)a0e this" #s5 si )a )nea +e) mto+o
muestraEnmascaramiento !u6iera si+o asF
Sistema.imprime(atributo.Nombre);
E) 2ro-rama !a6ra im2rimi+o e) atri6uto +e )a c)ase 9ersona5 es +ecir5 D9e+roE" 1e )a misma
forma5 !a6ien+o escritoF
Sistema.imprime(parmetro.Nombre);
3o que se mostrara sera e) 2ar.metro +e )a funci=n5 es +ecir5 DBanue)E"
7o e:iste nin-una 2a)a6ra reser0a+a 2ara !acer referencia a )as 0aria6)es )oca)es5
stas so)amente 2ue+en ser referencia+as con su nom6re"
E) 2ro6)ema +e) enmascaramiento +e 0aria6)es est. so)0enta+o casi com2)etamente" 7o o6stante5
si-ue !a6ien+o un caso en e) cua) una 0aria6)e 2ue+e enmascarar a otraF +efinien+o una nue0a
0aria6)e )oca) con e) mismo nom6re" Es +ecir5 asF
mtodo ultimaRegla()
{
Cadena Mensaje1 = Primera variable;
Cadena Mensaje1 = Segunda variable;
Sistema.imprime(Mensaje1);
}
$oman+o estrictamente )a 2rimera re-)a5 +e6era im2rimirse D*e-un+a 0aria6)eE 2or 2anta))a5 a)
!a6erse +ec)ara+o )a se-un+a 0aria6)e m.s tar+e" 9o+ra 2or tanto su2onerse que 3e3i 2ermite
+ec)arar 0arias 0aria6)es )oca)es con e) mismo nom6re" J sin em6ar-o no es as"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota /2
%aptulo -6 LeLi6 un Lengua5e Limitado 1ecci(n -.-6 Niveles sintctico y semntico
/ti)i%ar 0aria6)es )oca)es con e) mismo nom6re tiene e) incon0eniente +e a6rir )a 2uerta a un
e)e0a+o n?mero +e errores +e 2ro-ramaci=n5 2rinci2a)mente a) Dco2iar 2e-arE
'&
" En e) e4em2)o
anterior5 es 2ro6a6)e que e) 2ro-rama+or !u6iera queri+o crear +os mensa4es +iferentes5
Mensaje1 Mensaje25 tra6a4ar con e))as +e manera +iferente" Co2i= 2e-= )a 2rimera )nea5
o)0i+.n+ose +e cam6iar e) nom6re +e )a 0aria6)e" E) 2ro-rama com2i)ara 2erfectamente5
ten+ramos un 6u- 2erfectamente ocu)to"
#+em.s5 en e) im2ro6a6)e caso +e que e) 2ro-rama+or quisiera 0er+a+eramente uti)i%ar
Mensaje1 +e esa forma5 su c=+i-o sera confuso e in?ti)F no !aca fa)ta re+ec)arar )a 0aria6)e5
6asta6a con cam6iar)e )a +efinici=n"
1e to+o )o anterior 2o+emos +e+ucir )a tercera ?)tima re-)a +e enmascaramiento" B.s que una
re-)a es una restricci=n so6re )as +ec)aracionesF en 3e3i no es 2osi6)e +ec)arar +os 0aria6)es
)oca)es con e) mismo nom6re"
Como consecuencia +irecta +e )a ?)tima re-)a +e enmascaramiento5 no se 2ue+en
+ec)arar 0aria6)es )oca)es en e) cuer2o +e un 6uc)e"
/2todos de los tipos 7sicos
Como a se !a +ic!o5 Objeto es e) ti2o 6.sico +e )a 4erarqua +e o64etos +e 3e3i" 3os ti2os
6.sicos no son una e:ce2ci=n" 9or )o tanto cua)quier ti2o 6.sico 2osee )os mto+os !ere+a+os +e
+ic!a c)ase" #s5 e) mto+o si-uienteF
mtodo cualquiera()
{
Entero e = 1;
Sistema.imprime(e.nombreClase());
}
,m2rimir. 2or 2anta))a )a ca+ena DEnteroE"
E) ti2o Ca+ena tiene a+em.s una serie +e mto+os 2ro2ios +e su c)ase5 a sa6erF
X mtodo Entero longitud()F 1e0ue)0e )a )on-itu+
X mtodo Cadena subCadena(Entero inicio, Entero longitud)F 1e0ue)0e una
su6ca+ena" En 3e3i )as ca+enas se in+e:an en 0"
/na 2ro2ie+a+ curiosa es que es 2osi6)e in0ocar )os mto+os +e )os ti2os 6.sicos +irectamente
+es+e )os )itera)esF
1.nombreTipo(); // Devuelve Entero
Hola mundo.subCadena(0,4); // Devuelve Hola
'ra7a*ando con tipos: convertir 3 esEn
9ara !acer con0ersiones entre ti2os (castings) es necesario uti)i%ar e) mto+o es2ecia)
convertir5 a) que se )e 2asa e) o64eto a con0ertir e) ti2o a) que se quiere con0ertir" 3a
con0ersi=n es 2osi6)e entre )os ti2os 6.sicos"
'& *e-?n mi e:2eriencia5 Dco2iar 2e-arE es +e 2or s una +e )as 2rinci2a)es fuentes +e errores +e 2ro-ramaci=n"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota /-
%aptulo -6 LeLi6 un Lengua5e Limitado 1ecci(n -.-6 Niveles sintctico y semntico
convertir(1, Cadena); // Entero-Cadena. devuelve 1
convertir(1.0, Entero); // Real-Entero. devuelve 1
convertir(falso, Entero); // Booleano-Entero. devuelve 0
convertir(1, Entero); // Cadena-Entero. Devuelve 1
convertir(3.14159, Real); // Cadena-Real. Devuelve 3.14159
convertir(cierto, Booleano); // Cadena-Booleano. Devuelve cierto
convertir(uno, Entero); // Error en tiempo de ejecucin
#) contrario que en C++5 una con0ersi=n err=nea +e ti2os (como )a ?)tima) no arro4ar. e) 0a)or
2or +efecto +e )os enteros (0)5 sino que 2ro0ocar. un error K )a 2ara+a inme+iata +e) 2ro-rama"
$am6in es 2osi6)e con0ertir o64etos +e c)ase a su2erc)ase5 0ice0ersa@ e) 2rimer 2aso siem2re es
2osi6)e5 mientras que e) se-un+o 2ue+e 2ro0ocar errores en tiem2o +e e4ecuci=n o +e
com2i)aci=n"
clase ClaseA {...}
clase ClaseB extiende ClaseA {...}
clase ClaseC extiende ClaseA {...}
clase Inicio
{
mtodo abstracto inicio()
{
ClaseA a; ClaseB b; ClaseC c;
convertir(c, ClaseA); // Siempre posible
convertir(a, ClaseB); // Falso, a no esUn ClaseB
}
}
1e )a misma forma que en Ce5 e:iste un mecanismo +e "oxing un"oxing que 2ermite !acer
transformaciones +e ti2o Objeto a ti2o 6.sico (Entero5 Real5 Cadena)"
clase Unboxing
{
mtodo imprimir(Objeto o)
{
Si(o esUn Entero)
{
Entero e=convertir(o, Entero);
Sistema.imprime(Es un Entero de valor +e);
}
| (o esUn Real)
{
Real r=convertir(o,Real);
Sistema.imprime(Es un Real de valor +r);
}
| (o esUn Cadena)
{
Cadena c = convertir(Entero,o);
Sistema.imprime(Es una cadena de valor + com + c + com);
}
| (o esUn Booleano)
{
Booleano b = convertir(o, Booleano);
Sistema.imprime(Es un booleano de valor + b);
}
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota /)
%aptulo -6 LeLi6 un Lengua5e Limitado 1ecci(n -.-6 Niveles sintctico y semntico
| otras
{
Sistema.imprime(No es un tipo bsico);
}
}
}
Como 2ue+e 0erse5 esUn 2ermite sa6er en tiem2o +e e4ecuci=n si un o64eto es una instancia +e
una c)ase o su2erc)ase +a+a" Es )a ?nica 2a)a6ra reser0a+a +e) )en-ua4e que tiene una )etra
ma?scu)a"
$o+as )as con0ersiones entre ti2os (con convertir) se com2rue6an en tiem2o +e com2i)aci=n
e:ce2to )a con0ersi=n +in.mica (+e c)ase a su6c)ase) que se com2rue6a en tiem2o +e e4ecuci=n"
3as e:2resiones que uti)icen esUn se e0a)?an siem2re en tiem2o +e e4ecuci=n"
;rioridad en las e-presiones
3a 2riori+a+ +e )os o2era+ores es i+ntica a )a em2)ea+a en C++ Ja0a" 3os 2arntesis sir0en
2ara cam6iar)a5 +e )a forma usua)"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota /0
%aptulo -6 LeLi6 un Lengua5e Limitado 1ecci(n -.)6 &nstrucciones de LeLi
Becci%n 3.": /nstrucciones de LeLi
3.".1: Be'araci%n de instrucciones
3a se2araci=n +e instrucciones se rea)i%a con e) car.cter 2unto coma (@)5 e:actamente +e )a
misma manera que se !ara en 4a0a C"
3.".2: Asignaciones
3as asi-naciones en 3e3i se rea)i%an me+iante e) o2era+or +e asi-naci=n DUE" *o)amente se
2ermiten so6re o64etos +e ti2os 6.sico (Entero5 Real5 Cadena5 Booleano)" 3a asi-naci=n est.
2ro!i6i+a 2ara e) resto +e )os o64etos +e) )en-ua4e5 2orque 3e3i no a+mite nin-?n ti2o +e
D2unterosE o DreferenciasE a o64etos5 a2arte +e) 2aso +e 2ar.metros 2or referencia"
3.".3: 4ucles : mientrasI *acerJmientrasI desde
3os 6uc)es en 3e3i se e:2resan uti)i%an+o )a 2a)a6ra reser0a+a mientras, )a com6inaci=n +e
2a)a6ras reser0a+as hacer mientras o )a 2a)a6ra reser0a+a desde"
/n 6uc)e DmientrasE es equi0a)ente a un 6uc)e DwhileE +e 4a0a o CF
metodo buclemientras()
{
Entero i = 1;
// Imprime 10 mensajes por pantalla
mientras(i<=10)
{
Sistema.imprime(Iteracin (mientras) nmero + i + nl);
i++;
}
}
/n 6uc)e Dhacer-mientrasE es equi0a)ente a un Ddo-whileE +e 4a0a o CF
mtodo buclehacermientras()
{
// Imprime nueve mensajes por pantalla
i=1;
hacer
{
Sistema.imprime(Iteracin (hacer-mientras) nmero + i + nl);
i++;
}mientras(i<=10);
Como es !a6itua)5 )os +os 6uc)es se com2ortar.n +e manera +iferente cuan+o )a con+ici=n +e)
6uc)e sea inicia)mente fa)saF
mtodo condicionesFalsas()
{
// Este bucle jams se ejecutar
mientras(1>2)
{ Sistema.imprime(Es imposible llegar aqu + nl); }
// Este bucle se ejecutar una vez, aunque su condicin sea falsa
hacer
{ Sistema.imprime(Esto solamente se imprir una vez + nl); }
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota /,
%aptulo -6 LeLi6 un Lengua5e Limitado 1ecci(n -.)6 &nstrucciones de LeLi
mientras (1>2);
}
En 3e3i )as instrucciones +e un 6uc)e +e6en ir o+ligatoriamente +e)imita+as 2or
))a0es (fg)5 a) contrario que en 4a0a C++"
9or ?)timo5 un 6uc)e desde es 0irtua)mente i+ntico a un 6uc)e for +e 4a0a C++F
mtodo bucleDesde()
{
Entero i;
desde(i=1; i<=10; i++)
{
Sistema.imprime(esta es la iteracin + i + nl);
}
}
1entro +e )a 2rimera 2arte +e un 6uc)e desde so)amente 2ue+e !a6er e:2resiones@ no
2ue+e !a6er +ec)araciones +e 0aria6)es"
3.".": &ondicionales: si
En 3e3i so)amente !a una instrucci=n con+iciona)5 ))ama+a DsiE" *u sinta:is es una me%c)a entre
)a +e su !om=nima en 3E#
'6
)a +e )a instrucci=n if +e 4a0a C"
3a estructura +e )a instrucci=n si es )a si-uienteF
Si(condicion1){ instrucciones1 }
...
| (condicionN){ instruccionesN }
| otras { instrucciones_otras }
*o)amente )as +os 2rimeras 2artes (si(condicion){instrucciones}) son necesarias" #)
cuer2o 2rinci2a) se )e 2ue+en aCa+ir tantas com2ro6aciones a+iciona)es como se quieran"" 3a
2artcu)a DotrasE 2ue+e no a2arecer5 2ero en caso +e que a2are%ca +e6e !acer)o una so)a 0e%
a) fina)"
En 3e3i es o+ligatorio uti)i%ar )as ))a0es (fg) 2ara +e)imitar )as instrucciones a
e4ecutar a) cum2)irse una con+ici=n en )a instrucci=n si"
3.".#: /nstrucci%n volver
9ara sa)ir +e un mto+o sin !a6er ))e-a+o a) fina) +e +ic!o mto+o 2ue+e uti)i%arse )a 2a)a6ra
reser0a+a 0o)0erF
mtodo Entero mtodovolver(Booleano quiero1)
{
Si(quiero1)
{
mtodovolver= 1;
volver;
}
mtodovolver= 2; // Si la ejecucin llega hasta aqu, se devuelve un 2
}
'6 E) )en-ua4e que se enseCa en )os 2rimeros cursos +e in-eniera inform.tica en )a Escue)a $cnica *u2erior +e *e0i))a
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota /7
%aptulo -6 LeLi6 un Lengua5e Limitado 1ecci(n -.06 Atros aspectos de LeLi
Becci%n 3.#: Otros as'ectos de LeLi
3.#.1: Kerencia de clases
3e3i im2)ementa un ti2o mu 6.sico +e !erencia5 2areci+o a) +e 9I94"
9ara que una c)ase !ere+e +e otra 6asta con es2ecificar)o +e esa forma en )a +ec)araci=n +e )a
c)ase5 uti)i%an+o )a 2a)a6ra reser0a+a extiendeF
clase A extiende B
{
...
}
$o+os )os mto+os +e )a c)ase G 2asar.n autom.ticamente a formar 2arte +e )a c)ase # ()os
constructores no)" 3a c)ase # 2ue+e so6reescri6ir cua)quier mto+o +e GF
clase B
{
mtodo m() {Sistema.imprime(m en clase B + nl);}
}
clase A extiende B
{
mtodo m() {Sistema.imprime(m en clase A + nl);}
}
clase Inicio
{
mtodo abstracto inicio()
{
A a; B b;
a.m(); // Imprime m en clase A
b.m(); // Imprime m en clase B
convertir(a,B).m(); // Imprime m en clase B
a.super.m(); // Imprime m en clase B
}
}
Cuan+o se necesita ))amar a un mto+o +e )a su2erc)ase se uti)i%a )a 2a)a6ra reser0a+a super"
csta 2ue+e ser em2)ea+a +e +os manerasF )a 2rimera es como aca6amos +e 0er en e) e4em2)o
anteriorF sim2)emente se si-ue e) nom6re +e )a 0aria6)e +e un 2unto su2er" E) otro se uti)i%a
cuan+o es e) o64eto actua) e) que 2recisa ))amar a un mto+o +e) 2a+re" En ta) caso5 su2er se usa
+irectamente5 sin escri6ir na+a +e)ante" esta ca2aci+a+ es es2ecia)mente ?ti) en )os constructores
+e )as c)asesF
clase A
{
atributo Entero x;
constructor(Entero x) {atributo.x = x;}
}
clase B extiende A
{
atributo Cadena n;
constructor (Entero x, Cadena n)
{
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota //
%aptulo -6 LeLi6 un Lengua5e Limitado 1ecci(n -.06 Atros aspectos de LeLi
super.constructor(x); // Inicia x
atributo.n = n;
}
}
3a !erencia so)amente se a2)ica a )os mto+os a6stractos no a6stractos@ )os atri6utos no 2ue+en
Dso6reescri6irseE5 2orque en -enera) esta ca2aci+a+ so)amente aCa+e confusi=n a) )en-ua4eF
clase Base
{
atributo Entero a;
}
clase Heredada extiende Base
{
atributo Cadena a; // Provoca un error: el atributo a ya existe
}
(a% del sistema: clase 47*eto
$o+as )as c)ases +e) sistema son su6c)ases +e )a c)ase Objeto" Esta c)ase so)amente +is2one +e un
mto+o a6stracto5 aserto5 que sir0e 2ara +etener )a a2)icaci=n en tiem2o +e e4ecuci=n si una
con+ici=n no se cum2)e" 3os 2ar.metros que a+mite aserto son +osF una con+ici=n 6oo)eana un
mensa4e +e te:to en forma +e ca+enaF
clase Objeto
{
mtodo abstracto aserto(Booleano condicin, Cadena mensaje)
}
Gracias a )a !erencia5 aserto 2ue+e ser uti)i%a+a +irectamente en cua)quier mto+o +e cua)quier
c)asse +e 3e3i (2ues to+as )as c)ases +e) )en-ua4e son en ?)tima instancia su6 c)ases +e Objeto)"
3.#.2: Gesti%n de la memoria
7o se es2ecifica nin-?n mecanismo +e -esti=n +e )a memoria@ +a+o e) car.cter aca+mico +e)
)en-ua4e5 no su2one nin-una 0enta4a inc)uir un sistema +e reco)ecci=n +e 6asura a0an%a+o (a
que so)amente se +ec)arar.n una o +os c)ases en ca+a e4em2)o5 con 10 o '0 0aria6)es como
m.:imo)" #unque e) )ector es )i6re +e intentar)o"
Como norma -enera)5 se recomien+a uti)i%ar )a 2i)a 2ara to+as )as 0aria6)es ()a no e:istencia +e
2unteros 2ermite uti)i%ar)a f.ci)mente) e:ce2to 2ara )as ca+enas5 que +e6eran im2)ementarse con
un 2seu+oAmontcu)o" 3os atri6utos a6stractos +e )as c)ases 2ue+en -uar+arse en )a 2i)a o en una
%ona +e +atos es2ecia)"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota /<
%aptulo -6 LeLi6 un Lengua5e Limitado 1ecci(n -.,6 %onclusi(n
Becci%n 3.+: &onclusi%n
En este ca2tu)o !e +efini+o +e una manera m.s o menos estricta e) )en-ua4e 3e3i5 que usar 2ara
i)ustrar c=mo crear un com2i)a+or con #7$38" Esto es e:actamente )o que !ar en )os 2r=:imos
ca2tu)os"
/n 2equeCo a0anceF como seCa) en e) ca2tu)o '5 con #7$38 se tra6a4a uti)i%an+o una serie +e
fic!eros +e +efinici=n +e -ram.ticas" #unque es 2osi6)e escri6ir e) ana)i%a+or ):ico5 sint.ctico
sem.ntico en e) mismo fic!ero5 es muc!o m.s f)e:i6)e tener 0arios
'(
fic!eros se2ara+os" csta ser.
)a estrate-ia que se-uiremos 2ara construir un com2i)a+or 2ara 3e3i"
Ca+a uno +e )os si-uientes ca2tu)os ten+r. como o64eti0o 2rinci2a) e:2)icar )a construcci=n +e
ca+a uno +e +ic!os fic!eros5 e:2)icar c=mo !acer)o +e )a me4or manera 2osi6)e (en e) caso +e
que !aa 0arias)"
'( 1os5 tres o m#s"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota <
Captulo 4:
Anlisis lxico de LeLi
Cuando hables, procura ue tus palabras sean mejores ue el silencio.
9ro0er6io !in+?
Captulo 4:
Anlisis lxico de LeLi........................................................................91
Seccin !.1: Introduccin........................................................................................................12
Seccin !.2: +structura general del anali%ador ................................................................... 13
".2.1: &uer'o del !ic*ero..................................................................................................................... 13
".2.2: Keader: l 'aquete leli.............................................................................................................. 13
".2.3: O'ciones del anali8ador............................................................................................................ 13
".2.": Lona de to:ens.......................................................................................................................... 1"
Seccin !.3: 5ona de reglas.................................................................................................... 16
".3.1: MArg*E......................................................................................................................................... 1+
@ero... M$osotros siem're utili8(bamos un aut%mata 'ara el an(lisis l0xicoE..................................................1+
".3.2: 4lancos...................................................................................................................................... 1-
O'ciones dentro de una regla...........................................................................................................................1.
Reglas 'rotegidas..............................................................................................................................................11
".3.3: /denti!icadores........................................................................................................................... 11
".3.": BAmbolos y o'eradores............................................................................................................ 1C1
".3.#: nteros y reales....................................................................................................................... 1C2
".3.+: &omentarios............................................................................................................................ 1C2
".3.-: Literales cadena...................................................................................................................... 1C+
Seccin !.!: "ompilando el anali%ador................................................................................ 1.0
Seccin !.: +*ecucin: presentacin de la clase 'ool..................................................... 1.#
".#.1: /ntroducci%n............................................................................................................................. 1C.
".#.2: &lase >ool im'rimiendo el !lujo 2to:ens3................................................................................. 1C.
".#.3: jem'lo................................................................................................................................... 1C1
Seccin !.6: A6adiendo el nom7re de )ic8ero a los to9ens.............................................. 11.
".+.1: La incongruencia de antlr.&ommon>o:en............................................................................... 11C
".+.2: >o:ens *omog0neos y *eterog0neos...................................................................................... 11C
@rimera clase de antlraux: Lex/n!o>o:en........................................................................................................111
La inter!a8 Lex/n!o...........................................................................................................................................111
".+.3: Fodi!icaciones en la clase >ool.............................................................................................. 112
".+.": Begundo 'roblema.................................................................................................................. 113
Seccin !.0: +l )ic8ero $e$i$e-er.g......................................................................................116
Seccin !.#: "onclusin........................................................................................................ 12.
Gua prctica de ANTLR 2.7.2 v 1. <1
%aptulo )6 Anlisis l$8ico de LeLi 1ecci(n ).16 &ntroducci(n
Becci%n ".1: /ntroducci%n
En este ca2tu)o )os si-uientes 0o a escri6ir5 com2)etamente +es+e 05 to+os ca+a uno +e )os
fic!eros +e es2ecificaci=n +e -ram.tica que ser.n necesarios 2ara crear nuestro com2i)a+or +e
3e3i" 1a+o que 0o a !a6)ar continuamente +e sa)i+as 2or 2anta))a5 com2i)aciones +em.s5 es
mu con0eniente que e) )ector 2osea #7$38 insta)a+o en su sistema5 co+ifiquemos a )a 0e%
estos fic!eros"
Es un 6uen momento 2ara que e) )ector re0ise su insta)aci=n +e #7$38" $anto en este ca2tu)o
como en )os si-uientes 0o a uti)i%ar )a ?)tima 0ersi=n +is2oni6)e ('"("')"
9ara 2o+er com2i)ar )os fic!eros correctamente 2ue+e ser necesario recom2i)ar
#7$38 2ara que a+mita e) 4ue-o +e caracteres e:ten+i+o +e) es2aCo)(con 0ersiones
2re0ias a )a '"("')" E:2)ico e) 2roceso +e internaciona)i%aci=n en e) a2n+ice C"
Ia +os +ecisiones a tomar en cuanto a )os )en-ua4es em2)ea+os5 tanto e) natura) como e) +e
2ro-ramaci=n"
#7$38 2ro2orciona )a 2osi6i)i+a+ +e -enerar com2i)a+ores en Ja0a5 C++ Ce
'8
" 9or in+icaci=n
+e mi tutor +e 2roecto e) )en-ua4e uti)i%a+o ser. Ja0a"
/n com2i)a+or -enera c=+i-o ensam6)a+or5 que se ensam6)a 2ara con0ertirse en c=+i-o m.quina"
En mi caso 2rescin+ir +e -enerar c=+i-o a)-uno (as que 0er+a+eramente )o que -eneraremos
ser. un intr2rete5 no un com2i)a+or)" 7o o6stante e) ca2tu)o 8 est. +e+ica+o a )a -eneraci=n +e
c=+i-o"
E) )en-ua4e natura) a em2)ear tam6in es 2ro6)em.ticoF tenemos que -enerar tratar un D)en-ua4e
en es2aCo)E (3e3i) uti)i%an+o D)en-ua4es en in-)sE (4a0a e) 2ro2io #7$38)" 7o 2o+emos5 2or
e4em2)o5 nom6rar una c)ase D#na)i%a+or*int.cticoE5 2ues 4a0a no a+mitira e) car.cter acentua+o"
9or )o tanto !e se-ui+o )as si-uientes re-)asF
1" $o+os )os e)ementos escritos en )os fic!eros +e +efinici=n +e -ram.tica +e #7$38 estar.n en
es2aCo)5 e8cepto los nom+res de to7ens y reglas" cstos se con0ierten en 0aria6)es +e
interfaces mto+os 4a0a5 que no 2ue+en uti)i%ar caracteres no #*C,," Estar.n en es2aCo)5
2ero sustituen+o )os caracteres Des2aCo)esE 2or otros #*C,,"
'" E) c=+i-o (nom6res +e 0aria6)es5 comentarios""") +e )as c)ases 4a0a que !aa que crear 2ara
au+ar e:c)usi0amente a) com2i)a+or +e 3e3i (2aquete leli) estar.n en es2aCo) (e)iminan+o
caracteres es2ecia)es cuan+o sea necesario)5 )as que 2ue+an ser0ir 2ara !acer otros
com2i)a+ores (como )as que inte-ran e) 2aquete antlraux) estar.n en in-)s"
3" 3os nom6res +e )os fic!eros estar.n en in-)s"
4" 3os fic!eros +e e4em2)o escritos en 3e3i estar.n en es2aCo)"
'8 En fase +e 2rue6as"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota <2
%aptulo )6 Anlisis l$8ico de LeLi 1ecci(n ).26 !structura general del anali:ador
Becci%n ".2: structura general del anali8ador
".2.1: &uer'o del !ic*ero
E) fic!ero que escri6iremos en este ca2tu)o se ))amar. LeLiLexer.g" *u estructura ser. 2areci+a
a )a que a 2resent.6amos en e) ca2tu)o 'F
header{
/* opciones de cabecera */
}
class LeLiLexer extends Lexer;
options {
/* opciones de generacin para este analizador*/
}
tokens {
/* Seccin de tokens */
}
/* Reglas de generacin */
".2.2: Keader: l 'aquete leli
Ie or-ani%a+o )as c)ases que uti)i%ar 2ara e) com2i)a+or en 0arios 2aquetes@ en e) 2aquete )e)i
ir.n to+os )os ana)i%a+ores +e) )en-ua4e5 )a c)ase que 2ermitir. in0ocar )as +iferentes eta2as +e)
an.)isis"
$o+os )os ana)i%a+ores +e6er.n5 2or )o tanto5 inc)uirse +entro +e) 2aquete )e)i" Esto se rea)i%a
norma)mente en )a ca6ecera (!ea+er) +e ca+a fic!eroF
header
{
package leli;
}
$o+os )os ana)i%a+ores 2ara 3e3i formar.n 2arte +e) 2aquete )e)i5 as que to+as )as
ca6eceras +e ana)i%a+ores inc)uir.n esta )nea +e c=+i-o"
".2.3: O'ciones del anali8ador
$ras )a ca6ecera e:iste )a 2osi6i)i+a+ +e es2ecificar o2ciones -)o6a)es 2ara to+o e) fic!ero" 3a
?nica o2ci=n que 2or a!ora es 0.)i+a en +ic!a secci=n es )a o2ci=n )an-ua4e5 que 2ermite
es2ecificar e) )en-ua4e nati0o en e) que ser. -enera+o e) ana)i%a+or (4a0a5C++5Ce)" Como e)
)en-ua4e 2or +efecto es 4a0a5 es e) que 0amos a uti)i%ar5 no es2ecificaremos nin-una o2ci=n
-)o6a) (omitien+o esta secci=n) 2asaremos +irectamente a es2ecificar )as o2ciones re)ati0as a)
ana)i%a+or ):ico" cstas se encuentran inme+iatamente +es2us +e )a +ec)araci=n +e) ana)i%a+or5
que tiene )a si-uiente formaF
class LeLiLexer extends Lexer;
3a %ona +e o2ciones +e) ana)i%a+or comien%a con )a 2a)a6ra reser0a+a options se-ui+a +e una
))a0e a6ierta (f) termina con una ))a0e cerra+a (g)" 3as o2ciones que 0amos a uti)i%ar son )as
si-uientesF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota <-
%aptulo )6 Anlisis l$8ico de LeLi 1ecci(n ).26 !structura general del anali:ador
options
{
charVocabulary = '\3'..'\377';
exportVocab=LeLiLexerVocab;
testLiterals=false;
k=2;
}
3a 2rimera o2ci=n que se mo+ifica es charVocabulary" Esta o2ci=n in+ica qu 4ue-o +e
caracteres ser.n 0.)i+os 2ara e) ana)i%a+or" En e) caso +e 3e3i e) ran-o +e caracteres est. entre e)
car.cter unico+e 3 e) 3((5 )o que 2ermite to+os )os caracteres #*C,, mas to+as )as )etras
acentua+as con to+os )os acentos 2osi6)es5 mas a)-unos sm6o)os es2ecia)es +e 2untuaci=n"
3a se-un+a o2ci=n5 exportVocab5 es )a que 2ermite5 en con4unci=n con su com2aCera5
im2ortRoca65 se2arar en +iferentes fic!eros +iferentes ana)i%a+ores que se comunican (0er e)
a2arta+o +e o2ciones en e) ni0e) sint.ctico)"
3a si-uiente o2ci=n es testLiterals" Esta o2ci=n sir0e 2ara mane4ar )as 2a)a6ras reser0a+as +e)
)en-ua4e +e 2ro-ramaci=n" Cuan+o est. acti0a+a5 antes +e a2)icarse una re-)a se com2rue6a si
e:iste una 2a)a6ra reser0a+a (o toHen
'9
) que concuer+e con )a nue0a 2a)a6ra"
9or ?)timo5 H sir0e 2ara mo+ificar e) )ooHa!ea+ D2or +efectoE +e) ana)i%a+or" 3o !emos !ec!o '
2ara 2o+er 2rescin+ir +e a)-unos 2re+ica+os sint.cticos que sera mu te+ioso escri6ir"
3as o2ciones charVocabulary testLiterals son e:c)usi0as +e )os ana)i%a+ores ):icos"
ExportVocab H son comunes a to+os )os ti2os +e ana)i%a+ores"
".2.": Lona de to:ens
#) contrario que f)e:5 #7$38 2ro2orciona una manera est.n+ar +e es2ecificar )as 2a)a6ras
reser0a+as +e un )en-ua4e su toHen asocia+o" 9ara e))o se uti)i%a )a secci=n +e toHens +e)
ana)i%a+or ):ico" #s es como comien%a )a secci=n +e toHens +e nuestro ana)i%a+or ):icoF
tokens
{
// Tipos basicos
TIPO_ENTERO = "Entero" ;
TIPO_REAL = "Real" ;
TIPO_BOOLEANO = "Booleano" ;
TIPO_CADENA = "Cadena" ;
Como 0emos esta 2arte no es mu com2)ica+aF se +efine una 2a)a6ra reser0a+a 2or ca+a ti2o
6.sico +e) )en-ua4e +e 2ro-ramaci=n"
// Literales booleanos
LIT_CIERTO = "cierto" ; LIT_FALSO = "falso" ;
// Literales cadena
LIT_NL = "nl"; LIT_TAB = "tab" ; LIT_COM = "com";
Con estas +os )neas se +efinen )os )itera)es 6oo)eanos )as 2a)a6ras reser0a+as que 3e3i uti)i%a
en )u-ar +e )as secuencias +e esca2e en )as ca+enas"
'9 9ara m.s informaci=n so6re 2a)a6ras reser0a+as toHens5 )ea un 2oco m.s a+e)ante )a secci=n DtoHensE"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota <)
%aptulo )6 Anlisis l$8ico de LeLi 1ecci(n ).26 !structura general del anali:ador
// Palabras reservadas
RES_CLASE = "clase" ;
RES_EXTIENDE = "extiende" ;
RES_METODO = "mtodo" ;
RES_CONSTRUCTOR = "constructor" ;
RES_ATRIBUTO = "atributo" ;
RES_ABSTRACTO = "abstracto" ;
RES_PARAMETRO = "parmetro" ;
RES_CONVERTIR = "convertir" ;
RES_MIENTRAS = "mientras" ;
RES_HACER = "hacer" ;
RES_DESDE = "desde" ;
RES_SI = "si" ;
RES_OTRAS = "otras" ;
RES_SALIR = "volver" ;
RES_ESUN = "esUn" ;
RES_SUPER = "super" ;
En esta 2arte se +efine )as 2a)a6ras reser0a+as" Como a !emos +ic!o5 3e3i es un )en-ua4e
sensi6)e a )as ma?scu)as" #tenci=n a )os acentos en Dmto+oE D2ar.metroE"
// Operadores que empiezan con letras;
OP_Y = "y" ;
OP_O = "o" ;
OP_NO = "no" ;
# 2esar +e ser o2era+ores )=-icos5 !emos +e tratar a DyE5 DoE DnoE como 2a)a6ras reser0a+as
en )u-ar +e o2era+ores5 2orque em2ie%an 2or una )etra5 -eneraran conf)ictos con )a re-)a
IDENT e:2uesta m.s a6a4o"
// Los literales real y entero son "devueltos" en las
// acciones del token LIT_NUMERO
LIT_REAL ; LIT_ENTERO;
}
>ina)mente !emos +ec)ara+o +os toHens Dima-inariosE" #) tra6a4ar con #7$38 !e teni+o ocasi=n
+e tra6a4ar muc!as 0eces con este ti2o +e toHens5 es2ecia)mente a) !acer e) an.)isis sint.ctico"
3os toHens ima-inarios son toHens ficticios que se uti)i%an 2or como+i+a+" En ste caso )os
+ec)aramos aqu 2ara 2o+er +e0o)0er)os a+ecua+amente con )a re-)a 3,$_7/BE8; (si-a
)een+o 2ara 0er +e qu esto !a6)an+o)" 3os toHens ima-inarios nunca tienen nom6re5 es +ecir5
no 0an suce+i+os +e un i-ua) una ca+ena"
3os )ectores o6ser0a+ores se !an +a+o cuenta +e que no !e !ec!o referencia a)-una a )os
comentarios que a2arecen@ como a !e in+ica+o en otras 2artes +e) te:to5 stos 2ue+en escri6irse
en cua)quier )u-ar +e) c=+i-o5 su sinta:is es i+ntica a )a +e 4a0a C"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota <0
%aptulo )6 Anlisis l$8ico de LeLi 1ecci(n ).-6 Nona de reglas
Becci%n ".3: Lona de reglas
".3.1: MArg*E
Ja )o !e anuncia+o anteriormente5 2ero )o 0o)0er a escri6ir aquF /na +e )as 2rimeras sor2resas
que se encuentran a) escri6ir e) 2rimer ana)i%a+or ):ico con #7$38 es que no se uti)i%a un
aut=mata finito +eterminista (1>#5 Deterministic )inite /ut%omata) 2ara rea)i%ar e) an.)isis5
como en f)e:" En )u-ar +e e))o se uti)i%a un aut=mata 2re+A33(H) que uti)i%a caracteres como
sm6o)os"
Cuan+o me + cuenta +e sto )o 2rimero que 2ens fue DL#r-!NE" Ja me 0ea !acien+o
factori%aciones 2or )a i%quier+a5 inmerso en )as tormentosas a-uas +e 33(H)"""
9ensan+o en )os que5 como o5 sufrieran esca)ofros a) or )a i+ea5 $erence 9arr inc)u= un
a2arta+o ))ama+o D9ero""" L7osotros siem2re uti)i%.6amos un aut=mata 2ara e) an.)isis ):icoNE
30
en e) manua) +e #7$38"Ro a 2ermitirme inc)uir una tra+ucci=n +e +ic!a secci=n aqu"
;ero... L&osotros siempre utili%7amos un autmata para el anlisis l2-icoM
1raducido del manual en ingls de /A1L?. )ic%ero lexer.%tm.
$o+os )os ana)i%a+ores ):icos eran construi+os a mano en )os inicios +e )os com2i)a+ores !asta
que )os #ut=matas >initos 1eterministas (1>#s
31
) se im2usieron" 3os 1>#s tienen ciertas
0enta4asF
X 9ue+en construirse f.ci)mente a 2artir +e sim2)es e:2resiones re-u)ares"
X 9ue+en !acer factori%aciones a )a i%quier+a autom.ticamente +e )os 2refi4os" En un ana)i%a+or
):ico !ec!o a mano5 !a que encontrar factori%ar to+os )os 2refi4os comunes" 9or e4em2)o5
consi+rese un ana)i%a+or que ace2te enteros f)otantes" 3as e:2resiones re-u)ares son
+irectasF
entero : "[0-9]+" ;
real : "[0-9]+{.[0-9]*}|.[0-9]+" ;
Escri6ir un esc.ner 2ara sto requiere factori%ar e) S0A9T+ com?n" E) c=+i-o que !a6ra que
escri6ir sera +e ste esti)oF
Token nextToken() {
if ( Character.isDigit(c) ) {
match(entero)
if ( c=='.' ) {
match(entero)
return new Token(REAL);
}
else {
return new Token(ENTERO);
}
}
else if ( c=='.' ) { // Real que comienza con punto
match(entero)
return new Token(REAL);
}
else ...
30 DGut"""\e[0e #)<as /se+ #utomata >or 3e:ica) #na)sisNE
31 7 +e) $F 1>#5 Deterministic )inite /ut%omata
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota <,
%aptulo )6 Anlisis l$8ico de LeLi 1ecci(n ).-6 Nona de reglas
}
#)ternati0amente5 )os ana)i%a+ores escritos a mano tienen )as si-uientes 0enta4as so6re )os
im2)ementa+os so6re un 1>#F
X 7o est.n )imita+os a )os ti2os norma)es +e )en-ua4es" 9ue+en uti)i%ar informaci=n sem.ntica
))amar a mto+os +urante e) reconocimiento5 mientras que un 1># no tiene 2i)a se
caracteri%a 2or no 2o+er tener 2re+ica+os sem.nticos"
X 3os caracteres /nico+e (16 6it 0a)ues) son mane4a+os f.ci)mente mientras que )os 1>#s
usua)mente est.n )imita+os a caracteres +e 8 6its"
X 3os 1>#s son ta6)as +e enteros son5 2or )o tanto5 +ifci)es +e e:aminar mantener"
X /n ana)i%a+or !ec!o a mano5 si est. 6ien rea)i%a+o5 2ue+e ser m.s r.2i+o que un 1>#"
#s que5 Oqu so)uci=n 2ro2one #7$38 '"::Q L7in-una +e )as +osN #7$38 2ermite es2ecificar
e)ementos ):icos con e:2resiones5 2ero -enera un ana)i%a+or que se 2arece muc!o a uno !ec!o
a mano" 3a ?nica 2e-a es que si-ue sien+o necesario !acer )a factori%aci=n a )a i%quier+a en
a)-unas +efiniciones +e toHens (2ero a) menos sto se !ace con e:2resiones5 no con c=+i-o)"
Esta a2ro:imaci=n !6ri+a 2ermite construir ana)i%a+ores ):icos que son muc!o m.s r.2i+os
2otentes que )os 6asa+os en 1>#s5 e0itan+o tener que escri6ir )os ana)i%a+ores a mano"
En resumen5 es2ecificar e:2resiones re-u)ares es m.s sim2)e m.s corto que escri6ir un
ana)i%a+or a mano5 2ero stos ?)timos son m.s r.2i+os5 2otentes5 ca2aces +e mane4ar unico+e
m.s f.ci)es +e mantener" Este an.)isis !a ))e0a+o a muc!os 2ro-rama+ores a escri6ir ana)i%a+ores
):icos a mano a 2esar +e )a e:istencia +e !erramientas +e -eneraci=n 6asa+as en 1># como )e:
+)-" Como 4ustificaci=n fina)5 n=tese que escri6ir ana)i%a+ores ):icos es tri0ia) com2ara+o con
construir ana)i%a+ores sint.cticos@ que5 una 0e% que !aa construi+o su 2rimer ana)i%a+or
):ico5 uste+ )o reuti)i%ar. en e) futuro aCa+in+o)e +i0ersas mo+ificaciones"
*****
/na 0e% 4ustifica+o e) uso +e) a)-oritmo 33(H) 2ara e) an.)isis ):ico5 0amos a )o im2ortanteF )as
re-)as" 3as re-)as se co)ocan tras )a secci=n +e toHens5 no terminan !asta que no se termina e)
fic!ero o a2arece otra +ec)araci=n +e ana)i%a+or" 3a %ona +e re-)as no est. +e)imita+a 2or
Drules{ }E ni na+a 2areci+o"
".3.2: 4lancos
/sua)mente )a 2rimera re-)a que se +efine en un ana)i%a+or ):ico es )a +e )os caracteres +e
se2araci=n5 tam6in ))ama+os es2acios en 6)anco o5 sim2)emente5 6)ancos"
3os 6)ancos en 3e3i son e) es2acio5 e) car.cter +e ta6u)aci=n e) sa)to +e )nea" 3os +os 2rimeros
son senci))os +e im2)ementar5 mientras que e) se-un+o requiere a)-o m.s +e tra6a4o"
3a re-)a que 2ermite i+entificar )os 6)ancos es )a si-uienteF
BLANCO :
( ' '
| '\t'
| NL
) { $setType(Token.SKIP); } // La accin del blanco: ignorar
;
/na +e )as 2rimeras cosas que resa)ta es e) comentario" #7$38 2ermite insertar comentarios
ti2o 4a0a+oc +e)ante +e sus ana)i%a+ores +e)ante +e ca+a re-)a +e) ana)i%a+or"
3a a)ternati0a es f.ci)mente )e-i6)eF un es2acio5 un ta6u)a+or o un NL (7ue0a 3nea)" 3o que es
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota <7
%aptulo )6 Anlisis l$8ico de LeLi 1ecci(n ).-6 Nona de reglas
un 2oco menos )e-i6)e es )a acci=n que 0iene inme+iatamente +es2us +e )a a)ternati0a"
$setType es una funci=n que 2ermite cam6iar e) ti2o +e toHen que +e0ue)0e )a re-)a en )a que se
encuentra" *i !u6iramos escrito D$setType(LIT_CIERTO);E5 2or e4em2)o5 e) ana)i%a+or ):ico
+e0o)0era LIT_CIERTO 2or ca+a 6)anco que encontrase" Token.SKIP es un 0a)or es2ecia) que
2ue+e +arse a) ti2o +e) toHen que in+ica a) ana)i%a+or que +ic!o toHen +e6e ser fi)tra+o5 es +ecir5
no +e6e ser 2asa+o a) ana)i%a+or sint.ctico"
Ja casi !emos +efini+o qu son )os 6)ancos" 9ara +efinir)o com2)etamente es necesario que
+efinamos NL"
Como a !emos +ic!o )os sa)tos +e )nea son a)-o m.s com2)ica+os que )os otros +os
se2ara+ores" 9ara em2e%ar5 e) ana)i%a+or +e6e DcontarEcu.ntos sa)tos +e )nea !a 2asa+o5 so6re
to+o +e cara a )a emisi=n +e mensa4es +e error" 9ara e))o e) ana)i%a+or cuenta con e) mto+o
ne<)ine()5 que +e6e ser aCa+i+o +entro +e una acci=n +es2us +e ca+a sa)to +e )nea"
#!ora 6ien5 e) conce2to +e Dsa)to +e )neaE cam6ia +e sistema o2erati0o en sistema o2erati0o" En
)os sistemas o2erati0os +e /7,X se re2resenta con e) car.cter [in[" En )os sistemas Bacintos! es
[ir[5 en )os sistemas o2erati0os simi)ares +e Bicrosoft es )a secuencia +e caracteres DirinE" 1e
esta manera5 !a que +iferenciar )os casos en )os que !a Dun in en so)itarioE5 Dun ir en so)itarioE
Dun ir se-ui+o +e inE" En teora )a re-)a que !a6ra que escri6ir sera )a si-uienteF
NL :
(
"\r\n" // MS-DOS
| '\r' // MACINTOSH
| '\n' // UNIX
) { newline(); }
;
9or +es-racia esta re-)a es inco!erente en un ana)i%a+or 33(H)5 2ara cua)quier H" #7$38 se
encar-ar. +e recor+.rnos)o si intentamos com2i)ar una -ram.tica con esta re-)a"
#fortuna+amente !a una manera mara0i))osamente sim2)e +e so)ucionar e) 2ro6)ema" 3os que
!aan )e+o e) ca2tu)o 1 a sa6r.n cu.) esF un 2re+ica+o sint.ctico"
protected NL :
(
("\r\n") => "\r\n" // MS-DOS
| '\r' // MACINTOSH
| '\n' // UNIX
) { newline(); }
;
#Ca+ien+o +ic!o enuncia+o a )a o2ci=n se est. for%an+o a) ana)i%a+or a intentar)o 2rimero con
DirinE5 si no )o consi-ue5 consi+erar )as otras +os o2ciones" *i no entien+e qu est. 2asan+o
aqu5 necesita re)eer e) 2rimer ca2tu)o"
4pciones dentro de una regla
E:iste otra manera +e im2)ementar )os sa)tos +e )nea5 mu e:ten+i+a5 que a m no me -usta
+emasia+o" Consiste en uti)i%ar )a ca2aci+a+ +e #7$38 2ara +efinir o2ciones +entro +e
a)ternati0as +e una re-)a"
3a sinta:is 2ara +efinir +ic!as e:ce2ciones es rea)mente mu en-orrosa" Es a)-o asF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota </
%aptulo )6 Anlisis l$8ico de LeLi 1ecci(n ).-6 Nona de reglas
regla : alternativa1
| ( options {
nombre1=valor1;
nombre2=valor2;
...
}
alternativa2 )
...
| alternativaN
;
3o curioso +e) asunto es que #7$38 ofrece un com2ortamiento D2or +efectoE cuan+o se
encuentra con una re-)a como )a anteriorF consume caracteres )o m.s 2ronto 2osi6)e (o reconoce
)a 2rimera a)ternati0a )ista+a)" *i se +esacti0an )os <arnin-s5 )a re-)a se reconoce 2erfectamente"
9ara +esacti0ar)os 6asta con uti)i%ar )a o2ci=n generateAmbigWarningsF
NL :
( options {generateAmbigWarnings=false;}:
"\r\n" // MS-DOS
| '\r' // MACINTOSH
| '\n' // UNIX
) { newline(); }
;
Esta manera +e im2)ementar )os sa)tos +e )na se e:tien+e 2or )a maora +e )os fic!eros +e
e4em2)o +e #7$38
3'
" Esta re-)a funciona m.s r.2i+o que )a anterior5 a) no tener que e4ecutar un
2re+ica+o sint.ctico" 7o o6stante 2refiero so)ucionar )as am6i-ae+a+es en )u-ar +e ocu)tar)as5 as
que me +ecanto 2or mi so)uci=n"
(eglas protegidas
$anto G3#7C; como 73 son re-)as ):icas con una caracterstica interesanteF e) ana)i%a+or
sint.ctico que se conecte a nuestro 3e3i3e:er 4am.s ten+r. constancia +e estas re-)as5 2ues no
2ro+ucen nin-?n toHen@ son +e uso DinternoE +e) ana)i%a+or ):ico"
#7$38 2ermite o2timi%ar este ti2o +e re-)as en )os ana)i%a+ores ):icos con )a 2a)a6ra reser0a+a
protected" csta se co)oca +e)ante +e) nom6re +e )a re-)a5 asF
protected NL :
( options {generateAmbigWarnings=false;}:
"\r\n" // MS-DOS
| '\r' // MACINTOSH
| '\n' // UNIX
) { newline(); }
;
3as re-)as 2rote-i+as son o2timi%a+as 2ara no crear toHens5 +e manera que e) an.)isis sea m.s
r.2i+o"
$anto BLANCO como NL +e6er.n ir 2rece+i+os +e 2rotecte+5 a) i-ua) que otras re-)as internas que
a iremos 0ien+o"
".3.3: /denti!icadores
/n i+entifica+or en 3e3i es una )etra o car.cter +e su6raa+o se-ui+os +e una secuencia (que
2ue+e ser 0aca) +e )etras5 +-itos caracteres +e su6raa+o" Em2ecemos 2or +efinir qu es una
3' Pue ofrecen so)uciones 2ara casi cua)quier 2ro6)ema +e reconocimiento que se 2ue+a 2resentar"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota <<
%aptulo )6 Anlisis l$8ico de LeLi 1ecci(n ).-6 Nona de reglas
)etra"
/**
* Letras espaolas.
*/
protected LETRA
: 'a'..'z'
| 'A'..'Z'
| '' | ''
| '' | '' | '' | '' | ''
| '' | '' | 'I' | '' | ''
| 'u' | ''
;
3a re-)a en cuesti=n no es +ifci) +e enten+erF una )etra es cua)quier )etra +e) a6ece+ario es2aCo)5
inc)uen+o )a C )as 0oca)es acentua+as5 en ma?scu)as min?scu)as" 7=tese que a) es2ecificar
una re-)a +e ana)i%a+or ):ico es 2osi6)e uti)i%ar e) o2era+or +o6)e 2unto ("") 2ara referenciar
ran-os +e caracteres" Es 2osi6)e uti)i%ar caracteres unico+e 2ara re2resentar )os caracteres5 sean
stos #*C,, o noA#*C,,@ 2or e4em2)o5 2ue+e uti)i%arse [iu00f1[ o [i'41[ en )u-ar +e [C[5 2ero
uti)i%ar este ?)timo es muc!o m.s intuiti0o
33
" 7=tese que LETRA es una re-)a 2rote-i+a"
/na 0e% +efini+as )as )etras +efinamos )os +-itosF
protected DIGITO : '0'..'9';
7otaF si no fuera 2or que !emos !ec!o HU' en )as o2ciones +e) ana)i%a+or5 )as re-)as
LETRA e IDENT entraran en conf)icto5 as como DIGITO RES_NUMERO (0er m.s
a6a4o)
1e nue0o una re-)a 2ri0a+a5 a?n m.s senci))a que )a anterior" 9asemos5 2or fin5 a )os
i+entifica+oresF
IDENT
options {testLiterals=true;} // Comprobar palabras reservadas
:
(LETRA|'_') (LETRA|DIGITO|'_')*
;
E) cuer2o +e )a re-)a es )a transcri2ci=n e:acta +e )o que +ecamos a) 2rinci2io +e )a secci=n F una
)etra o car.cter +e su6raa+o se-ui+a +e cero o m.s )etras5 +-itos o caracteres +e su6raa+o"
3a 2arte interesante +e esta re-)a no est. en e) cuer2o5 sino antesF como 2ue+e 0erse5 es 2osi6)e
es2ecificar o2ciones in+i0i+ua)es 2ara ca+a re-)a +e )a -ram.tica (a+em.s +e 2ara )as su6 re-)as5
como 0imos en )os BLANCOs)" En este caso )a o2ci=n testLiterals (que se +esacti0= 2ara e)
ana)i%a+or en -enera)) se !a acti0a+o 2untua)mente en esta re-)a" Cuan+o esta o2ci=n est. acti0a5
e) ana)i%a+or act?a +e )a si-uiente formaF
1" E) ana)i%a+or encuentra un toHen que satisface e) cuer2o +e )a re-)a (en nuestro caso5 un
i+entifica+or)
'" E) ana)i%a+or com2rue6a si tiene en su )ista +e toHens a)-?n toHen cuo te:to coinci+a con e)
+e )a re-)a que aca6a +e !acer coinci+ir" 1e ser as5 se en0a +ic!o toHen a) ana)i%a+or
sint.ctico se +a 2or conc)ui+a )a re-)a"
3" En caso contrario5 se 2roce+e norma)mente (en nuestro caso5 en0ian+o un i+entifica+or)"
33 9ara 2o+er uti)i%ar esta notaci=n 2ue+e ser necesario recom2i)ar #7$38 2ara internaciona)i%ar)o" Consu)te e) #2n+ice G"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1
%aptulo )6 Anlisis l$8ico de LeLi 1ecci(n ).-6 Nona de reglas
".3.": BAmbolos y o'eradores
Em2e%aremos 2or +efinir )as re-)as que 2ermiten a) ana)i%a+or reconocer )os o2era+ores (como
suma5 mu)ti2)icaci=n5 etc) )os sm6o)os +e se2araci=n (2arntesis5 ))a0es5 etc")" Esta es
2ro6a6)emente )a 2arte m.s f.ci) +e !acer +e to+o e) ana)i%a+or"
9ara +efinir )os se2ara+ores uti)i%aremos )as si-uientes re-)asF
// Separadores
PUNTO_COMA : ';' ;
COMA : ',' ;
CORCHETE_AB : '[' ;
CORCHETE_CE : ']' ;
LLAVE_AB : '{' ;
LLAVE_CE : '}' ;
PUNTO : '.' ;
PARENT_AB : '(' ;
PARENT_CE : ')' ;
BARRA_VERT : '|' ;
3os o2era+ores5 2or su 2arte5 se re2resentan asF
// operadores
OP_IGUAL : "==" ;
OP_DISTINTO : "!=" ;
OP_ASIG : '=' ;
OP_MENOR : '<' ;
OP_MAYOR : '>' ;
OP_MENOR_IGUAL : "<=" ;
OP_MAYOR_IGUAL : ">=" ;
OP_MAS : '+' ;
OP_MENOS : '-' ;
OP_MASMAS : "++" ;
OP_MENOSMENOS : "--" ;
OP_PRODUCTO : '*' ;
OP_DIVISION : '/' ;
7=tese que no es necesario a)inear )os sm6o)os +e +os 2untos ni +e 2unto coma@ )o !e !ec!o
as 2or 2ura esttica5 2orque a)inean+o e) c=+i-o +e esta forma es m.s f.ci) com2ro6ar si fa)ta o
so6ra a)-?n 2unto coma o a)-?n 2arntesis" Es 2osi6)e inc)uso +efinir 0arias re-)as en )a misma
)nea5 cosa que o +esaconse4o fer0ientemente"
3a +ec)araci=n +e se2ara+ores o2era+ores es una tarea senci))a que no requiere muc!a
e:2)icaci=n" *o)amente 0amos a e:2)icar +os 2equeCos +eta))es"
9rimeroF 1a+o que a)-unos o2era+ores (como + ++) comien%an con e) mismo car.cter5 es
necesario que e) )ooHa!ea+ 2or +efecto +e) ana)i%a+or sea VU ' (+e otra manera !a6ra si+o
necesario uti)i%ar toHens ima-inarios 2re+ica+os sint.cticos5 que+an+o e) c=+i-o rea)mente
sucio)
*e-un+oF ,nc)uir )os o2era+ores que em2ie%an con )etras (5 o5 no) en )a secci=n +e toHens
+ec)arar )os +em.s como re-)as no es una +ecisi=n fortuita@ se !a rea)i%a+o as 2orque )as
2a)a6ras reser0a+as tienen una re-)a 2ara +is2ararse (en e) caso +e 3e3i +ic!a re-)a ser. ,1E7$@
si-ua )een+o 2ara m.s informaci=n)" 7o o6stante no !a nin-una re-)a equi0a)ente 2ara )os
o2era+ores A 7i +e6e !a6er)aF una re-)a como )a si-uienteF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 11
%aptulo )6 Anlisis l$8ico de LeLi 1ecci(n ).-6 Nona de reglas
tokens{
OP_MAS=+;
OP_MENOS=-;
...
}
...
OPERADOR options {testLiterals=true}: ('*' | '+' | '-' | ...)+ ;
>uncionara 6ien mientras )a entra+a fuera a)-uno +e )os o2era+ores 0.)i+os" *in em6ar-o5 un
o2era+or no 0.)i+o (2or e4em2)o UV) no 2ro0ocara e) )an%amiento +e una e:ce2ci=n5 sino que
)an%ara e) toHen ima-inario OPERADOR a) ana)i%a+or ):ico (como ocurre con IDENT)"
Este incon0eniente 2o+ra so)ucionarse !acien+o que )a re-)a OPERADOR Dfracasara siem2reE (2or
e4em2)o5 )an%an+o una e:ce2ci=n en una acci=n)" 9ero creo que es muc!o m.s senci))o
im2)ementar )os o2era+ores como o )o !e !ec!o"
".3.#: nteros y reales
#2ro0ec!an+o que estamos !a6)an+o +e toHens ima-inarios5 0amos a 0o)0er so6re )os +os toHens
ima-inarios que !emos +efini+o en )a secci=n +e toHens" 9ara )os que no ten-an -anas +e
re0o)0er 2.-inas5 )os 0ue)0o a escri6ir aquF
// Los literales real y entero son "devueltos" en las
// acciones del token LIT_NUMERO
LIT_REAL ; LIT_ENTERO;
E) comentario que )os 2rece+e +e6era a!ora resu)tar m.s com2rensi6)e que antes" Ramos a
escri6ir una re-)a (LIT_NUMERO) que sea ca2a% +e +iferenciar )os enteros +e )os rea)es5 +e
+e0o)0er)os con0enientemente"
3a re-)a en cuesti=n es )a si-uienteF
/**
* Permite reconocer literales enteros y reales sin generar conflictos.
*/
LIT_NUMERO : (( DIGITO )+ '.' ) =>
( DIGITO )+ '.' ( DIGITO )* { $setType (LIT_REAL); }
| ( DIGITO )+ { $setType (LIT_ENTERO); }
;
3a re-)a es en rea)i+a+ una o2ci=n con +os a)ternati0as mu sim2)es" 3o ?nico que !a que
mencionar es que )a 2rimera a)ternati0a comien%a con un predicado sintctico" cste 2re+ica+o
am2)a in+efini+amente e) )ooHa!ea+ +e) ana)i%a+or cuan+o encuentra una secuencia +e +-itos5
!asta que encuentra e) car.cter si-uiente" *i +ic!o car.cter es un 2unto5 entonces se trata +e un
rea) (se cum2)e )a 2rimera re-)a)" En otro caso es un entero5 2or )o que )a re-)a que se cum2)e es
)a se-un+a"
Ja !emos 0isto e) mto+o $setType a) !a6)ar +e )os BLANCOs" En ste caso sir0e 2ara que e)
ana)i%a+or +e0ue)0e un toHen +e ti2o LIT_ENTERO o LIT_REAL en )u-ar +e LIT_NUMERO"
".3.+: &omentarios
Es 2osi6)e es2ecificar +os ti2os +e comentarios en 3e3iF +e una so)a )nea +e 0arias )neas" 3os
comentarios ser.n tota)mente i-nora+os a 2artir ste momento5 as que +e6er.n ser fi)tra+os +e )a
misma forma que )os 6)ancos"
;6ser0emos5 2ues5 )a re-)a que 2ermite reconocer )os comentarios +e una so)a )neaF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 12
%aptulo )6 Anlisis l$8ico de LeLi 1ecci(n ).-6 Nona de reglas
/**
* Comentario de una sola lnea
*/
protected COMENTARIO1
:
"//" (~('\n'|'\r'))*
{ $setType(Token.SKIP); }
;
Esta re-)a im2one un 2oco a) 2rinci2io5 2ero ana)i%.n+o)a 2oco a 2oco se 2ue+e enten+er sin
+ificu)ta+" Comencemos 2or )os e:tremosF )a D^^E +e) 2rinci2io in+ica que un comentario +e6e
em2e%ar con )a +o6)e 6arra5 mientras que )a acci=n D$setType(Token.SKIP);E sir0e 2ara fi)trar
to+o e) toHen que no ))e-ue a) ana)i%a+or sint.ctico"
3o que que+a entre )a +o6)e 6arra )a acci=n5 (~('\n'|'\r'))*5 quiere +ecir Dcero o m.s 0eces
~('\n'|'\r')E" 3itera)mente5 ~(expresin) si-nifica Dcua)quier e)emento menos aque))os que
cum2)an e:2resi=nE" En nuestro caso expresin es [\n'|'\r'5 es +ecir5 cua)quier sa)to +e )nea"
9or )o tanto5 )o que +ice )a re-)a esF D/n COMENTARIO1 es )a ca+ena D^^E se-ui+a +e cero o m.s
0eces cua)quier car.cter que no sea un sa)to +e )nea" Esta re-)a +e6e fi)trarse"E
9asemos sin m.s 2re.m6u)os a )a construcci=n +e una re-)a 2ara )os comentarios +e 0arias )neas"
En )u-ar +e 2resentar mi so)uci=n comentar )o que si-nifica5 en este caso 0o a e:2)icar c=mo
)a constru5 2aso a 2aso"
3os comentarios mu)ti)nea 0an +e)imita+os entre D^YE DY^E" 3a re-)a terminar. tam6in
e4ecutan+o )a acci=n D$setType(Token.SKIP);E" 9or )o tanto5 )a re-)a ten+r. )a si-uiente forma"
protected COMENTARIO2 :"/*" ??? "*/" { $setType(Token.SKIP); };
>a)ta a0eri-uar )o que !a que escri6ir en )u-ar +e ???" 9o+ramos 2ensar en que ??? es Duna
secuencia +e cero o m.s caracteres cua)esquieraE5 es +ecirF
protected COMENTARIO2 :"/*" (.)* "*/" { $setType(Token.SKIP); };
E) 2unto (") en #7$38 re2resenta Dcua)quier car.cter +e) 0oca6u)arioE"
9ero )as cosas no sue)en ser tan f.ci)es" *i intentamos com2i)ar )a -ram.tica con esa re-)a
#7$38 emitir. un mensa4e +e error5 in+ican+o que Dno !a +eterminismo ):ico entre )a 2rimera
a)ternati0a e) fina) +e )a re-)aE"
E) 2ro6)ema es que no !emos 2)antea+o 6ien )o que !a entre )as marcas +e comentarioF a) +ecir
Duna secuencia +e cero o m.s caracteres cua)esquieraE estamos inc)uen+o )a ca+ena +e) fina) +e)
comentario5 es +ecir DY^E" 9or )o tanto )o que +e6eramos 2oner es Dcua)quier secuencia ce cero o
m.s caracteres5 e8cepto la cadena de 4in de comentarioE" Es +ecir5 a)-o asF
protected COMENTARIO2 :
"/*"
(
('*' ~'/') => '*' ~'/'
| ~('*')
)*
"*/"
{ $setType(Token.SKIP); }
;
/ti)i%an+o un 2re+ica+o sint.ctico5 una +isunci=n 2ue+e conse-uirse esta re-)a5 que no es
am6i-ua en a6so)uto" 1e !ec!o5 si a) ana)i%a+or )e 2asamos una -ram.tica con comentarios
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1-
%aptulo )6 Anlisis l$8ico de LeLi 1ecci(n ).-6 Nona de reglas
mu)ti)nea5 ser. ca2a% +e reconocer)os fi)trar)os con0enientemente" L9ero si-ue !a6ien+o un
2ro6)emaN"
*e-uramente no nos +aremos cuenta +e ) inme+iatamente" E) 2ro6)ema es e) si-uienteF E)
ana)i%a+or no tiene en cuenta )as )neas +e )os comentarios a )a !ora +e !acer e) conteo +e )neas
+e) fic!ero"
Bantener informaci=n so6re )a )nea actua) que se est. reconocien+o es una tarea mu
im2ortante5 2orque inf)ue nota6)emente en )a c)ari+a+ +e )os mensa4es +e error que +aremos a
)os 2ro-rama+ores +e 3e3i"
En e) caso +e COMENTARIO1 no era necesario contar )as )neas5 2ues se sa)a +e )a re-)a antes +e
))e-ar a )os caracteres +e fin +e )nea5 que eran reconoci+os en )a re-)a NL5 que se +is2ara6a 2or
BLANCO una 0e% que se aca6a6a e) COMENTARIO15 ))am.n+ose a ne<3ine() cuan+o era necesario"
Ja !emos 0isto que contar e) n?mero +e )neas no es tri0ia)5 2or eso )o !emos co)oca+o en una
re-)a a2arte (NL)" $enemos que ))amar a esa re-)a cuan+o sea necesario" 9or e4em2)o asF
protected COMENTARIO2 :
"/*"
| ('*' ~('/')) => '*' ~('/')
| NL
| ~( '\n' | '\r' | '*' )
)*
"*/"
{ $setType(Token.SKIP); }
;
Iemos aCa+i+o NL como una a)ternati0a m.s" 9ara que no !u6iera conf)ictos5 !emos teni+o que
quitar PRIMERO(NL) +e) 2re+ica+o sint.ctico +e )a tercera a)ternati0a" E) conteo +e )neas 2arece
efectuarse correctamente"
L9or +es-racia5 a?n que+a un 2ro6)emaN cste 2ue+e o6ser0arse a) ana)i%ar e) si-uiente fic!eroF
/* Este ejemplo demuestra que probar todas las posibilidades es *MUY*
importante. */
class Manolo { } // Error(lnea 4); es clase, no class
Ia un error en )a )nea 4" Bisteriosamente5 a) com2i)ar5 e) ana)i%a+or seCa)a que e) error est. en
)a )nea 3"
Esto quiere +ecir que a)-uno +e )os sa)tos +e )nea anteriores a )a )nea 4 no !a +is2ara+o )a re-)a
NL" 7o 2ue+en ser )os +e )a )nea ' a )a 3 +e )a 3 a )a 45 2ues son BLANCOS5 que funcionan
correctamente" 9or )o tanto so)amente 2ue+e ser e) comentario"
Efecti0amente5 !a un caso en e) cua) e) comentario no e4ecuta newline() a) to2ar con un
car.cter +e nue0a )neaF cuan+o ste 0a 2rece+i+o 2or un asterisco" Esto ocurre 2or cu)2a +e esta
a)ternati0aF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1)
%aptulo )6 Anlisis l$8ico de LeLi 1ecci(n ).-6 Nona de reglas
protected COMENTARIO2 :
"/*"
2 (030 4(0'0)) &> 030 4(0'0)
| NL
| ~( '\n' | '\r' | '*' )
)*
"*/"
{ $setType(Token.SKIP); }
;
3itera)mente5 )o que si-nifica esta a)ternati0a 2ara e) ana)i%a+or ):ico es Dcuanto encuentres un
asterisco se-ui+o +e cualFuier car#cter Fue no sea la "arra5 sim2)emente i-nora am6os
caracteresE"
L9ero Dcua)quier car.cter que no sea )a 6arraE inc)ue )os caracteres +e nue0a )neaN #s que
tenemos que aCa+ir una a)ternati0a m.s5 2ara e) caso +e un asterisco se-ui+o +e un car.cter +e
nue0a )nea5 ase-urarnos +e que )os caracteres +e nue0a )nea son reconoci+os 2or esa nue0a
re-)a no 2or )a anterior" 9ara e))o ( 2ara e0itar am6i-ae+a+es) +e6eremos mo+ificar )a re-)a
e:2uesta m.s arri6a" /na 0e% rea)i%a+as estas mo+ificaciones5 )a re-)a que+ar. asF
protected COMENTARIO2 :
"/*"
( ('*' NL) => '*' NL // Nueva alternativa
| ('*' ~('/'|'\n'|'\r')) => '*' ~('/'|'\n'|'\r') // Modificada
| NL
| ~( '\n' | '\r' | '*' )
)*
"*/"
{ $setType(Token.SKIP); }
;
>ina)mente !a 4 a)ternati0as" cstas sonF
1" /n asterisco se-ui+o +e un car.cter +e nue0a )nea"
'" /n asterisco se-ui+o +e cua)quier car.cter que no sea ni )a 6arra ()o que -enerara un conf)icto
con e) fina) +e )a re-)a) ni [in[ o [ir[ ()o que -enerara un conf)icto con )a re-)a anterior)"
3" /n car.cter +e nue0a )nea
4" Cua)quier car.cter que no sea ni asterisco5 ni +e nue0a )nea
Ia una 2equeCa ac)araci=n a !acer en )o referente a )os con4untos PRIMEROF O2or qu en )os
2re+ica+os sint.cticos !e uti)i%a+o [in[ [ir[ en )u-ar +e) muc!o m.s natura) NLQ En teora5 2o+ra
!a6er !ec!o a)-o asF
protected COMENTARIO2 :
"/*"
( ('*' 56) => '*' NL
| ('*' ~('/'|56)) => '*' ~('/'|NL) // NL en lugar de '\n'|'\r'
| NL
| ~( NL | '*' ) // NL en lugar de '\n'|'\r'
)*
"*/"
{ $setType(Token.SKIP); }
;
csto que 2arece tan )=-ico no se 2ue+e !acer 2or una 2equeCa )imitaci=n +e #7$38" #7$38
2ue+e mane4ar 6astante 6ien con4untos ne-ati0os +e Ds=)o caracteresE (como ~('a'|'b'|'c'))
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 10
%aptulo )6 Anlisis l$8ico de LeLi 1ecci(n ).-6 Nona de reglas
o +e Ds=)o re-)asE (como ~(IDENT|ENTERO))5 2ero no +e )os +os a )a 0e% (no 2ue+e mane4ar ~
('a'|ENTERO))" 9or eso en e) caso +e tener que !acer 2re+ica+os +e ste ti2o e) 2ro-rama+or
tiene que tra6a4ar un 2oco m.s ca)cu)ar e) con4unto PRIMERO +e )as re-)as que necesite" En
nuestro caso es mu f.ci)5 e) con4unto PRIMERO +e NL es {'\n','\r'}" Es siem2re 2referi6)e
uti)i%ar re-)as +e Ds=)o caracteresE5 2orque son m.s eficientes"
".3.-: Literales cadena
*i uste+ !a conse-ui+o enten+er )as re-)as +e )os comentarios5 )os )itera)es ca+ena no +e6eran
2resentar 2ro6)ema a)-uno" 3e recuer+o que 3e3i no 2ermite secuencias +e esca2e@ en )u-ar +e
e))o est.n )as 2a)a6ras reser0a+as nl (2ara nue0a )nea)5 tab (2ara e) car.cter +e ta6u)aci=n) com
(2ara )as comi))as)" Pue no !aa secuencias +e esca2e sim2)ifica )a re-)a" Bi im2)ementaci=n !a
si+o )a si-uienteF
LIT_CADENA :
'"' !
( ~('"'|'\n'|'\r'|'\t') )*
'"' !
;
3a re-)a no es +ifci) +e enten+erF un )itera) ca+ena em2ie%a termina con unas comi))as ([E[)" 3o
que !a entre estas +os comi))as es5 )itera)mente Dcua)quier car.cter +e) 0oca6u)ario que no sea ni
unas comi))as (2ara e0itar am6i-ae+a+es con e) fina) +e )a ca+ena) ni un car.cter +e fin +e )nea5
ni un ta6u)a+orE"
/na 2equeCa ac)araci=n 2ara )os o6ser0a+ores" Ia +os si-nos +e a+miraci=n si-uien+o a )as
comi))as" E) sm6o)o +e a+miraci=n se uti)i%a en un ana)i%a+or 2ara fi)trar" Es +ecir5 e) c=+i-o
anterior si-nifica )o mismo que e) si-uienteF
LIT_CADENA :
('"' { $setType(Token.SKIP); } )
( ~('"'|'\n'|'\r'|'\t') )*
('"' { $setType(Token.SKIP); } )
;
E) sm6o)o +e a+miraci=n no so)amente se 2ue+e uti)i%ar en )os ana)i%a+ores ):icos@ es a2)ica6)e
en cua)quier ana)i%a+or" 7o o6stante5 su si-nifica+o 0ara )i-eramente +e2en+ien+o +e) ti2o +e
ana)i%a+or en e) que se a2)ique F en una re-)a +e un ana)i%a+or ):ico si-nifica Deste toHen no
+e6e ser 2asa+o a) ni0e) sint.cticoE5 mientras que en un ana)i%a+or sint.ctico o sem.ntico
si-nifica Dste toHen no +e6e formar 2arte +e) .r6o) #*$E"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1,
%aptulo )6 Anlisis l$8ico de LeLi 1ecci(n ).)6 %ompilando el anali:ador
Becci%n ".": &om'ilando el anali8ador
9ara com2i)ar -enerar e) ana)i%a+or +e6er. situar)o en un +irectorio ))ama+o leli (2ues as se
))ama e) 2aquete en e) que se encuentra)" Ro a su2oner que e) +irectorio )e)i se encuentra en
c:\languajes (es +ecir5 e) 2at! com2)eto +e) 2aquete ser. c:\languajes\leli)" *it?ese en
c:\languajes\leli escri6a )o si-uiente
34
F
c:\languajes\leli\> java antlr.Tool LeLiLexer.g
*i to+o !a i+o 6ien #7$38 no emitir. mensa4es +e error" En e) +irectorio leli !a6r.n a2areci+o
)os si-uientes fic!erosF
X LeLiLexer.java
X LeLiLexerVocabTokenTypes.java
X LeLiLexerVocabTokenTypes.txt
3a funci=n +e) 2rimer fic!ero es e0i+enteF es e) fic!ero 4a0a que im2)ementa e) ana)i%a+or (un
ana)i%a+or ):ico recursi0o +escen+ente enriqueci+o con 2re+ica+os 2re+A33(H))"
O9ero qu son )os otros +os fic!erosQ Estos +os fic!eros son )os que 2ermiten a) ana)i%a+or
com2artir su con4unto +e toHens con e) ana)i%a+or sint.ctico5 que im2)ementaremos +es2us (m.s
informaci=n so6re sto en e) si-uiente ca2tu)o)"
Ro)0amos a) fic!ero que nos interesa5 LeLiLexer.java" 9ara que un fic!ero 4a0a nos sea ?ti)5
+e6e ser con0erti+o a c=+i-o com2ati6)e con )a m.quina 0irtua) 4a0a5 es +ecir5 +e6e ser
com2i)a+o" 1a+o que LeLiLexer.java necesita a LeLiLexerVocabTokenTypes.java5 ser.
necesario com2i)ar )os +os" E) coman+o m.s f.ci) 2ara !acer)o es e) si-uienteF
c:\languajes\leli> javac LeLiLexer*.java
E) com2i)a+or +e 4a0a no +e6era mostrar mensa4e a)-uno5 si-nifican+o que to+o !a i+o 6ien"
34 Como siem2re5 2ara 2o+er uti)i%ar #7$38 i-ua) que en )os e4em2)os ser. necesario que est correctamente insta)a+o" En e)
a2n+ice G e:2)ico c=mo rea)i%ar )a insta)aci=n"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 17
%aptulo )6 Anlisis l$8ico de LeLi 1ecci(n ).06 !5ecuci(n6 presentaci(n de la clase Tool
Becci%n ".#: jecuci%n: 'resentaci%n de la clase >ool
".#.1: /ntroducci%n
/na 0e% im2)ementa+o e) ni0e) ):ico +e) com2i)a+or5 un 6uen 2aso es 2ro6ar)o" 9ara 2o+er
!acer)o5 sin em6ar-o5 necesitamos a?n a)-o que a?n no tenemosF necesitamos e) mto+o main()"
7ecesitaremos un equi0a)ente a )a c)ase Calc que 0imos en e) ca2tu)o '"
*i-uien+o e) e4em2)o +e )a !erramienta #7$385 0amos a !acer que 3e3i +is2on-a +e una
D!erramientaE K la antlr.Tool" En otras 2a)a6ras5 0amos a crear una c)ase que 2ermita e4ecutar
nuestro ana)i%a+or +e )a si-uiente formaF
c:\home> java leli.Tool ejemplo.leli
3a c)ase leli.Tool ser0ir. 2ara inter2retar cua)quier fic!ero escrito en 3e3i" 9ara e))o +e6er.
mane4ar e) an.)isis ):ico5 sint.ctico sem.ntico5 contro)an+o )os errores fina)mente -eneran+o
c=+i-o" ,remos aCa+in+o)e ca2aci+a+ a) ir com2)etan+o ni0e)es"
9or a!ora )a funciona)i+a+ +e )a c)ase $oo) ser. mu )imita+aF se contentar. con a6rir e) fic!ero
+e te:to que se )e 2ase 2or )a )nea +e coman+os5 e im2rimir un )ista+o +e )os toHens que e)
ana)i%a+or ):ico sea ca2a% +e reconocer"
".#.2: &lase >ool im'rimiendo el !lujo 2to:ens3
*e 2ue+en +istin-uir 0arios 2asos im2ortantes a rea)i%ar en esta 2rimera im2)ementaci=n +e )a
c)ase leli.ToolF
X #6rir e) fic!ero cuo nom6re se suministra como 2rimer ar-umento en )a )nea +e coman+os"
X Crear un ana)i%a+or ):ico que )ea +ic!o fic!ero"
X 3eer to+os )os toHens +e) fic!ero im2rimien+o en )a conso)a )a informaci=n +e ca+a toHen"
#+em.s +e estos tres 2asos 2rinci2a)es5 e:isten otros 2asos au:i)iares que +e6er.n +arse5 como )a
-esti=n +e )as e:ce2ciones que 2ue+an 2ro+ucirse"
E) c=+i-o +e )a c)ase Tool ser. e) si-uienteF
package leli; // Tool tambin pertenece al paquete leli
import antlr.*; // Incluir todo antlr
import java.io.*; // Para entrada-salida
public class Tool{
public static void main(String [] args)
{
try
{
FileInputStream fis = new FileInputStream(args[0]);
LeLiLexer lexer = new LeLiLexer(fis);
lexer.setFilename(args[0]);
Token tok = lexer.nextToken();
while(tok.getType() != Token.EOF_TYPE)
{
System.out.println( tok.getFilename()+ : +
tok.getLine() + : +
tok.getColumn() + : +
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1/
%aptulo )6 Anlisis l$8ico de LeLi 1ecci(n ).06 !5ecuci(n6 presentaci(n de la clase Tool
tok.getText()+ , + tok.getType() );
tok = lexer.nextToken();
}
}
catch (FileNotFoundException fnfe)
{
System.err.println(No se encontr el fichero);
}
catch (TokenStreamException tse)
{
System.err.println(Error leyendo tokens);
}
}
}
".#.3: jem'lo
9ara )a si-uiente entra+aF
// Primer progama escrito en LeLi!
clase Inicio
{
mtodo inicio()
{
Sistema.imprime(Hola mundo!+nl);
}
}
3a sa)i+a 2or 2anta))a ser. )a si-uienteF
null:3:1: clase, 13
null:3:7: Inicio, 35
null:3:14: extiende, 14
null:3:23: Objeto, 35
null:4:1: {, 38
null:5:9: mtodo, 15
null:5:16: inicio, 35
null:5:22: (, 41
null:5:23: ), 42
null:6:9: {, 38
null:7:17: Sistema, 35
null:7:24: ., 40
null:7:25: imprime, 35
null:7:32: (, 41
null:7:33: Hola mundo!, 62
null:7:47: +, 51
null:7:48: nl, 10
null:7:50: ), 42
null:7:51: ;, 36
null:8:9: }, 39
null:9:1: }, 39
Ia 0arios +eta))es interesantes a o6ser0ar" E) 2rimero es que )os toHens que +e6an ser fi)tra+os
(comentarios 6)ancos) no se muestran" E) se-un+o +eta))e im2ortante es que L)os toHens no !an
conser0a+o e) nom6re +e) fic!ero (se muestra Dnu))E)N
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1<
%aptulo )6 Anlisis l$8ico de LeLi 1ecci(n ).,6 AOadiendo el nom+re de 4ic2ero a los to7ens
Becci%n ".+: AQadiendo el nombre de !ic*ero a los to:ens
".+.1: La incongruencia de antlr.&ommon>o:en
antlr.Token es una c)ase a6stracta@ )a c)ase que #7$38 uti)i%a 2or +efecto 2ara re2resentar )os
toHens es antlr.CommonToken"
Ia +os maneras +e 0er )os toHens" 9or un )a+o5 )a ?nica informaci=n D0ita)E que contienen es su
te:to su ti2o@ si fa)tara cua)quiera +e )os +os e) an.)isis sint.ctico no 2o+ra tra6a4ar
a+ecua+amente con )os toHens K no !a6ra manera +e +iferenciar)os"
9or como+i+a+5 sin em6ar-o5 se !a +ota+o a )a c)ase Token +e una serie +e mto+os a6stractos
a+iciona)es 2ara o6tener informaci=n a+iciona) +e ti2o ):ico5 como son un n?mero +e )nea
co)umna un nom6re +e fic!ero"
3a 0a)i+e% +e inc)uir esta informaci=n a+iciona) en )a c)ase Token es +iscuti6)e5 2orque
im2)citamente se est. so6reenten+ien+o que un toHen 2roce+e +e un fic!ero +e te:to5 cuan+o a
!emos 0isto que 2o+ra 2roce+er +e cua)quier f)u4o +e +atos (cua)quier c)ase que im2)emente )a
interfa% java.io.inputStream)5 en e) cua) )os conce2tos D)nea5 co)umna nom6re +e fic!eroE
2o+ran no tener si-nifica+o"
Este ti2o +e f)u4os +e +atos es5 sin em6ar-o5 tan 2oco !a6itua)5 que 2or 2ra-matismo es m.s
con0eniente i-norar)o su2oner que to+os )os toHens 2oseer.n un n?mero +e )nea co)umna
un nom6re +e fic!ero" 9or eso )a c)ase antlr.Token 2ro2orciona mto+os (0acos) 2ara acce+er
a esta informaci=n" 3as su6c)ases ser.n )as encar-a+as +e so6reescri6ir +ic!os mto+os 2ara
2ro2orcionar )a informaci=n"
J esto es )o que se su2one que ten+ra que !acer antlr.CommonToken@ a) ser )a c)ase que
#7$38 uti)i%a 2or +efecto 2ara im2)ementar )os toHens5 +e6era +e so6reescri6ir to+os )os
mto+os 0acos +e antlr.Token"
LJ sin em6ar-o no es asN 9or ra%ones que +escono%co5 antlr.CommonToken no im2)ementa )os
mto+os ni atri6utos que 2ermiten o6tener e) nom6re +e fic!ero +e) que 2ro0iene ca+a toHen@
so)amente 2ro2orcionan )nea co)umna" E) mto+o setFilename() no !ace na+a5 e) mto+o
getFilename() +e0ue)0e siem2re nu)) K 2or eso a2arecen nu))s en e) )ista+o +e) e4em2)o +e )a
secci=n anterior"
".+.2: >o:ens *omog0neos y *eterog0neos
antlr.CommonToken no es )a ?nica c)ase que 2ue+e uti)i%arse 2ara im2)ementar )os toHens en un
ana)i%a+or ):ico" E:isten mecanismos 2ara uti)i%ar cua)quier otra su6c)ase +e antlr.Token
+efini+a 2or e) usuario"
7uestro o64eti0o ser.5 2or tanto5 im2)ementar una c)ase +e toHens que s contem2)e )a 2osi6i)i+a+
+e -uar+ar e) nom6re +e) fic!ero +e) que se )e= e) toHen" Esta c)ase ser. )a 2rimera c)ase que
inc)uiremos en e) 2aquete ant)rau:"
3a 2rimera +e e))as 2asa 2or uti)i%ar e) mto+o setTokenObjectClass en nuestro ana)i%a+or
):ico" Este mto+o se ))ama tras crear e) ana)i%a+or ):ico5 asF
import enrique.tokens.MyToken;
...
MiLexer lexer = new MiLexer(new FileInputStream(nombreFichero));
lexer.set+o7en8b9ect:lass(enrique.tokens.MiToken);
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 11
%aptulo )6 Anlisis l$8ico de LeLi 1ecci(n ).,6 AOadiendo el nom+re de 4ic2ero a los to7ens
9ara uti)i%ar este mto+o es necesario es2ecificar e) nom6re com2)eto +e )a c)ase a
uti)i%ar (2rece+in+o)o +e) 2refi4o +e su 2aquete si est. en un 2aquete 4a0a)"
3a c)ase que es2ecifiquemos a+em.s +e6e cum2)ir +os con+icionesF
X *er su6c)ase +e antlr.Token"
X $ener accesi6)e un constructor 2or +efecto (sin 2ar.metros)
Bientras que e) 2rimer mto+o cam6ia e) ti2o 2or +efecto +e to+os )os toHens +e) ana)i%a+or5 e)
se-un+o 2ue+e mo+ificar )os ti2os +e )os toHens e:2e)i+os 2or ca+a re-)a" *e Consiste en
construir manua)mente un toHen +e) ti2o +esea+o en )as acciones +e) ana)i%a+or ):ico
+esi-nar)o como 2ro+ucto +e )a re-)a uti)i%an+o e) 2atr=n $setToken()" 9or e4em2)o5
su2on-amos un ana)i%a+or ):ico que )ee enteros con )a re-)a ENTERO que se +esea que )a c)ase
+e )os toHens +e0ue)tos 2or esta re-)a sea enrique.tokens.EnteroToken5 2ero que 2ara e)
resto +e )as re-)as se si-a uti)i%an+o e) ti2o 2or +efecto" E) c=+i-o necesario ser.F
header{
import enrique.tokens.EnteroToken;
...
}
class MyLexer extends Lexer;
...
ENTERO: (DIGITO)+
{
// getText() obtiene el texto de la regla
EnteroToken et = new EnteroToken(ENTERO, getText());
// $setToken designa un nuevo token como producto de la regla
;set+o7en(et);
}
3as c)ases +e toHens que se uti)i%an en este caso no 2recisan un constructor 2or +efecto5 aunque
s necesitan ser su6c)ases +e antlr.Token"
Cuan+o un ana)i%a+or ):ico -enera toHens +e +iferentes c)ases se +ice que est. -eneran+o
DtoHens !etero-neosE" *i to+os son +e) mismo ti2o5 se ))aman D!omo-neosE"
;rimera clase de antlrau-: $e-In)o'o9en
Ramos a uti)i%ar set$oHen;64ectC)ass 2ara !acer que )a c)ase 2or +efecto +e nuestros toHens no
sea ant)r"Common$oHen5 sino una que +efiniremos nosotrosF LexInfoToken"
LexInfoToken ser. )a 2rimera c)ase que aCa+iremos a nuestro 2aquete +e uti)i%a+es ant)rau:5 +e)
que a !a6)amos en e) ca2tu)o 1" Estar. +entro +e) su62aquete Duti)E5 as que su nom6re
com2)eto ser. Dant)rau:"uti)"3e:,nfo$oHenE"
*u im2)ementaci=n es mu senci))aF ser. una su6c)ase +e CommonToken con un atri6uto aCa+i+o
+e+ica+o a -uar+ar e) nom6re +e fic!ero" #+em.s se so6reescri6ir.n )os mto+os setFilename
getFilename"
$a inter)a% $e-In)o
LexInfoToken im2)ementar. )a interfa% antlraux.util.LexInfo" Esta interfa% contiene )as
si-uientes +efiniciones +e mto+osF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 111
%aptulo )6 Anlisis l$8ico de LeLi 1ecci(n ).,6 AOadiendo el nom+re de 4ic2ero a los to7ens
public interface LexInfo{
public int getLine();
public int getColumn();
public String getFilename();
public void setLine(int line);
public void setColumn(int column);
public void setFilename(String filename);
public void copyLexInfo(LexInfo other);
public String getLexInfoString();
}
3e:,nfo re2resenta cua)quier o64eto que 2ermita i+entificar un 2unto cua)quiera +entro +e un
fic!ero (con e) nom6re +e fic!ero5 )nea co)umna)" #+em.s +e )os usua)es mto+os +e acceso
()os tres DsetE )os tres D-etE) !a +os mto+os que faci)itar.n e) tra6a4o con )a interfa%F
X copyLexInfoF Pue co2ia e) nom6re +e fic!ero5 )nea co)umna +e otro 3e:,nfo
X getLexInfoStringF Pue +e0ue)0e una ca+ena +e) esti)o Dnom6refic!eroF)ineaFco)umnaE
9ara 2o+er uti)i%ar ant)rau: ser. necesario inc)uir)a en e) c)ass2at!"
".+.3: Fodi!icaciones en la clase >ool
3a c)ase Tool +e6er. mo+ificarse 2ara mo+ificar )a c)ase +e toHens que usa e) ana)i%a+or ):ico"
E) c=+i-o +e )a nue0a c)ase Tool ser. e) si-uienteF
package leli; // Tool tambin pertenece al paquete leli
import antlr.*; // Incluir todo antlr
import java.io.*; // Para entrada-salida
import antlrau<.util.6e<In=o+o7en; '' 5ueva clase +o7en
public class Tool{
public static void main(String [] args)
{
try
{
FileInputStream fis = new FileInputStream(args[0]);
LeLiLexer lexer = new LeLiLexer(fis);
lexer.setFilename(args[0]);
le<er.set+o7en8b9ect:lass(antlrau<.util.6e<In=o+o7en);
Token tok = lexer.nextToken();
while(tok.getType() != Token.EOF_TYPE)
{
System.out.println( tok.getFilename()+ : +
tok.getLine() + : +
tok.getColumn() + : +
tok.getText()+ , + tok.getType() );
tok = lexer.nextToken();
}
}
catch (FileNotFoundException fnfe)
{
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 112
%aptulo )6 Anlisis l$8ico de LeLi 1ecci(n ).,6 AOadiendo el nom+re de 4ic2ero a los to7ens
System.err.println(No se encontr el fichero);
}
catch (TokenStreamException tse)
{
System.err.println(Error leyendo tokens);
}
}
}
".+.": Begundo 'roblema
/na 0e% com2i)a+a )a nue0a c)ase $oo)5 )a e4ecutaremos so6re cua)quier fic!ero +e te:to """
Lse-uir.n a2arecien+o Dnu))sE en )u-ar +e) nom6re +e) fic!eroN
E) 2ro6)ema es que aunque !emos resue)to un 2ro6)ema5 que+a otro 2or reso)0erF )os nue0os
toHens que se crean no a)macenan e) nom6re +e) fic!ero" *i se co)oca un mensa4e +e +e6u- en e)
mto+o LexInfoToken.setFilename()5 0eremos que ste no es in0oca+o ni una so)a 0e%"
3a so)uci=n m.s inme+iata consiste en aCa+ir una acci=n a ca+a re-)a5 in0ocan+o manua)mente
set>i)ename" Esta o2ci=n5 sin em6ar-o5 no es )a me4or"
#na)icemos )a situaci=n" 3o que est. ocurrien+o es que5 a) crearse )os toHens en e) ana)i%a+or5
+on+e quiera que sto se !a-a5 se es. ))aman+o a setType5 setText5 setLine setColumn5
2ero no a setFilename" Ia que encontrar e) 2unto en e) que se crean )os toHens 2ara 2o+er
mo+ificar )a con+ucta +e) ana)i%a+or en +ic!o 2unto"
En casos as )o me4or es mirar +irectamente e) c=+i-o -enera+o 2ara e) ana)i%a+or" $o+os )os
ana)i%a+ores -enera+os 2or #7$38 tienen e) mismo as2ectoF son su6c)ases +e una c)ase +e
ana)i%a+or +e #7$38 (antlr.CharScanner 2ara )os ana)i%a+ores ):icos5 antlr.Parser 2ara
)os sint.cticos antlr.TreeParser 2ara )os sem.nticos)" Ia una serie +e constructores
)ue-o un mto+o 2or ca+a re-)a que tu0iera e) ana)i%a+or" Estos mto+os sue)en tener un
Ds<itc!E en e) que se +eci+e )a transici=n a rea)i%ar"
Centr.n+onos en )os ana)i%a+ores ):icos5 !a un mto+o que es ))ama+o mu a menu+o5 que
tiene un nom6re re0e)a+orF es makeToken" Este mto+o5 im2)ementa+o en antlr.CharScanner5
es e) que crea )os toHens e) que Dse est. o)0i+an+oE +e aCa+ir)es e) nom6re +e fic!ero" E) c=+i-o
+e +ic!o mto+o es e) si-uienteF
protected Token makeToken(int t) {
try {
Token tok = (Token)tokenObjectClass.newInstance();
tok.setType(t);
tok.setColumn(inputState.tokenStartColumn);
tok.setLine(inputState.tokenStartLine);
return tok;
}
catch (InstantiationException ie) {
panic("can't instantiate token: " + tokenObjectClass);
}
catch (IllegalAccessException iae) {
panic("Token class is not accessible" + tokenObjectClass);
}
return Token.badToken;
}
7=tese que makeToken no ))ama a setFilename ni a setText" setText es ))ama+o m.s tar+e (e)
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 11-
%aptulo )6 Anlisis l$8ico de LeLi 1ecci(n ).,6 AOadiendo el nom+re de 4ic2ero a los to7ens
e) c=+i-o que in0oca a maHetoHen)5 2ero no setFilename"
*e 2ue+e mo+ificar makeToken aCa+in+o)e )a )nea setFilename(inputState.filename);
9ero en )u-ar +e mo+ificar e) c=+i-o +e una c)ase +e ant)r 0amos a !acer que nuestro ana)i%a+or
):ico5 que a) fin a) ca6o es una su6c)ase +e CharScanner5 so6reescri6a makeToken )e aCa+a
)a informaci=n +e) nom6re +e fic!ero"
En )a )ista +e correo +e #7$385 a)-unas 0oces (entre e))as )a ma) se !an a)%a+o
2i+ien+o que se inc)ua a) menos )a )nea que aCa+e e) nom6re +e fic!ero a )os toHens
en maHe$oHen" Es 2osi6)e que #7$38 )a inc)ua en e) futuro"
9ara e))o +is2onemos +e )a %ona +e c=+i-o nati0o en e) fic!ero +e +efinici=n +e) ana)i%a+or" 3a
%ona +e c=+i-o nati0o5 que a?n no !emos uti)i%a+o en este ana)i%a+or5 es una %ona o2ciona) en )a
que escri6ir mto+os5 atri6utos constructores en )en-ua4e nati0o (4a0a5 C++ o Ce) 2ara
com2)etar nuestro ana)i%a+or" Cuan+o est. 2resente5 se encuentra 4usto antes +e )a %ona +e
re-)as5 entre ))a0es (fg)" En esta %ona tam6in es 2osi6)e so6reescri6ir mto+os +e )a su2erc)ase
+e) ana)i%a+or5 eso es )o que 0amos a !acer" E) c=+i-o a aCa+ir en nuestro ana)i%a+or ):ico
ser. e) si-uienteF
class LeLiLexer extends Lexer;
options {...} // Las opciones permanecen sin modificacin
tokens {...} // Sin modificacin
{ // Comienza la zona de cdigo nativo
protected Token makeToken(int type)
{
// Usamos la implementacin de la superclase...
Token result = super.makeToken(type);
// ... aadimos informacin del nombre de fichero
result.setFilename(inputState.filename);
// ... y devolvemos el token
return result;
}
}
// Zona de reglas (sin modificar)
/na 0e% recom2i)a+o e) fic!ero LeLiLexer.g )os -enera+os a 2artir +e ) (0er secci=n
anterior)5 2o+remos )an%ar nuestra c)ase Tool o6tener un )ista+o con e) nom6re +e) fic!ero +e)
que 2roce+en )os toHensF
test.leli:3:1: clase, 13
test.leli:3:7: Inicio, 35
test.leli:3:14: extiende, 14
test.leli:3:23: Objeto, 35
test.leli:4:1: {, 38
test.leli:5:9: mtodo, 15
test.leli:5:16: inicio, 35
test.leli:5:22: (, 41
test.leli:5:23: ), 42
test.leli:6:9: {, 38
test.leli:7:17: Sistema, 35
test.leli:7:24: ., 40
test.leli:7:25: imprime, 35
test.leli:7:32: (, 41
test.leli:7:33: Hola mundo!, 62
test.leli:7:47: +, 51
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 11)
%aptulo )6 Anlisis l$8ico de LeLi 1ecci(n ).,6 AOadiendo el nom+re de 4ic2ero a los to7ens
test.leli:7:48: nl, 10
test.leli:7:50: ), 42
test.leli:7:51: ;, 36
test.leli:8:9: }, 39
test.leli:9:1: }, 39
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 110
%aptulo )6 Anlisis l$8ico de LeLi 1ecci(n ).76 !l 4ic2ero LeLiLe8er.g
Becci%n ".-: l !ic*ero LeLiLexer.g
E) c=+i-o com2)eto +e) fic!ero LeLiLexer.g que !emos escrito ser. 2or )o tanto e) si-uienteF
header{
package leli;
/*-----------------------------------------------*\
| Un intrprete para un Lenguaje Limitado(LeLi) |
| _____________________________________________ |
| |
| ANALISIS LXICO |
| _____________________________________________ |
| |
| Enrique J. Garcia Cota |
\*-----------------------------------------------*/
}
/**
* El objeto que permite todo el analisis lxico.
* notas: comentar todo esto al final del analex.
*/
class LeLiLexer extends Lexer;
options{
charVocabulary = '\3'..'\377'; // Unicodes usuales
exportVocab=LeLiLexerVocab; // Comentar al hacer el parser
testLiterals=false; // comprobar literales solamente cuando se
diga exp
k=2; // lookahead
}
tokens
{
// Tipos basicos
TIPO_ENTERO = "Entero" ;
TIPO_REAL = "Real" ;
TIPO_BOOLEANO = "Booleano" ;
TIPO_CADENA = "Cadena" ;
// Literales booleanos
LIT_CIERTO = "cierto" ; LIT_FALSO = "falso" ;
// Literales cadena
LIT_NL = "nl"; LIT_TAB = "tab" ; LIT_COM = "com";
// Palabras reservadas
RES_CLASE = "clase" ;
RES_EXTIENDE = "extiende" ;
RES_METODO = "mtodo" ;
RES_CONSTRUCTOR = "constructor" ;
RES_ATRIBUTO = "atributo" ;
RES_ABSTRACTO = "abstracto" ;
RES_PARAMETRO = "parmetro" ;
RES_CONVERTIR = "convertir" ;
RES_MIENTRAS = "mientras" ;
RES_HACER = "hacer" ;
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 11,
%aptulo )6 Anlisis l$8ico de LeLi 1ecci(n ).76 !l 4ic2ero LeLiLe8er.g
RES_DESDE = "desde" ;
RES_SI = "si" ;
RES_OTRAS = "otras" ;
RES_SALIR = "volver" ;
RES_ESUN = "esUn" ;
RES_SUPER = "super" ;

// Operadores que empiezan con letras;
OP_Y = "y" ;
OP_O = "o" ;
OP_NO = "no" ;
// Los literales real y entero son "devueltos" en las
// acciones del token "privado" LIT_NUMERO
LIT_REAL ; LIT_ENTERO;
}
{ // Comienza la zona de cdigo
protected Token makeToken(int type)
{
// Usamos la implementacin de la superclase...
Token result = super.makeToken(type);
// ...y aadimos informacin del nombre de fichero
result.setFilename(inputState.filename);
// y devolvemos el token
return result;
}
}
/**
* Los tres tipos de retorno de carro.
*/
protected NL :
(
("\r\n") => "\r\n" // MS-DOS
| '\r' // MACINTOSH
| '\n' // UNIX
)
{ newline(); }
;
/**
* Esta regla permite ignorar los blancos.
*/
protected BLANCO :
( ' '
| '\t'
| NL
) { $setType(Token.SKIP); } // La accion del blanco: ignorar
;
/**
* Letras espaolas.
*/
protected LETRA
: 'a'..'z'
| 'A'..'Z'
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 117
%aptulo )6 Anlisis l$8ico de LeLi 1ecci(n ).76 !l 4ic2ero LeLiLe8er.g
| '' | ''
| '' | '' | '' | '' | ''
| '' | '' | 'I' | '' | ''
| 'u' | ''
;
/**
* Dgitos usuales
*/
protected DIGITO : '0'..'9';
/**
* Regla que permite reconocer los literales
* (y palabras reservadas).
*/
IDENT
options {testLiterals=true;} // Comprobar palabras reservadas
:
(LETRA|'_') (LETRA|DIGITO|'_')*
;
// Separadores
PUNTO_COMA : ';' ;
COMA : ',' ;
CORCHETE_AB : '[' ;
CORCHETE_CE : ']' ;
LLAVE_AB : '{' ;
LLAVE_CE : '}' ;
PUNTO : '.' ;
PARENT_AB : '(' ;
PARENT_CE : ')' ;
BARRA_VERT : '|' ;
// operadores
OP_IGUAL : "==" ;
OP_DISTINTO : "!=" ;
OP_ASIG : '=' ;
OP_MENOR : '<' ;
OP_MAYOR : '>' ;
OP_MENOR_IGUAL : "<=" ;
OP_MAYOR_IGUAL : ">=" ;
OP_MAS : '+' ;
OP_MENOS : '-' ;
OP_MASMAS : "++" ;
OP_MENOSMENOS : "--" ;
OP_PRODUCTO : '*' ;
OP_DIVISION : '/' ;
/**
* Permite reconocer literales enteros y reales sin generar conflictos.
*/
LIT_NUMERO : (( DIGITO )+ '.' ) =>
( DIGITO )+ '.' ( DIGITO )* { $setType (LIT_REAL); }
| ( DIGITO )+ { $setType (LIT_ENTERO); }
;
/**
* Comentario de una sola lnea
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 11/
%aptulo )6 Anlisis l$8ico de LeLi 1ecci(n ).76 !l 4ic2ero LeLiLe8er.g
*/
protected COMENTARIO1
:
"//" (~('\n'|'\r'))*
{ $setType(Token.SKIP); }
;
/**
* Comentario de varias lneas
*/
protected COMENTARIO2 :
"/*"
( ('*' NL) => '*' NL
| ('*' ~('/'|'\n'|'\r')) => '*' ~('/'|'\n'|'\r')
| NL
| ~( '\n' | '\r' | '*' )
)*
"*/"
{ $setType(Token.SKIP); }
;
/**
* Literales cadena
*/
LIT_CADENA :
'"' !
( ~('"'|'\n'|'\r') )*
'"' !
;
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 11<
%aptulo )6 Anlisis l$8ico de LeLi 1ecci(n )./6 %onclusi(n
Becci%n "..: &onclusi%n
Ja !emos 0isto c=mo rea)i%ar un ana)i%a+or ):ico con #7$38" Es2ero que no !aa si+o mu
+ifci) +e enten+erF )os ana)i%a+ores ):icos son )a 2arte m.s f.ci) +e !acer con #7$38"
*e trata +e un ana)i%a+or senci))o5 que no i)ustra to+as )as ca2aci+a+es +e an.)isis ):ico que
2osee #7$38" #)-unas +e estas ca2aci+a+es ine:2)ora+as sonF
X #na)i%a+or ):ico insensi6)e a )as ma?scu)as (uti)i%an+o )a o2ci=n caseSensitive)
X /ti)i%ar otros mto+os +e $oHen a+em.s +e $setType5 como $setToken5 $append o
$setText"
X /ti)i%ar 2re+ica+os sem.nticos" En a)-unos casos 2o+ramos !a6er)os uti)i%a+o5 2ero )a
-ram.tica sera 2otencia)mente menos 2orta6)e (so)amente 2o+ra -enerarse con se-uri+a+
c=+i-o 4a0a)"
X #n.)isis ):ico +e fic!eros 6inarios"
X /ti)i%aci=n +e otras o2ciones a ni0e) +e) ana)i%a+or +e sus re-)as5 como ignore o
classHeaderSuffix"
X /ti)i%ar 0arios ana)i%a+ores sint.cticos simu)t.neamente5 como ocurre con e) ana)i%a+or +e
comentarios 4a0a+oc en 4a0a (que funciona a )a 0e% que e) ana)i%a+or +e c=+i-o)"
Iemos 0isto que no es im2osi6)e im2)ementar un )e:er recursi0o +escen+ente5 que una 0e% que
se com2ren+e e) funcionamiento +e 2re+A33(H) es inc)uso senci))o"
1e momento !emos termina+o con e) an.)isis ):ico" En e) si-uiente ca2tu)o nos meteremos +e
))eno con e) an.)isis sint.ctico"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 12
Captulo 5:
Anlisis sintctico de LeLi
Las palabras son como las hojas! cuando abundan, poco fruto hay entre ellas.
#)e:an+er 9o2e
Captulo 5:
Anlisis sintctico de LeLi................................................................121
Seccin .1: Introduccin......................................................................................................122
Seccin .2: :e)inicin del anali%ador sintctico............................................................... 123
#.2.1: O'ciones del anali8ador.......................................................................................................... 123
#.2.2: /m'ortando los to:ens............................................................................................................. 123
#.2.3: Lona de to:ens........................................................................................................................ 12"
Seccin .3: 5ona de reglas.................................................................................................. 126
#.3.1: @rograma................................................................................................................................. 12+
#.3.2: 6e!inici%n de clases................................................................................................................. 12+
#.3.3: A8Ncar sint(ctica..................................................................................................................... 12-
/nsulina sem(ntica...........................................................................................................................................12.
#.3.": 6e!inici%n de atributos............................................................................................................. 131
#.3.#: 6e!inici%n de m0todos............................................................................................................. 131
#.3.+: x'resiones............................................................................................................................. 133
/ntroducci%n.....................................................................................................................................................133
Reglas de las ex'resiones...............................................................................................................................133
Accesos............................................................................................................................................................ 13#
#.3.-: /nstrucciones............................................................................................................................ 13-
/nstrucci%n nula................................................................................................................................................ 13.
/nstrucci%n volver.............................................................................................................................................13.
/ntrucci%nJex'resi%n........................................................................................................................................13.
6eclaraci%n de variables locales.....................................................................................................................13.
4ucles..............................................................................................................................................................131
/nstrucci%n 2si3.................................................................................................................................................131
Seccin .!: ,ic8ero $e$i;arser.g....................................................................................... 1!2
Seccin .: "ompilacin del anali%ador............................................................................. 1!1
Seccin .6: +*ecucin: modi)icaciones en la clase 'ool.................................................. 1.
#.+.1: /ntroducci%n............................................................................................................................. 1#C
#.+.2: /nter'retando la lAnea de comandos: el 'aquete antlraux.cl'arse........................................... 1#C
@resentaci%n....................................................................................................................................................1#C
5uncionamiento...............................................................................................................................................1#1
jem'lo............................................................................................................................................................1#1
#.+.3: La lAnea de comandos inicial: el m0todo leli.>ool.LeeL&9;...................................................... 1#3
#.+.": l m0todo leli.>ool.im'rimeAyuda9;........................................................................................ 1#"
#.+.#: l nuevo m0todo main............................................................................................................ 1#"
#.+.+: l m0todo leli.>ool.trabaja9;.................................................................................................... 1##
@asos...............................................................................................................................................................1##
/nicio................................................................................................................................................................. 1##
$ivel l0xico.......................................................................................................................................................1#+
$ivel sint(ctico.................................................................................................................................................1#+
Obtenci%n del AB>...........................................................................................................................................1#-
Re'resentaci%n textual del AB>......................................................................................................................1#-
Re'resentaci%n gr(!ica del AB>......................................................................................................................1#-
&%digo com'leto..............................................................................................................................................1#.
Seccin .0: 4tros aspectos de los AS's............................................................................161
#.-.1: 5(bricas de AB>s.................................................................................................................... 1+1
#.-.2: AB>s *eterog0neos................................................................................................................. 1+1
Seccin .#: "onclusin........................................................................................................ 16!
Gua prctica de ANTLR 2.7.2 v 1. 121
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.16 &ntroducci(n
Becci%n #.1: /ntroducci%n
E) an.)isis sint.ctico es )a esencia misma +e )a inter2retaci=n +e )en-ua4es" Buc!simos
2ro-rama+ores no )o +istin-uen (equi0oca+amente) +e) an.)isis sem.ntico" E) an.)isis ):ico5 2or
otra 2arte5 es consi+era+o una tarea m.s o menos Dtri0ia)E@ se consi+era una mo)estia necesaria"
1e )os tres ni0e)es +e) an.)isis5 e) an.)isis sint.ctico es e) que m.s satisfacci=n 2ro2orciona a) ser
im2)ementa+o" $iene muc!o encanto 2o+er +efinir )as re-)as +e un nue0o )en-ua4e
3&
" #+em.s5 e)
conce2to +e re-)as sint.cticas es mu intuiti0o5 se amo)+a mu 6ien a )a sinta:is G7> to+a0a
me4or a EG7>"
$o+o esto 2ro0oca que a )a !ora +e +esarro))ar un com2i)a+or se tien+a a 2restar m.s atenci=n a)
ni0e) sint.ctico que a) resto +e )os ni0e)es"
;tro tema im2ortante a tener en cuenta es )a recu2eraci=n +e errores" Buc!os 2ro-rama+ores +e
com2i)a+ores DencastranE )a recu2eraci=n +e errores +entro +e) an.)isis sint.ctico5 )o que 2ro+uce
ana)i%a+ores mu 0o)uminosos 2oco f)e:i6)es"
7osotros 0amos a se2arar estos +os conce2tos@ en este ca2tu)o nos centraremos en e) an.)isis
sint.ctico 2ro2iamente +ic!o5 en e) si-uiente )e aCa+iremos )a recu2eraci=n +e errores +e una
forma com2)etamente f)e:i6)e mane4a6)e (uti)i%an+o )a !erencia +e -ram.ticas)"
Gueno5 0amos a em2e%ar"
3& 3as re-)as sint.cticas5 c)aro" 3as sem.nticas +e6eran +efinirse en e) ni0e) sem.ntico"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 122
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.26 ?e4inici(n del anali:ador sintctico
Becci%n #.2: 6e!inici%n del anali8ador sint(ctico
E) fic!ero +on+e +efiniremos nuestro ana)i%a+or sint.ctico se ))amar. LeLiParser.g" $en+r. )a
estructura usua)F
header{
package leli;
}
class LeLiParser extends Parser; // Se extiende Parser, y no Lexer
options {
/* opciones del analizador */
}
tokens {
/* tokens */
}
/* Reglas de generacin */
Como 2o+emos 0er e) ana)i%a+or sint.ctico tam6in formar. 2arte +e) 2aquete )e)i"
#.2.1: O'ciones del anali8ador
3as o2ciones +e) ana)i%a+or sint.ctico ser.n )as si-uientesF
options
{
k = 2;
buildAST = true;
importVocab = LeLiLexerVocab;
exportVocab = LeLiParserVocab;
}
3as +os 2rimeras no +e6eran ser un 2ro6)ema a estas a)turas" H es e) )ooHa!ea+ buildAST
acti0a )a construcci=n +e) #*$"
3as otras +os o2ciones5 importVocab exportVocab5 son necesarias cuan+o se uti)i%an
ana)i%a+ores en fic!eros +iferentes (como en nuestro caso@ e) ana)i%a+or ):ico en un fic!ero5 e)
sint.ctico en otro5 etc")" *e e:2)ican con +etenimiento en e) si-uiente a2arta+o"
#.2.2: /m'ortando los to:ens
#) fina) +e) ca2tu)o anterior5 cuan+o !a6)amos +e com2i)ar e) fic!ero +e) ana)i%a+or lxico
(LeLiLexer.g) o6ser0amos que a+em.s +e) fic!ero LeLiLexer.java se -enera6an otros +os
fic!eros5 LeLiLexerVocabTokenTypes.java LeLiLexerVocabTokenTypes.txt" Estos +os
fic!eros son )os que 2ermiten a) a)ani%a+or ):ico Dcom2artirE sus toHens con e) ana)i%a+or
sint.ctico" OC=mo )o !acenQ 9ara a0eri-uar)o ana)icemos su conteni+o"
E) fic!ero LeLiLexerVocabTokenTypes.java no +efine una c)ase 4a0a5 sino una interfa% ))ama+a
LeLiLexerVocabTokenTypes" Es una interfa% mu senci))a@ carece +e mto+os5 so)amente
tiene atri6utos +e ti2o entero" Ca+a uno +e stos enteros re2resentar. un toHen +e) ana)i%a+or
):ico (e:ce2to )os 2rimeros5 que son uti)i%a+os internamente 2or #7$38)" E) c=+i-o +e )a
interfa% 0iene a ser a)-o asF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 12-
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.26 ?e4inici(n del anali:ador sintctico
package leli;
public interface LeLiLexerVocabTokenTypes {
int EOF = 1;
int NULL_TREE_LOOKAHEAD = 3;
int TIPO_ENTERO = 4;
int TIPO_REAL = 5;
...
int OP_MAS = 55;
int OP_MENOS = 56;
int OP_PRODUCTO = 57;
int OP_DIVISION = 58;
}
*i nos fi4amos en e) fic!ero LeLiLexer.java 2o+emos 0er que e) ana)i%a+or ):ico im2)ementa )a
interfa%F
public class LeLiLexer extends antlr.CharScanner
implements 6e6i6e<er>ocab+o7en+ypes, TokenStream
E) fic!ero LeLiLexerVocabTokenTypes.txt5 2or su 2arte5 es +e) si-uiente esti)oF
LeLiLexerVocab // Nombre del vocabulario
TIPO_ENTERO="entero"=4
TIPO_REAL="real"=5
...
OP_MAS=55
OP_MENOS=56
OP_PRODUCTO=57
OP_DIVISION=58
E) fic!ero co+ifica casi e:actamente )a misma informaci=n que e) 2rimero5 con otra sinta:is" 3a
?nica +iferencia es que aqu5 a+em.s +e) ti2o +e )os toHens5 se inc)ue su Dnom6reE5 en e) caso +e
que )o ten-an" 9or e4em2)o5 e) toHen TIPO_ENTERO tiene e) ti2o 4 su nom6re es DenteroE"
OP_MAS5 2or su 2arte5 carece +e nom6re"
En +efiniti0a5 )o que se )e est. +icien+o a) ana)i%a+or sint.ctico con )a o2ci=n
importVocab=LeLiLexerVocab es De) ana)i%a+or +e6e im2)ementar )a interfa%
LeLiLexerVocabTokenTypes" Gusca )os ti2os )os nom6res +e )os toHens en e) fic!ero
LeLiLexerVocabTokenTypes.txtE"
3a funci=n +e )a o2ci=n exportVocab es e:actamente )a es2era+aF 2ermite a) ana)i%a+or
sint.ctico De:2ortarE su con4unto +e toHens a un fic!ero +e manera que stos 2ue+an ser
com2arti+os con e) ana)i%a+or sem.ntico"
3as o2ciones importVocab5 exportVocab k son comunes a to+os )os ti2os +e ana)i%a+or5
mientras que buildAST so)amente tiene senti+o en )os ana)i%a+ores sint.cticos (2ara construir e)
#*$) en )os sem.nticos (2ara transformar)o)"
#.2.3: Lona de to:ens
Ja !e comenta+o )a funci=n +e )a secci=n +e toHens en un ana)i%a+or sint.ctico #7$38@ )a
secci=n +e toHens 2ermite +ec)arar toHens ima-inarios que se uti)i%ar.n 2ara enrai%ar )os .r6o)es
que )o necesiten (-enera)mente en re-)as que no ten-an un sm6o)o a2ro2ia+o 2ara )a ra% o
re-)as con )istas)"
3a secci=n +e toHens que uti)i%aremos 2ara 3e3i es )a si-uienteF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 12)
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.26 ?e4inici(n del anali:ador sintctico
tokens
{
// Tokens imaginarios para enraizar listas
PROGRAMA ;
LISTA_MIEMBROS;
LISTA_EXPRESIONES;
LISTA_INSTRUCCIONES;
// Tokens imaginarios que se utilizan cuando no hay races adecuadas
OP_MENOS_UNARIO;
INST_EXPRESION;
INST_DEC_VAR;
LLAMADA;
ATRIBUTO;
// Otros
TIPO_VACIO;
}
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 120
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.-6 Nona de reglas
Becci%n #.3: Lona de reglas
#.3.1: @rograma
3a 2rimera re-)a que se escri6e en una -ram.tica es )a que +efine un 2ro-rama" /n 2ro-rama no
es m.s que una )ista +e una o m.s +efiniciones +e c)ases" #s que )itera)menteF
programa : (decClase)+
{## = #( #[PROGRAMA, "PROGRAMA"] ,##);}
;
Como se trata +e una )ista5 enrai%amos e) .r6o) -enera+o autom.ticamente con un no+o
ima-inario" En ste caso concreto no es estrictamente necesario5 2ero enrai%ar )as )istas es un
!.6ito en e) que m.s 0a)e 2ecar 2or e:ceso que 2or +efecto"
#.3.2: 6e!inici%n de clases
/na +efinici=n +e c)ase esF
X 3a 2a)a6ra reser0a+a clase"
X E) nom6re +e )a c)ase5 o2ciona)mente se-ui+o +e extiende e) nom6re +e una c)ase 2a+re"
X /n con4unto +e cero o m.s miem6ros (atri6utos mto+os) encerra+os entre ))a0es"
#s que escri6imosF
decClase : RES_CLASE^ IDENT (RES_EXTIENDE IDENT)?
LLAVE_AB! listaMiembros LLAVE_CE!
;
En este caso uti)i%amos e) no+o +e) toHen RES_CLASE como ra%"
Esta re-)a reconocer. mu 6ien )as +efiniciones +e c)ases que )e 2asemos" 7o o6stante 2resenta
un 2ro6)emaF no construe e) #*$ m.s a+ecua+o" Cuan+o en )a +ec)araci=n no se e:2resa
e:2)citamente su su2erc)ase5 sta +e6e ser )a c)ase 6ase5 Objeto" 9ara !acer un #*$ )o m.s
!omo-neo 2osi6)e5 0amos a !acer que siem2re se -enera un .r6o) #*$" 3o m.s c=mo+o es
uti)i%ar una re-)a De:traE que se encar-ue +e -estionar )a 2arte +e creaci=n +e .r6o)esF
/** Definicin de una clase. */
decClase : RES_CLASE^ IDENT clausulaExtiende
LLAVE_AB! listaMiembros LLAVE_CE!
;
/** Clusula "extiende" **/
clausulaExtiende : RES_EXTIENDE^ IDENT
| /*nada*/ // Creamos un AST
{ ## = #( #[RES_EXTIENDE,"extiende"],
#[IDENT, "Objeto"] ); }
;
listaMiembros ten+r.5 2or su 2arte5 )a si-uiente im2)ementaci=nF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 12,
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.-6 Nona de reglas
protected listaMiembros
: (decMetodo|decConstructor|decAtributo)*
{## = #( #[LISTA_MIEMBROS, "LISTA_MIEMBROS"] ,##);}
;
1e nue0o enrai%amos )as )istas con un toHen ima-inario" 7=tese )a 2a)a6ra c)a0e protected que
2rece+e a )a +efinici=n +e )a re-)a@ +ec)arar como 2rote-i+as )as re-)as au:i)iares es mu com?n"
#.3.3: A8Ncar sint(ctica
*e +ice que un )en-ua4e tiene a%?car sint.ctica si tiene a)-una re-)a que5 aunque no sea
estrictamente necesaria 2ara co+ificar e) )en-ua4e5 faci)ita un 2oco )a 0i+a a) 2ro-rama+or" /n
e4em2)o c)aro +e re-)as con a%?car sint.ctica son )as +ec)araciones +e atri6utos5 2ar.metros
0aria6)es"
En 3e3i5 )as +ec)araciones +e 2ar.metros5 atri6utos 0aria6)es )oca)es 2ermiten a) 2ro-rama+or
+ec)arar 0arios e)ementos en una so)a +ec)araci=n" 9or e4em2)o5 e) si-uiente c=+i-oF
clase Azcar
{
atributo Booleano bEsMoreno;
atributo Booleano bEsBlanca;
atributo abstracto Entero caloriasCuchara=16;
atributo abstracto Entero cucharadasMedias=2;
mtodo endulzar(Entero dulzura; Entero cucharadasExtra)
{
Entero calorias1 = caloriasCuchara * cucharadasMedias;
Entero calorias2 = caloriasCuchara * cucharadasExtra;
dulzura = calorias1 + calorias2;
}
}
Es equi0a)ente a este otroF
clase Azcar
{
atributo Booleano bEsMoreno? b@sBlanca;
atributo abstracto Entero caloriasCuchara=16? cucAaradasBedias&C;
mtodo endulzar(Entero dulzura? cucAaradas@<tra)
{
Entero calorias1 = caloriasCuchara * cucharadasMedias,
caloriasC & calorias:ucAara 3 cucAaradas@<tra ;
dulzura = calorias1 + calorias2;
}
}
En una misma )nea +e +ec)araci=n +e atri6utos se +ec)aran 0arios atri6utos5 )o mismo ocurre
con )os 2ar.metros 0aria6)es )oca)es"
3a re2resentaci=n -r.fica +e) #*$ 2ara e) e4em2)o anterior5 +e) cua) so)amente inc)uiremos )os
#*$s +e )os +os 2rimeros atri6utos no a6stractos (bEsMoreno5 bEsBlanca) +e )a c)ase Azcar5
com2artir.n su ra%F
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 127
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.-6 Nona de reglas
Ilustracin ,.1 Hr"ol /01 con dia"etes sint#ctica
Ie marca+o ste ar6o) como Dcon +ia6etes sint.cticaE"
3a ra%=n es que un .r6o) as no es i+=neo 2ara )a eta2a si-uiente +e) an.)isis (an.)isis sem.ntico)
es muc!o m.s con0eniente un .r6o) en e) que )os +iferentes i+entifica+ores +e )os atri6utos
ten-an Dun .r6o) 2ara ca+a unoE5 2or ra%ones que 0eremos en e) si-uiente ca2tu)o
36
" Es +ecir5
que e) .r6o) que -enere )a se-un+a im2)ementaci=n +e )a c)ase Azcar +e6e ser i-ua) a) que
-enera )a 2rimera5 en )a que !a un .r6o) +e +ec)araci=n 2ara ca+a i+entifica+or5 como e)
mostra+o en )a si-uiente -r.ficaF
Ilustracin ,.2 Hr"ol /01 desea"le
Insulina semntica
9ara e0itar )os .r6o)es +ia6ticos necesitaremos crear )os .r6o)es +e una manera es2ecia)"
Ramos a tener que mo+ificar )a construcci=n +e) #*$" Ie aqu a)-unas consi+eraciones
im2ortantesF
1" 3a misma 2ro6)em.tica que se encuentra en )as +ec)araciones +e atri6utos (a%?car sint.ctica)
se encuentra en )as +ec)araciones +e 0aria6)es )oca)es 2ar.metros +e mto+os" 3o m.s
+esea6)e sera im2)ementar)os to+os con e) mismo con4unto +e re-)as"
'" 3os .r6o)es +e6en ser crea+os a) ))e-ar a )os i+entifica+ores5 no antes5 2ues so)amente en ese
momento se tiene to+a )a informaci=n (ti2o +e) atri6uto^0aria6)e^2ar.metro5 nom6re 0a)or si
est. inicia)i%a+o)
3" 1e a)-una manera !a que crear sen+as co2ias +e) no+o que re2resenta e) ti2o +e) .r6o) +e
+ec)araci=n (RES_BOOLEANO) +e su ra% (RES_ATRIBUTO) una 0e% 2or ca+a i+entifica+or"
4" Ia que continuar +iferencian+o si se 2ue+e o no aCa+ir una 0aria6)e es2ecia)5 e) 0a)or inicia)
+e) o64eto (recur+ese que )as 0aria6)es )os atri6utos a6stractos 2ue+en ser inicia)i%a+os)"
En +efiniti0a D3os .r6o)es +e6en ser crea+os a) ))e-ar a )os i+entifica+oresE A2unto 'A5 D !a que
2asar)es e) ti2o +e +ec)araci=n (atri6uto5 0aria6)e o 2ar.metro) ti2o +e )a +ec)araci=n (Entero5
Cadena""") que tam6in +e6e ser co2ia+oE A2unto 3A Da+em.s +e un 6oo)eano que in+ique si se
36 9ara )os im2acientesF !ace fa)ta 2ara 2o+er asociar un .r6o) #*$ +istinto a ca+a i+entifica+or en )a eta2a +e enriquecimiento
sem.ntico"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 12/
,1E7$
8E*_G;;3E#7;
8E*_#$8,G/$;
,1E7$ ,1E7$
8E*_C3#*E
#%?car
6EsBoreno 6EsG)anca
resto
+e) #*$
,1E7$
8E*_G;;3E#7;
8E*_#$8,G/$;
,1E7$
8E*_C3#*E
#%?car
6EsBoreno
resto
+e) #*$
8E*_G;;3E#7;
8E*_#$8,G/$;
,1E7$
6EsG)anca
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.-6 Nona de reglas
2ue+en o no iniciarE A2unto 4A"
3a re-)a que uti)i%aremos 2ara reconocer )as +ec)araciones +e )os atri6utos5 2ar.metros
0aria6)es +e 3e3i5 as como +e e)iminar e) a%?car sint.ctica +e )as re-)as5 se ))ama
listaDeclaraciones" Es una re-)a que ace2ta 0arios 2ar.metros5 que +efinir.n su forma +e
actuar" E) 2rimer 2ar.metro +e )a re-)a sir0e 2ara es2ecificar )a Dra%E +e to+as )as +ec)araciones
(en este caso 0en+r. 2ro2orciona+a 2or e) toHen RES_ATRIBUTO)"
E) se-un+o 2ar.metro +e )a re-)a es un 6oo)eano que in+ica si )as +ec)araciones se 2ue+en
DiniciarE" Ia +os formas +e iniciar una +ec)araci=nF con un 0a)or (2or e4em2)o5 Entero i&C) o
con D2ar.metros +e constructorE (2or e4em2)o Persona pepe(Depe? SancAeE? FG);)" En
e) )en-ua4e 3e3i )as 0aria6)es )os atri6utos a"stractos 2ue+en iniciarse +e esta forma5 mientras
que )os 2ar.metros )os atri6utos no a"stractos no 2ue+en" 9or eso !a si+o necesaria )a 0aria6)e
)oca) abstracto en )a re-)a decAtributo"
Reamos entonces )a re-)a listaDeclaracionesF
listaDeclaraciones [AST raiz, boolean inicializacion]
: t:tipo!
declaracion[raiz,#t,inicializacion]
(COMA! declaracion[raiz,#t,inicializacion])*
;
3a re-)a se )imita a reconocer e) ti2o +e )a +ec)araci=n a 2as.rse)o a )a re-)a que !ace to+o e)
tra6a4o5 es +ecir5 declaracion" Esta nue0a re-)a se im2)ementa +e )a si-uiente maneraF
declaracion ! // desactiva construccin por def. del AST
[AST r, AST t, boolean inicializacion] // parmetros
{
AST raiz = astFactory.dupTree(r); // copia del arbol
raiz.addChild(astFactory.dupTree(t)); // copia del rbol
}
: i1:IDENT
{
raiz.addChild(#i1);
## = raiz;
}
| { inicialiEacion !" // pred. semntico
i2:IDENT OP_ASIG valor:expresion
{
raiz.addChild(#i2);
raiz.addChild(#valor);
## = raiz;
}
| { inicialiEacion !"
i3:IDENT parentAb li:listaExpresiones parentCe
{
raiz.addChild(#i3);
raiz.addChild(#li);
## = raiz;
}
;
7=tese que es +ec)aracion )a que se encar-a que rea)i%ar )as co2ias +e no+os #*$ necesarias 2ara
e)iminar e) a%?car sint.ctica" 3os +os 2re+ica+os sem.nticos que 2rece+en a )as +os ?)timas
a)ternati0as +e )a re-)a im2i+en que stas se recono%can si e) 2ar.metro inicia)i%acion es fa)so"
7=tese i-ua)mente que listaDeclaraciones 2ro+uce un #*$ +e-enera+o +e +ec)araciones"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 12<
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.-6 Nona de reglas
Ja !emos e:2)ica+o qu es )o que +e6e !acer )a re-)a declaracion K +u2)icar ciertos no+os
enrai%ar)os +e cierta forma" Reamos c=mo )o !ace" 9ara enten+er)o !a que com2ren+er tres
conce2tosF )os 2re+ica+os sem.nticos (que a !emos e:2)ica+o en )os 2rimeros ca2tu)os +e este
+ocumento) )a forma +e +u2)icar aCa+ir !i4os a )os no+os #*$" Estas +os ?)timas o2eraciones
se rea)i%an uti)i%an+o astFactory"
astFactory es un atri6uto +e) ana)i%a+or sint.ctico5 concretamente una instancia +e
ASTFactory" E) mto+o dupTree +e )as ASTFactory 2ermite co2iar )a estructura +e un #*$5
no+o a no+o
3(
" Iemos +e crear c=2ias +e )os #*$s r t 2ara 2o+er mo+ificar)os a nuestro anto4o
(aCa+in+o)es !i4os5 2rinci2a)mente) re2eti+as 0eces5 sin que una inf)ua en )a otra"
Reamos a!ora addChild" Iemos teni+o que uti)i%ar)o 2ara no 2er+er !i4os que a tena r@
norma)mente5 si se +esea aCa+ir un e)emento a un #*$5 2o+emos escri6ir)o asF
// aadir el AST t2 a el AST t1
t1 = #(t1,t2);
Este mto+o tiene5 sin em6ar-o5 un im2ortante 2ro6)emaF e)imina to+os )os !i4os +e t15 situan+o
en su )u-ar t'" *i )o que queremos es conser0ar )os !i4os +e t1 aCa+ir un nue0o #*$ ten+remos
que uti)i%ar addChildF
t1.addChild(t2); // aade t2 al final de la lista de hijos de t1 sin borrarla.
$n-ase 2resente que )os +os mto+os son equi0a)entes si t1 no tiene !i4os (e) se-un+o es m.s
r.2i+o5 2ero e) 2rimero es m.s 2orta6)e)"
Es una 2ena que no e:istan a6re0iaturas como #()5 ##5 #[]5 2ara !acer co2ias +e no+os o 2ara
aCa+ir !i4os a un #*$5 +e manera que ten-amos que uti)i%ar mto+os 2oco 2orta6)es"
/na ?)tima notaF a)-unos 2o+ran 2ensar que !emos 2er+i+o tiem2o crean+o una 0aria6)e (rai%)
2ara ir -uar+an+o e) #*$ que se 0a crean+o5 a que 2o+ramos uti)i%ar eeF
declaracion ! // desactiva construccin por def. del AST
[AST r, AST t, boolean inicializacion] // parmetros
{
## = astFactory.dupTree(r); // copia del arbol
##.addChild(astFactory.dupTree(t)); // copia del rbol
}
: i1:IDENT
{
##.addChild(#i1);
}
| { inicializacion }? // pred. semntico
i2:IDENT OP_ASIG valor:expresion
{
##.addChild(#i2);
##.addChild(#valor);
}
| { inicializacion }?
i3:IDENT parentAb li:listaExpresiones parentCe
{
##.addChild(#i3);
##.addChild(#li);
}
;
L$am6in o 2ensa6a que un c=+i-o as funcionaraN 7o o6stante5 una mira+a a) c=+i-o -enera+o
3( Cons?)tese )a secci=n D;tros as2ectos +e )os #*$sE en e) ca2tu)o & 2ara m.s nformaci=n so6re )as f.6ricas +e #*$s"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1-
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.-6 Nona de reglas
me !i%o cam6iar +e i+eaF DeeE se uti)i%a 2rinci2a)mente cuan+o #7$38 est. construen+o
autom.ticamente un #*$" En ca+a acci=n5 #7$38 inicia)i%a DeeE a D)o que ))e0a construi+o
!asta ese momentoE" 1a+o que )a construcci=n 2or +efecto +e) #*$ est. +esacti0a+a5 Lee se
inicia)i%a a nu)) en ca+a acci=nN
#s que en -enera) !a que tener cui+a+o a )a !ora +e uti)i%ar ee en 0arias acciones5 so6re to+o
cuan+o )a construcci=n 2or +efecto est. +esacti0a+a" *i !a +e !acerse5 es me4or uti)i%ar una
0aria6)e au:i)iar Dasi-nar)aEa ee a) fina)"
#.3.": 6e!inici%n de atributos
Consi+eremos a!ora c=mo reconocer )as +ec)araciones +e atri6utos" /na +ec)araci=n comien%a
2or )a 2a)a6ra c)a0e atributo5 se-ui+a (o no) 2or )a 2a)a6ra reser0a+a abstracto" 1es2us
0iene un ti2o fina)mente una )ista +e +ec)araciones5 que son i+entifica+ores se-ui+os
o2ciona)mente +e 0a)ores +e inicia)i%aci=n (a sean 0a)ores o 2ar.metros +e constructor) si )os
atri6utos son a6stractos" 3as +ec)araciones 0an se2ara+as 2or comas5 fina)mente !a un 2unto
coma"
3o 2rimero que !a que +efinir es )a re-)a que reconoce e) ti2o con e) que un
atri6uto^0aria6)e^2ar.metro 2ue+e ser +ec)ara+o" cste 2ue+e ser Entero5 Real5 Booleano5
Cadena o una c)ase +efini+a 2or e) usuario" 1ic!o !ec!oF
tipo : TIPO_ENTERO // tipo Entero
| TIPO_REAL // tipo Real
| TIPO_BOOLEANO // tipo Booleano
| TIPO_CADENA // tipo Cadena
| IDENT // tipo no bsico
;
/na 0e% )e+o e) a2arta+o anterior5 reconocer )as +ec)araciones +e atri6utos +e6era ser mu
senci))oF
decAtributo
{ boolean abstracto = false; }
: raiz:RES_ATRIBUTO^
( a:RES_ABSTRACTO { abstracto=true; } )?
listaDeclaraciones[#raiz, abstracto] PUNTO_COMA!
;
#na)icemos )a re-)a" En 2rimer )u-ar5 se +ec)ara )a 0aria6)e )oca) abstracto" Como est.
+ec)ara+a en una acci=n a )a i%quier+a +e )os +os 2untos5 su .m6ito ser. to+a )a re-)a"
3a 2rimera estructura que se reconoce es e) toHen RES_ATRIBUTO" $ras )5 a2)ic.n+ose)e e)
o2era+or +e o2ciona)i+a+ ()a interro-aci=n) 2ue+e a2arecer e) toHen RES_ABSTRACTO" En ta) caso
)a 0aria6)e abstracto se !ace cierta"
1es2us5 so)amente que+a in0ocar listaDeclaraciones con )os 2ar.metros a+ecua+os"
#.3.#: 6e!inici%n de m0todos
3os mto+os 2ue+en ser +e tres ti2osF constructores5 mto+os norma)es mto+os a6stractos"
/n constructor no es m.s que )a 2a)a6ra reser0a+a constructor se-ui+a +e una )ista +e
2ar.metros entre 2arntesis una )ista +e instrucciones entre ))a0esF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1-1
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.-6 Nona de reglas
decConstructor : RES_CONSTRUCTOR^ PARENT_AB! listaDecParams PARENT_CE!
LLAVE_AB! listaInstrucciones LLAVE_CE!
;
3os mto+os a6stractos )os no a6stractos 2ue+en tener un ti2o +e retorno" 9or )o +em.s5
so)amente se +iferencian en )a uti)i%aci=n +e )a 2a)a6ra reser0a+a abstracto"
/n mto+o a6stracto o no a6stracto comien%a con )a 2a)a6ra reser0a+a mtodo se-ui+a (o no)
2or )a 2a)a6ra reser0a+a abstracto" 1es2us 0iene e) ti2o +e retorno5 que es o2ciona)" 3ue-o
0iene e) nom6re +e) mto+o5 que es un IDENT" >ina)mente !a una )ista +e 2ar.metros entre
2arntesis una )ista +e instrucciones entre ))a0es"
decMetodo
: RES_METODO^ (RES_ABSTRACTO)? tipoRetorno IDENT
PARENT_AB! listaDecParams PARENT_CE!
LLAVE_AB! listaInstrucciones LLAVE_CE!
;
Pue+an a)-unas cosas 2or +efinirF tipoRetorno5 listaParams listaInstrucciones"
9ara im2)ementar tipoRetorno tenemos que consi+erar +os o2cionesF que e) mto+o +e0ue)0a
a)-o o que no +e0ue)0a na+a" 3a 2rimera o2ci=n es senci))aF 6asta con reconocer tipo" 3a
se-un+a o2ci=n consiste en reconocer Dna+aE (nin-?n toHen)" #)-unos 2o+ran estar tenta+os +e
uti)i%ar e) o2era+or +e o2ci=n (DQE) a que se reconoce Dun ti2o o na+aE5 !acer a)-o asF
protected tipoRetorno : (tipo)? ;
*in em6ar-o !a una ra%=n 2or )a cua) 2refiero no uti)i%ar esta re-)a" 9reten+o que internamente
to+os )os mto+os ten-an un ti2o5 inc)uso )os que no +e0ue)0en na+a" 1e esta forma e) recorri+o
+e .r6o)es +e )a eta2a +e an.)isis sem.ntico ser. m.s senci))a"
En otros )en-ua4es se uti)i%a e) ti2o void 2ara es2ecificar esta i+ea5 2ero no !a una 2a)a6ra
reser0a+a D0acoE en 3e3i" 9ero so no im2i+e que e:ista e) conce2to aunque no e:ista )a
2a)a6ra" 3o que 0o a !acer es uti)i%ar un toHen ima-inario e im2)ementar tipoRetorno asF
protected tipoRetorno
: tipo
| /* nada */ {## = #[TIPO_VACIO,"TIPO_VACIO"]; }
;
7=tese que e) con4unto PRIMERO(tipoRetorno) contiene a IDENT5 que tipoRetorno 2ue+e
ser 0aco siem2re 0a se-ui+o +e un IDENT" Gracias a )a o2ci=n k=2 +e) ana)i%a+or 2o+emos
i-norar ste 2ro6)ema a!orrarnos unos en-orrosos 2re+ica+os sint.cticos"
listaDecParams es mu f.ci) +e im2)ementar si uno se 6asa en )a re-)a listaDeclaraciones5
que +efin anteriormente" /na )ista +e 2ar.metros es una )ista +e cero o m.s
listaDeclaraciones se2ara+as 2or e) car.cter 2unto coma (D@E)"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1-2
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.-6 Nona de reglas
listaDecParams
{ final AST raiz = #[RES_PARAMETRO,"parmetro"] ;}
:
( listaDeclaraciones[raiz, false]
( PUNTO_COMA! listaDeclaraciones[raiz, false])*
)? // opcional
{ ## = #(#[LISTA_DEC_PARAMS,"LISTA_DEC_PARAMS"], ##); }
;
Como +e costum6re5 to+a )ista es enrai%a+a con un toHen ima-inario" 7=tese e) o2era+or +e
o2ci=n (DQE) casi a) fina) +e )a re-)a"
Reremos listaInstrucciones un 2oco m.s a+e)ante5 en e) a2arta+o +e instrucciones"
#.3.+: x'resiones
Introduccin
,m2)ementar e) an.)isis sint.ctico +e )as e:2resiones es una +e )as 2ocas cosas m.s f.ci)es +e
!acer con 6ison que con #7$385 -racias a )a +irecti0a %left a que )as re-)as tienen
D2rece+encia +e uti)i%aci=nE se-?n e) or+en en e) que se +ec)aren" En #7$38 !a que se-uir
uti)i%an+o )a tcnica !a6itua) +e +i0i+ir )as e:2resiones en Dni0e)es +e 2rece+enciaE5 +e manera
que si +os o2era+ores tienen +iferente 2rece+encia est.n en ni0e)es +e 2rece+encia +iferentes"
3as e:2resiones en 3e3i se or-ani%an se-?n )a si-uiente ta6)aF
Nivel Nom+re !lementos
9 #si-naciones
=
8 D;E )=-ico
o
( DJE )=-ico
y
6 Com2araciones
<=, >=, ==, !=, <, >
& *uma resta aritmtica
+, -
4 9ro+ucto +i0isi=n
*, /
3 Cam6io +e si-no unario
+, -
' 9ostincremento +ecremento
++, --
1 7e-aci=n
no
0 es/n
esUn
(A1) accesos 2arntesis <accesos>5 ()
9or ca+a ni0e) !a una re-)a5 que uti)i%a re-)as +e) si-uiente ni0e)"
(eglas de las e-presiones
3as asi-naciones son )a entra+a +e) sistema +e an.)isis +e e:2resionesF
expresion: expAsignacion;
,nc)uir )a asi-naci=n +entro +e )as e:2resiones es una 2r.ctica corriente en e) mun+o +e )os
com2i)a+ores@ a 2esar +e tratarse +e una instrucci=n5 su re)aci=n con )as e:2resiones es tan
-ran+e que inc)uir)a +entro +e) -ru2o +e )as e:2resiones es m.s senci))o que no !acer)o" #+em.s5
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1--
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.-6 Nona de reglas
e:isten a)-unas e:2resiones que tam6in 2ue+en ser uti)i%a+as como instrucciones" 9or e4em2)o e)
2ost+ecremento (i++) o )as ))ama+as a mto+os son tam6in e:2resiones"
1a+o e) sistema +e 2rece+encia que estamos usan+o5 )as asi-naciones Dinc)uenE a) resto +e )as
e:2resiones" /na asi-naci=n es una e:2resi=n +e ni0e) inferior que 2ue+e estar o no se-ui+a +e)
o2era+or +e asi-naci=n otra e:2resi=nF
expAsignacion : expOLogico (OP_ASIG^ expOLogico)? ;
3as e:2resiones +e) si-uiente ni0e) son )as e:2resiones )=-icas con e) o2era+or ;" /na e:2resi=n
+e ste ti2o son una o 0arias e:2resiones +e) si-uiente ni0e) uni+as con o2era+ores ;F
expOLogico : expYLogico (OP_O^ expYLogico)* ;
1e una forma 2areci+a se +efinen e) resto +e )as e:2resiones 6inarias5 a sea e) J )=-ico5
expYLogico : expComparacion (OP_Y^ expComparacion)*;
o )a com2araci=n5
expComparacion
: expAritmetica
(
( OP_IGUAL^ | OP_DISTINTO^ | OP_MAYOR^ | OP_MENOR^
| OP_MAYOR_IGUAL^ | OP_MENOR_IGUAL^
)
expAritmetica
)*
;
o )a suma resta aritmtica5
expAritmetica : expProducto ((OP_MAS^ | OP_MENOS^) expProducto)* ;
o e) 2ro+ucto )a +i0isi=n"
expProducto : expCambioSigno
((OP_PRODUCTO^ | OP_DIVISION^) expCambioSigno)*
;
# 2artir +e) ni0e) 3 )a estructura +e )as re-)as cam6ia un 2oco 2orque )as e:2resiones 2asan +e ser
6inarias a ser unarias" 9or e4em2)o5 )a re-)a 2ara )os cam6ios +e si-no esF
expCambioSigno :
( OP_MENOS! expPostIncremento
{ ## = #( #[OP_MENOS_UNARIO, "OP_MENOS_UNARIO"], ## ) ;}
)
| (OP_MAS!)? expPostIncremento
;
Como 0emos esta re-)a es un 2oco m.s com2)e4a que )as anteriores" 3o que estamos !acien+o es
que si encontramos un si-no DmenosE (DAE) +e)ante +e una e:2resi=n5 i-noramos e) si-no
enrai%amos )a e:2resi=n con e) toHen ima-inario OP_MENOS_UNARIO" E) si-no Dm.sE (D+E)5 si se
encuentra5 es +irectamente i-nora+o"
E) 2ostincremento 2ost+ecremento se mane4an f.ci)menteF
expPostIncremento : expNegacion (OP_MASMAS^|OP_MENOSMENOS^)? ;
En e) ni0e) 1 +e nuestra 4erarqua +e e:2resiones encontramos e) o2era+or +e ne-aci=nF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1-)
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.-6 Nona de reglas
expNegacion : (OP_NO^)* expEsUn
;
J en e) ?)timo ni0e) +e nuestra 4erarqua tenemos )as e:2resiones que uti)i%an e) o2era+or esUnF
expEsUn : acceso (RES_ESUN^ tipo)*
;
>a)ta 2or +efinir qu es un acceso"
Accesos
3as e:2resiones +e un )en-ua4e sir0en 2ara mane4ar valores" Estos 0a)ores 2ue+en 0enir +a+os
2orF
X /n )itera)
X /n atri6uto +e )a c)ase actua) o +e otra c)ase
X /na ))ama+a a un mto+o o a) constructor +e )a c)ase actua) o +e otra c)ase
X /na 0aria6)e )oca)
# ste con4unto +e 0a)ores )o ))amaremos acceso.
E) as2ecto -enera) +e un acceso es e) +e un i+entifica+or se-ui+o o2ciona)mente +e una serie +e
Dsu6AaccesosE se2ara+os 2or 2untos" 7o o6stante e:isten a)-unas e:ce2cionesF
X 3)ama+as a mto+os o constructores +e) o64eto actua) (so)amente se escri6e e) nom6re +e)
mto+o se-ui+o +e sus 2ar.metros entre 2arntesis" En 3e3i no !a un equi0a)ente a Dt!isE)"
X 3os )itera)es5 que aunque 2ue+en ))amar a a)-unos mto+os (2or e4em2)o5 Hola
munto.subCadena(4) +e0ue)0e )a ca+ena Hola) no comien%an 2or un i+entifica+or"
X #ccesos rea)i%a+os con )as 2a)a6ras reser0a+as parmetro atributo5 que tam2oco
em2ie%an con un i+entifica+or"
X Con0ersiones entre ti2os (con convertir)
X 3a 2a)a6ra reser0a+a super"
X /na e:2resi=n entre 2arntesis"
#+em.s5 a)-unas +e )as races +e) acceso ()as 2a)a6ras reser0a+as parmetro5 atributo
super) e:i-en ir se-ui+as +e su6accesos5 mientras que e) resto 2ue+en a2arecer en so)itario"
En +efiniti0a5 2ue+e +ecirse que un acceso es Duna ra% se-ui+a +e cero o m.s +e su6Aaccesos
se2ara+os 2or 2untosE" *i )a ra% necesita o6)i-atoriamente +e a) menos un acceso entonces ir.
se-ui+a +e uno o m.s" Es +ecirF
acceso : r1:raizAcceso { ## = #(#[ACCESO], #r1); }
( PUNTO! sub1:subAcceso! { ##.add:Aild(#sub1); } )*
| r2:raizAccesoConSubAccesos { ## = #(#[ACCESO], #r2); }
( PUNTO! sub2:subAcceso! { ##.add:Aild(#sub2); } )+
;
Iemos teni+o que mo+ificar un 2oco )a manera que tiene #7$38 2or +efecto +e construir )os
.r6o)esF )a ra% es e) 2rimer !i4o +e un no+o ficticio +e ti2o ACCESO5 )os subAccesos se 0an
aCa+ien+o a )a )ista +e accesos5 uti)i%an+o addChild" 7=tese que en )a 2rimera a)ternati0a se
uti)i%a un cierre +e M)eene mientras que en )a se-un+a se uti)i%a una c)ausura 2ositi0a
3a re-)a raizAccesoConSubAccesos es5 como a !emos in+ica+o antes5 )a 2a)a6ra reser0a+a
parmetro5 )a 2a)a6ra reser0a+a atributo o )a 2a)a6ra reser0a+a superF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1-0
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.-6 Nona de reglas
raizAccesoConSubAccesos
: RES_PARAMETRO
| RES_ATRIBUTO
| RES_SUPER
;
3a re-)a raizAcceso +e6e reconcer e) resto +e )as 2osi6)es races que !emos enuncia+oF
raizAcceso : IDENT
| literal
| llamada
| conversion
| PARENT_AB! expresion PARENT_CE!
;
3os )itera)es 2ue+en ser +e )os tres ti2os 6.sicosF Entero5 Real Cadena" 3os )itera)es ca+ena
2ue+en ser una ca+ena norma) o 6ien )as 2a)a6ras reser0a+as nl5 tab o com"
literal : LIT_ENTERO
| LIT_REAL
| LIT_CADENA
| LIT_NL
| LIT_TAB
| LIT_COM
| LIT_CIERTO
| LIT_FALSO
;
/na ))ama+a es mu f.ci) +e es2ecificarF un i+entifica+or se-ui+o +e una )ista +e e:2resiones
entre 2arntesis se2ara+as 2or comas5 en e) caso +e )os mto+os5 o )a 2a)a6ra reser0a+a
constructor se-ui+a +e )os corres2on+ientes 2ar.metros"
llamada : IDENT PARENT_AB! listaExpresiones PARENT_CE!
{ ## = #(#[LLAMADA,"LLAMADA"],##); }
| RES_CONSTRUCTOR^ PARENT_AB! listaExpresiones PARENT_CE!
;
protected listaExpresiones
: ( expresion (COMA! expresion)* )?
{ ## = #(#[LISTA_EXPRESIONES,"LISTA_EXPRESIONES"],##); }
;
Estas +os re-)as i)ustran )os +os casos 6.sicos en )os que 0iene 6ien mo+ificar e) .r6o) que se
-enera autom.ticamenteF cuan+o no !a un toHen que 2ue+a ser em2)ea+o como ra% en )as
)istas"
9or su 2arte5 )a con0ersi=n entre ti2os es senci))aF
conversion : RES_CONVERTIR^
PARENT_AB! expresion COMA! tipo PARENT_CE!
;
9or ?)timo5 0amos a ana)i%ar )os su6#ccesos" /n su6#cceso 2ue+e ser +e tres ti2osF una ))ama+a
a un mto+o5 un acceso a un atri6uto o )a 2a)a6ra reser0a+a superF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1-,
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.-6 Nona de reglas
subAcceso
: llamada
| IDENT
| RES_SUPER
;
En )a se-un+a o2ci=n se uti)i%a un toHen ima-inario 2ara o6tener una 4erarqua +e accesos" esta
4erarqua5 4unto con )a em2)ea+a en )as ))ama+as5 2ermite que e) acceso
objeto.atributo1.metodo1() -enere un .r6o) como steF
Ilustracin ,.( /01 de un acceso
IDENT5 ATRIBUTO LLAMADA son .r6o)es !i4os +e ACCESO ( son !ermanos entre e))os)" IDENT es
)a ra- +e) acceso5 e) resto son su"accesos"
J no e) inmane4a6)e .r6o) +e-enera+o que se 2ro+ucira sin este enrai%amientoF
Ilustracin ,.* /01 degenerado de un acceso
#ntes +e terminar con )os accesos5 una nota fina)F )a que !emos 2resenta+o no es m.s que una +e
)as formas +e im2)ementar)os" 9ue+en encontrarse otras formas +e im2)ementar)os en )os
e4em2)os que acom2aCan a #7$38"
#.3.-: /nstrucciones
#nteriormente !emos !ec!o referencia a )a re-)a listaInstrucciones5 que re2resenta una )ista
+e cero o m.s instrucciones" *u im2)ementaci=n ser. )a !a6itua) 2ara )as )istasF
listaInstrucciones
: (instruccion)*
{## = #( #[LISTA_INSTRUCCIONES,"LISTA_INSTRUCCIONES"], ##);}
;
9or su 2arte una instrucci=n 2ue+e ser +e +iferentes ti2osF una e:2resi=n (una asi-naci=n5
2ostincremento o ))ama+a a funci=n) o una instrucci=n +e contro) (como un 6uc)e o una
instrucci=n si)" 3as +ec)araciones +e 0aria6)es tam6in son instrucciones" #+em.s est. )a
instrucci=n volver )a instrucci=n nu)a (que so)amente tiene un 2unto coma)"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1-7
,1E7$ ,1E7$ ,1E7$ """
o64eto atri6uto1 meto+o1
#CCE*;
#$8,G/$;
,1E7$ ,1E7$
33#B#1#
atri6uto1 meto+o1
,1E7$
o64eto
"""
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.-6 Nona de reglas
instruccion : instDecVar // declaracin
| instExpresion // Instruccin - expresin
| instMientras // bucle mientras
| instHacerMientras // bucle hacer-mientras
| instDesde // bucle desde
| instSi // Instruccin Si
| instVolver // Instruccin volver
| instNula // Instruccin Nula
;
/n 2oco m.s a6a4o (en e) a2arta+o D+ec)araciones +e 0aria6)es )oca)esE) 0eremos que
esta es2ecificaci=n no es suficiente5 2ues !a que co)ocar un 2re+ica+o sint.ctico
2ara e0itar una am6i-ae+a+"
Ramos a 0er uno a uno )os +iferentes ti2os +e instrucciones5 +e) m.s senci))o a) m.s com2)ica+o"
Instruccin nula
3a instrucci=n nu)a5 a) tener so)amente un PUNTO_COMA5 es )a m.s senci))a +e im2)ementarF
instNula : PUNTO_COMA! ;
7=tese que a) no aCa+irse nin-?n no+o a) #*$ con )a instrucci=n nu)a5 )a re-)a 2ro+uce un .r6o)
0aco5 +e manera que es totamente fi)tra+a a) an.)isis sem.ntico"
Instruccin volver
3a instrucci=n 0o)0er es tam6in mu f.ci) +e com2ren+er" *e trata +e )a 2a)a6ra reser0a+a
volver se-ui+a +e un PUNTO_COMA" 1ic!a 2a)a6ra reser0a+a ser. e) ?nico no+o +e) .r6o)"
instVolver : RES_VOLVER PUNTO_COMA! ;
Intruccin<e-presin
/na instrucci=nAe:2resi=n es una e:2resi=n se-ui+a +e PUNTO_COMA"
instExpresion: expresion PUNTO_COMA!
{## = #( #[INST_EXPRESION,"INST_EXPRESION"], ##);}
;
Ie aCa+i+o )a ra% ficticia INST_EXPRESION a) .r6o) +e )as e:2resiones 2ara que to+a instrucci=n
ten-a una ra% que )a i+entifique 2or su ti2o"
:eclaracin de varia7les locales
/na +ec)araci=n +e 0aria6)e )oca) a ni0e) sint.ctico no es m.s que un ti2o se-ui+o +e uno o 0arios
i+entifica+ores5 a )os que o2ciona)mente se )e 2ue+e asi-nar un 0a)or" E:actamente so es )a re-)a
tipoListaIdentsValores5 que anteriormente +efin a) !a6)ar +e )as +efiniciones +e 2ar.metros
+e )os mto+os" 7o !a que o)0i+ar aCa+ir e) PUNTO_COMAF
instDecVar
{ final AST raiz = #[INST_DEC_VAR,"variable"]; }
: listaDeclaraciones[raiz,true] PUNTO_COMA! ;
#tenci=nF intro+ucir esta re-)a 2ro0oca que e) ana)i%a+or no +iferente correctamente )as
instruccionesAe:2resion +e )as +ec)araciones5 2orque )os con4untos PRIMERO(expresion)
PRIMERO(instDecVar) contienen a IDENT, e) ana)i%a+or es *33(') 2ero no 33(')5 )o que
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1-/
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.-6 Nona de reglas
!ace que en a)-unos momentos no sea suficiente con HU'"
Es necesario aCa+ir un 2re+ica+o sint.ctico a instruccion 2ara so)ucionar esta am6i-ae+a+F
instruccion : (tipo IDENT)=>instDecVar // declaracin
| instExpresion // Instruccin - expresin
| instMientras // bucle mientras
| instHacerMientras // bucle hacer-mientras
| instDesde // bucle desde
| instSi // Instruccin Si
| instVolver // Instruccin volver
| instNula // Instruccin Nula
;
Bucles
3os 6uc)es mientras hacerAmientras son mu f.ci)es +e im2)ementarF
instMientras : RES_MIENTRAS^ PARENT_AB! expresion PARENT_CE!
LLAVE_AB! listaInstrucciones LLAVE_CE!
;
instHacerMientras : RES_HACER^ LLAVE_AB! listaInstrucciones LLAVE_CE!
RES_MIENTRAS PARENT_AB! expresion PARENT_CE!
PUNTO_COMA!
;
E) 6uc)e desde es un 2oco m.s com2)ica+o 2orque tras )a 2a)a6ra reser0a+a +es+e5 entre )os
2arntesis5 !a tres )istas +e e:2resiones se2ara+as 2or 2or COMAs5 2ue+en no tener nin-?n
e)emento" Ja !emos im2)ementa+o antes ste ti2o +e )istas a) !a6)ar +e ))ama+as a mto+osF )a
re-)a listaExpresiones es e:actamente )o que 6uscamnos" 9or )o tanto un 6uc)e desde es )o
si-uienteF
instDesde : RES_DESDE^ PARENT_AB! listaExpresiones PUNTO_COMA!
listaExpresiones PUNTO_COMA!
listaExpresiones PARENT_CE!
LLAVE_AB! listaInstrucciones LLAVE_CE!
;
Instruccin NsiO
3a instrucci=n si 2arece senci))a5 sin em6ar-o !a resu)ta+o ser )a m.s +ifci) +e co+ificar "
Comien%a con )a 2a)a6ra reser0a+a RES_SI5 tras e))a una e:2resi=n una )ista +e instrucciones"
1es2us !a cero o m.s a)ternati0as5 que 2ue+en ser Dnorma)esE (una 6arra5 una e:2resi=n una
)ista +e instrucciones) o )a a)ternati0a DotrasE" En 2rinci2io 2o+emos escri6ir a)-o asF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1-<
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.-6 Nona de reglas
instSi
: RES_SI^ PARENT_AB! expresion PARENT_CE!
LLAVE_AB! listaInstrucciones LLAVE_CE!
(altSiNormal)*
(altSiOtras)?
;
protected altSiNormal : BARRA_VERT^ PARENT_AB! expresion PARENT_CE!
LLAVE_AB! listaInstrucciones LLAVE_CE!
;
protected altSiOtras : BARRA_VERT! RES_OTRAS^
LLAVE_AB! listaInstrucciones LLAVE_CE!
;
7=tese que mientras que )as a)ternati0as norma)es tienen como ra% e) toHen BARRA_VERT5 )a
a)ternati0a otras )a tiene en RES_OTRAS"
cste con4unto +e re-)as5 que +e6era ser inter2reta+o 2erfectamente con HU' 2or #7$385 no )o
es" 9osi6)emente 2or un 6u- +e im2)ementaci=n en #7$385 e) )ooHa!ea+ se re+uce a 1 a) e0a)uar
)a secci=n (altOtras)? +e )a re-)a5 )o que 2ro0oca un inc=mo+o mensa4e +e a0iso +e
in+eterminismo en )a su6 re-)a (altSiNormal)*" 1e to+as maneras )as instrucciones
con+iciona)es se reconocen 6ien5 as que e) mensa4e +e error 2ue+e e)iminarse sim2)emente
2onien+o )a o2ci=n generateAmbigWarnings a falseF
instSi :
RES_SI^ PARENT_AB! expresion PARENT_CE!
LLAVE_AB! listaInstrucciones LLAVE_CE!
(options {generateAmbigWarnings=false;}: altSiNormal)*
(altSiOtras)?
;
*in em6ar-o a m no me -usta +esacti0ar generateAmbigWarnings" 9refiero tener una
-ram.tica sin am6i-ae+a+es" Ia 0arias -ram.ticas equi0a)entes a )a anterior que no -eneran
mensa4es +e a0iso +e am6i-ae+a+" 3o 2rimero que 2ue+e ocurrirsenos es uti)i%ar un 2re+ica+o
sem.ntico5 asF
instSi :
RES_SI^ PARENT_AB! expresion PARENT_CE!
LLAVE_AB! listaInstrucciones LLAVE_CE!
alternativasSi;
alternativasSi
{ boolean hayOtras=false; } // variable local
:
( {hayOtras==false}? altSiNormal
| {hayOtras==false}? altSiOtras { hayOtras=true; }
)*
;
En ste e4em2)o se +ec)ara una 0aria6)e )oca) (n=tese que !a que +ec)arar)a antes +e )os +os
2untos +e )a re-)a) se uti)i%a como 2re+ica+o sem.nticoF so)amente se 2ue+en aCa+ir
a)ternati0as a )a instrucci=n si si no se !a ))e-a+o a )a a)ternati0a otras"
E) 2ro6)ema que tiene uti)i%ar 2re+ica+os sem.nticos 0aria6)es )oca)es es que )a -ram.tica a no
es in+e2en+iente +e) )en-ua4e" 9or e4em2)o5 en C++ no e:iste e) ti2o boolean (se uti)i%a )a
0ersi=n m.s re+uci+a bool)" Es recomen+a6)e 6uscar una a)ternati0a in+e2en+iente +e) )en-ua4e
-enera+o"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1)
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.-6 Nona de reglas
Ia muc!as otras maneras +e !acer)o que s son in+e2en+ientes +e) )en-ua4e -enera+o" #qu
2resento una5 que se 6asa en e) 0ie4o mto+o +e )a recursi=n"
instSi :
RES_SI^ PARENT_AB! expresion PARENT_CE!
LLAVE_AB! listaInstrucciones LLAVE_CE!
alternativasSi
;
protected alternativasSi
: altSiNormal alternativasSi
| altSiOtras
| /* nada */
;
cste con4unto +e re-)as funciona 2erfectamente i-ua) que e) anterior5 es casi i-ua) +e f.ci) +e
enten+er a+em.s no 2ro0oca nin-una situaci=n +e am6i-ae+a+"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1)1
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.)6 .ic2ero LeLi3arser.g
Becci%n #.": 5ic*ero LeLi@arser.g
E) fic!ero LeLiParser.g a) com2)eto ten+r. e) si-uiente as2ectoF
header{
package leli;
/*-----------------------------------------------*\
| Un intrprete para un Lenguaje Limitado(LeLi) |
| _____________________________________________ |
| |
| ANALISIS SINTCTICO |
| _____________________________________________ |
| |
| Enrique J. Garcia Cota |
\*-----------------------------------------------*/
}
/**
* El objeto que permite todo el analisis sintactico.
*/
class LeLiParser extends Parser;
options
{
k = 2;
importVocab = LeLiLexerVocab;
exportVocab = LeLiParserVocab;
buildAST = true;
}
tokens
{
// Tokens imaginarios para enraizar listas
PROGRAMA ;
LISTA_MIEMBROS;
LISTA_EXPRESIONES;
LISTA_INSTRUCCIONES;
// Tokens imaginarios que se utilizan cuando no hay races adecuadas
OP_MENOS_UNARIO;
INST_EXPRESION;
INST_DEC_VAR;
LLAMADA;
ATRIBUTO;
// Otros
TIPO_VACIO;
}
/**
* Un programa esta formado por una lista de definiciones de clases.
*/
programa : (decClase)+
{## = #( #[PROGRAMA, "PROGRAMA"] ,##);}
;
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1)2
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.)6 .ic2ero LeLi3arser.g
/** Definicin de una clase. */
decClase : RES_CLASE^ IDENT clausulaExtiende
LLAVE_AB! listaMiembros LLAVE_CE!
;
/** Clusula "extiende" **/
clausulaExtiende : RES_EXTIENDE^ IDENT
| /*nada*/
{ ## = #( #[RES_EXTIENDE,"extiende"],
#[IDENT, "Objeto"] ); }
;
/** Auxiliar para definicin de clase */
protected listaMiembros
: (decMetodo|decConstructor|decAtributo)*
{ ## = #( #[LISTA_MIEMBROS, "LISTA_MIEMBROS"] ,##);}
;
/**
* Declaracin de los diferentes tipos que se pueden usar en LeLi
*/
tipo : TIPO_ENTERO // tipo Entero
| TIPO_REAL // tipo Real
| TIPO_BOOLEANO // tipo Booleano
| TIPO_CADENA // tipo Cadena
| IDENT // tipo no bsico
;
declaracion ! // desactiva construccin por def. del AST
[AST r, AST t, boolean inicializacion] // parmetros
{
AST raiz = astFactory.dupTree(r); // copia del arbol
raiz.addChild(astFactory.dupTree(t)); // copia del rbol
}
: i1:IDENT
{
raiz.addChild(#i1);
## = raiz;
}
| { inicializacion }? // pred. semntico
i2:IDENT OP_ASIG valor:expresion
{
raiz.addChild(#i2);
raiz.addChild(#valor);
## = raiz;
}
| { inicializacion }?
i3:IDENT parentAb li:listaExpresiones parentCe
{
raiz.addChild(#i3);
raiz.addChild(#li);
## = raiz;
}
;
listaDeclaraciones [AST raiz, boolean inicializacion]
: t:tipo!
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1)-
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.)6 .ic2ero LeLi3arser.g
declaracion[raiz,#t,inicializacion]
(COMA! declaracion[raiz,#t,inicializacion])*
;
/**
* Definicin de un atributo (abstracto o no abstracto)
*/
decAtributo
{ boolean abstracto = false; }
: raiz:RES_ATRIBUTO^
( a:RES_ABSTRACTO { abstracto=true; } )?
listaDeclaraciones[#raiz, abstracto] PUNTO_COMA!
;
/** Definicin de un constructor */
decConstructor : RES_CONSTRUCTOR^ PARENT_AB! listaDecParams PARENT_CE!
LLAVE_AB! listaInstrucciones LLAVE_CE!
;
/** Definicin de un mtodo normal */
decMetodo
: RES_METODO^ (RES_ABSTRACTO)? tipoRetorno IDENT
PARENT_AB! listaDecParams PARENT_CE!
LLAVE_AB! listaInstrucciones LLAVE_CE!
;
/** Regla auxiliar que codifica el tipo de retorno de un mtodo */
protected tipoRetorno
: tipo
| /* nada */ {## = #[TIPO_VACIO,"TIPO_VACIO"]; }
;
/** Lista de parmetros. */
listaDecParams
{ final AST raiz = #[RES_PARAMETRO,"parmetro"] ;}
:
( listaDeclaraciones[raiz, false]
( PUNTO_COMA! listaDeclaraciones[raiz, false])*
)? // opcional
;
/**
* Regla que sirve para empezar a reconocer las expresiones de LeLi
*/
expresion: expAsignacion;
/** Asignaciones (nivel 9) */
expAsignacion : expOLogico (OP_ASIG^ expOLogico)? ;
/** O lgico (nivel 8) */
expOLogico : expYLogico (OP_O^ expYLogico)* ;
/** Y lgico (nivel 7) */
expYLogico : expComparacion (OP_Y^ expComparacion)* ;
/** Comparacin (nivel 6) */
expComparacion
: expAritmetica
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1))
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.)6 .ic2ero LeLi3arser.g
(
( OP_IGUAL^ | OP_DISTINTO^ | OP_MAYOR^ | OP_MENOR^
| OP_MAYOR_IGUAL^ | OP_MENOR_IGUAL^
)
expAritmetica
)*
;
/** Suma y resta aritmtica (nivel 5) */
expAritmetica : expProducto ((OP_MAS^ | OP_MENOS^) expProducto)* ;
/** Producto y divisin (nivel 4) */
expProducto : expCambioSigno
((OP_PRODUCTO^ | OP_DIVISION^) expCambioSigno)*
;
/** Cambio de signo (nivel 3) */
expCambioSigno :
( OP_MENOS! expPostIncremento
{ ##=#(#[OP_MENOS_UNARIO, "OP_MENOS_UNARIO"], ##) ;}
)
| (OP_MAS!)? expPostIncremento
;
/** Postincremento y postdecremento (nivel 2) */
expPostIncremento : expNegacion (OP_MASMAS^|OP_MENOSMENOS^)? ;
/** Negacin y accesos (nivel 1) */
expNegacion : (OP_NO^)* expEsUn
;
/** EsUn + accesos (nivel 0) **/
expEsUn : acceso (RES_ESUN^ tipo)*
;
/**
* Regla que permite reconocer los accesos de las expresiones de LeLi.
* Los accesos son los valores que se utilizan en las expresiones:
* literales, variables, llamadas a mtodos, etc.
*/
acceso : r1:raizAcceso { ## = #(#[ACCESO], #r1); }
( PUNTO! sub1:subAcceso! { ##.addChild(#sub1); } )*
| r2:raizAccesoConSubAccesos { ## = #(#[ACCESO], #r2); }
( PUNTO! sub2:subAcceso! { ##.addChild(#sub2); } )+
;
/**
* Raz de los accesos que no son llamadas a un mtodo de la
* clase "actual"
*/
raizAcceso : IDENT
| literal
| llamada
| conversion
| PARENT_AB! expresion parentCe
;
/**
* Raz de los accesos que no son llamadas a un mtodo de la
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1)0
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.)6 .ic2ero LeLi3arser.g
* clase "actual" y que obligatoriamente van sucedidos de un subacceso
*/
raizAccesoConSubAccesos
: RES_PARAMETRO
| RES_ATRIBUTO
| RES_SUPER
;
/** Regla que reconoce los literales */
literal : LIT_ENTERO
| LIT_REAL
| LIT_CADENA
| LIT_NL
| LIT_TAB
| LIT_COM
| LIT_CIERTO
| LIT_FALSO
;
/**
* Esta regla se utiliza tanto para representar:
* 1) Una llamada a un mtodo del objeto actual
* 2) Un subacceso en forma de llamada.
* 3) Una llamada a un constructor del objeto actual
* 4) Un subacceso en forma de constructor.
*/
llamada : IDENT PARENT_AB! listaExpresiones PARENT_CE!
{ ## = #(#[LLAMADA,"LLAMADA"],##); }
| RES_CONSTRUCTOR^ PARENT_AB! listaExpresiones PARENT_CE!
;
/**
* Regla auxiliar que reconoce los parmetros de una llamada
* a un mtodo y la inicializacin del bucle "desde"
*/
protected listaExpresiones
: ( expresion (COMA! expresion)* )?
{ ## = #(#[LISTA_EXPRESIONES, "LISTA_EXPRESIONES"],##); }
;
/** Conversin entre tipos */
conversion : RES_CONVERTIR^
PARENT_AB! expresion COMA! tipo PARENT_CE!
;
/** Regla que reconoce los accesos a atributos y mtodos de un objeto. */
subAcceso
: llamada
| IDENT
| RES_SUPER
;
/** Una lista de 0 o ms instrucciones */
listaInstrucciones
: (instruccion)*
{## = #( #[LISTA_INSTRUCCIONES,"LISTA_INSTRUCCIONES"], ##);}
;
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1),
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.)6 .ic2ero LeLi3arser.g
/**
* Las instrucciones. Pueden ser expresiones, instrucciones de control,
* declaraciones de variables locales o la instruccin volver.
*/
instruccion : (tipo IDENT)=>instDecVar // declaracin
| instExpresion // Instruccin - expresin
| instMientras // bucle mientras
| instHacerMientras // bucle hacer-mientras
| instDesde // bucle desde
| instSi // Instruccin Si
| instVolver // Instruccin volver
| instNula // Instruccin Nula
;
/** Instruccin nula */
instNula : PUNTO_COMA! ;
/** Instruccin volver */
instVolver : RES_VOLVER PUNTO_COMA! ;
/** Instruccin-expresin */
instExpresion: expresion PUNTO_COMA!
{## = #( #[INST_EXPRESION,"INST_EXPRESION"], ##);}
;
/** Declaracin de variables locales */
instDecVar
{ final AST raiz = #[INST_DEC_VAR,"variable"]; }
: listaDeclaraciones[raiz,true] PUNTO_COMA! ;
/** Bucle "mientras" */
instMientras : RES_MIENTRAS^ PARENT_AB! expresion PARENT_CE!
LLAVE_AB! listaInstrucciones LLAVE_CE!
;
/** Bucle "hacer-mientras" */
instHacerMientras : RES_HACER^ LLAVE_AB! listaInstrucciones LLAVE_CE!
RES_MIENTRAS PARENT_AB! expresion PARENT_CE!
PUNTO_COMA!
;
/** Bucle "desde" */
instDesde : RES_DESDE^ PARENT_AB! listaExpresiones PUNTO_COMA!
listaExpresiones PUNTO_COMA!
listaExpresiones PARENT_CE!
LLAVE_AB! listaInstrucciones LLAVE_CE!
;
/** Instruccion "si" muy parecida a la del lenguaje LEA. */
instSi :
RES_SI^ PARENT_AB! expresion PARENT_CE!
LLAVE_AB! listaInstrucciones LLAVE_CE!
alternativasSi
;
/**
* Auxiliar (reconoce las alternativas de la instruccin "si"
* sin warnings de ambiguedad)
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1)7
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.)6 .ic2ero LeLi3arser.g
*/
protected alternativasSi
: altSiNormal alternativasSi
| altSiOtras
| /* nada */
;
/** Auxiliar (alternativa normal de la instruccin "si") */
protected altSiNormal : BARRA_VERT^ PARENT_AB! expresion PARENT_CE!
LLAVE_AB! listaInstrucciones LLAVE_CE!
;
/** Auxiliar (alternativa final "otras" de la instruccin "si") */
protected altSiOtras : BARRA_VERT! RES_OTRAS^
LLAVE_AB! listaInstrucciones LLAVE_CE!
;
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1)/
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.06 %ompilaci(n del anali:ador
Becci%n #.#: &om'ilaci%n del anali8ador
7o !a -ran+es +iferencias entre com2i)ar e) ana)i%a+or ):ico e) sint.ctico" *u2on+remos +e
nue0o que e) 2aquete )e)i se encuentra en e) +irectorio c:\languajes\leli" *it?ese en
c:\languajes\leli escri6a )o si-uiente
38
F
c:\languajes\leli\> java antlr.Tool LeLiParser.g
En e) +irectorio leli +e6er.n !a6er a2areci+o )os si-uientes nue0os fic!erosF
X LeLiParser.java
X LeLiParserVocabTokenTypes.java
X LeLiParserVocabTokenTypes.txt
# estas a)turas +e6era ser e0i+ente )a funci=n +e ca+a uno +e stos fic!erosF e) 2rimero es e)
ana)i%a+or 2ro2iamente +ic!o5 mientra que )os otros +os )e sir0en 2ara 2asar)e a) ana)i%a+or
sem.ntico )os toHens"
9ara 2o+er com2i)ar LeLiParser.java ser. necesario que LeLiParserVocabTokenTypes.java
est com2i)a+o5 y tam+i$n 6e6i6e<er>ocab+o7en+ypes.9ava" En -enera)5 2ara 2o+er
com2i)ar e) ana)i%a+or +e un ni0e) es necesario que to+os )os fic!eros +e )os ni0e)es anteriores
estn 2erfectamente com2i)a+os +is2oni6)es" #s que5 si no )o !a !ec!o a5 com2i)e e)
ana)i%a+or sint.cticoF
c:\languajes\leli\> java antlr.Tool LeLiParser.g
3a !erramienta ant)r"$oo) a+mite a+em.s 0arias o2ciones +e com2i)aci=n" Pui%.s una +e )as m.s
interesantes sea trace5 que 2ermite se-uir )a tra%a +e) ana)i%a+orF
c:\languajes\leli> java antlr.Tool -trace LeLiLexer.g
/na 0e% -enera+os to+os )os fic!eros 4a0a necesarios5 se 2o+r.n com2i)ar con )a or+enF
c:\languajes\leli> javac *.java
E) com2i)a+or +e 4a0a no +e6era mostrar mensa4e a)-uno5 si-nifican+o que to+o !a i+o 6ien"
*i se requiere informaci=n +e +e6u- (a)-o mu +esea6)e en )as 2rimeras fases +e) +esarro))o) se
+e6e aCa+ir )a o2ci=n A- a) com2i)a+or +e 4a0aF
c:\languajes\leli> javac -g *.java
38 Como siem2re5 2ara 2o+er uti)i%ar #7$38 i-ua) que en )os e4em2)es ser. necesario que est correctamente insta)a+o"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1)<
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.,6 !5ecuci(n6 modi4icaciones en la clase Tool
Becci%n #.+: jecuci%n: modi!icaciones en la clase >ool
#.+.1: /ntroducci%n
En e) ca2tu)o anterior !emos em2e%a+o a tra6a4ar con )a c)ase leli.Tool"
1e momento !emos im2)ementa+o )os ni0e)es ):ico sint.ctico5 )a construcci=n +e) #*$
inicia)" #unque no !aamos im2)ementa+o to+as )as fases5 a se 2ue+en em2e%ar a !acer cosas
m.s DinteresantesE que sim2)emente im2rimir e) f)u4o +e toHens" 9or e4em2)o5 2o+emos mostrar
2or 2anta))a e) #*$ (en )u-ar +e un f)u4o +e toHens5 mostraremos una 4erarqua +e no+os #*$)"
En este a2arta+o e:2)icar c=mo im2)ementar una c)ase $oo) Dincom2)etaE5 que se )imite a
ana)i%ar un fic!ero escrito en )en-ua4e 3e3i muestre su #*$ 2or 2anta))a" ,m2rimiremos un
2ro-rama mu senci))o en )a 2anta))a5 como e) si-uienteF
clase Inicio
{
mtodo inicio()
{
Sistema.Imprime(Hola mundo!+nl);
}
}
#7$38 2ro2orciona +os maneras +e o6tener una re2resentaci=n 0isua) +e un #*$F con una
ca+ena +e te:to sim2)e5 uti)i%an+o una notaci=n 2areci+a a )a +e) )en-ua4e 3,*95 una muc!o
m.s com2rensi6)e 2ara )os !umanos5 6asa+a en un com2onente *\,7G +e 4a0a"
#.+.2: /nter'retando la lAnea de comandos: el 'aquete antlraux.cl'arse
;resentacin
3a anti-ua 0ersi=n +e leli.Tool no es mu f)e:i6)e" 9ara mo+ificar )a forma en que se rea)i%a6a
e) an.)isis (2or e4em2)o5 2ara acti0ar^+esacti0ar e) an.)isis sint.ctico) es necesario mo+ificar e)
c=+i-o +e leli.Tool recom2i)ar"
En )u-ar +e uti)i%ar esta tcnica5 es muc!o m.s sim2)e uti)i%ar )a )nea +e coman+os" Con unos
cuantos 2ar.metros5 2o+remos contro)ar 2erfectamente e) com2ortamiento +e nuestra
!erramienta5 sin tener que recom2i)ar a ca+a 0e%"
Cuan+o se trata +e un 2ar +e coman+os +iferentes es senci))o inter2retar)os Da manoE" *in
em6ar-o5 cuan+o e) n?mero +e coman+os a contro)ar aumenta5 ca+a uno tiene un n?mero un
ti2o +e 2ar.metros +iferentes5 !acer)o as 2ro+uce un c=+i-o rea)mente +esa-ra+a6)e
+ifci)mente manteni6)e@ 0arias instrucciones switch enca+ena+as ))enas +e con+iciona)es (if-
elseif-elseif-else""")"
Jaime Cru% Bena o (Enrique Jos Garca Cota) nos encontramos con +ic!o 2ro6)ema mientras
tra6a4.6amos en una 2r.ctica +e 4a0a5 en )os )a6oratorios +e) ,*E9 (Institute 0uperieur
dLElectroniFue de >aris)5 +urante e) 2rimer semestre +e '00'" 1eci+imos im2)ementar un
2aquete que 2ermitiera inter2retar )a )nea +e coman+os con 2ocas )neas +e c=+i-o5 +e una
manera sim2)e e)e-ante" 3)amamos a +ic!o 2aquete clparse (2or 2ommand Line >/?0E)"
Ie inc)ui+o e) 2aquete clparse +entro +e antlraux5 +e forma que su nue0o nom6re es
antlraux.clparse"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 10
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.,6 !5ecuci(n6 modi4icaciones en la clase Tool
,uncionamiento
E) funcionamiento +e ant)rau:"c)2arse es senci))oF to+o -ira en torno a )a c)ase
CommandLineParser" csta ser. )a c)ase encar-a+a +e reconocer )a )nea +e coman+os e4ecutar
)as acciones o2ortunas" 3a maora +e )os usuarios ten+r.n suficiente con crear una so)a instancia
+e CommandLineParser5 aunque na+a im2i+e crear 0arias instancias +iferentes"
/na 0e% crea+o e) CommandLineParser5 (2as.n+o)e como 2ar.metro e) nom6re +e )a a2)icaci=n
4a0a que 0a a inter2retar )a )nea +e coman+os) es necesario es2ecificar)e )os +iferentes coman+os
que 2ue+e reconocer5 as como )os 2ar.metros que +e6en tomar )as acciones a efectuar con
e))os"
$o+o e))o se rea)i%a uti)i%an+o e) mto+o addComand" cste tiene e) si-uiente 2rototi2oF
public void addCommand( Object executer, String commandName,
String methodName, String paramTypes,
String description )
throws CommandLineParserException
Ramos a 0er qu si-nifica ca+a 2ar.metro"
methodName ser. e) nom6re +e) nue0o coman+o a aCa+ir" 9or e4em2)o5 si un coman+o es DAfE
entonces e) nom6re +e) comentario es DAfE" E) si-uiente 2ar.metro5 paramTypes5 sir0e 2ara
es2ecificar un 2ar.metro" #s5 si DAfE ace2ta una ca+ena como 2ar.metro (como un nom6re +e
fic!ero) entonces e) 2ar.metro paramTypes ser. )a ca+ena DsE (DsE 2or Dstrin-E5 ca+ena)" Es
2osi6)e aCa+ir 2ar.metros +e ti2o ca+ena (s)5 entero(i)5 car.cter(c)5 f)otante(f) o 6oo)eano (6)"
$am6in5 aunque es infrecuente5 es 2osi6)e aCa+ir m.s +e un 2ar.metro a ca+a coman+o5
aCa+ien+o sim2)emente m.s caracteres a )a ca+ena" 1e esta manera5 si DAfE tomara como
2ar.metro una ca+ena5 un entero un 6oo)eano paramTypes sera Dsi6E"
3os 2ar.metros e:ecuter methodName sir0en 2ara co+ificar )as acciones a rea)i%ar tras
reconocer un coman+o en )a )nea +e coman+os" e:ecuter es un o64eto cua)quiera (una instancia
cua)quiera +e una c)ase)5 met!o+7ame es e) nom6re +e uno +e )os mto+os +e +ic!o o64eto" 3o
que !ar. e) CommandLineParser cuan+o recono%ca un coman+o ser.5 en 2rimer )u-ar5
transformar )os 2ar.metros +e +ic!o coman+o en 0aria6)es +e )os ti2os a+ecua+os (String5
Integuer5 Character5 Float o Boolean) e in0ocar e) mto+o ))ama+o Dmet!o+7ameE +e)
o64eto e:ecuter5 2as.n+o)e como 2ar.metros )as 0aria6)es anteriormente menciona+as" 9or )o
tanto es necesario que e) ti2o +e )os 2ar.metros +e) mto+o coinci+a con )os +efini+os en
paramTypes"
9or ?)timo5 +escri2tion es una +escri2ci=n +e )o que !ace e) 2ar.metro" Esta ca+ena ser. uti)i%a+a
2ara -enerar e) mensa4e +e au+a"
/na 0e% se !an aCa+i+o )as es2ecificaciones +e coman+os requeri+as5 )a )nea +e coman+os se
2ue+e )eer in0ocan+o parseWhilePossible" E) CommandLineParser Dtra+ucir.E )a )nea +e
coman+os a una serie +e tareas a rea)i%ar5 2o+r. e4ecutar)as con e) mto+o
executeWhilePossible"
*i en a)-?n momento +e to+o e) 2roceso se 2ro+uce un error5 se )an%ar. una e:ce2ci=n +e ti2o
CommandLineParserException"
+*emplo
Ramos a 0er to+o esto con un senci))o e4em2)o" Consi+rese )a si-uiente c)ase +e 4a0aF
// Es MUY importante que la clase ejecutora sea declarada pblica
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 101
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.,6 !5ecuci(n6 modi4icaciones en la clase Tool
public class Persona
{
private String Nombre=;
private boolean esVaron=false;
private int edad = 0;
public Persona() {}
public void ajustarNombre(String s)
{ Nombre = s; }
// Hay que utilizar las clases de java (Boolean, Character, Float, Integer)
// y *NO* los tipos bsicos del lenguaje (boolean, char, float, int)
public void ajustarSexo( Boolean b )
{ esVaron = b.booleanValue(); }
public void ajustarEdad( Inte%er i )
{ edad = i.intValue(); }
public String toString()
{
return Nombre + es + (esVaron?un hombre de : una mujer de) +
edad + aos);
}
}
#!ora ima-inemos que e) mto+o main est. en )a c)ase Main5 que tiene e) si-uiente as2ectoF
import antlraux.clparse.*;
public class Main
{
public static void main(String [] args)
{
CommandLineParser clp = new CommandLineParser( Main );
Persona p = new Persona(); // p ser el ejecutor de todos los comandos
try
{
clp.addCommand(p, -nombre, ajustarNombre, s, Cambia el nombre);
clp.addCommand(p, -edad, ajustarEdad, i, Cambia la edad);
clp.addCommand(p, -varon, ajustarSexo, b, Cambia el sexo);
clp.parseWhilePossible();
clp.executeWhilePossible();
} catch (CommandLineParserException clpe) {
System.err.println(clpe);
System.err.print(Usage: );
System.err.println(clp.getUsageString(true));
}
System.out.println(p.toString());
}
}
Ie aqu una muestra +e )o que o6ten+remos si e4ecutamos e) 2ro-rama re2eti+as 0ecesF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 102
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.,6 !5ecuci(n6 modi4icaciones en la clase Tool
$ java Main -nombre Manuel
Manuel es una mujer de 0 aos
$ java Main -nombre Juan -varon true -edad 30
Manuel es un hombre de 30 aos
$ java Main -nombre Mercedes -edad false
Could not parse an integer from false
Usage: java Main [commands]
-nombre String
Cambia el nombre
-edad Integuer
Cambia la edad
-varon Booleano
Cambia el sexo
$
Como 2ue+e 0erse CommanLineParser se encar-a inc)uso +e -enerar un mensa4e +e uso
a+ecua+o5 si se 2recisa" $am6in se encar-a +e -enerar )os errores a+ecua+os si es necesario
(2or e4em2)o5 si se es2era6a un entero no se 2u+o )eer)"
E) 2aquete clparse no est. +esarro))a+o con #7$38F e) an.)isis +e ca+a e)emento +e )a )nea +e
coman+os se !i%o Da manoE"
#.+.3: La lAnea de comandos inicial: el m0todo leli.>ool.LeeL&9;
Esta se-un+a 0ersi=n +e leli.Tool ace2tar. so)amente +e tres coman+osF
X -ventana booleano F #cti0a^+esacti0a )a 0entana +e) #*$ (2or +efecto +esacti0a+a)
X -f cadena F >i4a e) nom6re +e) fic!ero a reconocer (cam2o o6)i-atorio)
X -imprime booleano F #cti0a^+esacti0a )a im2resi=n en mo+o te:to +e) #*$ (2or +efecto
+esacti0a+o)"
3a c)ase Tool 2ro2orcionar. un mto+o5 ))ama+o LeeLC5 que tomar. como 2ar.metro )a )nea +e
coman+os (String [] args) )a )eer.5 confi-ur.n+ose a+ecua+amenteF
public class Tool
{
public String mensajeAyuda="";
public boolean mostrarVentana=false;
public String nombreFichero="";
public FileInputStream fis=null;
public boolean imprimeArbol=false;
public void fijarMostrarVentana(Boolean B)
{ mostrarVentana=B.booleanValue(); }
public void fijarNombreFichero(String s)
{ nombreFichero=s; }
public void fijarImprimeArbol(Boolean B)
{ imprimeArbol = B.booleanValue(); }
public Tool ()
{ }
public void leeLC(String args[])
throws CommandLineParserException
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 10-
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.,6 !5ecuci(n6 modi4icaciones en la clase Tool
{
CommandLineParser clp =
new CommandLineParser("leli.Tool", args);
clp.addCommand(this, "-ventana", "fijarMostrarVentana", "b",
"Ensea o no la ventana del AST (defecto no)");
clp.addCommand(this, "-f", "fijarNombreFichero", "s",
"Fija el nombre del fichero a reconocer");
clp.addCommand(this, "-imprime", "fijarImprimeArbol", "b",
"Imprime el AST en la salida estndar");
mensajeAyuda = clp.getUsageMessage(true);
clp.parseWhilePossible();
clp.executeWhilePossible();
if( nombreFichero==null ||
nombreFichero.equals("") )
{
throw new
CommandLineParserException("Se necesita un nombre de fichero");
}
try
{
fis = new FileInputStream(nombreFichero);
}catch (FileNotFoundException fnfe){
throw new CommandLineParserException(
"El fichero '"+nombreFichero+"' no se pudo abrir");
}
}
7=tese que en este caso e) De4ecutorE que mane4ar. e) CommandLineParser es Dt!isE5 es +ecir5 )a
2ro2ia Tool"
#.+.": l m0todo leli.>ool.im'rimeAyuda9;
Este mto+o es mu senci))oF su ?nica funci=n es im2rimir un mensa4e +e uso5 uti)i%an+o e)
mensa4e +e au+a suministra+o 2or e) CommandLineParser o6teni+o en LeeLC (atri6uto
mensajeAyuda)F
public void imprimeAyuda()
{
System.err.println(mensajeAyuda);
}
#.+.#: l nuevo m0todo main
1a+o que a!ora to+a )a funciona)i+a+ est. +entro +e )a 2ro2ia c)ase Tool5 e) mto+o main
so)amente tiene que crear una instancia +e leli.Too) ))amar a sus mto+osF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 10)
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.,6 !5ecuci(n6 modi4icaciones en la clase Tool
public static void main(String args[])
{
Tool t = new Tool();
try {
t.leeLC(args); // Lee la lnea de comandos
t.trabaja(); // Ejecuta los comandos
} catch (CommandLineParserException clpe) {
System.err.println(clpe.getMessage());
t.imprimeAyuda();
}
}
Iemos !ec!o que )as e:ce2ciones +e )a )nea +e coman+os5 que so)amente 2ue+en ser )an%a+as
2or leeLC5 se recu2eren tras ))amar a Tool.trabaja" #s5 si !a un error +urante )a )ectura +e )a
)nea +e coman+os5 no se e4ecuta nin-?n an.)isis" Este mto+o no +e6era cam6iar m.s +e a!ora
en a+e)ante"
*o)amente nos que+a 2or estu+iar e) mto+o trabaja"
#.+.+: l m0todo leli.>ool.trabaja9;
En este nue0o mto+o es en e) que se rea)i%a to+o e) Dtra6a4oE +e an.)isis5 +e acuer+o con )os
coman+os que !emos 2ro2orciona+o a )a !erramienta"
;asos
Ia que tener c)aro )o que )a !erramienta +e6e !acer en este caso" 1e6eF
1" 3eer coman+os +e )a )nea +e coman+os" Entre e))os +e6e a2arecer e) nom6re +e) fic!ero a
)eer"
'" Crear un ana)i%a+or ):ico +e 3e3i5 uti)i%an+o 2ara crear)o e) fic!ero a) ana)i%a+or ):ico en
forma +e FileInputStream.
3" 9ro2orcionar e) nom6re +e) fic!ero a) ana)i%a+or ):ico con e) mto+o setFilename()5
es2ecificar LexInfoToken como c)ase 2ara e) ana)i%a+or ):ico uti)i%an+o
set$oHen;64ectC)ass
4" Crear un ana)i%a+or sint.ctico +e 3e3i5 uti)i%an+o 2ara crear)o e) ana)i%a+or ):ico que se cre=
en e) 2aso '"
&" 9ro2orcionar e) nom6re +e) fic!ero a) ana)i%a+or sint.ctico con e) mto+o setFilename()"
6" 3an%ar )a 2rimera re-)a +e) ana)i%a+or sint.ctico" En nuestro caso es programa()"
(" ;6tener e) #*$ -enera+o 2or e) ana)i%a+or sint.ctico con e) mto+o getAST()"
8" Bostrar e) #*$ 2or 2anta))a"
E) 2aso 1 a est. im2)ementa+o en e) mto+o LeeLC" E) mto+o tra6a4a se encar-ar. +e )os 2asos
+e) 1 a) 8" 7otaF si no se tiene c)aro cua)quier 2aso entre e) 1 e) 6 )e su-iero que re)ea )os
ca2tu)os 1 '"
*i ocurre cua)quier error5 )a c)ase too) +e6er. mostrar un mensa4e acor+e con )"
Inicio
3a c)ase comen%ar. con )as +irecti0as +e im2ortaci=n )a +ec)araci=n +e) 2aqueteF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 100
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.,6 !5ecuci(n6 modi4icaciones en la clase Tool
package leli; // Tool forma parte del paquete LeLi
import java.io.*;
import antlr.collections.AST;
import antlr.collections.impl.*;
import antlr.debug.misc.*;
import antlr.*;
import antlraux.clparse.*;
import antlraux.util.*;
public class Tool
{
... <mtodos y atributos utilizados por LeeLC>
public void LeeLC(String[] args) { ... }
public class Tool() {} // Constructor de la clase (no hace nada)
public void trabaja()
{
try{
...
catch (TokenStreamException tse)
{
tse.printStackTrace(System.err);
}
catch (RecognitionException re)
{
re.printStackTrace(System.err);
}
}
Como 2ue+e 0erse5 e) mto+o tra6a4a +is2one +e sus 2ro2ios -estores +e errores5 in+e2en+ientes
+e )os encontra+os en e) mto+o main"
&ivel l2-ico
En )os 2asos ' 3 se 2re2ara e) ni0e) sem.ntico" *o)amente !a que co2iar )o que a !emos
im2)ementa+o anteriormente5 cam6ian+o )i-eramente e) nom6re +e) fic!eroF
System.out.println("Reconociendo el fichero '"+nombreFichero+"'");
// PASOS 4 y 5. Crear analizador sintctico y pasarle
// nombre fichero
LeLiLexer lexer = new LeLiLexer(fis);
lexer.setFilename(nombreFichero);
lexer.setTokenObjectClass("antlraux.util.LexInfoToken");
&ivel sintctico
En e) ni0e) sint.ctico so)amente ten+remos que crear e) ana)i%a+or )an%ar e) an.)isis"
// PASOS 4 y 5. Crear analizador sintctico y pasarle nombre Fichero
LeLiParser parser = new LeLiParser(lexer);
parser.setFilename(nombreFichero);
// PASO 6. Comenzar el anlisis
parser.programa();
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 10,
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.,6 !5ecuci(n6 modi4icaciones en la clase Tool
47tencin del AS'
;6ten+remos e) #*$ in0ocan+o e) mto+o getAST() +e) 2arser"
// PASO 7. Obtener el AST
AST ast = parser.getAST();
// PASO 7b. Activar la impresin de informacin extra a toString()
BaseAST.setVerboseStringConversion(
true,
LeLiParser._tokenNames);
E) 2aso (6 !ace que se aCa+a informaci=n a+iciona) a )os no+os #*$ cuan+o se im2riman 2or
2anta))a"
(epresentacin te-tual del AS'
3os mto+os AST.toStringTree() AST.toStringList() sir0en 2ara re2resentar un #*$ en
forma +e ca+ena" *i 6ien esta re2resentaci=n es ?ti) en ciertas ocasiones5 )o m.s norma) es que
nos +ecantemos 2or )a re2resentaci=n -r.fica5 m.s c=mo+a +e enten+er 2ara un !umano m.s
?ti)"
// PASO 8. Mostrar el AST por pantalla (modo texto)
if(imprimeArbol==true)
{
System.out.println(ast.toStringList());
}
(epresentacin gr)ica del AS'
9resentar )a ca+ena que re2resenta e) .r6o) est. 6ien5 2ero no es mu mane4a6)e 2ara )os
!umanos" 3a 0ersi=n +e 4a0a +e #7$38 2ermite uti)i%ar un sistema +e re2resentaci=n muc!simo
m.s interesante5 en una 0entana *\,7G" 9ara 0er)o5 2o+emos aCa+ir e) 2aso 9 +e re2resentaci=n
-r.fica +e) .r6o) #*$F
// PASO 9. Representacin en ventana del AST
final ASTFrame frame = new ASTFrame(Filename, ast);
frame.setVisible(true);
/na 0e% com2i)a+a )a c)ase $oo)5 a) 2asar)e e) si-uiente c=+i-oF
// Fichero test.leli
clase Inicio
{
mtodo inicio()
{
Sistema.Imprime(Hola mundo!+nl);
}
}
e4ecutan+o )a si-uiente )nea +e coman+osF
c:\> java leli.Tool test.leli
;6ten+remos esta 0entanaF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 107
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.,6 !5ecuci(n6 modi4icaciones en la clase Tool
Ilustracin ,., Mentana 0WIAN mostrando el /01 de OPola mundoO
/na 0entana es muc!o m.s ?ti) que una sim2)e ca+ena 2orqueF
X 9resenta )os +atos +e una manera m.s or+ena+a com2rensi6)e 2ara )as 2ersonas"
X Ca+a no+o 2ue+e com2rimirse o e:2an+irse !asta )as !o4as"
X 3a 0entana es +e tamaCo a4usta6)e"
"digo completo
# continuaci=n se )ista e) c=+i-o com2)eto +e )a c)ase leli.Tool actua)"
package leli; // Tool forma parte del paquete LeLi
import java.io.*;
import antlr.collections.AST;
import antlr.collections.impl.*;
import antlr.debug.misc.*;
import antlr.*;
import antlraux.clparse.*;
import antlraux.util.*;
public class Tool
{
public String mensajeAyuda="";
public boolean mostrarVentana=false;
public String nombreFichero="";
public FileInputStream fis=null;
public boolean imprimeArbol=false;
public void fijarMostrarVentana(Boolean B)
{ mostrarVentana=B.booleanValue(); }
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 10/
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.,6 !5ecuci(n6 modi4icaciones en la clase Tool
public void fijarNombreFichero(String s)
{ nombreFichero=s; }
public void fijarImprimeArbol(Boolean B)
{ imprimeArbol = B.booleanValue(); }
public Tool ()
{ }
public void leeLC(String args[])
throws CommandLineParserException
{
CommandLineParser clp =
new CommandLineParser("leli.Tool", args);
clp.addCommand(this, "-ventana", "fijarMostrarVentana", "b",
"Ensea o no la ventana del AST (defecto no)");
clp.addCommand(this, "-f", "fijarNombreFichero", "s",
"Fija el nombre del fichero a reconocer");
clp.addCommand(this, "-imprime", "fijarImprimeArbol", "b",
"Imprime el AST en la salida estndar");
mensajeAyuda = clp.getUsageMessage(true);
clp.parseWhilePossible();
clp.executeWhilePossible();
if( nombreFichero==null ||
nombreFichero.equals("") )
{
throw new
CommandLineParserException("Se necesita un nombre de fichero");
}
try
{
fis = new FileInputStream(nombreFichero);
}catch (FileNotFoundException fnfe){
throw new CommandLineParserException(
"El fichero '"+nombreFichero+"' no se pudo abrir");
}
}
public class Tool() {} // Constructor de la clase (no hace nada)
public void trabaja()
{
try{
System.out.println("Reconociendo el fichero '"+nombreFichero+"'");
// PASOS 4 y 5. Crear analizador sintctico y pasarle
// nombre fichero
LeLiLexer lexer = new LeLiLexer(fis);
lexer.setFilename(nombreFichero);
lexer.setTokenObjectClass("antlraux.util.LexInfoToken");
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 10<
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.,6 !5ecuci(n6 modi4icaciones en la clase Tool
// PASOS 4 y 5. Crear analizador sintctico y pasarle nombre Fichero
LeLiParser parser = new LeLiParser(lexer);
parser.setFilename(nombreFichero);
// PASO 6. Comenzar el anlisis
parser.programa();
// PASO 7. Obtener el AST
AST ast = parser.getAST();
// PASO 7b. Activar la impresin de informacin extra a toString()
BaseAST.setVerboseStringConversion(
true,
LeLiParser._tokenNames);
// PASO 8. Mostrar el AST por pantalla (modo texto)
if(imprimeArbol==true)
{
System.out.println(ast.toStringList());
}
// PASO 9. Representacin en ventana del AST
final ASTFrame frame = new ASTFrame(Filename, ast);
frame.setVisible(true);
}
catch (TokenStreamException tse)
{
tse.printStackTrace(System.err);
}
catch (RecognitionException re)
{
re.printStackTrace(System.err);
}
}
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1,
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.76 Atros aspectos de los A1Ts
Becci%n #.-: Otros as'ectos de los AB>s
#?n !a m.s cosas que sa6er +e )os #*$s" En ste a2arta+o se consi+erar.n as2ectos a0an%a+osF
f.6ricas .r6o)es !etero-neos" 3os uti)i%aremos en e) tema si-uiente"
#.-.1: 5(bricas de AB>s
1raducido del manual en ingls de /A1L?. )ic%ero trees.%tm.
#7$38 uti)i%a e) 2atr=n +e +iseCo f.6rica 2ara crear e interconectar )os no+os #*$" 1e esta
forma se se2ara )a construcci=n +e )os .r6o)es +e) ana)i%a+or sint.ctico5 2ro2orcionan+o un
D2uenteE entre e) ana)i%a+or )a construcci=n" 9ara im2)ementar una f.6rica +e #*$ 6asta con
!acer una su6c)ase +e antlr.ASTFactory a)terar e) mto+o create"
3a c)ase que se uti)i%a 2ara )os #*$ 2ue+e cam6iarse me+iante e) mto+o setASTNodeClass
(String className)" Como a !emos +ic!o5 )a c)ase que se uti)i%a 2or +efecto es
antlr.CommonAST"
3a c)ase antlr.ASTFactory tiene a)-unos mto+os -enricos mu ?ti)esF
public AST dup(AST t);
*ir0e 2ara co2iar un #*$" clone() no se uti)i%a 2orque queremos +e0o)0er un #*$5 no un
;64ect" #+em.s uti)i%an+o este mto+o 2o+emos contro)ar to+os )os #*$s que !an si+o crea+os
2or )a f.6rica"
public AST dupList(AST t);
1u2)ica a+em.s to+os )os !i4os !ermanos +e) #*$"
public AST dupTree(AST t);
1u2)ica un .r6o) com2)etamente5 asumien+o que tiene ra% (co2ia )os !i4os5 2ero no )os !ermanos
+e )a ra%)"
*****
7=tese que a !emos uti)i%a+o a)-unos +e estos mto+os a) e)iminar e) a%?car sint.ctica +e
nuestra -ram.tica"
#.-.2: AB>s *eterog0neos
1raducido del manual en ingls de /A1L?. )ic%ero trees.%tm.
Ca+a no+o en un .r6o) #*$ +e6e co+ificar informaci=n acerca +e) ti2o +e no+o que es@ es +ecir5
tiene que !a6er una manera +e sa6er que se trata +e un o2era+or OP_MAS o +e un ENTERO" Ia
+os maneras +e co+ificar +ic!a informaci=nF con un toHen o uti)i%an+o una c)ase (4a0a5 C++5 Ce)
+iferente 2ara ca+a ti2o" En otras 2a)a6ras5 se 2ue+e tener una so)a c)ase +e toHens con muc!os
ti2os (muc!os enteros +iferentes) o 6ien muc!as c)ases +iferentes" $erence ))am= a )os #*$s
Dcon una so)a c)aseE #*$s %eterogneos a )os que tienen muc!as c)ases %omogneos" 3a ?nica
ra%=n 2ara tener #*$s !etero-neos es 2ara e) caso en e) que )a informaci=n a a)macenar 0are
ra+ica)mente +e no+o a no+o"
#7$38 so2orta )os +os ti2os +e #*$s A La )a 0e%N" *i no se !ace na+a m.s que acti0ar )a o2ci=n
buildAST5 se o2tiene un .r6o) !omo-neo" B.s tar+e5 si se 2reten+e uti)i%ar c)ases fsicamente
ser2ara+as 2ara a)-unos +e )os no+os5 sim2)emente !a que es2ecificar)o en )a re-)a que
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1,1
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.76 Atros aspectos de los A1Ts
construe e) .r6o)" 1e esta manera se tiene )o me4or +e am6os mun+osF )os .r6o)es son
construi+os autom.ticamente5 2ero se 2ue+en a2)icar +iferentes mto+os -uar+ar informaci=n
+iferente so6re 0arios no+os" 7=tese que )a estructura +e) .r6o) 2ermanece ina)tera+a@ so)amente
cam6ia e) ti2o +e )os no+os"
#7$38 a2)ica una es2ecie +e Da)-oritmo +e conte:toE 2ara +eterminar e) ti2o +e ca+a no+o
2articu)ar que necesita crear" 9or +efecto e) ti2o es antlr.CommonAST5 2ero 2ue+e cam6iarse
con una in0ocaci=n +e) mto+o setASTNodeClass +e) ana)i%a+or sint.cticoF
myParser.setASTNodeClass("com.acme.MyAST");
En e) fic!ero +e +efinici=n +e )a -ram.tica (e) Y"-) se 2ue+e cam6iar e) ti2o cam6i.n+o)o 2ara
no+os crea+os a 2artir +e un toHen 2articu)ar" 9ara e))o !a que uti)i%ar )a o2ci=n
<AST=nombretipo> en )a secci=n +e toHensF
tokens {
OP_MAS<AST=OP_MASNode>;
}
$am6in es 2osi6)e cam6iar e) ti2o +e un toHen +entro +e una re-)aF
un_entero : ENTERO<AST=ENTERONode> ;
Esta ca2aci+a+ es mu ?ti) 2ara toHens como IDENT5 que 2o+ran con0ertirse a NOMBRETIPO en
unos conte:tos a VARIABLE en otros"
#7$38 usa )a f.6rica +e #*$s 2ara crear no+os +e )os cua)es no conoce e) ti2o es2ecfico
(so)amente sa6e que +e6en cum2)ir )a interfa% antlr.collections.AST)" En otras 2a)a6ras5
#7$38 -enera un c=+i-o 2areci+o a) si-uienteF
AST tmp2_AST = (AST)astFactory.create(LT(1));
9or otra 2arte5 si se es2ecifica una c)ase a uti)i%ar5 a sea en )a secci=n +e toHens o +entro +e una
re-)a5 #7$38 -enera ste otro5 m.s a2ro2ia+oF
ENTERONode tmp3_AST = (ENTERONode)astFactory.create(LT(1), ENTERONode);
#+em.s +e ser m.s r.2i+o e0i+ente5 este c=+i-o a)i-era otro 2ro6)ema con )os #*$s
!omo-neosF e) tener que !acer con0ersiones +e ti2o (castings) entre AST ENTERONode a )a
in0ersa en ca+a re-)a (aunque #7$38 2ermite es2ecificar e) ti2o +e no+o 2or +efecto con )a
o2ci=n ASTLabelType)"
*****
Ia muc!as ra%ones 2ara uti)i%ar #*$s !etero-neos" Pui%.s )a m.s im2ortante ten-a que 0er
con )a or-ani%aci=n +e )os no+os" 3os no+os !omo-neos 2ro2orciona+os 2or +efecto 2or
#7$38 no se mane4an mu faci)mente en to+os )os casos" 9or e4em2)o5 e) #*$ !omo-neo 2ara
e) si-uiente mto+o +e 4a0aF
public static void main(string [] args)
{
...
}
$en+ra un no+o 2or ca+a mo+ifica+or +e) mto+o (public5 static)5 otro se-ui+os +e) ti2o +e
retorno(0oi+) e) nom6re5 etc"
3a estructura +e ca+a #*$ 2o+r. cam6iar +e2en+ien+o +e )a or-ani%aci=n concreta que se uti)ice
2ara re2resentar )os mto+os5 +e manera que e) nom6re +e un mto+o 2o+r. estar en 2rimer
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1,2
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0.76 Atros aspectos de los A1Ts
)u-ar en )a )ista +e !i4os +e su #*$5 mientras que en otro est en tercer o cuarto )u-ar@ +e2en+er.
+e si )os mo+ifica+ores 2rece+en a) nom6re"
9ara e0itar estructuras +iferentes en .r6o)es +e) mismo ti2o5 )o me4or sera uti)i%ar un #*$
!etero-neo que 2ro2orcionara )a informaci=n +e )os mo+ifica+ores (que 2ermitiera !acer sa6er
si e) mto+o es 2?6)ico o est.tico) me+iante mto+os en c=+i-o nati0o (4a0a5 C++5 o Ce)5
e)imin.n+ose as )os no+os 2ro6)em.ticos +e) #*$"
;tra ra%=n es )a mera necesi+a+ +e a+4untar informaci=n" 3os no+os #*$ 2ro2orciona+os 2or
#7$38 no 2ro2orcionan informaci=n ):ica so6re )a informaci=n que contienen5 +e manera que
a )a !ora +e im2rimir un mensa4e +e error sem.ntico no se conoce e) fic!ero5 )nea co)umna
+on+e se !a 2ro+uci+o" *o)ucionaremos este 2ro6)ema uti)i%an+o )a c)ase LexInfoAST" 9ero no
a+e)antemos acontecimientos"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1,-
%aptulo 06 Anlisis sintctico de LeLi 1ecci(n 0./6 %onclusi(n
Becci%n #..: &onclusi%n
En ste ca2tu)o !emos 0isto c=mo rea)i%ar un an.)isis sint.ctico casi com2)eto (sa)0o 2or )a
-esti=n +e errores sint.cticos)" Como en e) ca2tu)o anterior5 no !emos uti)i%a+o to+as )as
ca2aci+a+es +e #7$38@ 2or e4em2)o5 no !emos a2ro0ec!a+oF
X Pue #7$38 2ermite )a !erencia +e ana)i%a+ores sint.cticos"
X Pue se 2ue+en uti)i%ar 0arios ana)i%a+ores ):icos con e) mismo ana)i%a+or sint.ctico"
X Pue se 2ue+en +ec)arar mto+os atri6utos 4a0a^C++^Ce en e) 2ro2io ana)i%a+or"
X Pue se 2ue+en 2asar 2ar.metros a )as re-)as5 +e0o)0er 2ar.metros con e))as"
X 3os 2re+ica+os sem.nticos (es me4or as@ )os 2re+ica+os sem.nticos !acen )a -ram.tica menos
2orta6)e)"
3o que s !emos 0isto !a si+oF
X C=mo im2)ementar un ana)i%a+or sint.ctico en un fic!ero i+en2en+iente5 comunicar)o con un
ana)i%a+or ):ico"
X C=mo crear un #*$ en un ana)i%a+or sint.ctico"
X C=mo e)iminar e) a%?car sint.ctica"
X C=mo mostrar un #*$ en una 0entana *\,7G"
En e) si-uiente ca2tu)o no 0amos a em2e%ar con e) an.)isis sem.ntico +e 3e3i" En )u-ar +e e))o5
0amos a e:ten+er un 2oco e) an.)isis sint.ctico 2ara -estionar me4or )os errores +urante e)
reconocimiento5 que en este ca2tu)o !emos i-nora+o"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1,)
Captulo 6:
Recuperacin de errores
El hombre ue ha cometido un error y no lo corrige comete otro error mayor.
Confucio
Captulo 6:
Recuperacin de errores...................................................................165
Seccin 6.1: Introduccin......................................................................................................160
+.1.1: Bituaci%n.................................................................................................................................. 1+-
+.1.2: La controversia........................................................................................................................ 1+-
+.1.3: 5ases....................................................................................................................................... 1+.
+.1.": Gesti%n de errores en bison y !lex........................................................................................... 1+.
+.1.#: rrores en anali8adores recursivos descendentes.................................................................. 1+1
+.1.+: rrores como exce'ciones...................................................................................................... 1+1
+.1.-: Fanejadores de exce'ciones.................................................................................................. 1-C
Seccin 6.2: +strategias de recuperacin........................................................................... 102
+.2.1: /ntroducci%n............................................................................................................................. 1-2
+.2.2: strategia basada en B/G,/$>.......................................................................................... 1-3
+.2.3: &onjuntos @R/FRO y B/G,/$>....................................................................................... 1-"
+.2.": strategia basada en @R/FRO O B/G,/$>..................................................................... 1-"
+.2.#: A'rovec*ando el modo '(nico................................................................................................ 1-#
+.2.+: >o:ens de sincronismo ........................................................................................................... 1-+
jem'lo 'revio: el modo '(nico !racasando estre'itosamente......................................................................1-+
@resentaci%n de los to:ens de sincronismo....................................................................................................1-.
+.2.-: /m'lementaci%n en A$>LR..................................................................................................... 1-.
l conjunto de to:ens de sincronismo.............................................................................................................1-1
l algoritmo de sincroni8aci%n........................................................................................................................1-1
@roblemas del algoritmo..................................................................................................................................1.C
+.2..: >ram'as 'ara exce'ciones..................................................................................................... 1.1
La amena8a !antasma.....................................................................................................................................1.1
MF(s manejadoresE..........................................................................................................................................1.2
@resentaci%n de la t0cnica de las tram'as.....................................................................................................1.2
+.2.1: Retardo en el tratamiento de errores....................................................................................... 1."
l 'roblema de la 2nada3 y $oHiableAltxce'tion..........................................................................................1."
&a'turando las exce'ciones............................................................................................................................1.+
ANn no *emos terminado................................................................................................................................1.-
Seccin 6.3: Implementacin < =erencia de gramticas.................................................... 1#1
+.3.1: l 'roblema............................................................................................................................. 1.1
+.3.2: @resentando la *erencia de gram(ticas en A$>LR................................................................ 1.1
+.3.3: Kerencia A$>LR EP Kerencia java.......................................................................................... 11C
+.3.": LAnea de comandos................................................................................................................. 113
+.3.#: <&%mo se relaciona todo esto con la R?.............................................................................. 113
+.3.+: /m'ortaci%n de vocabulario..................................................................................................... 113
Seccin 6.!: "ontrol de mensa*es: $a clase $ogger.......................................................... 11
+.".1: l 'roblema............................................................................................................................. 11#
+.".2: La clase Logger del 'aquete antlraux...................................................................................... 11+
Seccin 6.: /e*orando los mensa*es de error...................................................................111
+.#.1: /ntroducci%n............................................................................................................................. 111
+.#.2: &ambiando el idioma de los mensajes de error...................................................................... 111
+.#.3: Alias de los to:ens................................................................................................................... 2C1
Seccin 6.6: Aplicacin en el compilador de $e$i.............................................................. 2.
+.+.1: Acotaci%n del 'roblema: el !ic*ero de errores......................................................................... 2C#
+.+.2: A'licando los sAmbolos de sincronismo................................................................................... 2C+
Kaciendo :P1...................................................................................................................................................2C+
/n!raestructura 'ara los to:ens de sincronismo..............................................................................................2C.
Gua prctica de ANTLR 2.7.2 v 1. 1,0
+.+.3: &olocando las tram'as 'ara exce'ciones............................................................................... 2C1
+.+.": Retardando el tratamiento de errores...................................................................................... 212
+.+.#: rrores !recuentes acentuaci%n............................................................................................ 21"
l 'roblema...................................................................................................................................................... 21"
l m0todo......................................................................................................................................................... 21#
Las estrategias................................................................................................................................................. 21#
Fodi!icaciones en las reglas...........................................................................................................................21+
Huelta a los to:ens de sincronismo.................................................................................................................21-
+.+.+: l resultado.............................................................................................................................. 211
Seccin 6.0: "digo............................................................................................................... 221
+.-.1: 5ic*ero LeLiLexer.g................................................................................................................. 221
+.-.2: 5ic*ero LeLi@arser.g............................................................................................................... 22#
+.-.3: 5ic*ero LeLirrorRecovery@arser.g........................................................................................ 232
Seccin 6.#: "ompilando 3 e*ecutando el anali%ador.........................................................2!.
+...1: &om'ilaci%n............................................................................................................................. 2"C
+...2: jecuci%n................................................................................................................................. 2"C
$uevos comandos...........................................................................................................................................2"C
$uevo c%digo de la clase >ool........................................................................................................................2"1
Seccin 6.1: "onclusin........................................................................................................ 2!3
Gua prctica de ANTLR 2.7.2 v 1. 1,,
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.16 &ntroducci(n
Becci%n +.1: /ntroducci%n
+.1.1: Bituaci%n
3a recu2eraci=n +e errores no es una fase m.s +e) 2roceso +e com2i)aci=n" En )u-ar +e eso5
+e6era consi+erarse como una caracterstica +esea6)e +e) an.)isis ):ico sem.ntico"
Ilustracin ..1 ?ecuperacin de errores en el reconocimiento
3a recu2eraci=n +e errores 2ermite a) com2i)a+or +etectar un error5 +ar 2arte +e ) ! seguir
reconociendo la entrada5 +etectan+o +e esta manera m.s errores" *i e) 2ro-rama+or 2ue+e 0er
m.s errores en ca+a com2i)aci=n5 2o+r. corre-ir m.s errores en ca+a com2i)aci=n5 2or )o que
ser. m.s eficiente"
+.1.2: La controversia
3as o2iniones con res2ecto a )a recu2eraci=n +e errores son mu 0aria+as5 )as +iscusiones que
ocasiona est.n a) mismo ni0e) +e )as +iscusiones so6re +=n+e co)ocar )as ))a0es en C++ 4a0a
(O+e6a4o o a) )a+o +e )a ca6ecera +e )os mto+osQ)5 o si )os 2ro-ramas +e6eran ta6u)arse con
es2acios o con ta6u)aciones
39
"
3a contro0ersia -ira en torno a )a si-uiente 2re-untaF OEs rea)mente necesaria )a 8"E"Q
En internet !e )e+o comentarios +e -ente que o2ina que )a recu2eraci=n +e errores es una
2r+i+a +e tiem2o +inero" 3a i+ea 2rinci2a) +e ste ar-umento es que en )os tiem2os en )os que
)os 2ro-ramas se co+ifica6an en tar4etas 2erfora+as tena senti+o 2ro2orcionar to+os )os errores
+e com2i)aci=n 2osi6)es (2orque ca+a com2i)aci=n era )enta cara K !a6a que 2a-ar )as tar4etasN)
mientras que en )a actua)i+a+ )as com2i)aciones son r.2i+as 0irtua)mente -ratuitas (sa)0o 2or e)
coste en e)ectrici+a+)"
Es e0i+ente que )as 2ersonas que rea)i%an este ti2o +e afirmaciones no !an tra6a4a+o muc!o en
2roectos me+ianos o -ran+es" 9or mi 2ro2ia e:2eriencia 2ue+o +ecir que )as com2i)aciones
actua)es +e 2ro-ramas 2equeCos son actua)mente casi instant.neas" *in em6ar-o5 a) aumentar e)
n?mero +e +e2en+encias )i6reras a recom2i)ar5 e) tiem2o +e com2i)aci=n aumenta r.2i+amente5
so6re to+o si a+em.s inter0iene un 2ero+o +e en)a%a+o (o lin+age5 como +icen a)-unos)" En una
em2resa en )a que tra6a4 e) 2ro-rama 2rinci2a) (2ro-rama+o en C++) tar+a6a 30 minutos en
com2i)ar (en un ser0i+or */7 es2ecia)i%a+o en com2i)aci=n)" J eso sin contar con )as )i6reras
au:i)iares" cstas se so)an com2i)ar 2or )a noc!e5 en "atc%" J no esta6a -aranti%a+o que 2or )a
maCana to+as estu0ieran com2i)a+as"
39 9arece que nunca ))e-aremos a un acuer+o con res2ecto a estas o2ciones" 9or e4em2)o5 o so un 2ro-rama+or Da6a4o con
ta6u)acionesE" *in em6ar-o $erence 9arr es5 a 4u%-ar 2or e) c=+i-o +e #7$385 D+erec!a con es2aciosE"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1,7
C=+i-o
fuente
#n.)isis
sem.ntico
#n.)isis
sint.ctico
#n.)isis
):ico
Caracteres
$oHens
#*$
#*$
Generaci=n
+e c=+i-o
C=+i-o
m.quina
8ecu2eraci=n
+e errores
8ecu2eraci=n
+e errores
8ecu2eraci=n
+e errores
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.16 &ntroducci(n
#s que )as com2i)aciones actua)es no son tan Dr.2i+asEcomo a)-unos 2ue+an 2ensar" J tam2oco
tan 6aratas" 3os 30 minutos que un tcnico 2ier+e es2eran+o a que se com2i)e un 2ro-rama
su2onen 30 minutos +e su sue)+o 2er+i+o" /n sue)+o que no es 2recisamente 6a4o5 o a) menos
eso es2ero"
+.1.3: 5ases
3as tres fases 6.sicas +e )a -esti=n +e errores sonF
1" 1etecci=n" E) error se )oca)i%a
'" ,nforme" *e arc!i0a o muestra un mensa4e informati0o e:2)ican+o )a natura)e%a +e) error
3" 8ecu2eraci=n" E) ana)i%a+or uti)i%a a)-una tcnica Dsu2erarE e) error 2o+er se-uir efectuan+o
e) an.)isis"
+.1.": Gesti%n de errores en bison y !lex
3a -esti=n +e errores en #7$38 es +iferente +e )a -esti=n +e errores en 6ison f)e:5 2or )a
sim2)e ra%=n +e que )os reconoce+ores que -eneran son +istin-os" Bientras #7$38 -enera
reconoce+ores 33(H)5 6ison f)e: -eneran res2ecti0amente aut=matas finitos +eterministas
reconoce+ores 3#38(1)"
Reamos c=mo se -estionan )os errores en 6ison f)e:"
9ara em2e%ar5 f)e: no tiene nin-?n mecanismo +e recu2eraci=n autom.tica +e errores" Cuan+o
+urante e) an.)isis ):ico se encuentra a)-?n car.cter no es2era+o5 sim2)emente se im2rime un
mensa4e +e error 2or 2anta))a se termina )a a2)icaci=n"
Gison 2ermite un tratamiento muc!o m.s 2ersona)i%a+o +e )os errores" 1a+o que )os ana)i%a+ores
que -enera son 385 ca+a construcci=n sint.ctica +e) )en-ua4e +e 2ro-ramaci=n 2ue+e ser
reconoci+a 2or 0arias re-)as a )a 0e%@ so)amente una o +os sir0en 2ara reconocer)a5 mientras que
)as +em.s se uti)i%an 2ara -estionar erroresF
tipo : RES_ENTERO
| IDENT
;
tipo_pto_coma
: tipo PUNTO_COMA!
{$$ = $1;}
| tipo
{ $$ = $1; error(yylocation(),"Falta el ';' al final del tipo"); }
| error PUNTO_COMA!
{$$ = Lit_Error();yyerrok;}
;
3a re-)a anterior +e6e reconocer un ti2o se-ui+o +e un 2unto coma" *o)amente )a 2rimera
o2ci=n reconoce 0er+a+eramente )a re-)a@ )as otras +os -estionan errores (un 2unto coma que
fa)ta o un ti2o err=neo5 uti)i%an+o )a 2a)a6ra reser0a+a +e 6ison error)
Esta a2ro:imaci=n 2ermite una -ranu)ari+a+ mu fina en e) tratamiento +e errores@ 2r.cticamente
cua)quier error 2ue+e tratarse in+i0i+ua)mente" E) 2ro6)ema es que )as -ram.ticas crecen
r.2i+amente +e tamaCo se !acen m.s i)e-i6)es" #+em.s5 )as acciones 2ue+en 2otencia)mente
aCa+ir conf)ictos s%i&tCreduce a) ana)i%a+or"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1,/
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.16 &ntroducci(n
+.1.#: rrores en anali8adores recursivos descendentes
/n ana)i%a+or 33 es com2)etamente +iferente a uno 38" #m6os son Daut=matasE5 en e) senti+o
+e que )os +os tienen Desta+osE DtransicionesE" 3a +iferencia estri6a en )o que !a en )os
esta+os"
En un esta+o 38 !a D0arias re-)as que se est.n reconocien+o +es+e atr.sE" Cuan+o una +e )as
re-)as se reconoce com2)etamente se Dre+uceE5 as sucesi0amente !asta que se termina e)
an.)isis" Construcciones +e re-)as es2ecia)es (error5 en e) caso +e 6ison) 2ermiten Dreconocer )os
errores en )as re-)asE" Estas re-)as son i+nticas a )as norma)es sa)0o 2or que 2ro0ocan un
informe +e error 2or )as acciones sem.nticas que )as suce+an"
En un aut=mata 335 sin em6arco5 ca+a esta+o se corres2on+era con una so)a re-)a que se est.
reconocien+o (un mto+o +e) ana)i%a+or recursi0o)" 1e esta forma5 e) ana)i%a+or est.
Des2eran+oE un +etermina+o con4unto +e sm6o)os en ca+a momento +e) an.)isis" *i e) toHen que
se encuentra no concuer+a con +ic!o con4unto5 !a un error" #s5 )a estrate-ia +e +etecci=n +e
errores en 33 no 2asa 2or Dreconocer )os errores con re-)as es2ecia)esE" En )u-ar +e e))o5 un
error es Dcua)quier entra+a que no est en e) con4unto es2era+oE"
1e esta manera5 2ara escri6ir )a re-)a anterior en un ana)i%a+or +e #7$38 ten+ramos que
D)im2iarE to+as )as re-)as +e -esti=n +e erroresF
tipo_pto_coma: tipo PTO_COMA ;
;tro +e )os 2untos interesantes +e #7$38 es e) si-uiente Oqu se !ace cuan+o se +etecta un
errorQ
+.1.+: rrores como exce'ciones
3a res2uesta este interro-ante es mu senci))a5 tenien+o en cuenta que uti)i%amos un ana)i%a+or
recursi0o +escen+enteF E:ce2ciones"
En -enera)5 cua)quier error +e reconocimiento ):ico o sint.ctico en #7$38 im2)ica
e) )an%amiento +e una e:ce2ci=n"
En 2articu)ar5 )os mto+os 2ara reconocer toHens en e) ana)i%a+or sint.ctico (match al) )an%an
una e:ce2ci=n antlr.MismatchedTokenException" 9or otra 2arte5 cuan+o nin-uno +e )os
toHens +e) )ooHa!ea+ concuer+a con )os es2era+os en )as a)ternati0as +e una e:2resi=n con 0arias
a)ternati0as5 se )an%a antlr.NoViableAltException" 3os mto+os an.)o-os 2ara reconocer
caracteres en e) ana)i%a+or ):ico (match al) )an%an e:ce2ciones an.)o-as"
#7$38 -enera autom.ticamente c=+i-o 2ara -estionar )os errores5 aunque tam6in 2ue+e
es2ecificarse uno 2ro2io" #m6as o2ciones +esem6ocar.n en )a -eneraci=n +e un 6)oque
try/catch en0o)0ien+o )a 2arte +e c=+i-o -enera+o que efect?a e) reconocimiento" 3o que
cam6iara sera e) cuer2o +e) catch" *i no se es2ecifica nin-?n -estor +e errores (ni 2or +efecto
ni 2ersona)i%a+o)5 )a e:ce2ci=n se 2ro2a-ar. !acia afuera5 su6ien+o +e mto+o en mto+o !asta
sa)ir +e) ana)i%a+or" 8ecor+emos que )os reconoce+ores -enera+os 2or #7$38 son
reconoce+ores recursi0os +escen+entes"
9ara i)ustrar c=mo se -estionan )os errores en #7$385 0eamos )a funci=n que se -enerara 2ara
reconocer )a re-)a anterior
40
F
40 E) c=+i-o est. sim2)ifica+o 2ara que so)amente muestre e) c=+i-o +e -esti=n +e errores +e #7$38"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1,<
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.16 &ntroducci(n
protected void tipo_pto_coma()
{
try{
tipo();
match(PTO_COMA);
}catch (RecognitionException ex) {
reportError(ex);
consume();
consumeUntil(_tokenSet_XX);
}
}
9ue+en o6ser0arse )as 3 fases +e )a -esti=n +e erroresF
X 3a +etecci=n +e) error se rea)i%a con e) 6)oque try/catch
X E) informe +e) error se rea)i%a con )a ))ama+a a reportError5 en e) cuer2o +e) catch
X 3a recu2eraci=n es sim2)e" 9rimero5 se consume e) toHen que !a 2ro0oca+o e) error" 1es2us5
se 0an consumien+o toHens !asta que a)-uno +e e))os concuer+e con a)-uno +e )os e:istentes
en e) con4unto _tokenSet_XX (+on+e XX re2resenta 0arios +-itos cua)esquiera) Ie 2o+i+o
+e+ucir que +ic!o con4unto es e) con4unto SIGUIENTE(tipo_pto_coma)" Reremos un 2oco
m.s a+e)ante qu es este con4unto"
+.1.-: Fanejadores de exce'ciones
9ara mo+ificar )a manera en )a que )as e:ce2ciones son -estiona+as en #7$38 !a que
es2ecificar mane4adores de excepciones" /n mane4a+or +e e:ce2ciones es una acci=n que se
e4ecuta en )a 2arte catch +e )a c).usu)a try/catch 0ista m.s arri6a"
/na misma re-)a 2ue+e tener m.s +e un mane4a+or +e e:ce2ciones simu)t.neamente5 ca+a uno +e
e))os corres2on+in+ose a un 6)oque catch +istinto" /n as2ecto a resa)tar es que no tienen Fue
situarse o"ligatoriamente al &inal de una regla" $am6in 2ue+en cu6rir una so)a a)ternati0a entre
0arias e inc)uso un so)o e)emento con una etiqueta"
exception [etiqueta]
catch [tipoExcepcin variableExcepcin]
{ accin }
catch ...
catch ...
etiqueta es uti)i%a+o so)amente 2ara )os e)ementos que tienen etiqueta" tipoExcepcin es e) ti2o
+e )a e:ce2ci=n que 0amos a ca2turar (a menu+o RecognitionException)5
variableExcepcin es )a 0aria6)e en )a que se a)macena +ic!a e:ce2ci=n"
Ramos a 0er un e4em2)o +e ca+a ti2o +e mane4a+or +e e:ce2cionesF
X Bane4a+or 2ara to+a una re-)aF
exprSuma : exprProducto OP_SUMA^ exprProducto
; // Ntese que los manejadores generales se colocan tras el ;
exception catch [RecognitionException ex]
{ ... <tratamiento> ... }
X Bane4a+or 2ara una a)ternati0aF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 17
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.16 &ntroducci(n
instruccion : instFor
| instExpresion
exception catch [RecognitionException ex]
{ ... <tratamiento> ... }
| instSi
;
X Bane4a+or 2ara un e)emento con etiquetaF
instMientras : RES_MIENTRAS^ PARENT_AB! e:expresion PARENT_CE!
CORCHETE_AB! listaInst CORCHETE_CE!
;
exception [e] catch [RecognitionException ex]
{ ... <tratamiento> ... }
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 171
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.26 !strategias de recuperaci(n
Becci%n +.2: strategias de recu'eraci%n
+.2.1: /ntroducci%n
En 2rinci2io )a fase +e +etecci=n est. estu2en+amente resue)ta con e) mecanismo +e )as
e:ce2ciones
41
" En -enera) 6astar. con aCa+ir mane4a+ores +e e:ce2tiones 2ara !acer una 6uena
-esti=n" 9ero en ciertas ocasiones resu)tar. m.s c=mo+o uti)i%ar una re-)aAerror )an%ar una
e:ce2ci=n 2ersona)i%a+a"
Consi+eremos5 2or e4em2)o5 )a instrucci=n si +e 3e3i" 1a+a )a a6un+ancia +e )en-ua4es que
uti)i%an )a 2a)a6ra in-)esa if 2ara re2resentar )os con+iciona)es5 sue)e uti)i%arse sta 2or error en
)u-ar +e si" Es un error tan corriente que se 2o+ra 2ensar en inc)uir un mensa4e e:c)usi0o 2ar )"
9o+ramos !acer)o con a)-o 2areci+o a stoF
instSi : si:RES_SI^ PARENT_AB! expresion PARENT_CE!
LLAVE_AB! listaInst LLAVE_CE!
;
exception [si] catch [RecognitionException ex]
{
Token t= LT(1); // Obtiene el token que ha provocado el error
if(t.getText()==if) // Si es un if
{
// Utilizar la informacin lxica de la excepcin,
// pero cambiar el mensaje por otro.
reportError(
ex, Se debe utilizar la palabra reservada 'si', no 'if');
consume(); // consume el if y contina la regla
}
else throw ex; // otro tipo de error. Relanza la excepcin
}
*in em6ar-o5 e) c=+i-o es un 2oco +ifci) +e )eer" Es m.s senci))o es uti)i%ar una re-)aAerrorF
{ // mtodo auxiliar
public void reportError(String msg, String fileName, int line, int column)
{ antlrTool.error(msg, fileName, line, column); }
}
...
si : RES_SI
| siErroneo:IDENT {siErroneo.getText()== if}?
{
// Modificamos el AST para que contenga el nodo adecuado
siErroneo.setType(RES_SI);
siErroneo.set Text(si);
reportError(
Se debe utilizar la palabra reservada 'si', no 'if',
getFileName(), getLine(), getColumn()-2);
}
;
instSi : s:si! PARENT_AB! expresion PARENT_CE!
LLAVE_AB! listaInst LLAVE_CE!
// Hay que hacer de si la raz. No se puede utilizar
// el operador ^ sobre referencias a otras reglas!
{ ## = #(#s, ##); }
41 B.s a+e)ante 0eremos que a 0eces +etecta )os errores D+emasia+o 2rontoE"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 172
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.26 !strategias de recuperaci(n
;
E) mto+o antlrTool.error es e) que se ))ama D2or +e6a4oE en Parser.reportError" Ie
teni+o que uti)i%ar)o 2orque 2or +efecto no se suministra un Parser.reportError que 2ermita
inc)uir e) nom6re +e fic!ero5 )nea co)umna"
Centrmonos a!ora en )a recu2eraci=n +e errores"
3a fase +e +etecci=n consiste en encontrar una +iscor+ancia entre )a entra+a +e) ana)i%a+or sus
re-)as" 3a fase +e informe se )imita a mostrar un mensa4e informan+o so6re +ic!a +iscor+ancia"
9ues 6ien5 )a recu2eraci=n +e errores consiste en Dresincroni%ar )a entra+a con res2ecto a )as
re-)asE5 +e manera que se 2ue+a se-uir con e) an.)isis"
*e +istin-uen +os estrate-ias fun+amenta)es 2ara recu2erarse +e un errorF
X #Ca+ir5 si es 2osi6)e5 )os toHens que fa)ten en )a entra+a (como se !a !ec!o en )a sustituci=n
+e) toHen DifE 2or un DsiE)
X 1escartar toHens +e )a entra+a !asta que se encuentre un toHen 0.)i+o que 2ermita
Dsincroni%arE" csta es )a estrate-ia que uti)i%a #7$38 2or +efecto"
Iemos +e mencionar que )a estrate-ia +e #7$38 es 6uena5 resu)ta +ifci) me4orar)a" En esta
secci=n 0amos a 2resentar +iferentes estrate-ias +e recu2eraci=n5 2ero no )as uti)i%aremos to+as
en nuestro com2i)a+or" 3as que no uti)i%aremos est.n a! 2or si a)-uien )as necesita"
+.2.2: strategia basada en B/G,/$>
1a+a una e:2resi=n +e reconocimiento ( que 2ue+e ser una re-)a5 una a)ternati0a o una su6 re-)a
EG7>)5 se +efine e) con4unto SIGUIENTE(expresin) como e) con4unto +e toHens que 2ue+en
se-uir a +ic!a e:2resi=n en )a -ram.tica en )a que se encuentra" 9or e4em2)o5 en )a -ram.ticaF
base : IDENT
| LIT_ENTERO
| LIT_REAL
| LIT_CADENA
;
expresion : exprSuma ;
exprSuma : e1:exprProducto (OP_SUMA exprProducto)* ;
exprProducto : e2:base (OP_PRODUCTO base)* ;
9o+emos ca)cu)ar 0arios con4untos SIGUIENTE en +iferentes )u-ares (que !e marca+o con
etiquetas)F
X SIGUIENTE(exprSuma-la regla)F Es OP_SUMA o fin +e fic!ero"
X SIGUIENTE(e1)F Es OP_SUMA o fin +e fic!ero"
X SIGUIENTE(e2)F Es OP_PRODUCTO o fin +e fic!ero"
3a estrate-ia 6asa+a en SIGUIENTE es )a que uti)i%a #7$38" Consiste en5 una 0e% +etecta+o e)
error5 consumir toHens !asta que se encuentre a)-uno coinci+ente con e) con4unto SIGUIENTE +e
)a re-)a en )a que se !a +etecta+o" 3os 2asos a se-uir son e:actamente tresF
X Bostrar e) error a) usuario (con una ))ama+a a) mto+o reportError)
X Consumir e) toHen que !a 2ro0oca+o e) error ())aman+o a consume)
X Consumir toHens +e )a entra+a !asta que a)-uno sea 0.)i+o K 2ertene%ca a) con4unto
SIGUIENTE(regla)5 +on+e regla es )a re-)a en )a que se !a 2ro+uci+o e) error" $o+o e))o se
rea)i%a con una sim2)e ))ama+a a) mto+o consumeUntil5 2as.n+o)e como 2ar.metro e)
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 17-
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.26 !strategias de recuperaci(n
con4unto SIGUIENTE(regla)"
# )a estrate-ia 6asa+a en SIGUIENTE tam6in se )a conoce como Dmo+o 2.nicoE (panicCmode)"
+.2.3: &onjuntos @R/FRO y B/G,/$>
1urante e) tratamiento +e errores en )as acciones es 2osi6)e que necesitemos uti)i%ar )os
con4untos PRIMERO SIGUIENTE +e una re-)a" 9ara 2o+er uti)i%ar)os en )a recu2eraci=n +e
errores5 #7$38 2ro2orciona +os a6re0iaturasF
X $FIRST(etiqueta) es GitSet que re2resenta e) con4unto PRIMERO(expresion)5 sien+o
expresion e) toHen o referencia etiqueta+os con etiqueta" *in etiqueta se refiere a )a re-)a
que )o contiene"
X $FOLLOW(regla) es e) GitSet que re2resenta e) con4unto SIGUIENTE(regla)" *in etiqueta se
refiere a )a re-)a que )o contiene"
3a c)ase BitSet se encuentra en ant)r"co))ections"im2)" 9ro2orciona mto+os 2ara rea)i%ar
o2eraciones comunes con con4untos +e 6its5 +es+e aCa+ir un 0a)or a !acer una o2eraci=n
6oo)eana (or5 an+) con otro BitSet"
3a estrate-ia 6asa+a en SIGUIENTE +e #7$38 2ue+e 2or tanto escri6irse a mano5 con un
mane4a+or +e e:ce2ciones 2ara to+a )a re-)a" 9or e4em2)o5 e) si-uiente c=+i-oF
tipo_pto_coma
: tipo PTO_COMA
;
es equi0a)ente a este otroF
tipo_pto_coma
: tipo PTO_COMA
;
exception catch [RecognitionException ex]
{
// 1. Comunicar el error
reportError(ex);
// 2. Consumir el token problemtico
consume();
// 3. Consumir tokens
consumeUntil($FOLLOW(tipo_pto_coma));
// consumeUntil($FOLLOW); tambin sera correcto
}
+.2.": strategia basada en @R/FRO O B/G,/$>
Es una me4ora so6re )a estrate-ia 6asa+a en SIGUIENTE" #) i-ua) que en e))a5 se 6asa en ir
e)minan+o toHens que no sean a+ecua+os5 sa)0o que 2or e) !ec!o +e que a+em.s +e 2ro6ar con e)
con4unto SIGUIENTE +e )a re-)a5 se uti)i%a e) con4unto PRIMERO" *i e) 2rimer toHen que 2ertenece
a uno +e )os -ru2os 2ertenece a SIGUIENTE se uti)i%ar )a estrate-ia !a6itua) (fin +e )a re-)a)" 9or
otro )a+o5 si 2ertenece a) con4unto PRIMERO5 se reinicia el reconocimiento de la regla5 es +ecir5
)a re-)a en )a que se !a +etecta+o e) error 0ue)0e a reconocerse +es+e e) 2rinci2io K in0ocan+o +e
nue0o e) mto+o que reconoce )a re-)a"
Ia que tener en cuenta que e) con4unto SIGUIENTE tiene 2riori+a+ a6so)uta so6re e) con4unto
PRIMERO5 es +ecir5 que cuan+o un toHen est en )os +os5 si se encuentra5 sim2)emente se sa)+r. +e
)a re-)a"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 17)
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.26 !strategias de recuperaci(n
3a estrate-ia PRIMERO+SIGUIENTE no se uti)i%a +e forma !a6itua)5 a que en )a maora +e )os
casos )os e)ementos +e PRIMERO est.n conteni+os en SIGUIENTE5 as que fina)mente no se -ana
muc!o"
/n e4em2)o +e im2)ementaci=nF
asignacion: IDENT OP_ASIG^ expresion PUNTO_COMA! ;
exception catch [RecognitionException ex]
{
reportError(ex);
if($FIRST.member(LA(0)))
asignacion();
else
{
consume();
Bitset auxiliar = $FOLLOW.or($FIRST);
consumeUntil(auxiliar);
if( ! $FOLLOW.member(LA(0)) ) asignacion();
}
}
3os 2asos que se si-uen en )a recu2eraci=n son )os si-uientesF
X *e im2rime e) mensa4e +e error
X *i e) toHen que !a 2ro0oca+o e) error 2ertenece a PRIMERO(regla)5 se reinicia )a re-)a"
X *i no5 se consume se contin?an consumien+o toHens !asta que se encuentre uno que
2ertene%ca a PRIMERO(regla) o SIGUIENTE(regla)" *i 2ertenece a SIGUIENTE5 se consi+era
que )a entra+a est. sincroni%a+a con )a re-)a que si-a a )a actua)5 se sa)e +e )a re-)a" En otro
caso5 2ertenecer. a PRIMERO5 )ue-o se reinicia e) reconocimiento +e )a re-)a"
3a estrate-ia PRIMERO+SIGUIENTE es a+ecua+a 2ara re-)as sim2)es que se re2itan muc!simo" En
e) e4em2)o anterior sera a+ecua+a si )a re-)a asignacion sir0iera 2ara reconocer un fic!ero +e
confi-uraci=n +e un 2ro-rama que so)amente tu0iera asi-naciones"
+.2.#: A'rovec*ando el modo '(nico
Iasta a!ora !emos consi+era+o e) mane4o +e e:ce2ciones Da ni0e) +e re-)aE5 es +ecir5 cuan+o un
error es encontra+o mientras se est. reconocien+o una re-)a5 sta se +a 2or 2er+i+a5 e)iminan+o
sm6o)os !asta que se encuentra a)-uno que 2ermita su2oner que )a re-)a se !a termina+o
(sm6o)os +e sincronismo con4unto SIGUIENTE)" Iemos ))ama+o a esta estrate-ia e) Dmo+o
2.nicoE"
En -enera) e) mo+o 2.nico es mu ?ti)F )as re-)as D2equeCasE5 que reconocen unos 2ocos toHens
como m.:imo +e )a entra+a5 se recu2eran r.2i+amente" 9or )o -enera)5 )as re-)as mas D-ran+esE5
que reconocen m.s toHens5 est.n +i0i+i+as en re-)as m.s sim2)es5 en )as que se efect?a )a
recu2eraci=n" 9or )o tanto no sue)e !a6er 2ro6)emas"
L9ero !a que tener cui+a+oN E:isten a)-unos casos en )os que es recomen+a6)e otro ti2o +e
recu2eraci=n" 9or e4em2)o5 en c)ausuras rea)i%a+as so6re enumeraciones +e toHensF
inicializaciones : (IDENT OP_IGUAL LIT_ENTERO PUNTO_COMA)+ ;
3a re-)a anterior est. 2ensa+a 2ara 2o+er reconocer un con4unto +e 1 o m.s Dinicia)i%acionesE"
/na inicia)i%aci=n es un i+entifica+or se-ui+o +e) o2era+or i-ua) un entero5 aca6an+o un
2unto coma" E) c=+i-o 4a0a que se -enerar. se-uir. e) si-uiente esquemaF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 170
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.26 !strategias de recuperaci(n
void inicializaciones()
{
try
{
do{
match(IDENT);
match(OP_IGUAL);
match(LIT_ENTERO);
match(PUNTO_COMA);
} while(true);
} catch (RecognitionException Ex) {
// Modo pnico
...
}
}
3a re-)a 2ue+e ser0ir5 2or e4em2)o5 2ara )eer un fic!ero +e confi-uraci=n" ,ma-inemos que se
trata +e un fic!ero e:tenso5 +e 10000 inicia)i%aciones5 que !a un error en )a se-un+a" *e
)an%ar. un error se em2e%ar.n a consumir toHens !asta que se encuentre uno 2erteneciente a)
con4unto SIGUIENTE(inicializaciones)" 3as 9998 inicia)i%aciones 2en+ientes se consumir.n
en e) mo+o 2.nico5 no se 6uscar.n m.s errores"
Este ti2o +e situaciones es mu f.ci) +e arre-)arF 6asta con uti)i%ar una re-)a a+iciona)" #sF
inicializaciones : (inicializacion)+ ;
inicializacion : (IDENT OP_IGUAL LIT_ENTERO PUNTO_COMA)+ ;
#!ora se uti)i%ar.n +os 6)oques try-catch5 uno en ca+a mto+o +e )as re-)as" *i se )e 2asa )a
misma entra+a que en e) caso anterior5 e) error +e )a se-un+a inicia)i%aci=n se recu2erar. +entro
+e )a re-)a inicializacion5 muc!simo antes"
En e) caso anterior es 2osi6)e e inc)uso m.s )e-i6)e uti)i%ar 0arias re-)as 2ara +efinir )a -ram.tica"
Este mto+o es e) m.s recomen+a6)e 2ara ace)erar )a recu2eraci=n +e) mo+o 2.nico"
E:iste una a)ternati0a5 6astante m.s a2aratosa5 consistente en uti)i%ar )os mane4a+ores +e
e:ce2ci=n internos +e )as re-)as" *o)amente es recomen+a6)e si )a recu2eraci=n 2or +efecto +e
#7$38 no es satisfactoria" Es +ecir5 que es mu 2oco recomen+a6)e"
#2ro0ec!ar e) mo+o 2.nico consiste5 2ues5 en +i0i+ir )as re-)as D-ran+esE en re-)as
m.s D2equeCasE 2ara que )os errores se recu2eren cuanto antes"
+.2.+: >o:ens de sincronismo
3a estrate-ia que 0amos a uti)i%ar en nuestro com2i)a+or es )a +e )os toHens +e sincronismo" /n
2oco m.s a+e)ante +efiniremos 2ro2iamente qu son )os toHens +e sincronismo5 2ero antes 0amos
a comen%ar con un e4em2)o 2re0io5 que i)ustrar. c=mo a)-unas situaciones 2ue+en +e4ar Dfuera +e
com6ateE a) mo+o 2.nico"
+*emplo previo: el modo pnico )racasando estrepitosamente
,ma-inemos que estamos reconocien+o )a si-uiente entra+aF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 17,
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.26 !strategias de recuperaci(n
clase A
{
mtodo m1(Entero pA)
{
pA ++ // Error! Falta un punto y coma!
}
}
clase B
{
atributo Entero aC;
mtodo m2()
{
aC++;
}
}
En e) c=+i-o !a un errorF fa)ta un 2unto coma" *i-uien+o )a tra%a +e) ana)i%a+or
4'
5 2o+emos
0er que e) error ser. +etecta+o en )a re-)a expPostIncremento" En expPostIncremento se
estar. es2eran+o un e)emento +e su con4unto SIGUIENTE5 2ero en )u-ar +e e))o !a6r. o6teni+o
una ))a0e cerra+a (LLAVE_CE5 [g[)"
*u2on-amos que e) con4unto SIGUIENTE(expPostIncremento) contiene e) 2unto coma ([@[)5 e)
2unto (["[) e) 2arntesis cerra+o ([)[)" Es +ecir5
SIGUIENTE(expPostIncremento)={PUNTO_COMA, PUNTO, PARENT_CE}
43
"
Entonces5 +a+o que LLAVE_CE no 2ertenece a SIGUIENTE(expPostIncremento)5 e)
reconoce+or sim2)emente i-norar. e) toHen5 em2e%ar. a consumir toHens !asta que encuentre
uno que s 2ertene%ca a +ic!o con4unto" J as comen%ar. una curiosa reacci=n en ca+ena"
3a ))a0e que se !a Dtra-a+oE e) mo+o 2.nico era )a ))a0e +e cierre +e) ?)timo mto+o +e una c)ase"
Esta ))a0e 0iene se-ui+a +e otra ))a0e +e cierre +e )a c)ase5 que tam6in ser. Dtra-a+aE5 as como
)a ca6ecera +e )a +efinici=n +e )a c)ase que 0en-a +etr.s c)ase (RES_CLASE IDENT etc""")5 2orque
nin-uno +e esos toHens 2ertenece a) con4unto SIGUIENTE(expPostIncremento)"
E) mo+o 2.nico se-uir. as consumien+o toHen tras toHen5 !asta ))e-ar a) 2unto coma que
fina)i%a )a +ec)araci=n +e) atri6uto aC +e )a c)ase B" E) ana)i%a+or5 a)i0ia+o5 sa)+r. +e) mo+o
2.nico +e expPostIncremento5 consi+eran+o )ue-o termina+a )a instrucci=n"
9ero )os 2ro6)emas no !an aca6a+o a?nF e) ana)i%a+or to+a0a cree que se encuentra +entro +e
una )ista +e instrucciones5 6uscar. un toHen que 2ertene%ca a PRIMERO(instruccion)" En
)u-ar +e e))o encontrar. e) toHen Dmto+oE (RES_METODO)5 que no 2ertenece a +ic!o
con4unto"Ro)0er. a 2onerse en marc!a e) mo+o 2.nico en listaInstrucciones consumir. e)
toHen RES_METODO" 3os +os toHens que si-uen a RES_METODO son un i+entifica+or5 IDENT5 un
2arntesis a6ierto5 PARENT_AB" Como e) ana)i%a+or est. es2eran+o una instrucci=n o )a ))a0e
cerra+a 2ara aca6ar con e) mto+o5 intentar. reconocer una ))ama+a a un mto+o ( no una
+ec)araci=n +e mto+o)" 7o )o conse-uir.5 2orque Entero no 2ertenece a) con4unto PRIMERO
(listaParmetros).""
"""e) ana)i%a+or continuar. Dequi0oc.n+oseE +os 0eces m.s5 antes +e 2or fin 2o+er sincroni%ar con
)a ?nica instrucci=n +e) mto+o B:m25 que se aCa+ir. a )a )ista +e instrucciones +e A:m1" *i e)
an.)isis sem.ntico est. acti0a+o5 se 2ro+ucir. un error m.s5 2orque e) i+entifica+or DaCE no
estar. +ec)ara+o"
4' 9ara se-uir )a tra%a ser. necesario com2i)ar e) ana)i%a+or con )a o2ci=n DAtraceE"
43 Este con4unto est.5 e0i+entemente5 incom2)eto5 2ero 6astar. 2ara 2resentar e) 2ro6)ema" 3o se-uro es que 33#RE_#G no
2ertenece a +ic!o con4unto"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 177
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.26 !strategias de recuperaci(n
;resentacin de los to9ens de sincronismo
E) caso que aca6amos +e 2resentar es una consecuencia e:trema +e no usar sm6o)os +e
sincronismo"
3a forma a+ecua+a +e recu2erar e) error es intuiti0aF cuan+o se encontr= )a ))a0e cerra+a a)
2rinci2io +e) mo+o 2.nico5 sta in+ica6a e) fina) +e un -ru2o +e instrucciones5 )o que im2)ica e)
fina) +e )a instrucci=n actua)5 que a su 0e% im2)ica e) fina) +e )a e:2resi=n actua)" 3o que ten+ra
que !acer e) com2i)a+or sera5 2or )o tanto5 cance)ar )a re-)a actua)5 0o)0ien+o a
listaInstrucciones5 +on+e reconocera )a ))a0e cerra+a como fin +e re-)a"
Ramos a e:2resar esto +e una manera m.s forma)" 9o+emos re2resentar e) momento +e
comien%o +e) error con una 2i)a +e ))ama+as" Esta 2i)a sim6o)i%a )os +iferentes mto+os que se
!an ))ama+o recursi0amente en e) ana)i%a+or recursi0o +escen+ente +es+e que em2e%= e) an.)isis"
3a re-)a expPostIncremento +e6er. D+e4ar 2asarE e) toHen LLAVE_AB a su Dni0e) su2eriorE5 en
nuestro caso expCambioSigno" csta a su 0e% )a +e6er. D+e4ar 2asar !acia arri6aE5 as
sucesi0amente !asta que una re-)a (listaInstrucciones) recono%ca LLAVE_AB en )a entra+a"
Ilustracin ..2 >ila de llamadas antes ! despus de recuperar un error
En )a i%quier+a 0emos e) esta+o +e )a 2i)a +e ))ama+as en e) momento en e) que se encuentra )a
))a0e cerra+a" En ese momento5 e) com2ortamiento +esea+o +e) ana)i%a+or es e) +e D+esa2i)arE
))ama+as !asta que se 2ue+a reconocer )a ))a0e"
En -enera)5 una ))a0e cerra+a siem2re 2o+r. siempre uti)i%arse 2ara D+esa2i)arE mto+os a)
encontrarse un error en )a entra+a" 3a ))a0e cerra+a es un to+en de sincronismo"
+.2.-: /m'lementaci%n en A$>LR
#unque 2ue+en uti)i%arse +iferentes -ru2os +e sm6o)os +e sincronismo en un mismo ana)i%a+or5
)o m.s usua) es que so)amente se uti)ice e) mismo -ru2o 2ara to+as )as re-)as" csta ser. )a
estrate-ia que uti)i%aremos" 9ara im2)ementar)a +e6emosF
X Encontrar una manera +e es2ecificar e) con4unto -)o6a) +e sm6o)os +e sincronismo
X Encontrar e) a)-oritmo +e sincroni%aci=n m.s a+ecua+o"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 17/
Q
Q
Q
Q
Q
Q
Q
Q
Q
programa()
defClase()
defMetodo()
listaInstrucciones()
instruccion()
expAsignacion()
instExpresion()
expOLogico()
expYLogico()
expComparacion()
expAritmtica()
expProducto()
expCambioSigno()
expPostIncremento()
programa()
defClase()
defMetodo()
listaInstrucciones()
Q U O[g[ *,G/,E7$EQ
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.26 !strategias de recuperaci(n
+l con*unto de to9ens de sincronismo
9ara re2resentar e) con4unto +e sm6o)os +e sincronismo +e nuestro )en-ua4e recomien+o uti)i%ar
)a c)ase antlr.collections.impl.Bitset" Esta c)ase a est. inc)ui+a autom.ticamente en e)
c=+i-o 4a0a +e nuestro ana)i%a+or5 )ue-o )o ?nico que !a que !acer es +ec)arar un atri6uto
est.tico fina) +e )a c)ase e iniciar)o con un mto+o est.tico fina"
*u2on-amos que estamos +efinien+o un ana)i%a+or sint.ctico ))ama+o MiParser" *u2on-amos
que e) con4unto +e sm6o)os +e sincronismo que !emos e)e-i+o sea LLAVE_AB5 LLAVE_CE5
PUNTO_COMA COMA" Entonces5 2ara crear e) con4unto +e sm6o)os +e sincronismo !a6r. que
escri6ir )o si-uienteF
class MiParser extends Parser
options {...}
tokens {...}
{
public static final BitSet SimbolosSincro = mk_SimbolosSincro();
private static final BitSet mk_SimbolosSincro()
{
BitSet b = new BitSet();
b.add( LLAVE_AB );
b.add( LLAVE_CE );
b.add( PUNTO_COMA );
b.add( COMA);
return b;
}
}
... // reglas
Este con4unto es5 sin +u+a5 +emasia+o 2equeCo 2ara 3e3i" 9resentaremos uno m.s a+ecua+o en
)a si-uiente secci=n" Entretanto5 !e aqu a)-unos conse4os 2ara e)e-ir)oF
X 3os sm6o)os +e sincronismo sue)en ser sm6o)os +e 2untuaci=n5 tanto Dcerra+osE (LLAVE_CE5
PARENT_CE) como Da6iertosE (LLAVE_AB5 PARENT_AB)" 3os 2rimeros 2orque si-nifican e) fina)
+e )a estructura )in-astica actua)5 )os se-un+os e) 2rinci2io +e una nue0a (5 2or tanto5 e)
fina) +e )a actua))"
X 1e forma simi)ar5 2ue+en e:istir toHens que re2resenten e) 2rinci2io +e una nue0a estructura
(en 3e3i son RES_CLASE5 RES_METODO5 etc""") que no se 2are%can te:tua)mente a sm6o)os +e
2untuaci=n" 1ic!os toHens tam6in +e6eran ser inc)u+os"
X Es me4or 2ecar 2or e:ceso que 2or +efectoF es m.s con0eniente tener +emasia+os toHens
+ec)ara+os como sm6o)os +e sincronismo que +emasia+o 2ocos@ )os errores m.s frecuentes
ser.n +etecta+os +e to+as maneras"
+l algoritmo de sincroni%acin
E) a)-oritmo +e sincroni%aci=n +e6er. )an%arse a) ca2turar un toHen no es2era+o en )a entra+a5
sustituen+o a) mane4a+or +e e:ce2ciones 2or +efecto" Consistir. enF
X 7o !acer na+a si e) toHen es un sm6o)o +e sincronismo
X *i no es +e sincronismo5 se 2roce+er. como en e) mo+o 2.nico norma)5 2ero uti)i%an+o como
con4unto +e toHens 0.)i+os la unin del con4unto 0im"olos0incro con 0INIEA1EF
Ramos a enca2su)ar +ic!o a)-oritmo en e) mto+o sincroni%ar" 1ic!o mto+o necesitar. como
2ar.metros )a e:ce2ci=n que se )an%= (2ara !acer un reportError si es 2reciso) e) con4unto
SIGUIENTE +e )a re-)aF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 17<
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.26 !strategias de recuperaci(n
expPostIncremento : expNegacion (OP_MASMAS^|OP_MENOSMENOS^)?
;
exception catch[ RecognitionException e]
{ sincronizar(e, $FOLLOW); }
3)amaremos sincroni-ador a) mane4a+or +e e:ce2ciones que in0oca e) mto+o sincronizar"
E) mto+o sincronizar5 2or su 2arte5 ten+r. e) si-uiente as2ectoF
class MiParser extends Parser;
options {...}
tokens {...}
{
... // declaracin de SimbolosSincro y mk_SimbolosSincro()
public void sincronizar ( RecognitionException re, BitSet SIGUIENTE )
throws RecognitionException, TokenStreamException
{
// Si es SS, "dejar pasar" (terminar la regla)
if( ! simbolosSincro.member(LA(0)) )
{
// Si estamos guessing, lanzamos directamente
if (inputState.guessing!=0) throw re;
// Crear un nuevo bitset que contenga a los smbolos de
// sincronismo y a SIGUIENTE utilizando la "or" lgica
BitSet auxiliar = simbolosSincro.or(SIGUIENTE);
// Mostrar el error y consumir, pero utilizando auxiliar
reportError(re);
consume();
consumeUntil(auxiliar);
}
}
}
;ro7lemas del algoritmo
Ramos a ac)arar a)-o im2ortanteF e) mto+o que aca6amos +e +escri6ir no es )a 2anacea" Entre
otras ra%ones5 2orque no 2ue+e sustituir a) mane4a+or +e e:ce2ciones 2or +efecto +e #7$38 en
to+os )os casos" Reamos 2or qu"
Em2ecemos re0isan+o e) e4em2)o anterior" $enamos e) si-uiente c=+i-oF
clase A
{
mtodo m1(Entero pA)
{
pA ++ // Error! Falta un punto y coma!
}
}
Ja !emos 0isto e) com2ortamiento im2eca6)e +e) a)-oritmo +e sincroni%aci=n en este casoF e)
sm6o)o +e sincronismo es D2asa+o !acia arri6aE en )a 2i)a +e ))ama+as" Estamos 6astante a6a4o
en )a 2i)a5 es mu 2ro6a6)e que otra re-)a 2ue+a Da6sor6er)oE se contin?e e) reconocimiento"
#) mto+o so)amente se )e 2ue+en ec!ar en cara +os 2ro6)emasF
X *e !a 2er+i+o e) conteni+o com2)eto +e )a instrucci=n (e) )an%amiento +e una e:ce2ci=n en )a
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1/
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.26 !strategias de recuperaci(n
re-)a 2ro0oc= )a cance)aci=n +e )a construcci=n +e) #*$)
X L7o se !a emiti+o nin-?n mensa4e +e errorN
*o)ucionaremos estos errores m.s a+e)ante"
E:iste5 sin em6ar-o5 otro 2ro6)ema que +e6emos tratar" 9o+emos encontrar)o este otro c=+i-oF
clase A
{
mtodo m1(Entero pA // Falta un parntesis cerrado
{
pA ++ ;
}
mtodo m2(...) {...}
...
}
En este caso )a ausencia +e) 2arntesis +e terminaci=n 2ro0ocar. que se entre en mo+o +e
sincroni%aci=n
44
en )a +ec)araci=n +e m1 (re-)a decMetodo)" E) a)-oritmo encontrar. LLAVE_AB5
que a) ser sm6o)o +e sincronismo ser. D2asa+o !acia arri6aE" 3a si-uiente re-)a en )a 2i)a es
listaMiembros5 que no es2era una ))a0e a6ierta5 as que 2or ser un toHen +e sincronismo
tam6in )o 2asar. 2ara arri6a""" a se intue )o que 2asar." 3as +os re-)as que que+an5 decClase
programa5 tam6in D2asar.n !acia arri6aE )a ))a0e"
#) aca6arse e) mto+o 2ro-rama se !a6r. aca6a+o e) an.)isis sint.ctico5 que+an+o e) #*$ ta)
como estu0iera en e) momento +e 2ro+ucirse e) 2rimer error" 7i siquiera se ana)i%ar.n e) resto +e
mto+os +e )a c)ase"
En resumen5 +e6emos reso)0er tres 2ro6)emasF
X 7uestro ana)i%a+or a?n es +emasia+o D2ere%osoE en )a recu2eraci=n5 2ues no -enera )os
me4ores #*$ 2osi6)es"
X 7o se emiten mensa4es +e error cuan+o fa)ta un toHen"
X En ocasiones !a Dsa)i+as 2rematurasE +e) an.)isis"
Como 0eremos5 to+os estos 2ro6)emas tienen re)aci=n con e) 2rotoco)o +e ca2turas +e
e:ce2ciones +e #7$38" Ramos a mostrar +os tcnicas que5 a2)ica+as con4untamente5 nos
2ermitir.n miti-ar )os tres 2ro6)emas +e nuestro a)-oritmo +e recu2eraci=n" Estas tcnicas se
))aman Dtram2as +e e:ce2cionesE Dretrasaso +e )a +etecci=n +e erroresE"
+.2..: >ram'as 'ara exce'ciones
3a tcnica +e )as tram2as 2ara e:ce2ciones es una tcnica +e recu2eraci=n que 2ue+e uti)i%arse
+e forma in+e2en+iente5 aunque nosotros )a uti)i%aremos en com6inaci=n con )os toHens +e
sincronismo5 2ara so)ucionar a)-unos +e )os 2ro6)emas que !emos 0isto que 2osee"
$a amena%a )antasma
*u2on-amos un ana)i%a+or sint.ctico con )os sm6o)os +e sincronismo !a6itua)es (2arntesis
a6ierto cerra+o5 2unto coma5 2unto5 coma5 ))a0e a6ierta ))a0e cerra+a)"
Consi+rese )a si-uiente re-)a 2ara in0ocar funciones5 a )a que !emos aCa+i+o un sincroni%a+orF
44 Estamos su2onien+o que se aCa+e e) mane4a+or +e e:ce2ciones con e) mto+o sincroni%ar a to+as )as re-)as +e )a -ram.tica"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1/1
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.26 !strategias de recuperaci(n
llamada : IDENT PARENT_AB! listaExpresiones PARENT_CE! PUNTO_COMA!;
exception catch [RecognitionException e]
{ sincronizar (e, $FOLLOW); }
*u2on-amos que e) ana)i%a+or que contiene esa re-)a se encuentra con una entra+a asF
...
f ( x, y, z ;
...
E) mecanismo +e sincroni%aci=n entrar. en marc!a5 cuan+o +etecte e) 2unto coma (estara
es2eran+o una coma o un 2arntesis cerra+o)" *e cance)ar. )a construcci=n +e) #*$ (2er+in+ose
to+a )a informaci=n +e )a ))ama+a) se D2asar. !acia arri6aE e) 2unto coma5 2or ser un sm6o)o
+e sincronismo" Es +ecir5 )a re-)a a+o)ece +e Dana)i%a+or 2ere%osoE Domisi=n +e mensa4e +e
errorE" #+em.s5 aunque im2ro6a6)e5 si nin-una re-)a +e) ana)i%a+or ca2tura e) 2unto coma5
!a6r. un 2ro6)ema +e Dsa)i+a 2rematuraE"
L$o+os estos 2ro6)emas !an si+o 2ro0oca+os 2or un so)o toHen que no e:istaN $enemos que
2rocurar que estos DtoHens fantasmaE no arruinen +e esta manera nuestro reconoce+or"
L/s mane*adoresM
Iasta a!ora so)amente !emos co)oca+o e) a)-oritmo +e recu2eraci=n en e) mane4a+or -)o6a) +e
una re-)a" 8ecor+emos que )os mane4a+ores +e e:ce2ciones 2ue+en5 a+em.s5 co)ocarse en +os
)u-ares m.sF
X En una o2ci=n
X En un e)emento con nom6re
4&
3a 0enta4a 2rinci2a) que tienen estos ti2os +e mane4a+ores con res2ecto a) -)o6a) es que no
cancelan el reconocimiento de la regla ni la construccin del /01" *o)amente cance)an )as
2artes afecta+as" En otras 2a)a6ras5 si escri6imos una ))ama+a a un mto+o asF
llamada
: IDENT p1:PARENT_AB! listaExpresiones p2:PARENT_CE! pc:PUNTO_COMA!
;
exception [p1] catch [RecognitionException e] // para p1
{ reportError(e);
exception [p2] catch [RecognitionException e] // para p2
{ reportError(e);
exception [pc] catch [RecognitionException e] // para pc
{ reportError(e); }
exception catch [RecognitionException] // sincronizador
{ sincronizar (e, $FOLLOW); }
J se omite cua)quiera +e )os +os 2arntesis (Lo )os +osN)5 se emitir. un mensa4e +e error5 2ero no
se cance)ar. )a construcci=n +e) #*$" 1e )a misma forma5 si se omite e) 2unto coma5 se emitir.
e) mensa4e +e error corres2on+iente5 sin )an%arse errores"
E) 2ro6)ema +e esta so)uci=n es que es a6so)utamente en-orrosa"
;resentacin de la t2cnica de las trampas
3a tcnica que +enominaremos como Dtram2a 2ara e:ce2cionesE es una -enera)i%aci=n +e)
e4em2)o anterior5 +e )a tcnica +e a2ro0ec!amiento +e) mo+o 2.nico que +escri6imos
anteriormente" 9arte +e )a i+ea +e que ciertos toHens son Do6)i-atoriosE en ciertos )u-ares +e )a
4& Consu)tar e) 2rinci2io +e) ca2tu)o 2ara m.s informaci=n so6re )os mane4a+ores +e e:ce2ciones"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1/2
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.26 !strategias de recuperaci(n
entra+a (2or e4em2)o5 +etr.s +e )a 2a)a6ra reser0a+a si siem2re tiene que !a6er un 2arntesis
a6ierto)" 3a omisi=n +e +ic!os toHens es suficientemente im2ortante como 2ara emitir unmensa4e
+e error5 2ero no )o suficiente como 2ara cance)ar e) reconocimiento +e )a re-)a 5 2orque son
f.ci)mente recu2era6)es" 3)amaremos a estos toHens to+ensCtrampa"
En e) su6a2arta+o anterior mostr.6amos una manera +e tratar )os toHens tram2a5 uti)i%an+o un
mane4a+or +e e:ce2ciones 2ara ca+a a2arici=n +e ca+a toHen tram2a en ca+a re-)a" *in em6ar-o
a !emos 0isto que este mto+o es mu en-orroso5 a+em.s oscurece e) c=+i-o (a 0eces !a
m.s te:to en )os mane4a+ores +e e:ce2ciones que en )a 2ro2ia re-)a)" *e im2one 2ues encontrar
un mto+o me4or"
1ic!o mto+o e:iste@ no !a m.s que a2)icar e) 0ie4o teorema +e )a 2ro-ramaci=n F Dsi a)-o se
re2ite muc!o5 !a% funcionesE" Consi+rense )as si-uientes re-)as au:i)iaresF
parentAb : PARENT_AB! ;
exception catch [ RecognitionException re ] { reportError(re); }
parentCe : PARENT_CE! ;
exception catch [ RecognitionException re ] { reportError(re); }
puntoComa : PUNTO_COMA! ;
exception catch [ RecognitionException re ] { reportError(re); }
/ti)i%.n+o)os5 )a re-)a llamada que+ara asF
llamada : IDENT parentAb listaExpresiones parentCe puntoComa ;
exception catch [ RecognitionException re ]
{ sincronizar (re, $FOLLOW); }
#!ora )a re-)a a es mu ro6usta@ cuan+o !a un error5 es ca2a% +e recu2erarse casi
instant.neamente si se trata +e una omisi=n +e sus toHensAtram2a" En caso contrario5 recurre a)
sincroni%a+or"
9o+emos uti)i%ar parentAb5 parentCe puntoComa 2ara sustituir a )os toHens PARENT_AB!5
PARENT_CE! PUNTO_COMA! en cua)quier re-)a +e nuestra -ram.tica5 sin +isminuir un .2ice )a
)e-i6i)i+a+5 o6tenien+o )as 0enta4as +e) contro) +e )as e:ce2ciones"
3as re-)as parentAb5 parentCe puntoComa )as ))amaremos Dtram2as 2ara e:ce2cionesE5 2or )a
forma que tienen +e Dca2turarE )as e:ce2ciones uti)i%ar)as +e )a manera a+ecua+a5 +e )a misma
forma que )a tram2a +e un ca%a+or"
9ara o6tener un 6eneficio =2timo +e) uso +e tram2as5 es necesario sa6er +=n+e co)ocar)as5 es
+ecir5 qu toHens 2ue+en ser toHens tram2a" /nos cuantos conse4osF
X 1e6en uti)i%arse toHens que sean Do6)i-atoriosE" # 0eces no es f.ci) sa6er cu.n+o )o son" 9or
e4em2)o5 PUNTO_COMA es necesario a) fina) +e ca+a instrucci=n5 )ue-o 2ue+e sustituirse 2or )a
tram2a 2ara e:ce2ciones puntoComa" 7orma)mente sa6remos que es o6)i-atorio 2orque a se
!a recorri+o 2arte +e )a re-)a en )a que est. Asa6emos que estamos reconocien+o una ))ama+a5
o una asi-naci=n" En otras ocasiones5 sin em6ar-o5 PUNTO_COMA no es Do6)i-atorioEA cuan+o
sir0e 2ara co+ificar )a instrucci=n nu)a no !a e)ementos 2re0ios que nos a+0iertan que +e6a
!a6er un PUNTO_COMA5 as que en +ic!a re-)a no +e6e uti)i%arse )a tram2a puntoComa
46
"
X 3os me4ores can+i+atos 2ara co)ocar tram2as son )os sm6o)os +e sincronismo que DcierranE5
como PARENT_CE5 LLAVE_CE o PUNTO_COMA"
X $am6in 2ue+en uti)i%arse sm6o)os +e sincronismo que Dem2iecenE (PARENT_AB,
LLAVE_AB """)" 7o o6stante !a que tener cui+a+o con )os toHens que se uti)i%an como ra%
(que ))e0an +etr.s e) o2era+or +e enrai%amiento5 [h[) a que si se sustituen 2or una re-)a +e6e
46 En rea)i+a+ s se 2ue+e@ 2ero no se -anar. na+a5 se 2er+er. eficiencia en e) ana)i%a+or"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1/-
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.26 !strategias de recuperaci(n
tenerse en cuenta que !a que enrai%ar e) .r6o) en una acci=n"
X En -enera)5 )os toHens +e sincronismo son 6uenos can+i+atos 2ara )os toHens tram2a5 2ero
n=tese que se trata +e conce2tos +iferentesF )os toHens +e sincronismo 2ermiten conocer e)
Desta+oE +e un reconoce+or a) ser reconoci+os mientras que )os toHens tram2a son toHens que
Dsiem2re +e6en estarE5 cua ausencia 2ro0oca un error"
X E) mto+o +e reconocimiento +e #7$38 2ue+e !acer que a)-unas tram2as 2ara e:ce2ciones
no funcionen correctamente5 2or reconocerse )os errores antes +e tiem2o5 +e manera que no se
acti0en ()as tram2as)" 9or e4em2)o5 )as tram2as 2ara e:ce2ciones no funcionar.n casi nunca en
una -ram.tica con HV1" Con HU15 tam6in fa))ar.n )as tram2as co)oca+as +etr.s +e su6 re-)as
o2ciona)es (con e) sm6o)o [Q[) o +e una su6 re-)a +e e)ecci=n +e a)ternati0as (con e) sm6o)o [
][)5 con una +e )as a)ternati0as 0aca" En e) si-uiente a2arta+o e:2)icar c=mo neutra)i%ar este
com2ortamiento"
+.2.1: Retardo en el tratamiento de errores
E) retar+o +e) tratamiento +e errores es )a se-un+a tcnica au:i)iar que 2resentaremos 2ara
me4orar e) uso +e toHens +e sincronismo con #7$38" #) contrario que )a tcnica +e )as tram2as
2ara e:ce2ciones5 se trata +e una tcnica Dcom2)ementariaE5 que so)amente 2ue+e uti)i%arse
efecti0amente aCa+i+a a )as tram2as 2ara e:ce2ciones"
+l pro7lema de la NnadaO 3 &oJia7leAlt+-ception
Con )as tram2as 2ara e:ce2ciones !emos a0an%a+o 6astante" 7uestro 2rimer e4em2)o5 una 0e%
co)oca+as5 com2i)ar. mostrar. e) error corres2on+ienteF
clase A
{
mtodo m1(Entero pA)
{
pA++ // Error! Falta punto y coma
}
}
7o o6stante a?n es 2osi6)e me4orar m.s nuestro mecanismo +e resincroni%aci=n@ a?n no es ca2a%
+e recu2erarse +e )os errores tan 6ien como +e6era"
clase A
{
mtodo m1(Entero pA)
{
pA= pA + 1 // Error! Falta un punto y coma!
}
}
*i )o com2i)amos5 0eremos que na+a +e )o que !emos !ec!o !asta a!ora funciona con este
e4em2)oF )a instrucci=n em2ie%a a reconocerse correctamente5 2ero ))e-a+a a un 2unto se cance)a5
se entra en mo+o sincroni%aci=n se termina"
Com2i)an+o e) ana)i%a+or en mo+o +e tracea+o
4(
2o+remos o6ser0ar en qu 2unto se cance)a )a
o2eraci=nF en )a re-)a expPostIncremento" 9arece que con )as tram2as 2ara e:ce2ciones no !a
si+o 6astante" Esta re-)a si-ue resistin+ose"
#na)icemos +e nue0o e) c=+i-o +e expPostIncremento 2ara 0er qu es )o que ocurre"
4( Con )a o2ci=n Atrace
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1/)
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.26 !strategias de recuperaci(n
expPostIncremento es una re-)a forma+a 2or una referencia a otra re-)a5 expNegacion5
se-ui+a +e una su6 re-)a o2ciona) (con e) o2era+or Q)
48
F
expPostIncremento : expNegacion (OP_MASMAS^ | OP_MENOSMENOS^)? ;
,nternamente #7$38 transforma )as su6 re-)as o2ciona)es en Da)ternati0as que 2ue+en e0a)uar a
0acoE" Es +ecir5 internamente5 #7$38 mane4ar. expPostIncremento asF
expPostIncremento : expNegacion (OP_MASMAS^ | OP_MENOSMENOS^ | /* nada */ ) ;
#!ora consi+eremos c=mo im2)ementa #7$38 )as a)ternati0as"
Cuan+o se ))e-a a un 2unto en e) que !a que reconocer una a)ternati0a5 con HU15 #7$38 uti)i%a
un s<itc! so6re e) toHen actua) 2ara sa6er qu a)ternati0a e)e-ir" #s5 cuan+o se -enere e) c=+i-o
2ara expPostIncremento5 tenemos )o si-uiente (ocu)taremos a)-unas 2artes que no resu)tan
interesantes 2ara esta e:2)icaci=n)F
public final void expPostIncremento() throws RecognitionException,
TokenStreamException
{
...
try { // manejador de errores
expNegacion(); // reconoce la primera negacin
...
switch ( LA(1)) // switch sobre el token actual
{
case OP_MASMAS: // PostIncremento
{
...
match(OP_MASMAS);
break;
}
case OP_MENOSMENOS: // PostDecremento
{
...
match(OP_MENOSMENOS);
break;
}
/* nada */
case OP_Y: case OP_O: case PUNTO_COMA: case COMA:
case PARENT_CE: case OP_IGUAL: case OP_DISTINTO: case OP_ASIG:
case OP_MENOR: case OP_MAYOR: case OP_MENOR_IGUAL:
case OP_MAYOR_IGUAL: case OP_MAS: case OP_MENOS: case OP_PRODUCTO:
case OP_DIVISION:
{
break;
}
default:
{
tAroH neH 5o>iable*lt@<ception(6+(I)? %etJilename());
}
}
... // construir el AST
}
catch (RecognitionException ex) {
... // cdigo de sincronizacin
48 Estamos o60ian+o e) mane4a+or +e e:ce2ciones" En este caso +a i-ua) que sea e) mo+o 2.nico o un sincroni%a+or@ el pro"lema
es Fue se entra en el mane4ador5 no cua) se uti)i%a"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1/0
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.26 !strategias de recuperaci(n
}
...
}
Como 2ue+e 0erse5 e) c=+i-o comien%a reconocien+o )a e:2resi=n +e ne-aci=n ())aman+o a
expNegacion)" 1etr.s +e ) 0iene e) switch 2ara )a su6 re-)a o2ciona)" ;6ser0emos sus casos"
E) caso 2rimero sir0e c)aramente 2ara reconocer e) o2era+or +e 2ost incremento5 mientras que e)
se-un+o reconoce e) 2ost +ecremento" E) tercer caso es e) que sir0e 2ara reconocer )a tercera
a)ternati0a5 que es Dna+aE" Esta re-)a se )imita a com2ro6ar que e) si-uiente toHen que ))e-a a)
ana)i%a+or 2ertenece a SIGUIENTE(expNegacion)5 terminar"
9or ?)timo5 si e) toHen actua) no se corres2on+e con nin-uno +e )os casos5 en e) caso +efau)t se
)an%a una e:ce2ci=n +e a)ternati0a no 0.)i+a (NoViableAltException) so6re e) toHen actua)"
Esa es e:actamente )a e:ce2ci=n que se )an%= en nuestro e4em2)o" E) toHen que e) ana)i%a+or
reci6i= fue toHen LLAVE_CE5 que no 2ertenece a nin-uno +e )os casos +e) s<itc!" *e )an%a )a
e:ce2ci=n5 se entra en e) c=+i-o +e sincroni%aci=n5 se 2ier+e e) #*$ que se esta6a
construen+o"
3a 2o)tica que $erence 9arr si-ui= cuan+o +esarro))= #7$38 fue )a +e +etectar )os errores )o
m.s 2ronto 2osi6)e" En muc!as ocasiones es )a me4or so)uci=n5 2ero no en to+as" 9or e4em2)o5 e)
mecanismo +e )as tram2as +e e:ce2ciones se 6asa en reconocer )os errores Den e) momento en e)
que 2ue+en 2ro+ucirseE5 no antes"
3o que quiero +ecir es que con )a im2)ementaci=n 2or +efecto +e )as su6 re-)as o2ciona)es e)
error +e que fa)ta un 2unto coma se reconoce +emasia+o 2rontoF nosotros 2reten+emos que e)
error sea contro)a+o 2or )a tram2a puntoComa5 2ero ))e-a expPostIncremento Dnos )o quitaE
antes +e tiem2o"
En -enera)5 si tenemos un sistema +e recu2eraci=n +e errores 6asa+o en Dtratar )os errores )o m.s
tar+e 2osi6)eE5 ste c!ocar. fronta)mente con )as re-)as o2ciona)es5 en )as que )a 2o)tica 2or
+efecto +e #7$38 es Dtratar )os errores )o m.s 2ronto 2osi6)eE"
E:isten 0arios caminos 2ara +esacti0ar este com2ortamiento 2or +efecto" 7osotros 0amos a
centrarnos en ca2turar )as e:ce2ciones"
"apturando las e-cepciones
OPu !acemos con cuan+o H tiene que ser V1Q O; cuan+o +eseamos tratar e) error )oca)mente (en
)a re-)a)Q ;5 como en nuestro caso5 Oqu !acemos si !a un 6u- en #7$38 que im2i+e
+esacti0ar )as e:ce2cionesQ
*o)amente que+a una o2ci=nF ca2turar)as" *o)amente tenemos que 6uscar e) mane4a+or +e
e:ce2ciones a+ecua+o"
9ara ca2turar )a NoViableAltException no 2o+emos uti)i%ar e) mane4a+or +e e:ce2ciones +e )a
re-)a5 2orque 2recisamente e) o64eti0o +e to+o este a2arta+o !a si+o e0itar ))e-ar a +ic!o
mane4a+or (si uti)i%amos e) mane4a+or -)o6a) +e )a re-)a 2er+emos e) #*$)" $enemos que
ca2turar )a e:ce2ci=n5 2ero +e manera que )a construcci=n +e) #*$ +e )a re-)a no se cance)e" #s
que +e6eremos uti)i%ar un mane4a+or +e e:ce2ciones 2ara un e)emento con nom6re o 2ara una
a)ternati0a"
Es2ecificar un mane4a+or 2ara ca+a una +e )as a)ternati0as +e )a re-)a o2ciona) +e
expPostIncremento (OP_MASMAS5 OP_MENOSMENOS na+a) es 2osi6)e5 2ero es mu en-orroso"
9or )o tanto )a ?nica a)ternati0a que nos que+a es uti)i%ar )os nom6res" Es +ecir5 queremos !acer
a)-o asF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1/,
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.26 !strategias de recuperaci(n
expPostIncremento : expNegacion opPost:(OP_MASMAS^|OP_MENOSMENOS^)?
;
exception [opPost] catch [RecognitionException e] { ... }
1on+e D"""E 2ue+e ser una instrucci=n nu)a (anu)an+o efecti0amente e) )an%amiento +e )a
e:ce2ci=n) o una ))ama+a a sincronizar5 +e manera que so)amente se i-nore )a e:ce2ci=n
cuan+o se encuentre un sm6o)o +e sincronismo"
Cuan+o com2i)emos e) c=+i-o 0eremos que #7$38 )o rec!a%aF #7$38 no a+mite nom6res +e
su6 re-)as5 a) menos no en su 0ersi=n '"("'"
#nte este 2ro6)ema5 )a ?nica so)uci=n 2osi6)e es uti)i%ar una re-)aAsu6re-)a" Es +ecir5 +i0i+ir )a
re-)a expPostIncremento en +osF
expPostIncremento : expNegacion expPostIncremento2
;
expPostIncremento2 : (OP_MASMAS^|OP_MENOSMENOS^)? ;
exception catch [RecognitionException e] { ... }
9ero a?n se-uir. que+an+o un 2ro6)emaF L)a ra%N
Cuan+o se +i0i+e una re-)a en 0arias Dre-)asAsu6re-)asE5 e) 2ro6)ema es que es 2osi6)e 2er+er )a
ra% +e) #*$" Este es e:actamente nuestro caso" #) !acer que OP_MASMAS OP_MENOSMENOS
2ertene%can a un su6.r6o)5 estamos im2i+ien+o a) mo+o 2or +efecto +e construcci=n que )os
!a-a races" *i queremos que sean races 0amos a tener que au+ar a #7$38 un 2ocoF
expPostIncremento : operando:expNegacion operador:expPostIncremento2
{ ## = construyeExpUn(#operando,#operador); }
;
1on+e e) mto+o construyeExpUn ser.F
public AST construyeExpUn(AST operando, AST operador)
{
if(null==operador) return operando;
if(operando.getNextSibling()==operador)
{
operando.setNextSibling(null);
}
operador.setFirstChild(operando);
return operador;
}
J con esto conse-uiremos +esacti0ar )a e:ce2ci=n 2ro+uci+a en expPostIncremento" 9ero e)
2recio !a si+o a)toF !emos teni+o que mo+ificar e) cuer2o +e una re-)a5 !acin+o)a menos )e-i6)e5
aCa+ir un mto+o 2ara reconstruir e) #*$ si fuera necesario" L1e6emos intentar e0itar que
nuestras -ram.ticas sean HV1 siem2re que sea 2osi6)eN
APn no 8emos terminado...
*ea cua) sea e) mto+o que !aamos e)e-i+o 2ara so)ucionar e) 2ro6)ema +e
NoViableAltException5 +e6e que+ar c)aro que )o !emos so)uciona+o en una re-)a" E) si-uiente
e4em2)oF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1/7
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.26 !strategias de recuperaci(n
clase A
{
mtodo m1(Entero pA)
{
pA= pA + 1 // Error! Falta un punto y coma!
}
}
no com2i)ar. a?n +e )a me4or manera 2osi6)eF L)a instrucci=n si-ue sin reconocerseN
3o que ocurre es que aunque !aamos arre-)a+o e) 2ro6)ema +e NoVibleAltException con
expPostIncremento5 no )o !emos !ec!o con e) resto +e e:2resiones" *i com2i)amos con )a
o2ci=n Atrace nuestro ana)i%a+or 0eremos que e) 2ro6)ema se encuentra m.s arri6a en )a 4erarqua
+e e:2resiones5 concretamente en expAsignacion"
expAsignacion : expOLogico (OP_ASIG^ expOLogico)? ;
1e nue0o !a una su6 re-)a o2ciona) que nos im2e+ir. uti)i%ar nuestra estrate-ia +e
sincroni%aci=n"
7ecesitaremos ca2turar )a e:ce2ci=n5 +e nue0o +i0i+ien+o )a re-)a en 0arias re-)asAsu6re-)as5
tenien+o que rea)i%ar manua)mente e) enrai%a+oF
{
public AST construyeExpBin ( AST izquierda, AST derecha )
{
if(derecha != null)
{
if(izquierda.getNextSibling()==derecha)
{
izquierda.setNextSibling(null);
}
AST valor = derecha.getFirstChild();
return #(derecha, izquierda, valor);
}
return izquierda;
}
...
}
...
/** Asignaciones (nivel 9) */
expAsignacion : izq:expOLogico der:expAsignacion2
{ construyeExpBin(#izq, #der); }
;
protected expAsignacion2 : (OP_ASIG^ expOLogico)? ;
exception catch [NoViableAltException nvae]
{ sincronizar(nvae, $FOLLOW); }
En este caso5 a) tratarse +e una e:2resi=n 6inaria5 !emos teni+o que im2)ementar un mto+o
+iferente" cste se 2arece muc!o a construyeExpUn5 con )a e:ce2ci=n +e que rea)i%a a)-unas
transformaciones 2re0ias con e) #*$"
B.s a+e)ante 0eremos c=mo !emos em2)ea+o )os toHens +e sincronismo5 tram2as 2ara
e:ce2ciones retar+o en )a recu2eraci=n en nuestro com2i)a+or +e 3e3i"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1//
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.-6 &mplementaci(n K Gerencia de gramticas
Becci%n +.3: /m'lementaci%n J Kerencia de gram(ticas
+.3.1: l 'roblema
En este a2arta+o res2on+eremos a una 2re-unta mu sim2)e FOC=mo aCa+imos )a -esti=n +e
errores a) ana)i%a+or sint.cticoQ
*i )e 2re-untamos a nuestro 2ro0er6ia) 2ro-rama+or 2rimeri%o5 nos res2on+er. m.s o menos
DL9ues mo+ifican+o e) c=+i-o +e) ana)i%a+orNE" Este im2u)so mo+ifica+or es mu com2rensi6)e"
*i un c=+i-o no rea)i%a to+as )as funciones que se es2eran +e )5 o no )as rea)i%a +e )a manera
a+ecua+a5 )o )=-ico es mo+ificar)o su !asta que )o !a-a"J +es+e )ue-o reescri6ir a)-unas +e sus
2artes es )a manera m.s inme+iata 2ara !acer)o"
#!ora 6ien5 Dmo+ificarE no tiene 2or qu ser necesariamente Dreescri6irE" #ntes +e reescri6ir e)
ana)i%a+or5 2ensemos en )os 2ros )os contras" 1es+e )ue-o es )a estrate-ia m.s r.2i+a +e
im2)ementar5 2or ser )a m.s +irecta" 9ero +a+o que )o que se 0an a aCa+ir son acciones
mane4a+ores +e e:ce2ciones5 se aCa+ir. muc!o c=+i-o 4a0a" E) ana)i%a+or se !ar. +e2en+iente +e)
c=+i-o 4a0a5 a+em.s +e ser ca+a 0e% m.s m.s e:tenso"
OPu ocurrir. si5 en e) futuro5 queremos rea)i%ar mo+ificaciones en e) ana)i%a+orQ 9or e4em2)o5
2o+emos necesitar un ana)i%a+or 2ara C++" ; un ana)i%a+or con una -esti=n +e errores
ra+ica)mente +iferente"
Ja !emos 0isto )os incon0enientes 2rinci2a)es +e reescri6ir un ana)i%a+or 2ara que !a-a a)-o que
no sea reconocer" 9ero si no se reescri6e e) ana)i%a+or +irectamente OPu otra o2ci=n !aQ
#7$38 2ro2orciona un mecanismo i+ea) 2ara este casoF )a !erencia +e -ram.ticas"
+.3.2: @resentando la *erencia de gram(ticas en A$>LR
,ma-inemos un ana)i%a+or ):ico
49
que recono%ca so)amente i+entifica+ores (con caracteres
in-)eses)F
class EnglishIdentLexer extends Lexer;
options {
charVocabulary = '\3'..'\129'; // Solamente ASCII bsico
}
LETRA : ('a'..'z') | ('A'..'Z') | '_' ;
DIGITO : ('0'..'9');
IDENT : LETRA(LETRA|DIGITO)* ;
Con ant)r es 2osi6)e uti)i%ar )a +efinici=n +e EnglishIdentLexer 2ara +efinir un nue0o
ana)i%a+or ):ico que )o e:tien+a" 9or e4em2)o5 2ara +efinir un ana)i%a+or que a+em.s
reconociera )os enteros5 6astara con !acer )o si-uienteF
/* se extiende EnglishIdentLexer, y no Lexer */
class EnglishIdentIntLexer extends EnglishIdentLexer;
ENTERO : (DIGITO)+;
Este ana)i%a+or reconoce tanto )os IDENTs como )os ENTEROs ())aman+o a )as re-)as au:i)iares
LETRA DIGITO cuan+o es necesario)" 9ara im2)ementar)o so)amente !a si+o necesario aCa+ir )a
re-)a que !ace fa)ta5 a2ro0ec!.n+ose )a +efinici=n 2re0ia"
49 #unque 2ara este e4em2)o 0o a uti)i%ar un ana)i%a+or ):ico5 )a !erencia +e -ram.ticas se 2ue+e a2)icar i-ua)mente en
ana)i%a+ores sint.cticos o sem.nticos"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1/<
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.-6 &mplementaci(n K Gerencia de gramticas
#+em.s5 si !acemos a)-?n cam6io en )a -ram.tica 2a+re (aCa+ien+o una re-)a5 o
mo+ific.n+o)a) )os cam6ios se 0er.n ref)e4a+os en )as -ram.ticas +eri0a+as +e e))a"
Eso s5 !a6r. que recom2i)ar"
+.3.3: Kerencia A$>LR EP Kerencia java
/n 2rimer 0ista%o 2ue+e !acernos 2ensar que 2ara uti)i%ar )a !erencia +e -ram.ticas #7$38 se
)imita a uti)i%ar e) mecanismo +e !erencia +e 4a0a" Es +ecir5 que EnglishIdentLexer.java
comien%a asF
public class EnglishIdentLexer extends antlr.CharScanner
{
...
5 que EnglishIdentIntLexer.java comien%a asF
public class EnglishIdentIntLexer extends EnglishIdentLexer
{
...
J que en )a su6c)ase se aCa+e e) mto+o ENTERO eso es to+o"
9ues 6ien5 esto 7; es cierto" Ia m?)ti2)es +iferencias" 3a 2rimera m.s im2ortante es que e)
ana)i%a+or ten+r. esta otra formaF
public class EnglishIdentIntLexer extends antlr.:AarScanner
{
...
9or si no !a que+a+o c)aro en e) ttu)o +e este a2arta+o5 )o 0o a escri6ir 6ien c)aroF
Ierencia #7$38 NU Ierencia 4a0a
O9or qu no se uti)i%a )a !erencia 4a0aQ OC=mo se im2)ementan )as re-)as +e )a su2er-ram.tica en
una -ram.tica +eri0a+aQ
,ma-inemos que necesitamos un ana)i%a+or que recono%ca )os i+entifica+ores )os n?meros
enteros5 2ero uti)i%an+o un 4ue-o +e caracteres m.s -ran+e K 2or e4em2)o5 e) con4unto +e
caracteres +e) caste))ano" *i +eci+imos e:ten+er +e EnglisIdenIntLexer5 ten+remos que !acer
+os cosasF
X Cam6iar )a secci=n options 2ara cam6iar )a o2ci=n charVocabulary a unico+e occi+enta)"
X Cam6iar )a +efinici=n +e )a re-)a LETRA"
/* extendemos a EnglishIdentIntLexer */
class universalLexer extends EnglishIdentIntLexer ;
/* Cambiamos el juego de caracteres vlidos */
options
{ charVocabulary = '\3'..'\377'; }
/* Cambiamos LETRA */
LETRA : (a..z) | (A..Z)
| '' | '' | '' | '' | '' | '' | 'E' | 'I' | '' | ''
| '' | ''
| 'u' | ''
;
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1<
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.-6 &mplementaci(n K Gerencia de gramticas
Como 2ue+e 0erse5 +a+o que IDENT uti)i%a internamente LETRA5 no !a si+o necesario nin-?n
cam6io a+iciona)" 9ara mo+ificar )a secci=n options so)amente !a !ec!o fa)ta 0o)0er a escri6ir)a"
O1=n+e est. entonces e) 2ro6)emaQ O9or qu )a !erencia +e #7$38 no 2ue+e 6asarse en )a +e
4a0aQ 9ara 2o+er res2on+er5 necesitamos in0esti-ar un 2oco m.s" >i4monos en e) mto+o que
im2)ementa )a re-)a IDENT"
3a re-)a IDENT tiene siem2re )a misma forma F una LETRA se-ui+a +e un con4unto +e LETRAs
DIGITOs"
OC=mo comen%ar. e) mto+oQ $estear. en )a entra+a e) si-uiente car.cter 2ara 0er si es una
LETRA""" L9ero una LETRA es +iferente en EnglishIdentLexer en UniversalLexerN
3a conc)usi=n es que en UniversalLexer no so)amente es necesario cam6iar LETRA5 tam6in es
necesario cam6iar IDENT5 2orque su )ooHa!ea+ cam6ia si cam6ia e) con4unto PRIMERO(LETRA)"
Ierencia #7$38 NU Ierencia 4a0a5 2orque cam6ia e) )ooHa!ea+ +e a)-unas re-)as +e
)a -ram.tica 6ase"
3o m.s senci))o ante esta 2ro6)em.tica es sim2)emente co2iar )as re-)as +e )a -ram.tica 6ase en )a
nue0a -ram.tica5 2roce+er como si se tratara +e una -ram.tica nue0a"
1raducido del manual de /A1L? Q &ic%ero in%eritance.%tml
1eterminar qu re-)as +e )a -ram.tica 6ase son afecta+as S2or e) )ooHa!ea+T no es senci))o5 2or )o
que nuestra im2)ementaci=n sim2)emente !ace una co2ia +e )a -ram.tica 6ase -enera un
ana)i%a+or com2)etamente nue0o con )as mo+ificaciones a2ro2ia+as" 1es+e e) 2unto +e 0ista +e)
2ro-rama+or5 )a com2artici=n +e c=+i-o^-ram.ticas !a6r. ocurri+o5 mientras que +es+e e) 2unto
+e 0ista +e )a im2)ementaci=n )o que se !a rea)i%a+o es una co2ia +e S)as re-)as +eT )a c)ase 6ase"
YYYYY
*i se crea un ana)i%a+or ))ama+o # !acin+o)o su6c)ase +e otro ana)i%a+or G5 se crear.n fic!ero
interme+io ())am+a+o extendedA.g) que conten+r. to+as )as re-)as que se !an aCa+i+o o
mo+ifica+o en # ! todas las reglas de B Fue %an permanecido intactas" Ese fic!ero ser. e) que
con0ierta en c=+i-o 4a0a"
Gien" Ja !emos 0isto una +e )as ra%ones 2or )as que )a !erencia +e -ram.ticas no es equi0a)ente
a )a !erencia +e c)ases +e 4a0a" 9ero fa)ta otra ra%=n" $iene que 0er con )os mto+os atri6utos
que se aCa+en a )a c)ase"
En #7$38 es 2osi6)e aCa+ir constructores5 mto+os atri6utos a) ana)i%a+or5 sim2)emente
escri6ien+o su c=+i-o entre ))a0es antes +e )a %ona +e re-)as" #sF
class CountIdentsParser extends Parser;
{
private int countIdents;
CountIdentsParser(TokenStream stream)
{
super(stream);
countIdents=0;
}
}
regla : (IDENT {countIdents++;} )* ;
E) ana)i%a+or sint.ctico +e arri6a sir0e 2ara reconocer una entra+a forma+a 2or i+entifica+ores
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1<1
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.-6 &mplementaci(n K Gerencia de gramticas
contar)os" Ie aCa+i+o un atri6uto 2ri0a+o (countIdents) un constructor que )o inicia a 0
&0
"
Consi+rese a!ora )a c)ase si-uienteF
class CountIdentsIntsParser extends CountIdentsParser;
{
private int countInts;
CountIdentsIntsParser(TokenStream stream)
{
super(stream);
countInts=0;
}
}
regla : (IDENT {countIdents++;} | ENTERO{countInts++;} )* ;
Iemos crea+o una su6 -ram.tica +e CountIdents5 a )a que !emos aCa+i+o un atri6uto
(countInts) 2ara contar )os n?meros enteros a+em.s +e )os i+entifica+ores"
*i )a !erencia +e #7$38 funcionase como en 4a0a to+o ira 6ien" 0i &uncionase como en 4ava"
3a !erencia +e -ram.ticas tiene un com2ortamiento un tanto 2ecu)iar con res2ecto a )as acciones
+e .m6ito -)o6a) ()os atri6utos mto+os aCa+i+os uti)i%an+o )as ))a0es en )a secci=n +e
-ram.tica) +e un ana)i%a+orF )a acci=n inicia) +e) ana)i%a+or es so"reescrita5 no aRadida" Es
+ecir5 que e) constructor +e )a c)ase CountIdentsParser se !a 2er+i+o5 as como )a +efinici=n
+e) atri6uto countIdents" 9or )o tanto )a c)ase no com2i)ar. K se !ace referencia a un e)emento5
countIdents5 que no est. +efini+o"
9ara o6tener e) resu)ta+o requeri+o sera necesario 0o)0er a inc)uir en )a acci=n e) atri6uto
countIdents5 e iniciar)o en e) constructor"
class CountIdentsIntsParser extends CountIdentsParser;
{
private int countIdents;
private int countInts;
CountIdentsIntsParser(TokenStream stream)
{
super(stream);
countIdents=0;
countInts=0;
}
}
regla : (IDENT {countIdents++;} | ENTERO{countInts++;} )* ;
C)aro est. que ))e-a+os a ste 2unto a no merece )a 2ena uti)i%ar )a !erencia +e -ram.ticas5 2ero
e0i+entemente e) ?nico 0a)or +e estas -ram.ticas es e) +ocumentati0o" #+em.s5 ni siquiera
com2i)aran F es necesario es2ecificar un 0oca6u)ario en e) que se +efinan )os toHens IDENT
ENTERO"
+.3.": LAnea de comandos
9ara 2o+er com2i)ar una -ram.tica !ere+a+a +e otra5 es necesario es2ecificar e) fic!ero en e) que
&0 /n 6uen e4ercicio sera uti)i%ar e) conta+or 2ara )imitar )a entra+a +e caracteres K im2)ementar un ana)i%a+or que recono%ca
e:actamente n enteros5 sien+o n una 0aria6)e que +e6e suministrarse a) crear e) ana)i%a+or" 9istaF *era necesario uti)i%ar un
2re+ica+o sem.ntico en )a re-)a mo+ificar )a acci=n5 2osi6)emente aCa+ien+o un atri6uto un 2ar.metro a) constructor"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1<2
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.-6 &mplementaci(n K Gerencia de gramticas
se encuentra )a se-un+a en )a )nea +e coman+os5 con )a o2ci=n A-)i6" #s5 si en e) fic!ero f1"- !a
su6-ram.ticas +e otras 2resentes en e) fic!ero f'"-5 2ara com2i)ar)as !a6r. que escri6irF
c:\> java antlr.Tool -glib f2.g f1.g
Es 2osi6)e aCa+ir 0arios fic!eros con )a o2ci=n -)i65 se2ar.n+o)os con 2unto coma" 9or
e4em2)o5 si f1"- D+e2enteE +e f'"- f3"-F
c:\> java antlr.Tool -glib f2.g;f3.g f1.g
+.3.#: <&%mo se relaciona todo esto con la R?
Bu senci))oF en )u-ar +e reescri6ir e) ana)i%a+or sint.ctico +irectamente5 0amos a crear5
uti)i%an+o )a !erencia +e -ram.ticas5 un ana)i%a+or +eri0a+o +e )5 ))ama+o
LeLiErrorRecoveryParser5 que estar. +efini+o en e) fic!ero LeLiErrorRecoveryParser.g"
3a estructura +e +ic!o fic!ero ser. )a si-uienteF
header{
package leli;
}
class LeLiErrorRecoveryParser e<tends 6e6iDarser;
options {... <opciones modificadas> }
{
... <mtodos, atributos y constructores en java>
}
... <reglas sobreescritas y nuevas reglas>
*er. en +ic!o fic!ero en e) que escri6iremos to+os )os cam6ios que +eseemos !acer a 3e3i9arser"
+.3.+: /m'ortaci%n de vocabulario
#) 2ro-ramar LeLiParser !emos +ec)ara+o5 en )a secci=n toHens5 una serie +e toHens
ima-inarios que uti)i%.6amos 2ara m?)ti2)es 2ro2=sitos5 +es+e enrai%ar )istas !asta re2resentar e)
ti2o 0aco" 7uestro ana)i%a+or +e6e ser ca2a% +e reconocer uti)i%ar +ic!os toHens"
9or su2uesto5 LeLiErrorRecoveryParser tiene que ser ca2a%5 a+em.s5 +e uti)i%ar to+os )os
toHens +efini+os en e) ni0e) ):ico5 como IDENT5 RES_SI5 etc"
3a !erencia +e -ram.ticas +e6era contro)ar 2or s misma e) 2ro6)ema +e reconocer to+os esos
toHens5 2ero +es-racia+amente no )o !ace K recur+ese que mientras que )as re-)as son
re2resenta+as con mto+os5 )os toHens son re2resenta+os como enteros en una interfa% 4a0a que
!a que im2)ementar"
3a !erencia es a ni0e) +e reglas5 no a ni0e) +e toHens"
OC=mo reso)0emos e) 2ro6)emaQ 3os que !aan esta+o atentos a )o sa6r.nF e) 2ro2io 3e3i9arser
e:2orta to+os )os toHens que uti)i%a (inc)uen+o )os +e) ni0e) ):ico) con )a o2ci=n exportVocab5
)o que 2ro0oca )a -eneraci=n +e un fic!ero +e te:to un interfa% 4a0a"
7orma)mente estos fic!eros est.n +estina+os a) ana)i%a+or sem.ntico5 2ero na+a im2i+e a nuestro
ana)i%a+or sint.ctico uti)i%ar)os tam6in" #s que mo+ificaremos )as o2ciones 2ara que ten-an e)
si-uiente as2ectoF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1<-
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.-6 &mplementaci(n K Gerencia de gramticas
class ErrorRecoveryParser extends LeLiParser
options
{
importVocab = LeLiParserVocab;
}
...
Estamos su2onien+o que no se 0an a +ec)arar toHens nue0os en nuestro nue0o
ana)i%a+or5 sino que se 0a a reuti)i%ar e) con4unto +e toHens +e LeLiParser" *i no
fuera as5 ser. necesario a+em.s e:2ortar e) nue0o con4unto +e toHens uti)i%an+o
exportVocab5 2ara que e) an.)isis sem.ntico no se encuentre con toHens
+esconoci+os"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1<)
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.)6 %ontrol de mensa5es6 La clase Logger
Becci%n +.": &ontrol de mensajes: La clase Logger
+.".1: l 'roblema
Ja !emos 0isto que e) mo+o 2.nico +e #7$38 consiste en5 una 0e% ca2tura+a una e:ce2ci=n5
2as.rse)a a) mto+o reportError
&1
F
public void regla r1()
{
try{
... (cuerpo de la regla)
}catch (RecognitionException e) {
report@rror(e);
consume();
consumeUntil(_tokenSetXX);
}
}
reportError es un mto+o im2)ementa+o en )a c)ase 2a+re +e nuestro ana)i%a+or" Esta c)ase es
ant)r"9arser en e) caso +e) ana)i%a+or sint.ctico5 antlr.CharScanner en e) caso +e) anani%a+or
):ico antlr.TreeParser en e) caso +e) ana)i%a+or sem.ntico"
1e2en+ien+o +e qu ti2o +e ana)i%a+or se est uti)i%an+o5 reportError a+mite un ti2o +e
2ar.metro +iferenteF RecognitionException en e) caso +e) ana)i%a+or sint.ctico o
TokenStreamException en e) caso +e) ana)i%a+or ):ico" Centr.n+onos en e) ana)i%a+or
sint.ctico5 e) c=+i-o +e reportError (im2)ementa+a en antlr.Parser) es e) si-uienteF
/** Parser error-reporting function can be overridden in subclass */
public void reportError(RecognitionException ex) {
System.err.println(ex);
}
7o es mu com2)e4oF e) mto+o se )imita a im2rimir 2or 2anta))a )a e:ce2ci=n" E) comentario
in0ita a mo+ificar e) mto+o so6reescri6in+o)o en nuestro ana)i%a+or5 eso es )o que 0amos a
!acer" 9ara e))o 0amos a uti)i%ar una c)ase es2ecia)5 Logger5 que +escri6ir m.s a+e)ante"
Ja !emos 2resenta+o )a estrate-ia que 0amos a se-uir 2ara mostrar )os mensa4es" *in em6ar-o
no nos !emos 2)antea+o si )os mensa4es que #7$38 2ro2orciona 2or +efecto son a+ecua+os"
/no +e )os incon0enientes que o6ser0o en #7$38 es e) i+ioma +e )os mensa4es +e error"
,ntentan+o rea)i%ar un com2i)a+or )o m.s D!is2anoE ami-a6)e 2osi6)e5 no 2ue+o +e4ar +e 2ensar
en mo+ificar )os mensa4es +e error 2ara que en )u-ar +e +ecirF
fichero:lin:col expecting IDENT, found PARENT_AB
+i-anF
fichero:lin:col se esperaba un identificador, se encontr un parntesis abierto
('(')
7=tese que e) mensa4e +e a6a4o se +iferencia +e) +e arri6a no so)amente en e) i+ioma uti)i%a+o
(Dse es2era6aE""" D5 se encontr=E""") sino que tam6in se !an mo+ifica+o )os Dnom6resE +e )os
toHens (Dun i+entifica+orE en )u-ar +e IDENT5 Dun 2arntesis a6iertoE en )u-ar +e PARENT_AB)"
Ramos a ir 0ien+o estos 2ro6)emas +e uno en uno"
&1 L#tenci=nN E) c=+i-o que muestro a continuaci=n es 2ara e) an#lisis sint#ctico" E) mo+o 2.nico en e) an.)isis ):ico
sem.ntico es5 como es )=-ico5 +iferente5 2ues uti)i%a +iferentes mto+os ti2os" *in em6ar-o )a funciona)i+a+ es )a misma"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1<0
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.)6 %ontrol de mensa5es6 La clase Logger
+.".2: La clase Logger del 'aquete antlraux
Ro)0amos 2or e4em2)o a) mto+o reportError +e )a c)ase antlr.Parser" 3a im2)ementaci=n
+e este mto+o es mu 2oco f)e:i6)e@ 2ara em2e%ar5 no !a forma +e cam6iar e) f)u4o 2or e) que
se emite e) mensa4e@ sim2)emente se uti)i%a System.err" #+em.s5 no !a manera +e mo+ificar )a
forma en )a que estos resu)ta+os se muestran en 2anta))a (se uti)i%a e) mto+o toString() +e )a
c)ase RecognitionException)" 9or ?)timo5 no !a manera +e mantener un conteo +e errores"
9ara reso)0er to+os estos 2ro6)emas !e im2)ementa+o una c)ase5 ))ama+a Logger5 que 2ermite
rea)i%ar to+o )o anterior" 1a+o que estar. +entro +e) 2aquete antlraux.util5 su nom6re
com2)eto ser. antlraux.util.Logger"
*i a?n no se !a !ec!o5 es mu aconse4a6)e inc)uir e) 2aquete antlraux en e)
classpath +e a!ora en a+e)ante"
*u interfa% es )a si-uienteF
public class Logger
{
// Constructores
public Logger( String name );
public Logger( String name, OutputStream s );
public Logger( String name, OutputStream s, String nls, String ts );
public Logger( String name, OutputStream s, String nls, String ts,
FileLineFormatter flf );
// Aadir mensajes
public void log ( String msg, int msgLevel );
public void log ( String msg, int msgLevel, antlraux.util.LexInfo li);
public void log ( String msg, int msgLevel, String fn,int line,int column );
public void log ( String msg, int msgLevel, LexInfo li );
public void print( String msg );
// Tabulacin
public void tabulate(); // Imprime level tabulaciones
public void newLine(); // Imprime newLineString en el OutputStream
public void incTabs(); // Aumenta el nmero de tabulaciones
public void decTabs(); // Disminuye el nmero de tabulaciones
public void setTabLevel();
public void getTabLevel();
// Conteo de mensajes
public int getLogCounter();
public int resetLogCounter();
// Filtrado
// nivel mnimo de los logs para que sean impresos
public void setMinLogLevel(int minLogLevel);
}
Ia otros mto+os (2rinci2a)mente mto+os DsetE D-etE)5 2ero stos son )os 2rinci2a)es"
Esta c)ase ofrece muc!a m.s f)e:i6i)i+a+ en e) tratamiento +e )os mensa4es +e error" 9ara
em2e%ar5 e) 2ar.metro type +e) mto+o log 2ermite mostrar tanto mensa4es +e error como
mensa4es +e a0iso ($arnings) o mensa4es +e informaci=n -enera)" #+em.s5 es 2osi6)e mo+ificar )a
manera en )a que )a informaci=n se muestra5 +istri6un+o)a en 0arios ni0e)es uti)i%an+o )as
ta6u)aciones o mo+ifican+o )a forma en )a que se muestran e) nom6re +e fic!ero5 )a )nea )a
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1<,
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.)6 %ontrol de mensa5es6 La clase Logger
co)umna +on+e se !a 2ro+uci+o e) error con e) 2ar.metro flf +e) tercer constructor" 9or ?)timo
es 2osi6)e ))e0ar )a cuenta +e) n?mero +e errores que se !an teni+o con au+a +e )os mto+os
getLogCounter resetLogCounter"
9ara 2o+er uti)i%ar Logger en LeLiErrorRecoveryParser necesitamos 0arias cosasF
X Ia que inc)uir (con import) )a c)ase antlraux.util.Logger"
X LeLiErrorRecoveryParser +e6e contener una instancia +e Logger como atri6uto"
X Ia que aCa+ir un constructor a) ana)i%a+or que inc)ua un Logger como 2ar.metro"
X 9or ?)timo5 !a que reescri6ir e) nue0o mto+o reportError 2ara que use e) Logger"
9ara im2ortar )a c)ase antlraux.util.Logger en e) ana)i%a+or so)amente !a que mo+ificar )a
secci=n !ea+er en LeLiErrorRecoveryParser.g5 ana+in+o)e )a )nea corres2on+ienteF
header
{
package leli;
import antlrau<.util.6o%%er;
}
class LeLiErrorRecoveryParser extends LeLiParser;
{
... cdigo java (de momento vaco)
}
E) resto +e )os cam6ios que 0amos a efectuar )os rea)i%aremos so6re )a secci=n +e c=+i-o 4a0a"
9ara em2e%ar5 aCa+ir un atri6uto +e ti2o 3o--er un constructor a2ro2ia+o es tan senci))o
comoF
class LeLiErrorRecoveryParser extends LeLiParser;
{
Logger logger = null;
/* Nuevo constructor */
LeLiErrorRecoveryParser( TokenStream lexer, Logger _logger )
{
this(lexer);
logger = _logger;
}
}
J5 fina)mente5 que+a e) mto+o reportError" 9or como+i+a+ 0amos a +i0i+ir)o en +osF e)
Dnorma)E5 que reci6ir. una RecognitionException como 2ar.metro5 e) que uti)i%aremos como
6ase5 que reci6ir. e) mensa4e5 nom6re +e fic!ero5 )nea co)umna +on+e se 2ro+u4o e) error"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1<7
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.)6 %ontrol de mensa5es6 La clase Logger
/* reescribe antlr.Parser.reportError */
public void reportError( RecognitionException e )
{
reportError(
e.getMessage(), e.getFilename(), e.getLine(),e.getColumn() );
}
/* mtodo auxiliar */
public void reportError(
String msg, String filename, int line, int column )
{
if( null==logger ) logger = new Logger( error, System.err );
logger.log( msg, 1, filename, line, column);
}
En e) se-un+o 2o+emos 0er que se rea)i%a un test 2ara 0er si e) Logger se !a crea+o o no (2o+ra
no !a6er)o !ec!o si e) ana)i%a+or no se !u6iera crea+o con e) constructor que !emos
suministra+o) )o crea si es necesario"
9or su2uesto5 )a c)ase leli.Tool (que se encar-a6a +e coor+inar to+os )os ana)i%a+ores K 0er
fina) +e) ca2tu)o anterior) tam6in +e6er. ser mo+ifica+a" #ntes +e crear nuestro ana)i%a+or
ten+remos que crear un Logger 2ara 2as.rse)o a) ana)i%a+or en e) constructorF
public class Tool
{
...
Logger logger = new Logger(System.err);
ErrorRecoveryParser parser = new ErrorRecoveryParser(lexer, logger);
parser.programa();
...
}
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1</
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.06 Ce5orando los mensa5es de error
Becci%n +.#: Fejorando los mensajes de error
+.#.1: /ntroducci%n
En esta secci=n 0eremos c=mo me4orar )os mensa4es +e error emiti+os 2or nuestro com2i)a+or +e
0arias manerasF
X Cam6ian+o e) i+ioma +e )os mensa4es +e error
X /ti)i%an+o )os a)ias +e )os toHens
+.#.2: &ambiando el idioma de los mensajes de error
9ara a0eri-uar c=mo tra+ucir )os mensa4es +e error +e #7$38 nos 0amos a 6asar en una
afirmaci=n que a !e !ec!o anteriormenteF
En #7$385 to+o error +e reconocimiento con))e0a e) )an%amiento +e una e:ce2ci=n"
Concretamente5 con))e0a e) )an%amiento +e una su6c)ase +e ANTLRException" En )a
+ocumentaci=n +e #7$38 se 2resenta un esquema 2areci+o a) si-uienteF
Ilustracin ..( ?elacin 4er#rFuica de las excepciones de /A1L?
#unque es 2ro6a6)e que )a situaci=n cam6ie en e) futuro5 +e momento )os mensa4es +e error +e
#7$38 est.n co+ifica+os Den +uroE en )as e:ce2ciones +e ant)r" Es +ecir5 2ara 2o+er efectuar )a
tra+ucci=n !a6r. que mo+ificar e) c=+i-o fuente +e )as e:ce2ciones recom2i)ar #7$38"
Ramos a ir comentan+o 2ara qu sir0e ca+a una +e estas e:ce2ciones c=mo !a que
mo+ificar)as"
Las de&iniciones de las excepciones %an sido traducidas del manual de /A1L?.. )ic%ero err.%tml.
!8cepci(n ?escripci(n y modi4icaciones
ANTLRExceptionF
Es )a ra% +e )a 4erarqua +e e:ce2ciones" 7o es necesario
mo+ificar)a"
CharStreamExceptionF
Es )an%a+a cuan+o a)-o ma)o ocurre en e) f)u4o +e caracteres" 3a
maor 2arte +e) tiem2o se trata +e un 2ro6)ema +e entra+a
sa)i+a" 7o es necesario mo+ificar)a"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 1<<
A$>LRxce'tion
&*arBtreamxce'tion &*arBtream/Oxce'tion
Recognitionxce'tion
>o:enBtreamxce'tion
Fismatc*ed&*arxce'tion
$oHiableAltxce'tion
$oHiableAlt5or&*arxce'tion
Bemanticxce'tion
>o:enBtream/Oxce'tion
>o:enBtreamRecognitionxce'tion
>o:enBtreamRetryxce'tion
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.06 Ce5orando los mensa5es de error
CharStreamIOExceptionF
Ia !a6i+o un error +e E^* en e) f)u4o +e caracteres +e entra+a"
3os errores +e E^* )os +e4aremos en in-)s5 2orque en ?)tima
instancia 2ro0ienen +e e:ce2ciones +e E^* +e 4a0a" 7o !a que
mo+ificar)a"
RecognitionExceptionF
/n 2ro6)ema -enrico +e reconocimiento en )a entra+a" $o+as
)as re-)as +e )os ana)i%a+ores sint.cticos 2ue+en )an%ar)a" Ia
que mo+ificar e) constructor 2or +efecto5 cam6ian+o D2arsin-
errorE 2or Derror +e reconocimientoE"
MismatchedCharExceptionF
Es )an%a+a 2or CharScanner.match() cuan+o est. es2ereran+o
un car.cter 2ero encuentra otro en e) f)u4o +e entra+a" Guscar
reem2)a%ar en to+o e) fic!eroF
X DBismatc!e+ c!arE 2or DCar.cter in0.)i+oE
X De:2ectin-E 2or Dse es2era6aE
X D5 foun+E 2or D5 se encontr=E
X De:2ectin- ant!in- 6ut [E 2or Dse es2era6a cua)quier cosa
menos [E
X D[@ -ot it an<aE 2or D[@ se ace2t= +e to+os mo+osE
X De:2ectin- toHenE 2or Dse es2era6a un toHenE
X D 7;$E 2or Dque 7; estu0ieraE
X D in ran-eF E 2or D en e) ran-oF E
X D one of (E 2or D un car.cter +e )os si-uientes (E
X D)5 foun+ E 2or D)5 se encontr= E
MismatchedTokenExceptionF
3an%a+a 2or Parser.match() cuan+o est. es2eran+o un toHen
2ero encuentra otro" Guscar reem2)a%arF
X DBismatc!e+ $oHenF e:2ectin- an #*$ no+eE 2or D$oHen
no 0.)i+oF se es2era6a cua)quier no+o #*$E
X DBismatc!e+ $oHenE 2or D$oHen no 0.)i+oE
X Djem2t treeVE 2or Dj.r6o) 0acoVE
X Bensa4es equi0a)entes a )os +e Bismatc!e+C!arE:ce2tion
2ero 2ara toHens"
NoViableAltExceptionF
E) ana)i%a+or sint.ctico encuentra un toHen que no comien%a
nin-una a)ternati0a en )a o2ci=n actua)" Guscar reem2)a%arF
X Dune:2ecte+ toHenF E 2or DtoHen ines2era+oF E
X Dune:2ecte+ en+ of su6treeE 2or Dfin +e) su6.r6o) ines2era+oE
X Dune:2ecte+ #*$ no+eF E 2or Dno+o #*$ ines2era+oF E
NoViableAltForCharExceptionF
E) ana)i%a+or ):ico encuentra un car.cter que no comien%a
nin-una a)ternati0a en )a o2ci=n actua)" Guscar reem2)a%ar
Dune:2ecte+ c!arF E 2or Dcar.cter ines2era+oF E"
SemanticExceptionF
E:ce2ci=n )an%a+a cuan+o un 2re+ica+o sem.ntico se incum2)e5
o en una acci=n (me+iante throw)" 7o es necesario mo+ificar)a"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.06 Ce5orando los mensa5es de error
TokenStreamExceptionF
,n+ica un error -enrico en e) f)u4o +e toHens" 7o necesita
cam6ios"
TokenStreamIOExceptionF
Con0ierte una IOException en una TokenStreamException"
7o mo+ificaremos )os mensa4es que 0ienen +irectamente +e 4a0a"
TokenStreamRecognitionExceptionF
Con0ierte una RecognitionException en
TokenStreamException 2ara que 2ue+a 2asarse en e) f)u4o" 7o
necesita mo+ificaciones"
TokenStreamRetryExceptionF
*e )an%a cuan+o se !a a6orta+o e) reconocimiento +e un toHen"
7o necesita cam6ios"
*****
/nas cuantas notas 2ara aca6arF
X #7$38 contiene a)-unas e:ce2ciones que no forman 2arte +e )a 4erarqua 6asa+a en
antlr.ANTLRExcepcion5 como antlr.FileCopyException" 7o o6stante no es 2osi6)e
tra+ucir)as (2ro0ienen +e errores +e java.io)"
X /n efecto secun+ario mu curioso +e tra+ucir )as e:ce2ciones +e #7$38 es que a!ora e)
2ro2io #7$38 )as uti)i%a5 as que a 2artir +e a!ora nos !a6)ar. en es2aCo) )a maor 2arte +e)
tiem2o"
X *o)amente -racias a que #7$38 es un soft<are +e c=+i-o a6ierto (open source) !emos
2o+i+o acce+er a su c=+i-o mo+ificar ciertos e)ementos 2ara recom2i)ar" /na )icencia m.s
restricti0a no nos )o !a6ra 2ermiti+o"
+.#.3: Alias de los to:ens
E) com2ortamiento 2re+etermina+o +e #7$38 2ara mostrar )os toHens en )os mensa4es +e error
es uti)i%ar su nom6re5 es +ecir5 )a ca+ena que se o6tiene a) ))amar a) mto+o getText() +e)
toHen"
7orma)mente getText() 2ro2orciona un te:to que es a+ecua+o 2ara e) usuario" >unciona
es2ecia)mente 6ien con )os toHens que tienen un te:to 2re+etermina+o5 como )os )as 2a)a6ras
reser0a+as o )os o2era+ores" #s5 2ara )a 2a)a6ra reser0a+a RES_MIENTRAS se muestra su te:to
corres2on+iente5 es +ecir5 DmientrasE" /n error 2ro0oca+o 2or )a omisi=n +e +ic!a 2a)a6ra sera
+e esta formaF
fichero:linea:columna: Se esperaba mientras
En otros casos )a funci=n getText() no funciona tan 6ien" 9or e4em2)o5 en e) caso +e )os
i+entifica+ores" $a) como )o !emos construi+o5 se-?n e) mo+o +e funcionamiento norma) +e
#7$385 ca+a toHen IDENT +e0ue)0e con getText() un te:to +iferente K concretamente e)
nom6re +e) i+entifica+or" Es +ecir5 que una 0e% reconoci+o Dmano)oE como un IDENT5 entonces
a) in0ocar a) mto+o getText() so6re +ic!o i+ent o6ten+remos K o60iamente K Dmano)oE"
O1=n+e est.5 entonces5 e) 2ro6)emaQ
E) 2ro6)ema es que e) IDENT so)amente +e0ue)0e Dmano)oE una ve- Fue se %a reconocido
8manolo; como un IDENT" 9ero este no es e) caso +e )os errores +e omisi=n"
En ciertas ocasiones se es2era un IDENT en una e:2resi=n" *i +ic!o IDENT no se 2ro2orciona5
+e6e )an%arse un mensa4e +e error" *e escri6ir. D*e es2era6a E a continaci=n )a ca+ena que se
o6ten-a a) ))amar a getText() so6re un IDENT" >ero esta ve- el identi&icador no %a sido
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 21
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.06 Ce5orando los mensa5es de error
reconocido en la entrada" En un caso as5 Oqu ca+ena +e te:to +e0o)0er. getText()Q
En un caso as #7$38 +e0ue)0e e) te:to 2or +efecto +e )os toHens ima-inarios5 que 0iene a ser
e) te:to que se !a uti)i%a+o 2ara nom6rar)os en e) ana)i%a+or" 9or e4em2)o5 e) te:to 2or +efecto
+e) toHen IDENT es e:actamente se5 D,1E7$E"
#s5 e) mensa4e +e error 2or omisi=n +e un IDENT ser. +e ste esti)oF
fichero:linea:columna: Se esperaba IDENT
/n usuario a0an%a+o sera ca2a% +e +e+ucir que D,1E7$E si-nifica Dun i+entifica+orE" 9ero
si-ue sin ser un 6uen mensa4e +e error" L3os usuarios +e) com2i)a+or no +e6eran tener que
conocer )os nom6res 2or +efecto +e )os toHens ima-inarios que uti)i%amosN
3o mismo que ocurre con IDENT ocurre otros toHens ima-inarios a ni0e) ):ico5 como
RES_ENTERO5 RES_REAL o RES_CADENA"
3o que estamos 6uscan+o aqu es5 2or )o tanto5 cam6iar e) te:to 2or +efecto +e )os toHens
ima-inarios"
#fortuna+amente #7$38 2ro2orciona un mecanismo que resue)0e e:actamente +ic!o 2ro6)emaF
)a o2ci=n )oca) paraphrase" Esta o2ci=n 2ermite cam6iar e) te:to 2or +efecto +e )os toHens en e)
ana)i%a+or ):ico" #s que !a que e+itar e) fic!ero LeLiLexer.g aCa+ir a a)-unas +e )as re-)as
+ic!a o2ci=n"
3a 2rimera re-)a que cam6iaremos ser. )a +e )os i+entifica+ores" Ie seCa)a+o )a )nea que se !a
aCa+i+o"
IDENT
options
{
testLiterals=true; // Comprobar palabras reservadas
parapArase&Kun identi=icadorK;
}
:
(LETRA|'_') (LETRA|DIGITO|'_')*
;
3a si-uiente re-)a que 0amos a mo+ificar es )a que 2ermite reconocer enteros rea)es" cstos eran
reconoci+os 2or )a re-)a LIT_NUMEROF
LIT_NUMERO : (( DIGITO )+ '.' ) =>
( DIGITO )+ '.' ( DIGITO )* { $setType (LIT_REAL); }
| ( DIGITO )+ { $setType (LIT_ENTERO); }
;
Bientras que tanto LIT_NUMERO como LIT_REAL se encuentran +efini+os como toHens
ima-inarios en )a secci=n toHens +e) ana)i%a+or ):icoF
class LeLiLexer extends Lexer;
options {...}
tokens
{ ...
LIT_ENTERO; LIT_REAL;
}
E) me4or )u-ar 2ara 2o+er +efinir un a)ias 2ara estos +os toHens sera )a 2ro2ia secci=n +e toHens@
a)-o asF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 22
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.06 Ce5orando los mensa5es de error
tokens
{
...
LIT_ENTERO <paraphrase=un literal entero>;
LIT_REAL <paraphrase=un literal real>;
}
9ero +es-racia+amente #7$38 no tiene +ic!a ca2aci+a+ im2)ementa+a" Es +ecir5 no se 2ue+e
aCa+ir un a)ias a un toHen ima-inario"
3a so)uci=n ser.5 2or tanto5 +efinir +os re-)as nue0as5 LIT_REAL LIT_ENTERO" 9ero no 0a a ser
tan f.ci) como 2arece" *i tu0imos que +efinir)as en una so)a re-)a5 3,$_7/BE8;5 fue 2or una
?nica ra%=n@ 2ro6)emas +e )ooHa!ea+" *i se quiere com2ro6ar a qu me refiero5 no !a m.s que
comentar )a re-)a LIT_NUMERO5 6orrar a LIT_REAL LIT_NUMERO +e )a secci=n +e toHens
escri6ir estas +os nue0as re-)asF
LIT_REAL
options{ paraphrase="un literal real" }
: ( DIGITO )+ '.' ( DIGITO )*
;
LIT_ENTERO
options{ paraphrase="un literal entero" }
: ( DIGITO )+
;
#7$38 se ne-ar. a com2i)ar este c=+i-o5 ar-umentan+o que )as +os re-)as son infinitamente
i-ua)es 2or )a i%quier+a@ si em2ie%a a reconocer una serie +e DIGITOs no sa6r. si se trata +e un
LIT_REAL o un LIT_ENTERO" 3a ?nica manera +e sa)0ar este esco))o es reconocer)os en una so)a
re-)a uti)i%an+o un 2re+ica+o sint.ctico 2ara +istin-uir entre am6os" Justamente como se !ace en
LIT_NUMERO"
#s que 2or un )a+o necesitamos tener a LIT_ENTERO LIT_REAL +ec)ara+os como re-)as5 2ero
2or otro necesitamos reconocer )os )itera)es enteros rea)es con )a re-)a LIT_NUMERO" 3a
so)uci=n 2or )a que o !e o2ta+o es uti)i%ar una 2equeCa Dtram2aE5 un %ac+5 como )e +icen en e)
e:tran4ero5 consistente en uti)i%ar re-)as Dque 2ro0oquen un errorE en e) ana)i%a+or"
9ensemos en )os errores que se +an +urante un an.)isis ):ico" En e) 99d +e )as ocasiones se trata
+e un car.cter no 0.)i+o" *i en un com2i)a+or +e C intentamos ))amar [ami-@[ a una 0aria6)e5
o6ten+remos un error +e car.cter no 0.)i+o )an%a+o 2or e) ana)i%a+or ):ico +e) com2i)a+or5 que
es2era una )etra +e) a6ece+ario
&'
5 un +-ito o e) car.cter +e su6raa+o"
3os caracteres +e )a entra+a se reconocen uti)i%an+o e) mto+o antlr.CharScanner.match
(char) K entre otrosA" Cuan+o e) car.cter que se encuentra no es e) a+ecua+o5 se )an%a una
e:ce2ci=n +e) ti2o MismatchedCharException"
E) 2)an es e) si-uienteF e)e-imos +os caracteres a) a%ar5 +e entre to+o e) 4ue-o +e caracteres
/nico+e5 que no estn 2ermiti+os en #7$385 2or e4em2)o [@[ [e[5 )os reconocemos con )as
re-)as LIT_ENTERO LIT_REAL res2ecti0amente5 pero inmediatamente despus de reconocerlos
lan-amos excepcionesB simulando Fue matc% %a &allado" #sF
&' 1e) a6ece+ario #*C,,5 se entien+e" /na [C[ tam6ien 2ro0ocara un error"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2-
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.06 Ce5orando los mensa5es de error
LIT_ENTERO
options { paraphrase = un literal entero; }
: '@' {throw new MismatchedCharException(); }
;
LIT_REAL
options { paraphrase = un literal real; }
: '#' {throw new MismatchedCharException(); }
;
# )os )itera)es ca+ena se )es asi-na un a)ias m.s faci)mente" *o)amente !a que uti)i%ar
paraphraseF
LIT_CADENA
options { paraphrase="una cadena"; }
:
'"' !
( ~('"'|'\n'|'\r') )*
'"' !
;
9or ?)timo 0amos a 2oner a)ias a a)-unos sm6o)os +e 2untuaci=nF
PUNTO_COMA
options { paraphrase="un punto y coma (';')"; }
: ';' ;
COMA
options { paraphrase="una coma (',')"; }
: ',' ;
LLAVE_AB
options { paraphrase="una llave abierta ('{')"; }
: '{' ;
LLAVE_CE
options { paraphrase="una llave cerrada ('}')"; }
: '}' ;
PUNTO
options { paraphrase="un punto ('.')"; }
: '.' ;
PARENT_AB
options { paraphrase="un parntesis abierto ('(')"; }
: '(' ;
PARENT_CE
options { paraphrase="un parntesis cerrado (')')"; }
: ')' ;
BARRA_VERT
options { paraphrase="una barra vertical ('|')"; }
: '&' ;
/na nota interesante so6re )os a)iasF se -uar+an en e) fic!ero +e te:to en e) que se e:2ortan )os
toHens (LeLiLexerVocabTokenTypes.txt en nuestro caso)" 1e esta manera5 cua)quier
ana)i%a+or que im2orte e) con4unto +e toHens o6ten+r. tam6in )os a)ias5 con )o que no !a que
mo+ificar )os ana)i%a+ores sint.cticos o sem.nticos 2ara que )os uti)icen@ 6astar. con
Drecom2i)ar)osE"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2)
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.,6 Aplicaci(n en el compilador de LeLi
Becci%n +.+: A'licaci%n en el com'ilador de LeLi
+.+.1: Acotaci%n del 'roblema: el !ic*ero de errores
3a recu2eraci=n +e errores es una +e esas tareas que siem2re est.n Den construcci=nE" Es como
)a fami)iaF se e:tien+e se e:tien+e !asta +on+e uno est +is2uesto a to)erar"
3o que quiero +ecir es que tenemos que 2onernos )mites" 7uestro ana)i%a+or estar. en )a )nea
que une e) ana)i%a+or Dcom2)etamente in?ti)E5 que cance)a )a construcci=n +e) #*$ -)o6a)5 e)
Dim2osi6)e ana)i%a+or 2erfectoE5 que es ca2a% +e inter2retar cua)quier entra+a +e +atos +e)
2ro-rama+or5 recu2erarse +e cua)quier error5 corri-ien+o e) 2ro-rama +e manera que funcione
como e) usuario quera5 in+e2en+ientemente +e )o que !aa escrito" 3a cuesti=n es +eterminar en
qu 2unto +e +ic!a )nea nos 0amos a encontrar" Guscamos un equi)i6rio ra%ona6)e entre
2restaciones faci)i+a+ +e im2)ementaci=n"
/na +e )as maneras m.s senci))as +e encontrar e) 2unto que 6uscamos es uti)i%an+o un fic!ero +e
e4em2)o5 en e) cua) se encuentren 2resentes )os errores +e )os que nos queremos recu2erar" E)
fic!ero +e e4em2)o5 a+em.s +e mostrar )os errores a corre-ir5 es +e 2or s un e:ce)ente 6anco +e
2rue6as"
7uestro fic!ero +e errores ser. e) si-uienteF
// Fichero err.leli
clase Inicio
metodo inicio(
{
Sistema.Imprime("Hola mundo!"+nl)
}
mtodo m (Entero a, b
parametro.a = 1;
Systema.imprime(a)
}
}
E) ana)i%a+or +e6er. Aa) menosA ser resistente a )os errores que mostramos en +ic!o fic!ero" *e
trata so6re to+o +e omisiones +e toHens +e 2untuaci=n" Con que e) ana)i%a+or sea DresistenteE a
)os errores queremos +ecir que recono%ca e) te:to muestre )os errores 2or 2anta))a5 2ero sea
ca2a% +e construir e) #*$ com2)eto correctamente"
En e) esta+o actua) e) ana)i%a+or no ))e-ar. mu )e4os@ no ))e-ar. ni siquiera a reconocer )a c)ase5
que+an+o un #*$ 6astante 2o6reF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 20
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.,6 Aplicaci(n en el compilador de LeLi
Ilustracin ..* /01 sin recuperacin de errores
+.+.2: A'licando los sAmbolos de sincronismo
3a maora +e )os errores que encontramos en e) fic!ero +e e4em2)o son omisiones +e sm6o)os
+e 2untuaci=n K 6ien 2o+ramos ))amar)os +e sincronismo" 3a situaci=n en )a que nos
encontramos es i+ea) 2ara 2ro6ar )a tcnica que !emos a2ren+i+o en )a secci=n anterior5 es +ecir5
)a a2)icaci=n +e sm6o)os +e sincronismo5 com2)eta+a con tram2as 2ara e:ce2ciones retraso en
e) tratamiento +e errores"
9ara im2)ementar com2)etamente )a estrate-ia5 0amos a se-uir )os si-uientes 2asosF
X Con0ertir )a -ram.tica en una HU15 con au+a +e )os 2re+ica+os sint.cticos
X #Ca+ir )a infraestructura 2ara mane4ar sm6o)os +e sincronismo
X Co)ocar tram2as +e e:ce2ciones
X 8etar+ar e) tratamiento +e errores en a)-unas re-)as
9ara 2o+er enten+er com2)etamente )o que 0amos a +iscutir en este a2arta+o5 es mu
im2ortante !a6er com2ren+i+o )a estrate-ia +e recu2eraci=n que !emos e:2)ica+o en
)a secci=n anterior" Iar contnuas referencias a e))a a )o )ar-o +e este a2arta+o" 3os
que no estn se-uros +e com2ren+er)a5 +e6eran re2asar)a"
=aciendo 9Q1
Ja !emos esta6)eci+o que 2ara que )a tcnica 2ue+a e4ecutarse i+=neamente +e6emos uti)i%ar una
-ram.tica con HU1" #s que 0amos a mo+ificar )a o2ci=n corres2on+ienteF
class LeLiErrorRecoveryParser extends LeLiParser;
options
{
importVocab=LeLiParserVocab;
7&I;
}
*i intentamos -enerar e) ana)i%a+or en e) esta+o actua)5 #7$38 -enerar. 4 mensa4es +e
a+0ertencia en & re-)asF declaracion5 tipoRetorno5 raizAcceso5 subAcceso5
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2,
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.,6 Aplicaci(n en el compilador de LeLi
alternativasSi" 9or cierto5 )os errores se +etectar.n en e) fic!ero
extendedLeLiErrorRecoveryParser.g5 que #7$38 !a6r. -enera+o en nuestro +irectorio +e
tra6a4o
&3
"
Ia6r. que mo+ificar con0enientemente )as & re-)as 2ara conse-uir una -ram.tica con HU1" 9or
su2uesto5 ten+remos que uti)i%ar 2re+ica+os sint.cticos" 7o es mu +ifci)5 se trata +e +etectar )as
a)ternati0as que comien%an 2or e) mismo toHen5 aCa+ir un 2re+ica+o sint.ctico en )a 2rimera
a)ternati0a 2ara e)iminar )a seme4an%a"
# continuaci=n mostrar )a nue0a im2)ementaci=n +e )as re-)as" 3os 2re+ica+os sint.cticos
a2arecen seCa)a+os"
class LeLiErrorRecoveryParser extends Parser;
options {...} // importVocab, k=1
// ----------------------- HACER k=1 -----------------------------
declaracion ! // desactivar construccin por defecto
[AST r, AST t, boolean inicializacion] // parmetros
{
AST raiz = astFactory.dupTree(r); // copia del rbol
raiz.addChild(astFactory.dupTree(t)); // copia del rbol
}
: { inicializacion }? // pred. semntico
(IL@5+ 8D_*SIM) &> i1:IDENT OP_ASIG valor:expresion
{
raiz.addChild(#i1);
raiz.addChild(#valor);
## = raiz;
}
| { inicializacion }?
(IL@5+ D*N@5+_*B) &>
i2:IDENT parentAb le:listaExpresiones parentCe
{
raiz.addChild(#i2);
raiz.addChild(#le);
## = raiz;
}
| i3:IDENT
{
raiz.addChild(#i3);
## = raiz;
}
;
/** Regla auxiliar que codifica el tipo de retorno de un mtodo */
protected tipoRetorno
: (tipo IL@5+) &> tipo
| /* nada */ {## = #[TIPO_VACIO,"TIPO_VACIO"]; }
;
/**
* Raz de los accesos que no son llamadas a un mtodo de la
* clase "actual"
*/
raizAcceso : ((IL@5+2N@S_:85S+NO:+8N) D*N@5+_*B)&>llamada
&3 Esto no es en a6so)uto cierto" #7$38 no 2ermite +ec)arar un ana)i%a+or sin a) menos una re-)a +e reconocimiento5 2or )o que
e:ten+e+3e3iError8eco0er9arser no se -enerar." 9ara e))o !a que escri6ir una re-)a est?2i+a5 como aF ,1E7$@
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 27
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.,6 Aplicaci(n en el compilador de LeLi
| IDENT
| literal
| conversion
| PARENT_AB! expresion parentCe
;
/** Regla que reconoce los accesos a atributos y mtodos de un objeto. */
subAcceso
: ((IL@5+2N@S_:85S+NO:+8N) D*N@5+_*B)&>llamada
| IDENT
| RES_SUPER
;
/**
* Auxiliar (reconoce las alternativas de la instruccin "si"
* sin warnings de ambiguedad)
*/
protected alternativasSi
: (B*NN*_>@N+ D*N@5+_*B)&>altSiNormal alternativasSi
| altSiOtras
| /* nada */
;
Como 2ue+e 0erse no es mu com2)ica+o" 3o ?nico que !a6ra que resa)tar es e) or+en +e )os
2re+ica+os cuan+o !a 2re+ica+os sint.cticos sem.nticos en )a misma a)ternati0a" Como 2ue+e
0erse en )a re-)a declaracion5 2rimero se escri6en )os 2re+ica+os sem.nticos )ue-o )os
sint.cticos"
In)raestructura para los to9ens de sincronismo
3o 2rimero que !ar. fa)ta ser. inc)uir e) mto+o sincroni%ar e) con4unto sim6o)os*incro en e)
ana)i%a+or" E) con4unto +e sm6o)os +e sincronismo que Ainicia)menteA 0amos a uti)i%ar ser.
{LLAVE_AB, LLAVE_CE, PARENT_AB, PARENT_CE, COMA, PUNTO_COMA, PUNTO,
BARRA_VERT, RES_CLASE, RES_METODO, RES_ATRIBUTO, RES_DESDE, RES_HACER,
RES_MIENTRAS, RES_SI, RES_VOLVER}
Es +ecir5 0amos a uti)i%ar como toHens +e sincronismo to+os )os Dsm6o)os +e 2untuaci=nE
(se2ara+ores que no inter0ienen en )a creaci=n +e e:2resiones) a+em.s +e )as 2a)a6ras reser0a+as
que sir0en 2ara reconocer e) 2rinci2io +e una estructura reco-niti0a5 como una instrucci=n o una
+ec)araci=n +e atri6uto"
3a im2)ementaci=n5 una 0e% esta6)eci+o e) con4unto +e toHens +e sincronismo5 es casi inme+iataF
class LeLiErrorRecoveryParser extends LeLiParser;
options {...}
{
/** Smbolos de sincronismo **/
public static final BitSet simbolosSincro = mk_simbolosSincro();
private static final BitSet mk_simbolosSincro()
{
BitSet b = new BitSet();
b.add(LLAVE_AB);
b.add(LLAVE_CE);
b.add(PARENT_AB);
b.add(PARENT_CE);
b.add(COMA);
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2/
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.,6 Aplicaci(n en el compilador de LeLi
b.add(PUNTO_COMA);
b.add(PUNTO);
b.add(BARRA_VERT);
b.add(RES_CLASE);
b.add(RES_METODO);
b.add(RES_ATRIBUTO);
b.add(RES_DESDE);
b.add(RES_HACER);
b.add(RES_MIENTRAS);
b.add(RES_SI);
b.add(RES_VOLVER);
b.add(IDENT); // para mtodo y parmetro
return b;
}
/** Funcin de sincronizacin con smbolos de sincronismo **/
public void sincronizar ( RecognitionException re,
BitSet SIGUIENTE )
throws TokenStreamException, RecognitionException
{
... // (Consultar implementacin en la seccin anterior)
}
}
E:ce2tuan+o )as re-)as en )as que necesitemos un tratamiento +e erroes +iferente (como en )as
tram2as 2ara e:ce2ciones)5 e) mto+o sincronizar ser. e) que uti)icemos como mane4a+or +e
e:ce2ciones en to+as )as re-)as que mo+ifiquemos en )a recu2eraci=n +e errores" 3as re-)as que
no toquemos se-uir.n uti)i%an+o e) mane4a+or que #7$38 2ro2orciona 2or +efecto"
+.+.3: &olocando las tram'as 'ara exce'ciones
Co)ocar tram2as 2ara e:ce2ciones no consiste m.s que en e)e-ir una serie +e toHens a+ecua+os
sustituir sus referencias 2or referencias a una re-)a que )os reconoce +e una manera es2ecia)" Es
+ecir5 si LLAVE_AB es un toHen can+i+ato a ser tram2a5 !a que sustituir)o 2or )a re-)a llaveAb
en to+a )a -ram.tica ()a uti)i+a+ +e 6uscarAAreem2)a%ar +e su e+itor +e te:tos !a6itua) )e
2ermitir. sa)ir airoso +e este a2rieto)"
Ramos a co)ocar tram2as en )os si-uientes toHensF
{ LLAVE_AB,LLAVE_CE,PARENT_AB,PARENT_CE,PUNTO_COMA,PUNTO,COMA,BARRA_VERT }
3as tram2as 2ara e:ce2ciones que 0amos a construir tienen to+as )a misma estrate-ia +e
recu2eraci=n5 que !emos enca2su)a+o +entro +e) mto+o errorFaltaToken" 3as tram2as
ten+r.n e) si-uiente as2ectoF
/** Regla auxiliar para reconocer parntesis necesarios **/
parentAb : PARENT_AB! ;
exception catch [RecognitionException ex]
{ errorFaltaToken(PARENT_AB); }
/** Regla auxiliar para reconocer parntesis necesarios **/
parentCe : PARENT_CE! ;
exception catch [RecognitionException ex]
{ errorFaltaToken(PARENT_CE); }
/** Regla auxiliar para reconocer llaves necesarias **/
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2<
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.,6 Aplicaci(n en el compilador de LeLi
llaveAb : LLAVE_AB! ;
exception catch [RecognitionException ex]
{ errorFaltaToken(LLAVE_AB); }
/** Regla auxiliar para reconocer llaves necesarias **/
llaveCe : LLAVE_CE! ;
exception catch [RecognitionException ex]
{ errorFaltaToken(LLAVE_CE); }
/** Regla auxiliar para reconocer comas necesarias **/
coma : COMA! ;
exception catch [RecognitionException ex]
{ errorFaltaToken(COMA); }
/** Regla auxiliar para reconocer barras verticales necesarias **/
barraVert : BARRA_VERT! ;
exception catch [RecognitionException ex]
{ errorFaltaToken(BARRA_VERT); }
/** Regla auxiliar para reconocer puntos y comas necesarios **/
puntoComa : PUNTO_COMA! ;
exception catch [RecognitionException ex]
{ errorFaltaToken(PUNTO_COMA); }
/** Regla auxiliar para reconocer puntos **/
punto : PUNTO! ;
exception catch [RecognitionException ex]
{ errorFaltaToken(PUNTO); }
Ramos a 0er )a estructura +e) mto+o errorFaltaToken5 que como es !a6itua) !a6r. que inc)uir
en )a secci=n +e c=+i-o 4a0a +e LeLiErrorRecoveryParser.gF
public void errorFaltaToken( int token )
throws TokenStreamException
{
Token t0 = LT(0);
Token t1 = LT(1);
if(t1.getType() != Token.EOF_TYPE)
{
String t1Text;
if(t1.getType()==IDENT)
t1Text = "el identificador '" + t1.getText() +"'";
else
t1Text = getTokenName(t1.getType());
reportError( "Se esperaba " + getTokenName(token) +
", se encontr " + t1Text,
this.getFilename(),
t1.getLine(),
t1.getColumn() - t1.getText().length() );
}
else
{
reportError ( "Se esperaba " + getTokenName(token) +
" cuando se alcanz el final de fichero",
this.getFileName(),
t0.getLine(),
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 21
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.,6 Aplicaci(n en el compilador de LeLi
t0.getColumn() ) ;
}
}
E) ?nico 2ar.metro +e) mto+o es un entero que re2resenta e) ti2o +e) toHen que fa)ta (IDENT5
PUNTO_COMA5 etc)" 3a maor 2arte +e) c=+i-o +e) mto+o se +e+ica a emitir un mensa4e +e error
)o m.s es2ecfico 2osi6)e" 9ara crear +ic!o mensa4e se si-ue e) si-uiente a)-oritmoF
X *i se !a ))e-a+o a) fina) +e) fic!ero5 se escri6e Dse es2era6a jtoHenV cuan+o se a)can%= e) fina)
+e) fic!eroE
X *i no5 !a un toHen en 3$(1)" E) mensa4e ser. Dse es2era6a jtoHenV5 2ero se encontr= un
toHen j3$(1)VE" *i e) toHen en 3$(1) es un i+entifica+or5 se +eta))ar. un 2oco m.s5 in+ican+o
que se trata +e un i+entifica+or con e) te:to D:::E"
3)e-a+os a este 2unto tenemos que incrustar )as tram2as en nuestras re-)as"
A Gien5 a!ora so)amente que+a so6reescri6ir en LeLiErrorRecoveryParser to+as )as re-)as +e
LeLiParser que usen uno +e estos toHens 2ara que uti)icen una tram2a 2ara re-)as A +ice nuestro
2ro0er6ia) 2ro-rama+or no0ato" Ramos a res2on+er)e"
A Esa so)uci=n no es a+ecua+a" 1a+o que )a maora +e )as re-)as +e LeLiParser uti)i%a a)-?n
toHen con tram2a5 0amos a tener que reescri6ir )a maora +e )as re-)as en
LeLiErrorRecoveryParser"
A OPu !acemos entoncesQ L7o me +ir.s a estas a)turas que 0amos a mo+ificar LeLiParser
+irectamenteN Con to+a )a )ata que me !as +a+o con uti)i%ar )a !erencia +e -ram.ticas 2ara no
mo+ificar e) fic!ero ori-ina)"""
A E) 2ro2=sito +e uti)i%ar )a !erencia no era ni muc!o menos Dmantener intacto 3e3i9arser"-E5
sino uno m.s 2rofun+oF faci)itarnos )a 0i+a a) 2ro-ramar5 incrementan+o )a f)e:i6i)i+a+ sin
2er4u+icar )a manteni6i)i+a+ +e) sistema" 9ue+e 2arecer que esto se 2ue+e conse-uir sin tocar )a
-ram.tica 6ase5 2ero eso no es cierto siem2re"
A # 0er si )o !e enten+i+oF es como con )a orientaci=n a o64etos@ a 0eces a) +esarro))ar una
su6c)ase nos +amos cuenta +e que )a c)ase 6ase necesita a)-?n retoque"
A LE:actamenteN Jo no )o !a6ra e:2)ica+o me4or"
A Gueno5 entonces5 Oqu !acemosQ
A Ramos a +e4ar )a -ram.tica 6ase D2re2ara+aE 2ara ace2tar tram2as 2ara e:ce2ciones5 aunque no
)as im2)emente" 9ara e))o5 +efiniremos )as si-uientes re-)as en LeLi>arser.g F
parentAb : PARENT_AB! ;
parentCe : PARENT_CE! ;
llaveAb : LLAVE_AB! ;
llaveCe : LLAVE_CE! ;
coma : COMA! ;
barraVert : BARRA_VERT! ;
puntoComa : PUNTO_COMA! ;
punto : PUNTO! ;
A L;!N
A #+em.s rea)i%aremos )as sustituciones (PARENT_AB 2or parentAb5 etc) tam6in en
LeLiParser.g en )u-ar +e en LeLiErrorRecoveryParser.g"
A LC)aroN L#s5 so)amente !a que reescri6ir )as re-)asAtram2aN
A Efecti0amente" LeLiParser se-uir. tenien+o una -ram.tica )e-i6)e e in+e2en+iente +e)
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 211
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.,6 Aplicaci(n en el compilador de LeLi
tratamiento +e errores" J e) fic!ero LeLiErrorRecoveryParser.g ser. muc!o m.s c)aro"
A 9ero !a un incon0enienteF a!ora LeLiParser ser. m.s )ento@ se ))aman a m.s mto+os !a
m.s 6)oques try/catch 2ara reconocer )as mismas entra+as que antes"
A 3a f)e:i6i)i+a+ sue)e co6rarse un 2equeCo 2ea4e +e 0e)oci+a+" 9ero 6ien o6ser0a+o" #!ora5 si no
te im2orta5 2asemos a) si-uiente 2unto"
+.+.": Retardando el tratamiento de errores
E:isten 0arias re-)as en )as que encontraremos e) 2ro6)ema +e) )an%amiento in+esea+o +e una
NoViableAltException" Ro a ca2turar )as e:ce2ciones en )u-ar +e +esacti0ar)as (2refiero
enfrentarme a )os errores en )u-ar +e in-norar)os@ a) menos 2ro-raman+o)"
En nuestra -ram.tica estas re-)as son )as que 2ue+en reconocer Dna+aE5 a e:ce2ci=n +e) cierre +e
M)eene" 9or )o tanto estamos !a6)an+o +e re-)as o su6 re-)as que ten-an a)ternati0as (#]G]C)
sien+o a)-una +e e))as 0aca (#]G]) o +e re-)as o su6 re-)as o2ciona)es ((#)Q)"
Es +ecir5 0amos a tener que ca2turar e:ce2ciones en expAsignacion5 expPostIncremento5
clausulaExtiende listaDecParams" Comencemos con )as +os 2rimeras"
expAsignacion expPostIncremento )an%an NoViableAltException in+esea6)emente en su6
re-)as" Ramos a tener que +i0i+ir)as en re-)asAsu6 re-)as 2ara 2o+er ca2turar )a e:ce2ci=n"
Rase )a secci=n anterior 2ara una e:2)icaci=n m.s +eta))a+a so6re e) retar+o +e)
tratamiento +e errores5 expPostIncremento expAsignacion"
/** Asignaciones (nivel 9) */
expAsignacion : izq:expOLogico der:expAsignacion2
{ ## = construyeExpBin(#izq, #der); }
;
expAsignacion2 : ( OP_ASIG^ expOLogico )? ;
exception catch [NoViableAltException nvae]
{ sincronizar(nvae, $FOLLOW); }
/** Postincremento y postdecremento (nivel 2) */
expPostIncremento : operando:expNegacion operador:expPostIncremento2
{ ## = construyeExpUn(#operando, #operador); }
;
expPostIncremento2 : ( OP_MASMAS^|OP_MENOSMENOS^ )?
;
exception catch [NoViableAltException nvae]
{ sincronizar(nvae, $FOLLOW); }
1a+o que )as re-)asAsu6 re-)as contenan a )a ra% +e )as re-)as ori-ina)es
&4
5 nos !emos teni+o que
ser0ir +e )os mto+os construyeExpUn construyeExpBin5 que tam6in !a6r. que es2ecificar
en )a secci=n +e c=+i-o +e) ana)i%a+or"
public AST construyeExpUn(AST operando, AST operador)
{
if(null==operador) return operando;
if(operando.getNextSibling()==operador)
{
operando.setNextSibling(null);
&4 *i esto )e suena a c!ino5 consu)te )a secci=n anterior con +etenimiento"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 212
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.,6 Aplicaci(n en el compilador de LeLi
}
operador.setFirstChild(operando);
return operador;
}
public AST construyeExpBin ( AST izquierda, AST derecha )
{
if(derecha != null)
{
// "desconectar" los nodos si es necesario
if(izquierda.getNextSibling()==derecha)
{
izquierda.setNextSibling(null);
}
AST valor = derecha.getFirstChild();
return #(derecha, izquierda, valor);
}
return izquierda;
}
En clausulaExtiende sim2)emente uti)i%aremos un sincroni%a+or"
clausulaExtiende : RES_EXTIENDE^ IDENT
| /*nada*/
{ ## = #( #[RES_EXTIENDE,"extiende"],
#[IDENT, "Objeto"] ); }
;
exception catch [NoViableAltException nvae]
{
sincronizar(nvae, $FOLLOW);
## = #( #[RES_EXTIENDE,"extiende"], #[IDENT, "Objeto"] );
}
7=tese que inc)uso en e) caso +e que se )ance una e:ce2ci=n seremos ca2aces +e suministrar un
#*$ 2ara )a c).usu)a e:tien+e"
Iemos +e4a+o )o me4or 2ara e) fina)" 8ecu2eraci=n +e errores en una )ista +e +ec)araciones +e
2ar.metros"
3a )ista +e +ec)araciones +e 2ar.metros es5 se-uramente5 una +e )as estructuras +e 3e3i m.s
com2)ica+as +e tratar en recu2eraci=n +e errores" 3o que ocurre es que es una estructura
rea)mente com2)ica+aF )os 2ar.metros !an +e estar se2ara+os 2or 2untos comas5 2ero cuan+o
son +e) mismo ti2o se se2aran 2or comas so)amente se necesita escri6ir e) ti2o una 0e%" 3as +os
formas +e +ec)araci=n (con comas con 2untos comas) 2ue+en coe:istir en )a misma +e
+ec)araciones" >ina)mente5 )a 2ro2ia )ista 2ue+e ser com2)etamente 0aca5 a sa6emos que )as
o2ciones 0acas no se 2restan faci)mente a )a recu2eraci=n"
*e trata5 en +efiniti0a5 +e una estructura 6astante com2)e4a5 que requiere un tratamiento +e
errores un 2oco m.s refina+o"
Em2ecemos con )o o60ioF un error en e) reconocimiento +e )a )ista +e +ec)araciones +e
2ar.metros +e un mto+o no +e6e5 6a4o nin-?n conce2to5 anu)ar e) reconocimiento +e) mto+o a)
que 2ertenece (2ro0ocan+o una e:ce2ci=n cance)an+o +ecBeto+o)"
9or otro )a+o5 0amos a intentar no Dcance)ar antes +e tiem2oE e) an.)isis" Es +ecir5 si
encontramos un error en un 2ar.metro5 2ero )os +em.s est.n 6ien +efini+os5 stos +e6en ser
correctamente ana)i%a+os su informaci=n inc)ui+a en e) #*$ +e )a re-)a"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 21-
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.,6 Aplicaci(n en el compilador de LeLi
9ara e0itar que listaDecParametros 2ue+a anu)ar a decMetodo )o m.s senci))o es uti)i%ar un
sincroni%a+orF co)ocamos e) mane4a+or +e e:ce2ciones a) fina) +e )a re-)a5 as ase-uramos que
nin-una e:ce2ci=n )a a6an+one !acia e) ni0e) su2erior +e )a 2i)a +e ))ama+as"
Pue+a 2or reso)0er e) se-un+o 2ro6)emaF cuan+o ocurre un error que se recu2era con un
mane4a+or +e e:ce2ciones -)o6a)5 se cance)a )a construcci=n +e #*$5 )o que en nuestro caso
si-nifica 2er+er )os #*$s a -enera+os" 9ara conser0ar )a construcci=n +e) #*$ 0amos a uti)i%ar
una estrate-ia +e Dsa)0a-uar+aEF ca+a 0e% que +ec)aremos una )ista +e 2ar.metros +e) mismo
ti2o5 mo+ificaremos e) #*$ +e )a re-)a (en )u-ar +e !acer)o so)amente a) fina))"
E) c=+i-o 2ara listaDecParametros ser.5 2or )o tanto5 e) si-uienteF
listaDecParams
{ final AST raiz = #[RES_PARAMETRO,"parmetro"] ; }
:
{ ## = #[LISTA_DEC_PARAMS,"parmetros"]; }
( l1:listaDeclaraciones[raiz, false]P
{ ##.addChild(#l1); }
( puntoComa ln:listaDeclaraciones[raiz, false]P
{ ##.addChild(#ln); }
)*
)? // opcional
;
// Capturar NoViableAltException y resincronizar
exception catch [NoViableAltException nvae]
{ sincronizar(nvae, $FOLLOW); }
7=tense )os +os o2era+ores +e fi)tra+o que !e seCa)a+o en e) c=+i-o"
+.+.#: rrores !recuentes acentuaci%n
+l pro7lema
Ja !emos trata+o e) ti2o m.s frecuente +e error sint.ctico que a2areci. en e) e4em2)o" Be refiero
a) ti2o Dse es2era6a e) toHen :E o Dse es2era6a un toHen +entro +e) -ru2o (:55%)E" Estos errores
son 2ro0oca+os 2or e:ce2ciones" *us mensa4es tienen una 2arte fi4a (Dse es2era6a e) toHen E o
Dse es2era6a un toHen +entro +e) -ru2o E) una 2arte 0aria6)e5 que se confi-ura me+iante
2ar.metros +e )as e:ce2ciones (D:E D:55%E)"
E) 2ro6)ema es que en ocasiones )os mensa4es 2ro2orciona+os 2or e) com2i)a+or no son
suficientes" Consi+rese e) si-uiente e4em2)oF
clase Persona
{
atributo Entero edad;
metodo erroresLexicos(Entero edad)
{
atributo.edad = parametro.edad;
}
*i se com2i)a e) e4em2)o anterior5 se o6ten+r.n +os errores +e reconocimiento 2areci+os a stosF
Persola.leli:4:1: Se esperaba un token en el grupo (mtodo, atributo)
Persona.leli:6:19: El identificador parametro no ha sido declarado
E) se-un+o error es sem.ntico no a2arecer. !asta que no !aamos im2)ementa+o e) ni0e)
sem.ntico en e) ca2tu)o si-uiente5 2ero eso es )o +e menos"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 21)
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.,6 Aplicaci(n en el compilador de LeLi
OPu es )o que !a ocurri+oQ En )a )nea 4 e) 2ro-rama+or !a escrito Dmeto+oE en )u-ar +e
Dmto+oE en )a )nea 6 !a escrito D2arametroE en )u-ar +e D2ar.metroE" Es +ecir5 en )os +os
casos se !a o)0i+a+o +e inc)uir )os acentos +e )as 2a)a6ras reser0a+as"
LEste es5 sin +u+a5 un error mu frecuenteN 9ue+e 2asar un 6uen rato antes que e) 2ro-rama+or se
+ cuenta +e )o que ocurre" 3os mensa4es +e error que se muestran no son a+ecua+os"
3o i+ea) sera que5 antes inc)uso +e ))e-ar a) ni0e) sem.ntico5 es +ecir en e) ana)i%a+or sint.ctico5
se +etectaran estas omisiones +e )os acentos se mostraran mensa4es m.s +escri2ti0osF
Persona.leli:4:1: Omisin de acento; escriba mtodo en lugar de metodo
Persona.leli:4:1: Omisin de acento; escriba parmetro en lugar de
parametro
+l m2todo
Em2e%aremos con un mto+o que enca2su)e to+a )a 2ro6)em.tica re)aciona+a con )os mensa4es
+e omisi=n +e ti)+e" 3)amaremos a +ic!o mto+o comprobarErrorTilde"
public boolean comprobarErrorTilde ( Token t, AST ast,
String textoIncorrecto, int tipoCorrecto,
String textoCorrecto )
{
if( t.getText().equals(textoIncorrecto) )
{
reportError( "Omisin de tilde. " +
"Escriba '" + textoCorrecto +
"' en lugar de '" + t.getText() + "'",
this.getFilename(),
t.getLine(),
t.getColumn() );
ast.setType( tipoCorrecto );
ast.setText( textoCorrecto );
return false;
}
return true;
}
Este mto+o toma como 2ar.metros e) toHen 2ro6)em.tico5 su #*$5 e) te:to sin acento5 e) ti2o
que +e6era tener e) toHen e) te:to que +e6era tener5 -enera un mensa4e a+ecua+o5 a+em.s +e
mo+ificar e) ast si es necesario" E) mto+o +e0ue)0e DtrueE si no !a6a errores Dfa)seE si !a
teni+o que cam6iar a)-o"
$as estrategias
$enemos que in-eniarnos)as 2ara uti)i%ar este mto+o cuan+o se )ea D2arametroE o Dmeto+oE en
)u-ar +e D2ar.metroE Dmto+oE"
3a forma m.s senci))a +e reconocer )os errores +e acentuaci=n (5 en -enera)5 cua)quier error +e
escritura +e una 2a)a6ra reser0a+a +e) )en-ua4e) es reser0ar tam6in )as ca+enas err=neas como si
fueran 2a)a6ras reser0a+as" Es +ecir5 aCa+ir +os toHens a) ana)i%a+or ):ico5 a)-o como
RES_PARAMETRO_ERROR RES_METODO_ERROR" *in em6ar-o esta forma +e 2roce+er im2e+ir. a)
2ro-rama+or uti)i%ar D2arametroE Dmeto+oE como i+entifica+ores en su 2ro-rama"
#unque 2ue+e que no sea tan ma)a i+ea im2e+ir)e uti)i%ar estos toHens5 esta estrate-ia no es
e:tensi6)e" OPu ocurre si muc!as +e )as 2a)a6ras reser0a+as tienen 2osi6i)i+a+ +e escri6irse ma)Q
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 210
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.,6 Aplicaci(n en el compilador de LeLi
/ti)i%an+o esta estrate-ia se im2i+e a) 2ro-rama+or uti)i%ar i+entifica+ores que +e6era 2o+er
uti)i%ar"
3a se-un+a estrate-ia no necesita reser0ar )os i+entifica+ores5 2ero es un 2oco m.s com2)ica+a
+e im2)ementar" 9ara e))o5 )o que !aremos ser. tratar)os como i+entifica+ores@ i+entifica+ores que
2ue+en sustituir a )as 2a)a6ras reser0a+as en +etermina+as ocasiones" Esta ser. )a estrate-ia que
uti)i%aremos"
/odi)icaciones en las reglas
Em2ecemos con parmetro5 RES_PARAMETRO 2ara )os ami-os" RES_PARAMETRO se uti)i%a en
3e3i 2ara so)ucionar e) 2ro6)ema +e +iferenciaci=n entre 2ar.metros5 0aria6)es atri6utos +e una
c)ase cuan+o to+os tienen e) mismo nom6re" *e uti)i%a ante2onin+o)a a) i+entifica+or que 0amos
a uti)i%ar con un 2unto" *e reconoce en )a re-)a raizAcceso5 que a !emos re+efini+o en e)
ana)i%a+or 2ara !acer HU1"
raizAcceso es una re-)aAa)ternati0a" *e +a )a fe)i% casua)i+a+ +e que una +e sus o2ciones es
IDENT5 +e manera que )o ?nico que 0amos a tener que !acer es aCa+ir una 2equeCa acci=n que
emita un mensa4e mo+ifique e) .r6o) si e) te:to +e) i+entifica+or es D2arametroE" $o+o eso a se
!ace +entro +e comprobarErrorTilde" #s5 e) c=+i-o +e raizAcceso que+ar. como si-ueF
raizAcceso : ((IDENT|RES_CONSTRUCTOR) PARENT_AB)=>llamada
| i:IDENT
{ comprobarErrorTilde( i, #i, "parametro",
RES_PARAMETRO, "parmetro" ); }
| literal
| conversion
| PARENT_AB! expresion parentCe
;
exception catch [NoViableAltException nvae]
{ sincronizar(nvae, $FOLLOW); }
E) caso +e Dmto+oE Dmeto+oE es un 2oco m.s com2)ica+o" Ia +os 2ro6)emasF e) toHen
conf)icti0o +e6e usarse como ra% en un #*$5 a+em.s no !a nin-una Da)ternati0a 2ara IDENTE
a !ec!a"
3a 2a)a6ra reser0a+a RES_METODO so)amente se uti)i%a 2ara +efinir un mto+o5 en )a re-)a
decMetodo" 3o 2rimero que !e !ec!o !a si+o sustituir en decMetodo )a referencia +irecta a
RES_METODO 2or una ))ama+a a una re-)a au:i)iar5 +e nom6re resMetodo" #+em.s !e aCa+i+o
una acci=n 2ara Dreenrai%arE e) #*$"
decMetodo
: r/resBetodoP (RES_ABSTRACTO)? tipoRetorno IDENT
parentAb listaDecParams parentCe
llaveAb listaInstrucciones llaveCe
{ .. & .(.r?..); !
;
7=tese que e) #*$ que construe resMetodo so)amente se inc)ue en e) #*$ fina) en )a acci=n5
2orque 2or +efecto no se inc)ue (a) estar suceci+o +e) sufi4o [N[)
&&
"
3a estructura +e )a re-)a que nos que+a 2or e:aminar5 resMetodo5 ser. )a si-uienteF
&& 9o+emos !acer esto 2orque sa6emos que er no tiene !i4os@ si )os tu0iera quisiramos conser0ar)os5 +e6eramos escri6ir
r"a++C!i)+(ee)@ eeUer@
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 21,
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.,6 Aplicaci(n en el compilador de LeLi
resMetodo : RES_METODO
| i:IDENT
{
if( comprobarErrorTilde( i, #i, "metodo",
RES_METODO, "mtodo") )
{
throw new MismatchedTokenException( tokenNames,
i,
RES_METODO,
false,
getFilename() );
}
}
;
exception catch [NoViableAltException nvae]
{ sincronizar(nvae, $FOLLOW); }
En este caso 0emos que se a+miten +os a)ternati0asF )a 2a)a6ra reser0a+a RES_METODO o un
IDENT" En este ?)timo caso !a un error" Pue+a 2or sa6er cu.) es@ en rea)i+a+ es senci))oF si e)
toHen tiene como te:to Dmeto+oE es un error +e acentuaci=n5 en cua)quier otro caso se trata +e
un toHen no 0.)i+o"
3)aman+o a comprobarErrorTilde )an%aremos un error si so)o si e) te:to +e) toHen
reconoci+o es Dmeto+oE" En cua)quier otro caso5 )an%aremos un error +e toHen ines2era+o5
i+ntico a) que se )an%ara si )a re-)a resMetodo so)amente fuera ca2a% +e reconocer
RES_METODO"
Juelta a los to9ens de sincronismo
3a recu2eraci=n +e errores a es mu 6uena" Casi to+os )os casos est.n trata+os" Ro a 2ro2oner
aqu una 2equeCsima me4ora"
En e) esta+o actua)5 #7$38 uti)i%a RES_METODO RES_PARAMETRO como toHens +e sincronismo"
O7o estara 6ien uti)i%ar Dmeto+oE D2arametroE tam6in como toHens +e sincronismoQ
L#!N Ro)0emos a) 2ro6)ema que tenamos 2ara tratar )os errores +e escritura +e 2a)a6ras
reser0a+as" 3o m.s senci))o sera reconocer sim2)emente )as +os ca+enas +e te:to con +os toHens
+etermina+os (a )os que !emos +a+o inc)uso nom6re5 RES_METODO_ERROR
RES_PARAMETRO_ERROR) aCa+ir +ic!os toHens a )a )ista +e toHens +e sincronismo5 es +ecir5 a)
Git*et est.tico simbolosSincro" E) 2ro6)ema es5 como a !emos +ic!o5 que +e esta forma
estamos im2i+ien+o a) 2ro-rama+or uti)i%ar Dmeto+oE D2arametroE como nom6res 2ara sus
mto+os5 2ar.metros5 atri6utos5 0aria6)es o c)ases"
$en+remos que !i)ar un 2oco m.s fino" 3o que 0amos a !acer es mo+ificar e) a)-oritmo +e
sincroni%aci=n5 im2)ementa+o en e) mto+o sincronizar5 2ara que uti)ice solamente algunos
IDEA10 como sm6o)os +e sincronismo5 2ero no to+os"
3o 2rimero que 0amos a !acer es aCa+ir IDENT a) con4unto +e toHens +e sincronismoF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 217
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.,6 Aplicaci(n en el compilador de LeLi
public static final BitSet simbolosSincro = mk_simbolosSincro();
private static final BitSet mk_simbolosSincro()
{
BitSet b = new BitSet();
b.add(LLAVE_AB);
...
b.add(IL@5+);
return b;
}
#!ora 0amos a aCa+ir un atri6uto est.tico que a)macene to+os )os i+entifica+ores que +eseemos
que 2artici2en en e) sincronismo (en nuestro caso so)amente +os)" Ramos a uti)i%ar una instancia
+e )a c)ase java.util.HashSet"
public static final HashSet identsSincro = mk_identsSincro();
public static final HashSet mk_identsSincro()
{
HashSet hs = new HashSet();
hs.add("metodo");
hs.add("parametro");
return hs;
}
9ara 2o+er uti)i%ar java.util.HashSet5 0amos a necesitar im2ortar)o en e) !ea+er +e)
ana)i%a+orF
header {
package leli;
import antlraux.Logger;
import 9ava.util.HasASet;
}
>ina)mente !emos +e mo+ificar e) mto+o sincroni%ar 2ara que uti)ice identsSincroF
public void sincronizar ( RecognitionException re,
BitSet SIGUIENTE )
throws RecognitionException, TokenStreamException
{
// Si es SS, "dejar pasar" (terminar la regla)
if( ! simbolosSincro.member(LA(0)) )
{
// Si estamos guessing, lanzamos directamente
if (inputState.guessing!=0) throw re;
BitSet auxiliar = simbolosSincro.or(SIGUIENTE);
// Mostrar el error y consumir, pero utilizando
// auxiliar en lugar de SIGUIENTE
// Y TENIENDO EN CUENTA IDENTIFICADORES ESPECIALES
reportError(re);
boolean bSincronizado = false;
Token t = null;
do {
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 21/
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.,6 Aplicaci(n en el compilador de LeLi
consume();
consumeUntil(auxiliar);
t = LT(0);
if( t.%et+ype()&&IL@5+ QQ // si es un IDENT y
PidentsSincro.contains(t.%et+e<t()) ) // NO es de
identsSincro
{ bSincronizado = false; }
else
{ bSincronizado = true; }
!HAile (PbSincroniEado);
}
}
Ie resa)ta+o )os cam6ios m.s im2ortantes" #!ora es 2osi6)e que tanto consume() como
consumeUntil() sean ))ama+os m.s +e una 0e%5 2or estar +entro +e un 6uc)e"
3a con+ici=n +e sa)i+a +e +ic!o 6uc)e es )a si-uienteF
X *e !a encontra+o un toHen +e sincronismo que no es un IDENT
X *e !a encontra+o un IDENT 2erteneciente a) con4unto i+ents*incro"
Cua)quier toHen que no cum2)a una +e estas +os con+iciones ser. Da6sor6i+oE"
+.+.+: l resultado
*i )an%amos nuestro nue0o f)amante ana)i%a+or a reconocer e) fic!ero +e e4em2)o o6ten+remos
unos resu)ta+os 0er+a+eramente satisfactoriosF com2ro6aremos que e) ana)i%a+or +etecta
correctamente )os errores5 recu2er.n+ose como es +e6i+o" 3a sa)i+a que +e6eramos o6tener
sera 2areci+a a )a si-uienteF
err.leli:5:11: Se esperaba una llave abierta ('{'), se encontr el
identificador 'metodo'
err.leli:5:17: Omisin de tilde. Escriba 'mtodo' en lugar de 'metodo'
err.leli:6:16: Se esperaba un parntesis cerrado (')'), se encontr una llave
abierta ('{')
err.leli:8:16: Se esperaba un punto y coma (';'), se encontr una llave cerrada
('}')
err.leli:12:16: Se esperaba un parntesis cerrado (')'), se encontr el
identificador 'parametro'
err.leli:12:16: Se esperaba una llave abierta ('{'), se encontr el
identificador 'parametro'
err.leli:12:25: Omisin de tilde. Escriba 'parmetro' en lugar de 'parametro'
err.leli:14:16: Se esperaba un punto y coma (';'), se encontr una llave
cerrada ('}')
errores: 8
E) #*$ tam6in se !a6r. recu2era+o" 7o 0o a mostrar)o com2)etamente +es2)e-a+o5 2orque o
6ien ocu2ara m.s +e una 2.-ina o 6ien no 2o+ran )eerse to+os )os nom6res@ !a6r. que fiarse +e
mi 2a)a6raF )os errores se !an recu2era+o satisfactoriamente"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 21<
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.,6 Aplicaci(n en el compilador de LeLi
Ilustracin .., /01 con la recuperacin de errores &uncionando
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 22
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.76 %(digo
Becci%n +.-: &%digo
+.-.1: 5ic*ero LeLiLexer.g
3as mo+ificaciones rea)i%a+as a este fic!ero en este ca2tu)o !an consisti+o maormente en
!a6i)itar )os a)ias 2ara toHens5 2ara -enerar mensa4es +e error m.s inte)i-i6)es"
header{
package leli;
/*-----------------------------------------------*\
| Un intrprete para un Lenguaje Limitado(LeLi) |
| _____________________________________________ |
| |
| ANALISIS LXICO |
| _____________________________________________ |
| |
| Enrique J. Garcia Cota |
\*-----------------------------------------------*/
}
/**
* El objeto que permite todo el analisis lxico.
* notas: comentar todo esto al final del analex.
*/
class LeLiLexer extends Lexer;
options{
charVocabulary = '\3'..'\377'; // Unicodes usuales
exportVocab=LeLiLexerVocab; // Comentar al hacer el parser
testLiterals=false; // comprobar literales solamente cuando se
diga exp
k=2; // lookahead
}
tokens
{
// Tipos basicos
TIPO_ENTERO = "Entero" ;
TIPO_REAL = "Real" ;
TIPO_BOOLEANO = "Booleano" ;
TIPO_CADENA = "Cadena" ;
// Literales booleanos
LIT_CIERTO = "cierto" ; LIT_FALSO = "falso" ;
// Literales cadena
LIT_NL = "nl"; LIT_TAB = "tab" ; LIT_COM = "com";
// Palabras reservadas
RES_CLASE = "clase" ;
RES_EXTIENDE = "extiende" ;
RES_METODO = "mtodo" ;
RES_CONSTRUCTOR = "constructor" ;
RES_ATRIBUTO = "atributo" ;
RES_ABSTRACTO = "abstracto" ;
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 221
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.76 %(digo
RES_PARAMETRO = "parmetro" ;
RES_CONVERTIR = "convertir" ;
RES_MIENTRAS = "mientras" ;
RES_HACER = "hacer" ;
RES_DESDE = "desde" ;
RES_SI = "si" ;
RES_OTRAS = "otras" ;
RES_SALIR = "volver" ;
RES_ESUN = "esUn" ;
RES_SUPER = "super" ;

// Operadores que empiezan con letras;
OP_Y = "y" ;
OP_O = "o" ;
OP_NO = "no" ;
// Los literales real y entero son "devueltos" en las
// acciones del token "privado" LIT_NUMERO
// LIT_REAL < paraphrase="un literal real" >;
// LIT_ENTERO < paraphrase="un literal entero" >;
}
{ // Comienza la zona de cdigo
protected Token makeToken(int type)
{
// Usamos la implementacin de la superclase...
Token result = super.makeToken(type);
// ...y aadimos informacin del nombre de fichero
result.setFilename(inputState.filename);
// y devolvemos el token
return result;
}
}
/**
* Los tres tipos de retorno de carro.
*/
protected NL :
(
("\r\n") => "\r\n" // MS-DOS
| '\r' // MACINTOSH
| '\n' // UNIX
)
{ newline(); }
;
/**
* Esta regla permite ignorar los blancos.
*/
protected BLANCO :
( ' '
| '\t'
| NL
) { $setType(Token.SKIP); } // La accion del blanco: ignorar
;
/**
* Letras espaolas.
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 222
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.76 %(digo
*/
protected LETRA
: 'a'..'z'
| 'A'..'Z'
| '' | ''
| '' | '' | '' | '' | ''
| '' | '' | 'I' | '' | ''
| 'u' | ''
;
/**
* Dgitos usuales
*/
protected DIGITO : '0'..'9';
/**
* Regla que permite reconocer los literales
* (y palabras reservadas).
*/
IDENT
options
{
testLiterals=true; // Comprobar palabras reservadas
paraphrase="un identificador";
}
:
(LETRA|'_') (LETRA|DIGITO|'_')*
;
// Separadores
PUNTO_COMA
options { paraphrase="un punto y coma (';')"; }
: ';'
;
COMA
options { paraphrase="una coma (',')"; }
: ','
;
LLAVE_AB
options { paraphrase="una llave abierta ('{')"; }
: '{'
;
LLAVE_CE
options { paraphrase="una llave cerrada ('}')"; }
: '}'
;
PUNTO
options { paraphrase="un punto ('.')"; }
: '.'
;
PARENT_AB
options { paraphrase="un parntesis abierto ('(')"; }
: '('
;
PARENT_CE
options { paraphrase="un parntesis cerrado (')')"; }
: ')'
;
BARRA_VERT
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 22-
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.76 %(digo
options { paraphrase="una barra vertical ('|')"; }
: '&'
;
// operadores
OP_IGUAL : "==" ;
OP_DISTINTO : "!=" ;
OP_ASIG : '=' ;
OP_MENOR : '<' ;
OP_MAYOR : '>' ;
OP_MENOR_IGUAL : "<=" ;
OP_MAYOR_IGUAL : ">=" ;
OP_MAS : '+' ;
OP_MENOS : '-' ;
OP_MASMAS : "++" ;
OP_MENOSMENOS : "--" ;
OP_PRODUCTO : '*' ;
OP_DIVISION : '/' ;
/**
* Permite reconocer literales enteros y reales sin generar conflictos.
*/
LIT_NUMERO
: ( ( DIGITO )+ '.' ) =>
( DIGITO )+ '.' ( DIGITO )*
{ $setType(LIT_REAL); }
| ( DIGITO )+
{ $setType(LIT_ENTERO); }
;
LIT_ENTERO
options { paraphrase = "un literal entero"; }
: '@' { throw new MismatchedCharException(); }
;
LIT_REAL
options { paraphrase = "un literal real"; }
: '#' { throw new MismatchedCharException(); }
;
/**
* Comentario de una sola lnea
*/
protected COMENTARIO1
: "//" (~('\n'|'\r'))*
{ $setType(Token.SKIP); }
;
/** Comentario de varias lneas */
protected COMENTARIO2 :
"/*"
( ('*' NL) => '*' NL
| ('*' ~('/'|'\n'|'\r')) => '*' ~('/'|'\n'|'\r')
| NL
| ~( '\n' | '\r' | '*' )
)*
"*/"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 22)
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.76 %(digo
{ $setType(Token.SKIP); }
;
/** Literales cadena */
LIT_CADENA
options { paraphrase="un literal cadena"; }
: '"' !
( ~('"'|'\n'|'\r') )*
'"' !
;
+.-.2: 5ic*ero LeLi@arser.g
E) ?nico cam6io que se !a efectua+o so6re este fic!ero !a si+o 2re2arar)o 2ara ace2tar f.ci)mente
tram2as 2ara e:ce2ciones5 transforman+o )as referencias a toHensAtram2a en referencias a re-)as
(LLAVE_AB se cam6i= 2or llaveAb5 etc")
7=tese que a)-unos cam6ios no se !an efectua+o5 2or e4em2)o en )as re-)as expNegacion e
instNula5 2or moti0os +e eficiencia"
#) fina) +e) fic!ero se !an aCa+i+o )as re-)as que5 a) ser so6reescritas en
LeLiErrorRecoveryParser.g5 +ar.n )u-ar a )as tram2as 2ara e:ce2ciones"
header{
package leli;
/*-----------------------------------------------*\
| Un intrprete para un Lenguaje Limitado(LeLi) |
| _____________________________________________ |
| |
| ANALISIS SINTCTICO |
| _____________________________________________ |
| |
| Enrique J. Garcia Cota |
\*-----------------------------------------------*/
}
/**
* El objeto que permite todo el analisis sintactico.
*/
class LeLiParser extends Parser;
options
{
k = 2;
importVocab = LeLiLexerVocab;
exportVocab = LeLiParserVocab;
buildAST = true;
}
tokens
{
// Tokens imaginarios para enraizar listas
PROGRAMA ;
LISTA_MIEMBROS;
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 220
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.76 %(digo
LISTA_EXPRESIONES;
LISTA_INSTRUCCIONES;
LISTA_DEC_PARAMS;
// Tokens imaginarios que se utilizan cuando no hay races adecuadas
OP_MENOS_UNARIO;
INST_EXPRESION;
INST_DEC_VAR;
LLAMADA;
ATRIBUTO;
// Otros
TIPO_VACIO;
}
/**
* Un programa esta formado por una lista de definiciones de clases.
*/
programa : (decClase)+
{## = #( #[PROGRAMA, "PROGRAMA"] ,##);}
;
/** Definicin de una clase. */
decClase : RES_CLASE^ IDENT clausulaExtiende
llaveAb listaMiembros llaveCe
;
/** Clusula "extiende" **/
clausulaExtiende : RES_EXTIENDE^ IDENT
| /*nada*/
{ ## = #( #[RES_EXTIENDE,"extiende"],
#[IDENT, "Objeto"] ); }
;
/** Auxiliar para definicin de clase */
protected listaMiembros
: (decMetodo|decConstructor|decAtributo)*
{ ## = #( #[LISTA_MIEMBROS, "LISTA_MIEMBROS"] ,##);}
;
/**
* Declaracin de los diferentes tipos que se pueden usar en LeLi
*/
tipo : TIPO_ENTERO // tipo Entero
| TIPO_REAL // tipo Real
| TIPO_BOOLEANO // tipo Booleano
| TIPO_CADENA // tipo Cadena
| IDENT // tipo no bsico
;
declaracion ! // desactiva construccin por def. del AST
[AST r, AST t, boolean inicializacion] // parmetros
{
AST raiz = astFactory.dupTree(r); // copia del arbol
raiz.addChild(astFactory.dupTree(t)); // copia del rbol
}
: i1:IDENT
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 22,
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.76 %(digo
{
raiz.addChild(#i1);
## = raiz;
}
| { inicializacion }? // pred. semntico
i2:IDENT OP_ASIG valor:expresion
{
raiz.addChild(#i2);
raiz.addChild(#valor);
## = raiz;
}
| { inicializacion }?
i3:IDENT parentAb li:listaExpresiones parentCe
{
raiz.addChild(#i3);
raiz.addChild(#li);
## = raiz;
}
;
listaDeclaraciones [AST raiz, boolean inicializacion]
: t:tipo!
declaracion[raiz,#t,inicializacion]
(coma declaracion[raiz,#t,inicializacion])*
;
/**
* Definicin de un atributo (abstracto o no abstracto)
*/
decAtributo
{ boolean abstracto = false; }
: raiz:RES_ATRIBUTO^
( a:RES_ABSTRACTO { abstracto=true; } )?
listaDeclaraciones[#raiz, abstracto] puntoComa
;
/** Definicin de un constructor */
decConstructor : RES_CONSTRUCTOR^ parentAb listaDecParams parentCe
llaveAb listaInstrucciones llaveCe
;
/** Definicin de un mtodo normal */
decMetodo
: RES_METODO^ (RES_ABSTRACTO)? tipoRetorno IDENT
parentAb listaDecParams parentCe
llaveAb listaInstrucciones llaveCe
;
/** Regla auxiliar que codifica el tipo de retorno de un mtodo */
protected tipoRetorno
: tipo
| /* nada */ {## = #[TIPO_VACIO,"TIPO_VACIO"]; }
;
/** Lista de parmetros. */
listaDecParams
{ final AST raiz = #[RES_PARAMETRO,"parmetro"] ;}
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 227
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.76 %(digo
:
( listaDeclaraciones[raiz, false]
( puntoComa listaDeclaraciones[raiz, false])*
)? // opcional
{ ## = #(#[LISTA_DEC_PARAMS,"LISTA_DEC_PARAMS"], ##); }
;
/**
* Regla que sirve para empezar a reconocer las expresiones de LeLi
*/
expresion: expAsignacion;
/** Asignaciones (nivel 9) */
expAsignacion : expOLogico (OP_ASIG^ expOLogico)? ;
/** O lgico (nivel 8) */
expOLogico : expYLogico (OP_O^ expYLogico)* ;
/** Y lgico (nivel 7) */
expYLogico : expComparacion (OP_Y^ expComparacion)* ;
/** Comparacin (nivel 6) */
expComparacion
: expAritmetica
(
( OP_IGUAL^ | OP_DISTINTO^ | OP_MAYOR^ | OP_MENOR^
| OP_MAYOR_IGUAL^ | OP_MENOR_IGUAL^
)
expAritmetica
)*
;
/** Suma y resta aritmtica (nivel 5) */
expAritmetica : expProducto ((OP_MAS^ | OP_MENOS^) expProducto)* ;
/** Producto y divisin (nivel 4) */
expProducto : expCambioSigno
((OP_PRODUCTO^ | OP_DIVISION^) expCambioSigno)*
;
/** Cambio de signo (nivel 3) */
expCambioSigno :
( OP_MENOS! expPostIncremento
{ ##=#(#[OP_MENOS_UNARIO, "OP_MENOS_UNARIO"], ##) ;}
)
| (OP_MAS!)? expPostIncremento
;
/** Postincremento y postdecremento (nivel 2) */
expPostIncremento : expNegacion (OP_MASMAS^|OP_MENOSMENOS^)? ;
/** Negacin y accesos (nivel 1) */
expNegacion : (OP_NO^)* expEsUn
;
/** EsUn + accesos (nivel 0) **/
expEsUn : acceso (RES_ESUN^ tipo)*
;
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 22/
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.76 %(digo

/**
* Regla que permite reconocer los accesos de las expresiones de LeLi.
* Los accesos son los valores que se utilizan en las expresiones:
* literales, variables, llamadas a mtodos, etc.
*/
acceso : r1:raizAcceso { ## = #(#[ACCESO], #r1); }
( punto sub1:subAcceso! { ##.addChild(#sub1); } )*
| r2:raizAccesoConSubAccesos { ## = #(#[ACCESO], #r2); }
( punto sub2:subAcceso! { ##.addChild(#sub2); } )+
;
/**
* Raz de los accesos que no son llamadas a un mtodo de la
* clase "actual"
*/
raizAcceso : IDENT
| literal
| llamada
| conversion
| PARENT_AB! expresion parentCe
;
/**
* Raz de los accesos que no son llamadas a un mtodo de la
* clase "actual" y que obligatoriamente van sucedidos de un subacceso
*/
raizAccesoConSubAccesos
: RES_PARAMETRO
| RES_ATRIBUTO
| RES_SUPER
;
/** Regla que reconoce los literales */
literal : LIT_ENTERO
| LIT_REAL
| LIT_CADENA
| LIT_NL
| LIT_TAB
| LIT_COM
| LIT_CIERTO
| LIT_FALSO
;
/**
* Esta regla se utiliza tanto para representar:
* 1) Una llamada a un mtodo del objeto actual
* 2) Un subacceso en forma de llamada.
* 3) Una llamada a un constructor del objeto actual
* 4) Un subacceso en forma de constructor.
*/
llamada : IDENT parentAb listaExpresiones parentCe
{ ## = #(#[LLAMADA,"LLAMADA"],##); }
| RES_CONSTRUCTOR^ parentAb listaExpresiones parentCe
;
/**
* Regla auxiliar que reconoce los parmetros de una llamada
* a un mtodo y la inicializacin del bucle "desde"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 22<
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.76 %(digo
*/
protected listaExpresiones
: ( expresion (coma expresion)* )?
{ ## = #(#[LISTA_EXPRESIONES, "LISTA_EXPRESIONES"],##); }
;
/** Conversin entre tipos */
conversion : RES_CONVERTIR^
parentAb expresion coma tipo parentCe
;
/** Regla que reconoce los accesos a atributos y mtodos de un objeto. */
subAcceso
: llamada
| IDENT
| RES_SUPER
;
/** Una lista de 0 o ms instrucciones */
listaInstrucciones
: (instruccion)*
{## = #( #[LISTA_INSTRUCCIONES,"LISTA_INSTRUCCIONES"], ##);}
;
/**
* Las instrucciones. Pueden ser expresiones, instrucciones de control,
* declaraciones de variables locales o la instruccin volver.
*/
instruccion : (tipo IDENT)=>instDecVar // declaracin
| instExpresion // Instruccin - expresin
| instMientras // bucle mientras
| instHacerMientras // bucle hacer-mientras
| instDesde // bucle desde
| instSi // Instruccin Si
| instVolver // Instruccin volver
| instNula // Instruccin Nula
;
/** Instruccin nula */
instNula : PUNTO_COMA! ;
/** Instruccin volver */
instVolver : RES_VOLVER puntoComa ;
/** Instruccin-expresin */
instExpresion: expresion puntoComa
{## = #( #[INST_EXPRESION,"INST_EXPRESION"], ##);}
;
/** Declaracin de variables locales */
instDecVar
{ final AST raiz = #[INST_DEC_VAR,"variable"]; }
: listaDeclaraciones[raiz,true] puntoComa ;
/** Bucle "mientras" */
instMientras : RES_MIENTRAS^ parentAb expresion parentCe
llaveAb listaInstrucciones llaveCe
;
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2-
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.76 %(digo
/** Bucle "hacer-mientras" */
instHacerMientras : RES_HACER^ llaveAb listaInstrucciones llaveCe
RES_MIENTRAS parentAb expresion parentCe
puntoComa
;
/** Bucle "desde" */
instDesde : RES_DESDE^ parentAb listaExpresiones puntoComa
listaExpresiones puntoComa
listaExpresiones parentCe
llaveAb listaInstrucciones llaveCe
;
/** Instruccion "si" muy parecida a la del lenguaje LEA. */
instSi :
RES_SI^ parentAb expresion parentCe
llaveAb listaInstrucciones llaveCe
alternativasSi
;
/**
* Auxiliar (reconoce las alternativas de la instruccin "si"
* sin warnings de ambiguedad)
*/
protected alternativasSi
: altSiNormal alternativasSi
| altSiOtras
| /* nada */
;
/** Auxiliar (alternativa normal de la instruccin "si") */
protected altSiNormal : BARRA_VERT^ parentAb expresion parentCe
llaveAb listaInstrucciones llaveCe
;
/** Auxiliar (alternativa final "otras" de la instruccin "si") */
protected altSiOtras : barraVert RES_OTRAS^
llaveAb listaInstrucciones llaveCe
;

// Reglas auxiliares que sern reescritas para el tratamiento de
// errores
parentAb : PARENT_AB! ;
parentCe : PARENT_CE! ;
llaveAb : LLAVE_AB! ;
llaveCe : LLAVE_CE! ;
coma : COMA! ;
barraVert : BARRA_VERT! ;
puntoComa : PUNTO_COMA! ;
punto : PUNTO! ;
+.-.3: 5ic*ero LeLirrorRecovery@arser.g
cste es e) fic!ero +on+e se im2)ementan )os 2rinci2a)es mecanismos +e recu2eraci=n sint.ctica"
Es e) ana)i%a+or m.s com2)ica+o que !emos rea)i%a+o !asta a!ora"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2-1
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.76 %(digo
header{
package leli;
/*-----------------------------------------------*\
| Un intrprete para un Lenguaje Limitado(LeLi) |
| _____________________________________________ |
| |
| ANALISIS SINTCTICO (RECUPERACIN DE ERRORES) |
| _____________________________________________ |
| |
| Enrique J. Garcia Cota |
\*-----------------------------------------------*/
import antlraux.Logger;
import java.util.HashSet;
}
/**
* El objeto que permite todo el analisis sintactico con
* recuperacin de erroes.
*/
class LeLiErrorRecoveryParser extends LeLiParser;
options{
k=1;
importVocab=LeLiParserVocab;
}
{
/** Gestor de errores del analizador **/
public Logger logger = null;
/** Smbolos de sincronismo **/
public static final BitSet simbolosSincro = mk_simbolosSincro();
/** Iniciar simbolosSincro **/
protected static final BitSet mk_simbolosSincro()
{
BitSet b = new BitSet();
b.add(LLAVE_AB);
b.add(LLAVE_CE);
b.add(PARENT_AB);
b.add(PARENT_CE);
b.add(COMA);
b.add(PUNTO_COMA);
b.add(BARRA_VERT);
b.add(RES_CLASE);
b.add(RES_METODO);
b.add(RES_ATRIBUTO);
b.add(RES_DESDE);
b.add(RES_HACER);
b.add(RES_MIENTRAS);
b.add(RES_SI);
b.add(RES_VOLVER);
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2-2
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.76 %(digo
b.add(IDENT); // para mtodo y parmetro
return b;
}
/** Identificadores de sincronismo **/
public static final HashSet identsSincro = mk_identsSincro();
/** Iniciar identsSincro **/
public static final HashSet mk_identsSincro()
{
HashSet hs = new HashSet();
hs.add("metodo");
hs.add("parametro");
return hs;
}
/**
* Mtodo de sincronizacin con smbolos de sincronismo
* y teniendo en cuenta algunos identificadores de sincronismo
**/
public void sincronizar ( RecognitionException re,
BitSet SIGUIENTE )
throws RecognitionException, TokenStreamException
{
// Si es SS, "dejar pasar" (terminar la regla)
if( ! simbolosSincro.member(LA(0)) )
{
// Si estamos guessing, lanzamos directamente
if (inputState.guessing!=0) throw re;
// Crear un nuevo bitset que contenga a los
// smbolos de sincronismo y a "siguientes"
// utilizando la "or" lgica
BitSet auxiliar = simbolosSincro.or(SIGUIENTE);
// Mostrar el error y consumir, pero utilizando
// auxiliar en lugar de SIGUIENTE
reportError(re);
boolean bSincronizado = false;
Token t = null;
do
{
consume();
consumeUntil(auxiliar);
bSincronizado = true;
t = LT(0);
// Excepciones con IDENT ("metodo" y "parametro"
// son los nicos idents vlidos para sincronizar)
if( t.getType()==IDENT &&
!identsSincro.contains(t.getText()) )
{ bSincronizado = false; }
else
{ bSincronizado = true; }
}
while (!bSincronizado);
}
}
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2--
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.76 %(digo
/** Constructor aadiendo un ErrorManager **/
public LeLiErrorRecoveryParser(TokenStream lexer, Logger _logger)
{
this(lexer);
logger = _logger;
}
/** imprime un error **/
public void reportError( String msg,
String filename,
int line,
int column )
{
if(null==logger)
{
logger = new Logger(error, System.err);
}
logger.log( msg, 1, filename, line, column);
}
/** Sobreescribir reportError **/
public void reportError(RecognitionException e)
{
reportError( e.getMessage(),
e.getFilename(),
e.getLine(),
e.getColumn() );
}
/** Error que se lanza cuando falta un token "necesario" **/
public void errorFaltaToken( int token )
throws TokenStreamException
{
Token t0 = LT(0);
Token t1 = LT(1);
if(t1.getType() != Token.EOF_TYPE)
{
String t1Text;
if(t1.getType()==IDENT)
t1Text = "el identificador '" + t1.getText() +"'";
else
t1Text = getTokenName(t1.getType());
reportError( "Se esperaba " + getTokenName(token) +
", se encontr " + t1Text,
this.getFilename(),
t1.getLine(),
t1.getColumn() - t1.getText().length() );
}
else
{
reportError ( "Se esperaba " + getTokenName(token) +
" cuando se alcanz el final de fichero",
this.getFilename(),
t0.getLine(),
t0.getColumn() ) ;
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2-)
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.76 %(digo
}
}
/**
* Error habitual de acentuacin (tilde)
* @returns true si t.getText().equals(textoIncorrecto),
* false en cualquier otro caso
**/
public boolean comprobarErrorTilde (
Token t,
AST ast,
String textoIncorrecto,
int tipoCorrecto,
String textoCorrecto )
{
if( t.getText().equals(textoIncorrecto) )
{
reportError( "Omisin de tilde. " +
"Escriba '" + textoCorrecto +
"' en lugar de '" + t.getText() + "'",
this.getFilename(),
t.getLine(),
t.getColumn() );
ast.setType( tipoCorrecto );
ast.setText( textoCorrecto );
return false;
}
return true;
}
/** Re-construccin de una expresin unaria */
public AST construyeExpUn(AST operando, AST operador)
{
if(null==operador) return operando;
if(operando.getNextSibling()==operador)
{
operando.setNextSibling(null);
}
operador.setFirstChild(operando);
return operador;
}
/** Re-construccin de una expresin binaria */
public AST construyeExpBin ( AST izquierda, AST derecha )
{
if(derecha != null)
{
// "desconectar" los nodos si es necesario
if(izquierda.getNextSibling()==derecha)
{
izquierda.setNextSibling(null);
}
AST valor = derecha.getFirstChild();
return #(derecha, izquierda, valor);
}
return izquierda;
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2-0
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.76 %(digo
}
}
// ----------------------- HACER k=1 -----------------------------
declaracion ! // desactivar construccin por defecto
[AST r, AST t, boolean inicializacion] // parmetros
{
AST raiz = astFactory.dupTree(r); // copia del rbol
raiz.addChild(astFactory.dupTree(t)); // copia del rbol
}
: { inicializacion }? // pred. semntico
(IDENT OP_ASIG) => i1:IDENT OP_ASIG valor:expresion
{
raiz.addChild(#i1);
raiz.addChild(#valor);
## = raiz;
}
| { inicializacion }?
(IDENT PARENT_AB) =>
i2:IDENT parentAb le:listaExpresiones parentCe
{
raiz.addChild(#i2);
raiz.addChild(#le);
## = raiz;
}
| i3:IDENT
{
raiz.addChild(#i3);
## = raiz;
}
;
/** Regla auxiliar que codifica el tipo de retorno de un mtodo */
protected tipoRetorno
: (tipo IDENT) => tipo
| /* nada */ {## = #[TIPO_VACIO,"TIPO_VACIO"]; }
;
/* nota : raizAcceso es declarada ms abajo */
// raizAcceso : ((IDENT|RES_CONSTRUCTOR) PARENT_AB)=>llamada
// | IDENT
// | literal
// | conversion
// | PARENT_AB! expresion parentCe
// ;
/** Regla que reconoce los accesos a atributos y mtodos de un objeto. */
subAcceso
: ((IDENT|RES_CONSTRUCTOR) PARENT_AB)=>llamada
| IDENT
| RES_SUPER
;
exception catch [NoViableAltException nvae]
{ sincronizar(nvae, $FOLLOW); }
/**
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2-,
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.76 %(digo
* Auxiliar (reconoce las alternativas de la instruccin "si"
* sin warnings de ambiguedad)
*/
protected alternativasSi
: (BARRA_VERT PARENT_AB)=>altSiNormal alternativasSi
| altSiOtras
| /* nada */
;
exception catch [NoViableAltException nvae]
{ sincronizar(nvae, $FOLLOW); }
// ------------------ TRAMPAS PARA EXCEPCIONES --------------------
/** Regla auxiliar para reconocer parntesis necesarios **/
parentAb : PARENT_AB! ;
exception catch [RecognitionException ex]
{ errorFaltaToken(PARENT_AB); }
/** Regla auxiliar para reconocer parntesis necesarios **/
parentCe : PARENT_CE! ;
exception catch [RecognitionException ex]
{ errorFaltaToken(PARENT_CE); }
/** Regla auxiliar para reconocer llaves necesarias **/
llaveAb : LLAVE_AB! ;
exception catch [RecognitionException ex]
{ errorFaltaToken(LLAVE_AB); }
/** Regla auxiliar para reconocer llaves necesarias **/
llaveCe : LLAVE_CE! ;
exception catch [RecognitionException ex]
{ errorFaltaToken(LLAVE_CE); }
/** Regla auxiliar para reconocer comas necesarias **/
coma : COMA! ;
exception catch [RecognitionException ex]
{ errorFaltaToken(COMA); }
/** Regla auxiliar para reconocer barras verticales necesarias **/
barraVert : BARRA_VERT! ;
exception catch [RecognitionException ex]
{ errorFaltaToken(BARRA_VERT); }
/** Regla auxiliar para reconocer puntos y comas necesarios **/
puntoComa : PUNTO_COMA! ;
exception catch [RecognitionException ex]
{ errorFaltaToken(PUNTO_COMA); }
/** Regla auxiliar para reconocer puntos **/
punto : PUNTO! ;
exception catch [RecognitionException ex]
{ errorFaltaToken(PUNTO); }
// ------------ RETARDO DEL TRATAMIENTO DE ERRORES ----------
/** Asignaciones (nivel 9) */
expAsignacion : izq:expOLogico der:expAsignacion2
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2-7
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.76 %(digo
{ ## = construyeExpBin(#izq, #der); }
;
expAsignacion2 : ( OP_ASIG^ expOLogico )? ;
exception catch [NoViableAltException nvae]
{ sincronizar(nvae, $FOLLOW); }
/** Postincremento y postdecremento (nivel 2) */
expPostIncremento : operando:expNegacion operador:expPostIncremento2
{ ## = construyeExpUn(#operando, #operador); }
;
expPostIncremento2 : ( OP_MASMAS^|OP_MENOSMENOS^ )?
;
exception catch [NoViableAltException nvae]
{ sincronizar(nvae, $FOLLOW); }

/** Clusula "extiende" **/
clausulaExtiende : RES_EXTIENDE^ IDENT
| /*nada*/
{ ## = #( #[RES_EXTIENDE,"extiende"],
#[IDENT, "Objeto"] ); }
;
exception catch [NoViableAltException nvae]
{
sincronizar(nvae, $FOLLOW);
## = #( #[RES_EXTIENDE,"extiende"], #[IDENT, "Objeto"] );
}
/** Lista de parmetros. */
listaDecParams
{ final AST raiz = #[RES_PARAMETRO,"parmetro"] ; }
:
{ ## = #[LISTA_DEC_PARAMS,"parmetros"]; }
( l1:listaDeclaraciones[raiz, false]!
{ ##.addChild(#l1); }
( puntoComa ln:listaDeclaraciones[raiz, false]!
{ ##.addChild(#ln); }
)*
)? // opcional
;
// Capturar NoViableAltException y resincronizar
exception catch [NoViableAltException nvae]
{ sincronizar(nvae, $FOLLOW); }
// ------------------- ERRORES DE ACENTUACIN ------------
/**
* Raz de los accesos que no son llamadas a un mtodo de la
* clase "actual" (recuperacin del error de acentuacin en
* "parmetro")
*/
raizAcceso : ((IDENT|RES_CONSTRUCTOR) PARENT_AB)=>llamada
| i:IDENT
{ comprobarErrorTilde( i, #i, "parametro",
RES_PARAMETRO, "parmetro" ); }
| literal
| conversion
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2-/
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.76 %(digo
| PARENT_AB! expresion parentCe
;
exception catch [NoViableAltException nvae]
{ sincronizar(nvae, $FOLLOW); }
/**
* Definicin de un mtodo normal ( con recuperacin del error
* de acencuacin de "mtodo"
**/
decMetodo
: r:resMetodo! (RES_ABSTRACTO)? tipoRetorno IDENT
parentAb listaDecParams parentCe
llaveAb listaInstrucciones llaveCe
{ ## = #(#r,##); }
;
/** Regla que permite la recuperacin del error de omisin de tilde */
resMetodo : RES_METODO
| i:IDENT
{
if( comprobarErrorTilde( i, #i, "metodo",
RES_METODO, "mtodo") )
{
throw new MismatchedTokenException( tokenNames,
i,
RES_METODO,
false,
getFilename() );
}
}
;
exception catch [NoViableAltException nvae]
{ sincronizar(nvae, $FOLLOW); }
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2-<
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,./6 %ompilando y e5ecutando el anali:ador
Becci%n +..: &om'ilando y ejecutando el anali8ador
+...1: &om'ilaci%n
Com2i)ar e) ana)i%a+or sint.ctico con recu2eraci=n +e errores es mu senci))oF !a que !acer )o
mismo que 2ara com2i)ar e) ana)i%a+or sint.ctico norma)5 sa)0o 2or e) !ec!o +e que !a que
inc)uir e) fic!ero que contiene )a Dsu2er-ram.ticaE (LeLiParser.g) en )a )nea +e coman+os5 con
)a o2ci=n -glib" Es +ecir5 que !a que com2i)ar)o con )a si-uiente )nea +e coman+osF
c:\leli\ java antlr.Tool -glib LeLiParser.g LeLiErrorRecoveryParser.g
Este 2roceso -enerar. )os fic!eros !a6itua)esF
X LeLiErrorRecoveryParser.java
X LeLiErrorRecoveryParserVocabTokenTypes.java
X LeLiErrorRecoveryParserVocabTokenTypes.txt
a+em.s un fic!ero con )a -ram.tica e:2an+i+a5 ))ama+o
expandedLeLiErrorRecoveryParser.g" cste ser. e) fic!ero que uti)i%ar. #7$38 2ara -enerar
)os tres anteriores"
3os n?meros +e )nea errores que encuentre #7$38 a )a !ora +e com2i)ar un fic!ero
Y"- +e una su6-ram.tica ser.n referencias a) fic!ero +e )a -ram.tica e:2an+i+a5 no +e)
fic!ero ori-ina)"
3os fic!eros Y"4a0a se com2i)ar.n +e )a manera usua)5 uti)i%an+o e) com2i)a+or +e 4a0a5 sin nin-?n
aCa+i+o es2ecia)F
c:\leli\ javac *.java
+...2: jecuci%n
En este a2arta+o 0amos a 0er c=mo )an%ar e) an.)isis con +etecci=n +e errores" Concretamente5
0amos a 0er c=mo mo+ificar )a c)ase leli.Tool 2ara que )o uti)ice" 9or )o tanto se !ar. menci=n
a mto+os atri6utos +e )a c)ase que a se e:2)icaron en ca2tu)os anteriores" 8emtase a e))os si
tiene +ificu)ta+es 2ara se-uir esta secci=n"
&uevos comandos
/na o2ci=n +e )a )nea +e coman+os5 -erec5 2ermitir. acti0ar o +esacti0ar )a recu2eraci=n +e
errores (uti)i%an+o una instancia +e LeLiParser o LeLiErrorRecoveryParser 2ara rea)i%ar e)
an.)isis)"
Ia6r. que aCa+ir un atri6uto con su mto+o DsetterEF
public class Tool
{
...
public boolean recuperacion = true;
...
public void fijarRecuperacion(Boolean B)
{ recuperacion = B.booleanValue(); }
1es2us !a6r. que asociar e) mto+o a) nue0o coman+o en LeeLCF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2)
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,./6 %ompilando y e5ecutando el anali:ador
public void leeLC(String args[])
throws CommandLineParserException
{
...
clp.addCommand(this, "-erec", "fijarRecuperacion", "b",
"Activa/desactiva la recuperacin de errores sintcticos" );
...
>ina)mente !a que mo+ificar e) mto+o trabaja 2ara que5 en funci=n +e) atri6uto
recuperacionF
public void trabaja()
{
// Tambin hay que crear el Logger!
Logger logger = new Logger("error", System.err);
try
{
// PASOS 2 y 3 permanecen sin modificaciones.
...
// PASOS 4 y 5. Crear analizador sintctico y pasarle
// nombre fichero. El tipo de parser depende del atributo
// recuperacion
antlr.Parser parser = null;
if(recuperacion)
parser = new LeLiErrorRecoveryParser(lexer, logger);
else
parser = new LeLiParser(lexer);
parser.setFilename(nombreFichero);
7=tese )a creaci=n e) uso +e )a c)ase Logger 2ara mane4ar )os mensa4es +e error"
&uevo cdigo de la clase 'ool
3a nue0a c)ase Tool ten+r.5 2or )o tanto5 e) si-uiente as2ectoF
package leli; // Tool tambin pertenece al paquete leli
import antlr.*; // Incluir todo antlr
import java.io.*; // Para entrada-salida
import antlraux.util.LexInfoToken; // Nueva clase Token
import antlrau<.util.6o%%er; // Logger
public class Tool{
public static void main(String [] args)
{
try
{
FileInputStream fis = new FileInputStream(args[0]);
LeLiLexer lexer = new LeLiLexer(fis);
lexer.setFilename(args[0]);
lexer.setTokenObjectClass(antlraux.util.LexInfoToken);
Token tok = lexer.nextToken();
while(tok.getType() != Token.EOF_TYPE)
{
System.out.println( tok.getFilename()+ : +
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2)1
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,./6 %ompilando y e5ecutando el anali:ador
tok.getLine() + : +
tok.getColumn() + : +
tok.getText()+ , + tok.getType() );
tok = lexer.nextToken();
}
}
catch (FileNotFoundException fnfe)
{
System.err.println(No se encontr el fichero);
}
catch (TokenStreamException tse)
{
System.err.println(Error leyendo tokens);
}
}
}
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2)2
%aptulo ,6 Recuperaci(n de errores 1ecci(n ,.<6 %onclusi(n
Becci%n +.1: &onclusi%n
E) tratamiento +e errores es una tarea un 2oco m.s +esa-ra+a6)e que )a construcci=n +e
ana)i%a+ores sin -esti=n +e errores" #) menos as me )o 2arece 2ersona)mente"
E) c=+i-o +e )os ana)i%a+ores con -esti=n +e errores5 si no se tiene muc!o cui+a+o5 se con0ierte
r.2i+amente en un -ran -a)imatas5 ininte)i-i6)e a 2rimera 0ista" #+em.s5 e) c=+i-o nati0o (es
+ecir5 )as acciones) !acen que e) ana)i%a+or se 0ue)0a mu +e2en+iente +e) )en-ua4e uti)i%a+o 2ara
-enerar"
7osotros !emos so)uciona+o a)-unos +e estos 2ro6)emas ()a com2)e4i+a+ no tiene so)uci=n) con
)a !erencia +e -ram.ticas" Iemos conse-ui+o ais)ar to+o ese c=+i-o DfeoE D2oco manteni6)eE
en una su6-ram.tica +e) ana)i%a+or5 +e4an+o LeLiParser mu )im2io5 ofrecien+o un esque)eto
so6re e) que 2o+er im2)ementar otros ana)i%a+ores (2or e4em2)o5 un com2i)a+or +e 3e3i en C++
con recu2eraci=n +e errores)"
Esta im2ortancia +e )a 6?sque+a )a )a )im2ie%a en e) c=+i-o es uno +e )os 2rinci2ia)es 2untos que
quera resa)tar en este ca2tu)o" Iasta a!ora5 e) c=+i-o +e recu2eraci=n +e errores se me%c)a6a
sin or+en ni concierto +entro +e) ana)i%a+or5 resu)tan+o un ana)i%a+or mu 2oco +esea6)e5 a)
menos +es+e e) 2unto +e 0ista +e )a manteni6i)i+a+"
E) otro 2unto a resa)tar en este ca2tu)o es5 2or su2uesto5 )a 2ro2ia recu2eraci=n +e errores" Ie
2ro2uesto a)-unos mecanismos +a+o a)-unas i+eas 2ara )a recu2eraci=n5 resu)tan+o en un
ana)i%a+or 6astante resistente
&6
"
9ero )o 0er+a+eramente im2ortante es com2ren+er )a esencia +e )a recu2eraci=n +e errores" 1e
momento5 2ara 2o+er im2)ementar una 6uena recu2eraci=n +e errores5 si-ue sien+o mu
im2ortante conocer )a manera en que e) c=+i-o +e) ana)i%a+or se -enera" E) c=+i-o +e )a
recu2eraci=n !a si+o em6e6i+o +entro +e) 2ro2io ana)i%a+or" /na so)uci=n m.s +esea6)e sera
que a) menos e) mto+o sincronizar fuera 2ro2orciona+o 2or )a )i6rera ant)rau:@ qui%.s )o
!a-a en un futuro"
9or ?)timo !emos a2ren+i+o c=mo se me4oran )os mensa4es +e error +e #7$385 uti)i%an+o )os
a)ias +e toHens a2ren+ien+o a tra+ucir )os mensa4es a cua)quier i+ioma (aunque nos !aamos
+eci+i+o 2or e) caste))ano)" Esta D2roe%aE5 2or su2uesto5 tam6in 2ue+e )o-rarse con Gison
>)e:F 6asta con 6uscar )as ca+enas con )os mensa4es +e error en e) c=+i-o +e) ana)i%a+or
recom2i)ar (como quiera que se !a-a eso)" Es )a 6e))e%a +e) soft<are +e c=+i-o a6ierto"
Ia un 2unto en e) cua) no nos !emos +eteni+oF recu2eraci=n +e errores en e) an.)isis ):ico" 7os
!emos centra+o muc!simo en e) an.)isis sint.ctico5 como si fuera e) ?nico sitio +on+e se 2ue+e
recu2erar un error" 3os ana)i%a+ores ):icos +e #7$38 tienen su 2ro2ia infraestructura
error^e:ce2ci=n^mane4a+or 2ara -estionar )os errores en )a entra+a"
*in em6ar-o5 e) n?mero +e errores a ni0e) ):ico es a2a6u))antemente 6a4o en com2araci=n con
)os que ocurren a ni0e) sint.ctico" #+em.s5 #7$38 tam6in 2ro2orciona un mecanismo 2or
+efecto 2ara tratar +ic!os errores" 9or estas +os ra%ones !e 2referi+o +e4ar un 2oco +e )a+o )os
errores ):icos centrarme en )os sint.cticos" L9ero cua)quier mente inquieta es )i6re +e
in0esti-arN
En e) ca2tu)o si-uiente a6an+onaremos com2)etamente e) ni0e) sint.ctico 2ara 2asar a) ni0e)
sem.ntico" 1e4aremos +e ana)i%ar f)u4os +e +atos 2ara em2e%ar a ana)i%ar +atos estructura+os en
forma +e #*$s"
&6 L#unque siem2re es me4ora6)eN
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2)-
Captulo 7:
Anlisis semntico de LeLi
El verdadero significado de las cosas se encuentra al decir las mismas cosas con otras palabras.
C!ar)es C!a2)in
Captulo 7:
Anlisis semntico de LeLi...............................................................244
Seccin 0.1: Introduccin......................................................................................................2!0
-.1.1: rrores sem(nticos est(ticos................................................................................................... 2"-
rrores de ti'o.................................................................................................................................................2"-
rrores de lecturaSescritura: RJvalue y LJvalue...............................................................................................2".
rrores de ubicaci%n........................................................................................................................................2".
rrores de ex'resiones evaluables durante la com'ilaci%n............................................................................2".
rrores de contexto..........................................................................................................................................2"1
-.1.2: rrores sem(nticos din(micos................................................................................................. 2#C
-.1.3: AQadiendo in!ormaci%n l0xica a los AB>s............................................................................... 2#C
l 'roblema...................................................................................................................................................... 2#C
La clase antlraux.util.Lex/n!oAB>....................................................................................................................2#C
5acilit(ndonos la labor en los iteradores de (rboles: AB>Label>y'e.............................................................2#1
Seccin 0.2: Iterador simple de r7oles.............................................................................. 23
-.2.1: strategia de im'lementaci%n del an(lisis sem(ntico............................................................. 2#3
-.2.2: structura del !ic*ero de gram(tica......................................................................................... 2#"
-.2.3: Regla raA8: @rograma.............................................................................................................. 2#"
-.2.": 6e!inici%n de clases................................................................................................................. 2#"
-.2.#: 6e!inici%n de atributos............................................................................................................. 2##
6e!inici%n de m0todos normalesI m0todos abstractos y constructores.........................................................2##
-.2.+: x'resiones............................................................................................................................. 2#+
-.2.-: /nstrucciones............................................................................................................................ 2#-
-.2..: &%digo com'leto del iterador.................................................................................................. 2#.
-.2.1: Los errores de construcci%n del AB>....................................................................................... 2+2
Seccin 0.3: +l sistema >m7ito?:eclaracin?'ipo.............................................................. 263
-.3.1: /ntroducci%n............................................................................................................................. 2+3
-.3.2: @resentaci%n de el sistema RmbitoS6eclaraci%nS>i'o 9A6>;.................................................. 2+3
voluci%n de la enca'sulaci%n en los lenguajes de 'rogramaci%n................................................................ 2+3
Rmbitos............................................................................................................................................................2+"
6eclaraciones..................................................................................................................................................2+#
>i'os................................................................................................................................................................2++
AB>s es'eciali8ados........................................................................................................................................2++
-.3.3: /m'lementaci%n del sistema A6>: el 'aquete antlraux.context.............................................. 2++
La exce'ci%n antlraux.context.&ontextxce'tion............................................................................................2++
,n buen sistema de identi!icaci%n : la du'la nombreJ2etiqueta3.....................................................................2+-
-.3.": La clase antlraux.context.Bco'e.............................................................................................. 2+.
/denti!icaci%n: nombre y etiqueta de los (mbitos............................................................................................2+.
/nserci%n de declaraciones..............................................................................................................................2+.
/m'lementaci%n im'lAcita de la 'ila de (mbitos y bNsquedas locales y no locales....................................... 2+.
Organi8aci%n de las declaraciones dentro de un (mbito................................................................................2+1
l doble ordenamiento de los elementos........................................................................................................2-C
-.3.#: La clase antlraux.context.6eclaration..................................................................................... 2-2
lementos b(sicos: nombre y ti'o..................................................................................................................2-2
/denti!icaci%n: tiqueta y nombre....................................................................................................................2-2
/niciali8aci%n....................................................................................................................................................2-2
Otros cam'os..................................................................................................................................................2-2
-.3.+: l sistema de ti'os 9antlraux.context.ty'es.T;......................................................................... 2-3
/den!i!icaci%n: la inter!a8 antlraux.contex.ty'es.>y'e......................................................................................2-3
Otras inter!aces y clases interesantes del sistema de ti'os...........................................................................2-3
>i'os 2es'eciales3............................................................................................................................................2-"
l ti'o de un m0todo: antlraux.context.ty'es.Fet*od>y'e.............................................................................2-"
Gua prctica de ANTLR 2.7.2 v 1. 2))
&om'atibilidad de m0todos.............................................................................................................................2-+
l ti'o de un atributo: antlraux.context.ty'es.Attribute>y'e...........................................................................2--
l ti'o de una clase: antlraux.context.ty'es.&lass>y'e..................................................................................2-.
-.3.-: AB>s es'eciali8ados............................................................................................................... 2-1
antlraux.context.asts.Bco'eAB>......................................................................................................................2-1
antlraux.context.asts.>y'eAB>........................................................................................................................2.C
antlraux.context.x'ressionAB>......................................................................................................................2.C
$otas sobre los (rboles...................................................................................................................................2.C
-.3..: Resumen................................................................................................................................. 2.3
Seccin 0.!: A:' 3 $e$i.........................................................................................................2#!
-.".1: /ntroducci%n............................................................................................................................. 2."
-.".2: Las declaraciones en LeLi....................................................................................................... 2."
-.".3: Los (mbitos en LeLi................................................................................................................ 2."
Algunas restricciones....................................................................................................................................... 2."
La clase antlraux.context.&ontext....................................................................................................................2.#
,tili8aci%n de Bco'e y &ontext........................................................................................................................2.#
-.".": l sistema de ti'os de LeLi...................................................................................................... 2.+
>ratamiento de errores sem(nticos y el >i'o rror........................................................................................2.+
l 'aquete leli.ty'es.........................................................................................................................................2.-
Fodelado de los ti'os 2normales3 de LeLi......................................................................................................2.-
Gesti%n de los ti'os 'rede!inidos: LeLi>y'eFanager.....................................................................................2..
Fetaclases.......................................................................................................................................................2.1
Seccin 0.: "ompro7acin de tipos < ;rimera pasada..................................................... 212
-.#.1: &om'robaci%n de ti'os en dos 'asadas.................................................................................. 212
x'licaci%n detallada de los objetivos del anali8ador.....................................................................................213
Las !ases del anali8ador..................................................................................................................................21"
-.#.2: 6e!inici%n del anali8ador......................................................................................................... 21"
&abecera.......................................................................................................................................................... 21"
Lona de o'ciones............................................................................................................................................21"
Lona de to:ens................................................................................................................................................21#
Lona de c%digo nativo.....................................................................................................................................21#
-.#.3: 5ase 1: &reaci%n de (mbitos................................................................................................... 21+
@rograma.........................................................................................................................................................21+
6eclaraci%n de clases......................................................................................................................................21+
6eclaraciones de m0todos..............................................................................................................................21.
6eclaraciones de constructores......................................................................................................................211
6eclaraci%n de bucles...................................................................................................................................... 211
/nstrucciones condicionales.............................................................................................................................3CC
6eclaraci%n de atributos..................................................................................................................................3C1
6eclaraciones de 'ar(metros..........................................................................................................................3C1
-.#.": 5ase 2: @re'araci%n de las ex'resiones.................................................................................. 3C2
-.#.#: 5ase 3: @re'araci%n de los ti'os............................................................................................. 3C3
-.#.+: 5ase ": @re'araci%n del (mbito global.................................................................................... 3C"
l !ic*ero de ti'os b(sicos...............................................................................................................................3C"
-.#.-: 5ic*ero LeLiBymbol>ree@arser.g............................................................................................ 3C-
-.#..: $otas !inales sobre el anali8ador............................................................................................ 31+
Seccin 0.6: "ompro7acin de tipos @ segunda pasada...................................................310
-.+.1: /ntroducci%n............................................................................................................................. 31-
Objetivos..........................................................................................................................................................31-
5ases del an(lisis............................................................................................................................................31-
-.+.2: 6e!inici%n del anali8ador......................................................................................................... 31-
&abecera.......................................................................................................................................................... 31-
Lona de o'ciones............................................................................................................................................31.
Lona de to:ens................................................................................................................................................31.
Lona de c%digo nativo.....................................................................................................................................31.
-.+.3: 5ase 1 Fantener el (mbito actual ....................................................................................... 311
@rograma.........................................................................................................................................................32C
6eclaraciones de clases..................................................................................................................................32C
6eclaraciones de m0todos y constructores....................................................................................................32C
4ucles..............................................................................................................................................................321
/nstrucciones condicionales.............................................................................................................................321
-.+.": 5ase 2: Adici%n de las variables locales a los (mbitos........................................................... 322
-.+.#: 5ase 3: x'resiones................................................................................................................ 322
errorx'resion.................................................................................................................................................. 323
x'resi%n 2es,n3.............................................................................................................................................323
Gua prctica de ANTLR 2.7.2 v 1. 2)0
x'resiones unarias........................................................................................................................................32#
x'resiones binarias........................................................................................................................................ 32.
-.+.+: 5ase ": Accesos...................................................................................................................... 331
RaA8 de un acceso...........................................................................................................................................332
Literales............................................................................................................................................................ 33#
/nvocaciones....................................................................................................................................................33+
&onversiones de ti'o.......................................................................................................................................33-
Los subaccesos...............................................................................................................................................331
-.+.-: 5ic*ero LeLi>y'e&*ec:>ree@arser.g...................................................................................... 3"1
-.+..: $otas !inales sobre el anali8ador............................................................................................ 3#.
Seccin 0.0: "ompilacin 3 e*ecucin................................................................................. 31
-.-.1: &om'ilaci%n............................................................................................................................. 3#1
-.-.2: jecuci%n................................................................................................................................. 3#1
&ambios en la clase >ool................................................................................................................................3#1
&%digo de la nueva clase >ool........................................................................................................................3#1
Seccin 0.#: "onclusin........................................................................................................ 36!
Gua prctica de ANTLR 2.7.2 v 1. 2),
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.16 &ntroducci(n
Becci%n -.1: /ntroducci%n
En e) an.)isis ):ico se +etecta6an )os toHens" En e) an.)isis sint.ctico se a-ru2a6an +ic!os toHens
en re-)as sint.cticas5 se construa un 2rimer #*$"
E) cometi+o +e) an.)isis sem.ntico es +o6)eF
X 9or un )a+o +e6e +etectar errores sem.nticos (inco!erencias con res2ecto a )as re-)as
sem.nticas +e) )en-ua4e)"
X 9or otro5 +e6e enriquecer e) #*$ con informaci=n sem.ntica que ser. necesaria 2ara )a
-eneraci=n +e c=+i-o"
3os errores sem.nticos a )os que nos estamos refirien+o aqu son )os errores sem.nticos
est.ticos5 que son aque))os +etecta+os +urante )a com2i)aci=n (en e) an.)isis sem.ntico)" En
o2osici=n a )os errores sem.nticos est.ticos est.n )os errores sem.nticos +in.micos5 que se
+etectan +urante )a e4ecuci=n +e) 2ro-rama a com2i)a+o ( no forman 2arte +e) an.)isis
sem.ntico 2ro2iamente +ic!o)"
-.1.1: rrores sem(nticos est(ticos
/na 0e% 2asa+o e) ni0e) sint.ctico5 un 2ro-rama a?n 2ue+e tener errores +etecta6)es +urante )a
com2i)aci=n" *ue)en tener )u-ar en )as e:2resiones5 2ero no 2ue+en ser +etecta+os en e) an.)isis
sint.ctico 2orque son sint.cticamente correctos (2ero inco!erentes con a)-?n as2ecto sem.ntico
+e) )en-ua4e)" Estos errores son )os errores sem.nticos est.ticos"
3os errores sem.nticos est.ticos se +i0i+en en +iferentes -ru2osF
X Errores +e ti2o
X Errores +e )ectura^escritura +e e:2resiones (o +e 3A0a)ue 8A0a)ue)
X Errores +e restricci=n +e u6icaci=n
X Errores +e e:2resiones e0a)ua6)es en tiem2o +e com2i)aci=n
X Errores +e conte:to
+rrores de tipo
*on )os errores sem.nticos est.ticos m.s comunes" #2arecen cuan+o una o 0arias e:2resiones
son incom2ati6)es a ni0e) +e un o2era+or" Consi+rese e) si-uiente e4em2)oF
clase Persona
{
atributo Cadena nombre;
atributo Entero edad;
constructor(Entero E, Cadena C)
{
nombre = E;
edad = C;
}
}
Esta c)ase 2asar. sin errores e) an.)isis sint.ctico5 2ues )as construcciones son co!erentes a ni0e)
sint.ctico" *in em6ar-o5 a ni0e) sem.ntico !a errores" E) 2ro-rama+or !a +e6i+o +e equi0ocarse
a) tec)ear
&(
!a asi-na+o )a e+a+ a) nom6re e) nom6re a )a e+a+" /n 6uen com2i)a+or +e6era
&( *e-uramente +e6i+o a una 2sima 2o)tica +e nomenc)atura" LIa que e)e-ir 6uenos nom6res +e 0aria6)esN
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2)7
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.16 &ntroducci(n
emitir +os mensa4es como stosF
Persona.leli (8,10): El parmetro E de tipo Entero no puede ser
asignado al atributo nombre de tipo Cadena
Persona.leli (9,8): El parmetro C de tipo Cadena no puede ser
asignado al atributo edad de tipo Entero
Estos +os errores se !an 2ro+uci+o 2or incom2ati6i)i+a+ +e )os ti2os Entero Ca+ena con
res2ecto a )a asi-naci=n" 3os errores 2or incom2ati6i)i+a+ +e ti2os son tan frecuentes que tienen
nom6re 2ro2io@ se )es ))ama sim2)emente errores de tipo"
#unque )os errores +e ti2o sean )os m.s frecuentes entre )os errores sem.nticos est.ticos5 no son
)os ?nicos"
+rrores de lectura?escritura: (<value 3 $<value
Errores +e )ectura^escritura +e e:2resiones" cstos errores se +an en )as asi-naciones" En una
asi-naci=n5 a) e)emento a )a i%quier+a +e) o2era+or +e asi-naci=n se )e Dco2iaE e) 0a)or +e )a
e:2resi=n +e )a +erec!a" 3a 2arte +erec!a +e )a asi-naci=n +e6e ser D)e-i6)eE5 )a 2arte i%quier+a
+e6e ser Dasi-na6)eE"
1iremos que )as e:2resiones que 2ue+en ser D)e-i6)esE tienen ?Cvalue (8 +e ?ig%tA +erec!a5
2orque 2ue+en estar a )a +erec!a +e una asi-naci=n)5 mientras que )as que 2ue+en ser
Dasi-na6)esE tienen LCvalue (2orque 2ue+en estar a )a i%quier+a5 Le&t)"
/n e4em2)o +e e:2resiones sin 8A0a)ue son )as ))ama+as a mto+os 0acos (mto+os que no
+e0ue)0en nin-?n 0a)or)" 9or e4em2)oF
mtodo mA () // mtodo vaco
{ ... }
mtodo mB ()
{
Entero a = mA(); // es errneo porque se requiere un R-value
// (adems, los tipos no coinciden)
}
E) e4em2)o t2ico +e e:2resiones sin 3A0a)ue son )os )itera)es" 7o se 2ue+e encontrar un )itera) en
)a 2arte i%quier+a +e una e:2resi=n" OPu senti+o ten+raQ
"Cadena1" = "Cadena2" ; // ??
+rrores de u7icacin
*on )os errores que 2ue+en 2ro+ucirse 2or una co)ocaci=n incorrecta +e a)-una 2arte +e)
)en-ua4e" 3e3i carece +e este ti2o +e errores5 2ero 2o+emos encontrar a)-unos e4em2)os en otros
)en-ua4es" En e) )en-ua4e C5 2or e4em2)o5 )a instrucci=n break +e6e a2arecer siem2re +entro +e)
cuer2o +e un 6uc)e o +e un switch"
+rrores de e-presiones evalua7les durante la compilacin
Este error se +a en )as inicia)i%aciones +e atri6utos a6stractos@ un atri6uto a6stracto no 2ue+e
inicia)i%arse a un 0a)or que no 2ue+a +eterminarse en tiem2o +e com2i)aci=nF
clase Cualquiera
{
atributo abstracto Cadena nombre = "Pedro"; // Correcto.
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2)/
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.16 &ntroducci(n
atributo abstracto Entero valor = 1+2+nombre.longitud(); // Correcto.
atributo Entero indice; // Atributo no abstracto
atributo abstracto Entero indice2 = indice + 1; // Incorrecto.
}
3a ?)tima +ec)araci=n es incorrecta 2orque e) 0a)or +e )a 0aria6)e indice no 2ue+e sa6erse en
tiem2o +e e4ecuci=n"
En 3e3i no !a ta6)as" En otros )en-ua4es +on+e s se uti)i%an se 6uscan errores +e e:2resiones
constantes en e) tamaCo +e +ic!as ta6)as5 cuan+o no 2ue+en inicia)i%arse con un tamaCo no
constante"
+rrores de conte-to
E) com2i)a+or +e6e tener en cuenta e) conte:to +e )as 0aria6)es5 +e manera que no 2ue+an
referenciarse fuera +e )" cstos errores sue)en 2ro+ucirse 2or i+entifica+ores ma) escritos" En
-enera)5 cua)quier i+entifica+or 2ue+e 2ro+ucir un error +e conte:to"
mtodo Booleano esCero(Entero a)
{
si(a==0)
{
Booleano result = cierto;
}
| otras
{
result = falso;
}
esCero = result;
}
Ia +os errores +e conte:to en )as )neas 8 10@ se !ace referencia a )a 0aria6)e result cuan+o
sta a se !a +estrui+o (a) cerrarse e) cuer2o +e )a 2rimera o2ci=n +e )a instrucci=n si)" 9or )o
tanto +e6en emitirse +os errores"
3os errores +e conte:to son )os ?nicos errores sem.nticos est.ticos que 2ue+en +arse fuera +e )as
e:2resionesF cua)quier +ec)araci=n +e c)ase5 0aria6)e5 atri6uto o 2ar.metro 2ue+e contener
errores +e conte:to" 9or e4em2)oF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2)<
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.16 &ntroducci(n
clase Persona {...}
clase Alumno extiende persona // error : persona est mal escrito
{
atributo entero Edad; // error : la clase entero no existe (es Entero)
...
mtodo hablar (persona P) // mismo error
{
persona M; // idem
}
}
3os errores marca+os a2arecer.n5 c)aro est.5 si no se !an +efini+o )as c)ases DpersonaE
DenteroE5 con min?scu)as"
-.1.2: rrores sem(nticos din(micos
*on )os errores que so)amente 2ue+en +etectarse en tiem2o +e e4ecuci=n" En 3e3i !a tres
2osi6)es errores sem.nticos en tiem2o +e e4ecuci=nF
X 1es6or+amiento numrico
X Pue e) mto+o a6stracto Objeto.aserto no se cum2)a
X Pue se !a-a una con0ersi=n +e ti2os (con convertir) +escen+ente5 )os ti2os no sean
a+ecua+os"
-.1.3: AQadiendo in!ormaci%n l0xica a los AB>s
+l pro7lema
Cuan+o estu+iamos en 2rofun+i+a+ )os #*$s en e) tema & mencion que )a ?nica informaci=n
im2rescin+i6)e que se -uar+a en )os #*$s es Dun te:toE Dun ti2oE5 accesi6)es res2ecti0amente
me+iante )os mto+os getText getType +e )a interfa% antlr.collections.AST" $am6in
!ice !inca2i en que aunque )a c)ase Token +is2on-a +e mto+os con nom6res simi)ares5 no !a
que confun+ir)asF aunque )a maora +e )as instancias +e $oHen ser. uti)i%a+a 2ara iniciar un no+o
#*$ (uti)i%an+o e) mto+o AST.initialize(Token)) no siem2re ser. as@ !a6r. toHens que no
se uti)i%ar.n 4am.s 2ara iniciar #*$s (t2icamente )os 2arntesis sm6o)os +e se2araci=n)
!a6r. no+os #*$ cuo ti2o ser. ima-inario5 no sien+o uti)i%a+o 2or toHen a)-uno (2or e4em2)o
)os #*$s que se uti)i%an 2ara enrai%ar )istas +e toHens)"
3os Tokens5 a+em.s5 2ro2orcionan informaci=n ):ica (un nom6re +e fic!ero5 una )nea5 una
co)umna)5 )a cua) no es inc)ui+a en e) interfa% antlr.collections.AST" 5 no es im2)ementa+a
2or antlr.CommonAST5 e) ti2o que #7$38 uti)i%a 2or +efecto 2ara construir )os .r6o)es"
3a informaci=n ):ica (siem2re que est 6ien ca)cu)a+a) es un im2ortante aCa+i+o a )os mensa4es
+e error@ !asta ta) 2unto +e que su ausencia 2ue+e !acer)os inser0i6)es" *in em6ar-o5 a) ))e-ar a)
ni0e) sem.ntico no 2o+emos acce+er a )os toHens que )a 2ro2orcionan" 9ara so)ucionar)o
im2)ementaremos una su6c)ase +e antlr.CommonAST5 que sea ca2a% +e -uar+ar informaci=n
):ica5 que so6reescri6a e) mto+o initia)i%e($oHen) 2ara co2iar )a informaci=n ):ica@ to+os )os
#*$s que creemos ser.n instancias +e +ic!a c)ase"
$a clase antlrau-.util.$e-In)oAS'
3a nue0a c)ase que 0amos a uti)i%ar se encontrar. tam6in en e) 2aquete ant)rau:5 +entro +e)
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 20
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.16 &ntroducci(n
su62aquete antlraux.util" #) i-ua) que antlraux.util.LexInfoToken5 LexInfoAST
im2)ementar. )a interfa% antlraux.util.LexInfo
&8
"
9ara que LexInfoAST funcione correctamente (muestre )os nom6res +e fic!ero en )os
mensa4es +e error) ser. necesario que )os toHens +e0ue)tos 2or e) )e:er conten-an
informaci=n so6re e) nom6re +e fic!ero" /na +e )as o2ciones 2ara )o-rar esto es
uti)i%ar antlraux.util.LexInfoToken como se su-iri= en e) ca2tu)o 4"
1e )a misma manera que un ana)i%a+or ):ico 2ue+e -enerar $oHens !omo-neos !etero-neos
+iferentes +e )os toHens 2or +efecto
&9
5 )os ana)i%a+ores sint.cticos 2ermiten -enerar #*$s
!omo-neos !etero-neos +e c)ases +iferentes a )a ofreci+a 2or +efecto (CommonAST)"
En nuestro caso5 )o m.s senci))o ser. uti)i%ar e) mto+o e) mto+o setASTNodeType
60
en e)
2arser5 a sea e) un 2arser con o sin ca2aci+a+ +e recu2eraci=n +e errores sint.cticosF
import antlraux.util.LexInfoAST;
...
Parser parser = new ... ;// crear el parser de la manera adecuada
parser.setFilename(nombreFichero);
parser.setASTNodeType(antlraux.util.LexInfoAST);
parser.programa(); // lanzar el reconocimiento
1a+o que LexInfoAST im2)ementa )a interfa% #*$5 no ser. necesario mo+ificar e) c=+i-o +e)
2arser 2ara a+a2tar)o a) nue0o ti2o@ 6asta con mo+ificar un 2ar.metro en tiem2o +e e4ecuci=n"
E) mto+o que se uti)i%a 2ara iniciar )os #*$s crea+os 2or un 2arser es 2or re-)a
-enera) initialize(Token)" 7orma)mente es con0eniente que )as c)ases +e #*$s
que sean -enera+as 2or un 2arser so6reescri6an +ic!o mto+o (como !ace
LexInfoAST)"
1e forma simi)ar 2o+emos cam6iar e) ti2o +e )os #*$s -enera+os 2or )os itera+ores +e .r6o)es
que -eneren nue0os .r6o)es" 9or e4em2)oF
import antlraux.util.LexInfoAST;
...
ast = parser.getAst(); // suponiendo que ast haya sido creado as
TreeParser treeParser = new ... ; // crear el treeParser
treeDarser.set*S+5ode+ype(antlrau<.util.6e<In=o*S+);
treeParser.programa(ast);
3os #*$s crea+os 2or )os itera+ores +e .r6o)es son inicia+os me+iante e) mto+o
initialize(AST ast)" Es con0eniente que )os #*$s que sean -enera+os 2or un
tree9arser so6reescri6an +ic!o mto+o (como !ace LexInfoAST)"
,acilitndonos la la7or en los iteradores de r7oles: AS'$a7el'3pe
>recuentemente ten+remos que uti)i%ar )a informaci=n ):ica aCa+i+a a nuestros #*$s en )as
acciones +e )os itera+ores +e .r6o)es" Esta necesi+a+ 2ue+e +ar )u-ar a muc!simos castings5 que
&8 3a interfa% ant)rau:"uti)"3e:,nfo se +escri6e en )a 2.-ina 111"
&9 Rer a2arta+o D$oHens !omo-neos !etero-neosE en )a 2.-ina 110"
60 Rer secci=n &"("' D#*$s !etero-neosE5 en )a 2.-ina 161"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 201
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.16 &ntroducci(n
!ar.n e) c=+i-o 6astante i)e-i6)eF
header { import antlraux.util.LexInfoAST; }
public class MiTreeParser extends TreeParser;
...
expresion: #(op:OP_MAS e1:expresion e2:expresion)
{
LexInfoAST liop =(LexInfoAST)op;
LexInfoAST lie1 =(LexInfoAST)e1;
LexInfoAST lie2 =(LexInfoAST)e2;
... // Trabajar con liop, lie1 y lie2
}
#fortuna+amente !a una manera +e a!orrarse to+os esos castin-s5 consistente en uti)i%ar )a
o2ci=n ASTLabelType5 que rea)i%a estos castin-s autom.ticamenteF
header { import antlraux.util.LexInfoAST; }
public class MiTreeParser extends TreeParser;
options
{ *S+6abel+ype& antlrau<.util.6e<In=o*S+; }
...
expresion : #(op:OP_MAS e1:expresion e2:expresion)
{
// Ahora op, e1 y e2 son de tipo LexInfoAST
}
E) ?nico incon0eniente +e ASTLabelType=claseAST so)amente funcionar. si to+os )os no+os
+e) itera+or +e .r6o)es son +e )a c)ase Dc)ase#*$E o +e una +e sus su6c)ases (en otro caso se
)an%ar. una ClassCastException antes o +es2us)"
9ara nosotros esto no su2on+r. un 2ro6)ema 2ues to+os )os ti2os +e #*$ que uti)i%aremos
2ertenecer.n a) 2aquete antlraux.context.asts5 to+os e))os son su6c)ases +e LexInfoAST"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 202
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.26 &terador simple de r+oles
Becci%n -.2: /terador sim'le de (rboles
-.2.1: strategia de im'lementaci%n del an(lisis sem(ntico
Ja !e comenta+o que e) cic)o +e an.)isis sem.ntico se 2ue+e +i0i+ir en 2equeCos 2asos
+iferencia+os" Esta i+ea se entien+e 2erfectamente con e) si-uiente +i6u4o (que a !e usa+o
anteriormente)F
Ilustracin 7.1 /n#lisis sem#ntico dividido en su"tareas
Ia +os maneras +e im2)ementar esta funciona)i+a+F )as ))amaremos forma Dmono)ticaE forma
Den ca2asE"
3a forma mono)tica consiste en i-norar tota)mente )a estructura +e) an.)isis sem.ntico e
im2)ementar to+o e) an.)isis en una so)a c)ase" Estaramos im2)ementan+o una c)ase que
reso)0iera +e una so)a 0e% to+o )o que !a +entro +e) rect.n-u)o con )neas +iscontinuas +e )a
fi-ura" 3a 2rinci2a) 0enta4a +e )a estrate-ia mono)tica es su 0e)oci+a+F !a menos ))ama+as a
mto+os5 2ues !a menos an.)isis rea)i%a+os so6re e) #*$" *u 2rinci2a) +es0enta4a es que se
-enerar. un fic!ero mu -ran+e5 se-uramente con 2artes +e c=+i-o re2eti+as5 con e) cua) ser.
mu f.ci) cometer errores" En +efiniti0a5 ser. 2oco manteni6)e"
9or su 2arte5 )a a2ro:imaci=n en ca2as se 6asa en uti)i%ar un ana)i%a+or +iferente 2ara ca+a uno
+e )os su6Aan.)isis sem.nticos" 9artien+o e) an.)isis en 0arias 2artes 2otenciar. )a enca2su)aci=n5
+e manera que e) con4unto ser. m.s manteni6)e
61
" 9or otro )a+o5 a) 6asarse e) sistema en )an%ar
0arios an.)isis en )u-ar +e 15 es mu 2ro6a6)e que )a 0e)oci+a+ sea menor que en e) caso +e )a
estrate-ia mono)tica"
1a+os nuestros fines +i+.cticos5 nos +ecantaremos in+u+a6)emente 2or )a se-un+a estrate-ia5
+i0i+iremos e) an.)isis en 0arias ca2as" $n-ase en mente que si )o que estu0iramos
+esarro))an+o fuera un 2ro+ucto comercia) +e6eramos consi+erar )a estrate-ia mono)tica5 en
aras +e )a eficienciaAe4ecutar 0arias D2asa+asE so6re e) #*$ 2ue+e ser si-nificati0amente m.s
)ento que !acer so)amente una"
Ia que resa)tar tam6in que !a ocasiones en )as que sim2)emente no que+a m.s o2ci=n que
!acer m?)ti2)es 2asa+as@ como 0eremos5 esto ser. )o que ocurra a )a !ora +e im2)ementar e)
an.)isis +e ti2os +e 3e3i"
9ara im2)ementar )os +i0ersos ana)i%a+ores sem.nticos que necesitaremos 0amos a ser0irnos +e
nue0o +e )a !erencia +e -ram.ticas" $o+os )os su6Aan.)isis actuar.n so6re un #*$ m.s o menos
2areci+o5 +e manera que5 una 0e% es2ecifica+o un esque)eto inicia)5 so)amente ten+remos que
reescri6ir )as re-)as im2ortantes +e ca+a an.)isis"
9recisamente este esque)eto inicia) ser. nuestro itera+or sim2)e +e .r6o)es5 que ))amaremos
61 *iem2re cuan+o )as +ecisiones +e +iseCo sean a+ecua+as5 c)aro"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 20-
#n.)isis
sem.ntico 1
#n.)isis
sint.ctico
#*$
Generaci=n
+e c=+i-o
#n.)isis
sem.ntico n
#*$ 1
"""
#*$ nA1
#*$ enriqueci+o
#n.)isis sem.ntico
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.26 &terador simple de r+oles
LeLiTreeParser escri6iremos en e) fic!ero LeLiTreeParser.g" 3os ana)i%a+ores sem.nticos
que im2)ementaremos se or-ani%ar.n en )a si-uiente 4erarquaF
Ilustracin 7.2 EsFuema de clases para el an#lisis sem#ntico
-.2.2: structura del !ic*ero de gram(tica
E) fic!ero LeLiTreeParser.g comen%ar. +e )a si-uiente maneraF
header {
package leli;
}
class LeLiTreeParser extends TreeParser;
options
{
k=1;
buildAST = false; // Por defecto no construimos un AST nuevo
importVocab=LeLiParserVocab;
}
LeLiTreeParser es un itera+or +e .r6o)es5 )ue-o e:ten+er. a TreeParser" En cuanto a )as
o2ciones5 ten+remos queF
X k=1 "Esta o2ci=n es re+untante@ 2or +efecto HU1 en )os ana)i%a+ores sem.nticos"
X buildAST=false" 9or +efecto no construiremos un nue0o #*$"
X importVocab=LeLiParserVocab" ,m2ortaremos e) 0oca6u)ario que e:2ort= en ana)i%a+or
sint.ctico" *i !u6iramos teni+o que aCa+ir toHens en nuestro ana)i%a+or con recu2eraci=n +e
errores ten+ramos que im2ortar su 0oca6u)ario"
-.2.3: Regla raA8: @rograma
3a re-)a ra% +e) ana)i%a+or si-ue sien+o 2ro-ramaF
programa : #(PROGRAMA (decClase)+) ;
/n 2ro-rama es un .r6o) con e) toHen ima-inario 98;G8#B# como ra% con 1 o m.s !i4os
que ser.n recorri+os 2or )a re-)a decClase"
-.2.": 6e!inici%n de clases
/na c)ase ten+r. )a si-uiente formaF
decClase
: #( RES_CLASE IDENT
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 20)
LeLiTreeParser
Analizador1 Analizador2 Analizadorn
"""
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.26 &terador simple de r+oles
clausulaExtiende
#(LISTA_MIEMBROS (decAtributo|decMetodo|decConstructor)*)
)
;
E) #*$ +e una +efinici=n +e c)ase tiene como ra% RES_CLASE" *u 2rimer !i4o es un IDENT (en e)
que se -uar+a e) nom6re +e )a c)ase) su se-un+o !i4o +e6e ser reconoci+o 2or )a re-)a
clausulaExtiende" E) tercer !i4o es un #*$ con ra% LISTA_MIENBROS con +e 0 a 7 !i4os que
son reconoci+os 2or )a re-)a decAtributo5 decMetodo o decConstructor"
Iemos se2ara+o c)ausu)aE:tien+e +e) resto +e )a +efinici=n +e )a c)ase 2ara faci)itar su reescritura
en su6-ram.ticas5 2or e4em2)o 2ara reconocer errores" 3a c).usu)a e:tien+e siem2re +e6e ser
construi+a 2or e) ana)i%a+or sint.ctico5 tenien+o )a si-uiente formaF
clausulaExtiende : #(RES_EXTIENDE IDENT);
-.2.#: 6e!inici%n de atributos
/na +efinici=n +e atri6uto 2ue+e ser +e un atri6uto norma) o a6stracto" Gracias a que e)iminamos
e) a%?car sint.ctica5 )a re-)a 2ara reconocer e) #*$ +e )os atri6utos es mu senci))aF
decAtributo
: #( RES_ATRIBUTO (RES_ABSTRACTO)? tipo IDENT (expresion)? )
;
7o tenemos que 2reocu2arnos 2or e) !ec!o +e que so)amente )os atri6utos a6stractos 2ue+en ser
inicia)i%a+os@ esto a se !a teni+o en cuenta en )a fase +e) an.)isis sint.ctico"
tipo ser. asF
tipo : TIPO_ENTERO // tipo Entero
| TIPO_REAL // tipo Real
| TIPO_BOOLEANO // tipo Booleano
| TIPO_CADENA // tipo Cadena
| IDENT // tipo no bsico
2 +ID8_>*:I8 '' tipo vacRo
;
7=tese e) cam6io con res2ecto a )a im2)ementaci=n +e )a re-)a ti2o en e) an.)isis sint.cticoF en e)
an.)isis sem.ntico5 TIPO_VACIO forma 2arte +e )a re-)a tipo5 +e manera que 2ara +efinir )os
ti2os a no !a +os re-)as (tipo tipoRetorno) sino una so)a" Esto es 2osi6)e 2orque a se
contro)= +e6i+amente e) uso +e) ti2o 0aco en e) an.)isis sint.ctico"
Esta Dfusi=nE re+ucir. e) n?mero +e re-)as5 !acien+o e) ana)i%a+or m.s r.2i+o manteni6)e"
:e)inicin de m2todos normalesK m2todos a7stractos 3 constructores
E) #*$ +e )a +efinici=n +e un mto+o ser. reconoci+o 2or )a re-)a decMetodoF
decMetodo
: #( RES_METODO (RES_ABSTRACTO)? tipo
IDENT
listaDecParams
listaInstrucciones
)
;
Como 2ue+e 0erse5 e) no+o ra% tiene e) ti2o RES_METODO" E) 2rimer !i4o sir0e 2ara in+icar si e)
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 200
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.26 &terador simple de r+oles
mto+o es a6stracto o no (cuan+o no est.)" E) tercer 2ar.metro es e) ti2o +e) mto+o5 que como
a !emos +ic!o 2ue+e ser cua)quier ti2o5 inc)ui+o TIPO_VACIO5 que a!ora se reconoce con )a
re-)a tipo"
E) si-uiente !i4o +e) #*$ es )a )ista +e +ec)araciones +e 2ar.metros" *e reconoce con )a si-uiente
re-)aF
listaDecParams : #(LISTA_DEC_PARAMS ( #(RES_PARAMETRO tipo IDENT) )* ) ;
Gracias +e nue0o a )a e)iminaci=n +e) a%?car sint.ctica5 reconocer )as +ec)araciones +e
2ar.metros es mu sim2)eF ca+a 2ar.metro +e )a )ista +e 2ar.metros tiene su 2ro2io #*$5 en e)
que se inc)uen su nom6re su ti2o"
E) ?)timo !i4o +e) #*$ se reconocer. con )a re-)a )ista,nstrucciones5 que ten+r. )a si-uiente
formaF
listaInstrucciones : #(LISTA_INSTRUCCIONES (instruccion)*) ;
Reremos m.s a+e)ante )a re-)a instruccion"
9or otro )a+o5 )a +efinici=n +e un constructor ten+r. )a si-uiente formaF
decConstructor : #( RES_CONSTRUCTOR listaDecParams listaInstrucciones) ;
-.2.+: x'resiones
# ni0e) sem.ntico5 )as e:2resiones 2resentan menos +ificu)ta+es que a ni0e) sint.cticoF cuan+o e)
#*$ est. 6ien construi+o5 se uti)i%an +iferentes ti2os en )a ra% +e ca+a no+o5 as que se
2r.cticamente se 2ue+e recorre to+o e) #*$ +e una e:2resi=n con una ?nica re-)aF
expresion
: #(OP_MAS expresion expresion)
| #(OP_MENOS expresion expresion)
| #(OP_ASIG expresion expresion)
| #(OP_O expresion expresion)
| #(OP_Y expresion expresion)
| #(OP_IGUAL expresion expresion)
| #(OP_DISTINTO expresion expresion)
| #(OP_MAYOR expresion expresion)
| #(OP_MENOR expresion expresion)
| #(OP_MAYOR_IGUAL expresion expresion)
| #(OP_MENOR_IGUAL expresion expresion)
| #(OP_PRODUCTO expresion expresion)
| #(OP_DIVISION expresion expresion)
| #(OP_MENOS_UNARIO expresion)
| #(OP_MASMAS expresion)
| #(OP_MENOSMENOS expresion)
| #(OP_NO expresion)
| #(RES_ESUN acceso tipo)
| acceso
;
*o)amente nos que+a 2or +efinir accesoF
acceso : #(ACCESO raizAcceso (subAcceso)* );
#s que un acceso no es m.s que una ra% se-ui+a +e 0 o m.s subAccesos" 7o tenemos que
2reocu2arnos +e qu accesos tienen que ir se-ui+os o6)i-atoriamente 2or a) menos un accesoF a
nos encar-amos +e eso en )a fase +e) an.)isis sint.ctico" 3a ra% 0iene +a+a 2or )as si-uientes
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 20,
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.26 &terador simple de r+oles
re-)asF
raizAcceso : IDENT
| RES_PARAMETRO
| RES_ATRIBUTO
| RES_SUPER
| literal
| llamada
| conversion
| expresion // Expresiones entre parntesis
;
*ien+o literal )a si-uiente re-)aF
literal : LIT_ENTERO
| LIT_REAL
| LIT_CADENA
| LIT_NL
| LIT_TAB
| LIT_COM
| LIT_CIERTO
| LIT_FALSO
;
5 una llamada una in0ocaci=n +e un mto+o o un constructorF
llamada : #(LLAMADA IDENT listaExpresiones )
| #(RES_CONSTRUCTOR listaExpresiones )
;
listaExpresiones : #(LISTA_EXPRESIONES (expresion)* ) ;
reconocin+ose as una con0ersi=n +e ti2osF
conversion : #(RES_CONVERTIR expresion tipo) ;
>ina)mente5 )a re-)a subAcceso ten+r. esta formaF
subAcceso : llamada //Invocacin de un mtodo
| IDENT // Acceso a un atributo
| RES_SUPER // Invocacin de la clase padre
;
-.2.-: /nstrucciones
>ina)mente tenemos )as instrucciones" /na instrucci=n 2ue+e ser +e muc!os ti2osF
instruccion : instDecVar // declaracin
| instExpresion // Instruccin - expresin
| instMientras // bucle mientras
| instHacerMientras // bucle hacer-mientras
| instDesde // bucle desde
| instSi // Instruccin Si
| instVolver // Instruccin volver
;
1efinir )os +iferentes ti2os +e instrucciones tam6in es mu senci))o" 3a instrucci=n +e
+ec)araci=n +e 0aria6)es tiene e) ti2o INST_DEC_VARF
instDecVar : #(INST_DEC_VAR tipo IDENT (expresion)?) ;
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 207
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.26 &terador simple de r+oles
3a instrucci=nAe:2resi=n tiene INST_EXPRESIONF
instExpresion : #(INST_EXPRESION expresion) ;
3os tres ti2os +e 6uc)e se recorren tam6in mu 6ienF
instMientras : #(RES_MIENTRAS expresion listaInstrucciones) ;
instHacerMientras : #(RES_HACER listaInstrucciones expresion) ;
instDesde : #(RES_DESDE listaExpresiones
listaExpresiones
listaExpresiones
listaInstrucciones )
;
3a instrucci=n con+iciona) es un 2oco m.s com2)ica+a5 aunque no +emasia+o@ un #*$ 6ien
construi+o se 2ue+e recorrer f.ci)mente con un 2ar +e re-)asF
instSi : #(RES_SI expresion listaInstrucciones (alternativasSi)*) ;
alternativasSi : #(BARRA_VERT expresion listaInstrucciones)
| #(RES_OTRAS listaInstrucciones)
;
9or ?)timo5 )a m.s senci))aF )a instrucci=n volverF
instVolver : RES_VOLVER ;
-.2..: &%digo com'leto del iterador
E) c=+i-o com2)eto +e) itera+or es e) si-uienteF
header
{
package leli;
/*-----------------------------------------------*\
| Un intrprete para un Lenguaje Limitado(LeLi) |
| _____________________________________________ |
| |
| ANALISIS SEMNTICO 1 |
| _____________________________________________ |
| |
| Enrique J. Garcia Cota |
\*-----------------------------------------------*/
}
/**
* El objeto que permite recorrer los AST de LeLi.
* Hay que heredar de este objeto para hacer algo
* util (aparte de reconocer).
*/
class LeLiTreeParser extends TreeParser;
options
{
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 20/
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.26 &terador simple de r+oles
importVocab=LeLiParserVocab;
buildAST = false; // Por defecto no construimos un AST nuevo
}
/** Permite recorrer el nodo principal, llamado "programa" */
programa : #(PROGRAMA (decClase)+) ;
/**
* Permite recorrer la definicin de una clase. Una clase tiene:
* - Un identificador
* - Una OBLIGATORIA (se debe crear siempre en el parser) de "extiende"
* - Una lista de atributos y mtodos (miembros)
*/
decClase
: #( RES_CLASE IDENT
clausulaExtiende
listaMiembros
)
;
/** Lista de miembros de una clase **/
listaMiembros
: #(LISTA_MIEMBROS (decAtributo|decMetodo|decConstructor)*)
;
/**
* La palabra reservada "extiende" seguida de un identificador.
* Debe sobreescribirse en las subgramticas para aadir informacin
* de contexto.
**/
clausulaExtiende : #(RES_EXTIENDE IDENT);
/**
* Esta regla permite recorrer los tipos.
*/
tipo : TIPO_ENTERO // tipo Entero
| TIPO_REAL // tipo Real
| TIPO_BOOLEANO // tipo Booleano
| TIPO_CADENA // tipo Cadena
| TIPO_VACIO // tipo vaco
| IDENT // tipo no bsico
;
/**
* Regla que recorre tanto los atributos abstractos como los
* "normales"
*/
decAtributo
: #( RES_ATRIBUTO (RES_ABSTRACTO)? tipo IDENT (expresion)? )
;
/**
* Regla que recorre la definicin de un mtodo normal o abstracto
*/
decMetodo
: #( RES_METODO (RES_ABSTRACTO)? tipo
IDENT
listaDecParams
listaInstrucciones
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 20<
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.26 &terador simple de r+oles
)
;
/**
* Regla que recorre la definicin de los constructores
*/
decConstructor
: #( RES_CONSTRUCTOR listaDecParams listaInstrucciones )
;
/**
* Declaracin de los parmetros de un mtodo
*/
listaDecParams : #(LISTA_DEC_PARAMS (decParametro)* ) ;
/** declaracin de un parmetro **/
decParametro : #(RES_PARAMETRO tipo IDENT) ;
/**
* Regla que permite reconocer todas las instrucciones
*/
expresion
: #(OP_MAS expresion expresion)
| #(OP_MENOS expresion expresion)
| #(OP_ASIG expresion expresion)
| #(OP_O expresion expresion)
| #(OP_Y expresion expresion)
| #(OP_IGUAL expresion expresion)
| #(OP_DISTINTO expresion expresion)
| #(OP_MAYOR expresion expresion)
| #(OP_MENOR expresion expresion)
| #(OP_MAYOR_IGUAL expresion expresion)
| #(OP_MENOR_IGUAL expresion expresion)
| #(OP_PRODUCTO expresion expresion)
| #(OP_DIVISION expresion expresion)
| #(OP_MENOS_UNARIO expresion)
| #(OP_MASMAS expresion)
| #(OP_MENOSMENOS expresion)
| #(OP_NO expresion)
| #(RES_ESUN acceso tipo)
| acceso
;
/** Regla que permite reconocer un acceso */
acceso : #(ACCESO raizAcceso (subAcceso)* );
/** Regla auxiliar que permite reconocer la raz de un acceso */
raizAcceso : IDENT
| RES_PARAMETRO
| RES_ATRIBUTO
| RES_SUPER
| literal
| llamada
| conversion
| expresion // expresiones con parntesis
;
/** Regla auxiliar que permite reconocer los literales */
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2,
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.26 &terador simple de r+oles
literal : LIT_ENTERO
| LIT_REAL
| LIT_CADENA
| LIT_NL
| LIT_TAB
| LIT_COM
| LIT_CIERTO
| LIT_FALSO
;
/**
* Permite recorrer una llamada a un mtodo o un constructor
*/
llamada : #(LLAMADA IDENT listaExpresiones )
| #(RES_CONSTRUCTOR listaExpresiones )
;
/**
* Lista de expresiones. Sirve para representar parmetros pasados a
* un mtodo o un constructor
*/
listaExpresiones : #(LISTA_EXPRESIONES (expresion)* ) ;
/** Recorre una conversin de tipos */
conversion : #(RES_CONVERTIR expresion tipo) ;
/** Recorre un subacesso */
subAcceso : llamada
| IDENT
| RES_SUPER
;
/** Permite reconocer una lista de instrucciones */
listaInstrucciones : #(LISTA_INSTRUCCIONES (instruccion)*) ;
/** Regla que permite reconocer las instrucciones */
instruccion : instDecVar // declaracin
| instExpresion // Instruccin - expresin
| instMientras // bucle mientras
| instHacerMientras // bucle hacer-mientras
| instDesde // bucle desde
| instSi // Instruccin Si
| instVolver // Instruccin volver
;
/** Permite recorrer la declaracin de una variable local */
instDecVar : #(INST_DEC_VAR tipo IDENT (expresion|listaExpresiones)? ) ;
/** Permite reconcer las "instrucciones-expresin" */
instExpresion : #(INST_EXPRESION expresion) ;
/** Permite reconocer los bucles "mientras" */
instMientras : #(RES_MIENTRAS expresion listaInstrucciones) ;
/** Permite recorrer los bucles "hacer-mientras" */
instHacerMientras : #(RES_HACER listaInstrucciones expresion) ;
/** Permite reconocer los bucles "desde" */
instDesde : #(RES_DESDE listaExpresiones
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2,1
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.26 &terador simple de r+oles
listaExpresiones
listaExpresiones
listaInstrucciones )
;
/**
* Permite reconocer la instruccin Si.
*/
instSi : #(RES_SI expresion listaInstrucciones (alternativaSi)*) ;
/**
* Regla auxiliar para reconocer las alternativas de la instruccin Si
*/
alternativaSi : #(BARRA_VERT expresion listaInstrucciones)
| #(RES_OTRAS listaInstrucciones)
;

/** Reconoce la instruccin volver */
instVolver : RES_VOLVER ;
-.2.1: Los errores de construcci%n del AB>
8ecorrer un #*$ es un 0er+a+ero 2aseo com2ara+o con ana)i%ar sint.cticamente un f)u4o +e
toHens@ esto es 2articu)armente cierto si a+em.s e) ana)i%a+or sint.ctico que !a construi+o e) #*$
se !a esfor%a+o a+ecua+amente en recu2erarse +e )os errores"
7o o6stante5 2or muc!o cui+a+o que !aamos teni+o en )a recu2eraci=n +e errores sint.cticos5
es imposi"le que !aamos teni+o en cuenta to+os )os errores que un 2ro-rama+or 2ue+a cometer
(2ues son 0irtua)mente infinitos)"
# 2esar +e to+os nuestros esfuer%os en e) ca2tu)o 65 no est. -aranti%a+o que )os #*$s
resu)tantes +e) an.)isis estn e:entos +e inco!erenciasF un error no +etecta+o o no mane4a+o
con0enientemente 2ro0ocar. )a construcci=n +e un #*$ +efectuoso5 que )an%ar. 2ro0ocar. e)
)an%amiento +e errores en e) an.)isis sem.ntico" # fin +e im2)ementar un com2i)a+or rea)mente
ro6usto5 sera recomen+a6)e aCa+ir recu2eraci=n +e errores a) itera+or" 7o o6stante5 +a+o que
#7$38 2ro2orciona un mecanismo +e recu2eraci=n +e errores 2or +efecto que )os errores +e
construcci=n +e) #*$ ser.n escasos5 esto que+ar. como e4ercicio 2ara e) )ector"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2,2
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.-6 !l sistema @m+itoI?eclaraci(nITipo
Becci%n -.3: l sistema RmbitoS6eclaraci%nS>i'o
-.3.1: /ntroducci%n
En to+os )os )en-ua4es +e 2ro-ramaci=n fuertemente ti2a+os (+efiniremos m.s a+e)ante qu es un
)en-ua4e Dfuertemente ti2a+osE) e) ni0e) sem.ntico tiene que !acer una serie +e com2ro6aciones
e:!austi0as re)ati0as a )os ti2os +e )as e:2resiones que se mane4an en e) c=+i-o +e entra+a"
Consi+eremos5 2or e4em2)o5 e) si-uiente c=+i-oF
Entero a = 2;
Entero b = 1;
Booleano c = false;
a = a + b;
c = a > d;
Ia +os errores sem.nticos en e) e4em2)o" E) 2rimero se 2ro+uce a) +ec)arar )a 0aria6)e 6oo)eana
c5 que se inicia)i%a con e) i+entifica+or Dfa)seE (un i+entifica+or +esconoci+o en 3e3i) en )u-ar +e
)a ca+ena Dfa)soE (que es )a que se uti)i%a en 3e3i 2ara +efinir e) 0a)or Dno ciertoE)" E) se-un+o
error est. en )a se-un+a asi-naci=n5 2ues se uti)i%a una 0aria6)e ))ama+a d que no !a si+o
+ec)ara+a 2re0iamente"
En e) esta+o actua)5 e) com2i)a+or se )imita a recorrer e) .r6o) #*$ sin !acer na+a@ se )imita a
Dace2tarE )as construcciones que concuer+an sint.cticamente con )o que ) es2era" 1i-amos que
Dasiente est?2i+amenteE a cua)quier construcci=n que )e 2ro2orcionemos5 con ta) +e que sea
sint.cticamente correcta" *i 2u+iramos 0er )o que D2iensaE e) com2i)a+or5 0eramos a)-o as"
...
Entero a=2; <es un AST INST_DEC_VAR con Entero, el identificador a y 2. O!
Entero b=1; <es un AST INST_DEC_VAR con Entero, el identificador " y #. O!
Booleano c=false; <es un AST INST_DEC_VAR con $ooleano, el identificador
c y el identificador %false&. O!
a=a+b; <es un AST con los idents a y " y los o'er. ( y ) . O!
c=a>d; <es un AST con los idents c, a y d y los o'er. ( y *!*. O!
...
Este com2ortamiento es mu 2oco ?ti)" 7ecesitamos !acer m.s inte)i-ente a nuestro com2i)a+or5
que sea ca2a% +e +etectar )os errores que !emos cometi+o5 a+0irtien+o con0enientemente a)
2ro-rama+or"
csto es )o que se 2ersi-ue en e) tratamiento +e )a informaci=n conte:tua)5 que nos +is2onemos a
im2)ementar" 9ero 2ara e))o +e6eremos +efinir a)-unos conce2tos 2re0ios5 a )o que +e+icaremos
esta secci=n"
-.3.2: @resentaci%n de el sistema RmbitoS6eclaraci%nS>i'o 9A6>;
+volucin de la encapsulacin en los lengua*es de programacin
3os 2rimeros )en-ua4es +e 2ro-ramaci=n se 2arecan muc!o a) )en-ua4e ensam6)a+or" E)
2ro-rama+or +e6a conocer en 2rofun+i+a+ to+os )os entresi4os +e )a m.quina5 sa6er qu 6its se
transmitiran entre qu com2onentes +e) 2rocesa+or en ca+a instante" 3a 2rimera +irecti0a +e
contro) +e f)u4o +e) 2ro-rama fue GOTO5 se-ui+a un 2oco m.s tar+e 2or GOSUB"
3a se-un+a -eneraci=n +e )en-ua4es +e 2ro-ramaci=n intro+u4o una 2rimera ca2a +e a6stracci=n"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2,-
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.-6 !l sistema @m+itoI?eclaraci(nITipo
Ja no era necesario sumar e) re-istro #X con 1XF se 2as= a sumar e) entero cantidad con e)
entero incremento" 3a or+en GOTO se 0io sustitui+a 2or )as instrucciones +e contro)
con+iciona)es )os 6uc)es" 3as su6rutinas que se rea)i%a6an con GOSUB se fueron con0irtien+o en
funciones"
3a tercera e0o)uci=n +e )os )en-ua4es a ))e-a+o con )a 9ro-ramaci=n ;rienta+a a ;64etos (9;;)"
3os +atos funciones re)aciona+os con un mismo .m6ito se a-ru2aron en o64etos5
con0irtin+ose )os +atos en Datri6utosE )as funciones en Dmto+osE +e +ic!os o64etos"
#ctua)mente e:iste un cuarto ni0e) +e a6stracci=n5 aunque en )a maora +e )as a2)icaciones
actua)es no se uti)i%a to+a0a" Esto !a6)an+o +e )os *istemas 1istri6ui+os" 3os *istemas
1istri6ui+os 2ermiten a) 2ro-rama+or a6straerse +e )a re+ que sustenta su a2)icaci=n" 3os o64etos
interaccionan entre e))os in+e2en+ientemente +e )a m.quina en )a que se encuentren5 a tra0s +e
)a re+" 1e esta forma5 un *istema 1istri6ui+o es m.s f)e:i6)e que una a2)icaci=n monoestaci=n"
E:isten 0arios mo+e)os 2ara +esarro))ar *istemas 1istri6ui+os" #)-unos e4em2)os +e tecno)o-as
+e *istemas 1istri6ui+os son C;8G#5 C;B^1C;B +e Bicrosoftk Enter2rise Ja0aGeans +e
*unk" 3a caracterstica m.s interesante +e C;B^1C;B es que )os atri6utos +e un o64eto son
inaccesi6)es +es+e e) e:terior (si no es a tra0s +e mto+os) )os mto+os est.n a-ru2a+os en
inter&aces5 que no son mas que -ru2os +e mto+os" #s5 2ara 2o+er e4ecutar un mto+o en un
o64eto con C;B^1C;B es necesario o6tener su interfa%5 que es e) D2uenteE que 2ermite tra6a4ar
con e) mto+o +e manera trans2arente con )a re+"
3a e0o)uci=n +e )os )en-ua4es +e 2ro-ramaci=n a )o )ar-o +e) tiem2o 2ermite sacar muc!as
conc)usiones" 3a que nos interesa aqu5 sin em6ar-o5 es e) incremento ca+a 0e% maor +e )a
encapsulacin" Jo +efinira )a enca2su)aci=n como )a Docu)taci=n 2ertinente +e )os +atosE5 es
+ecir5 que en ca+a uni+a+ )=-ica +e) 2ro-rama se Drestrin-eE a) 2ro-rama+or e) acceso a ciertos
+atos que no +e6era uti)i%ar" #)-unos 2ro-rama+ores (en -enera) ine:2ertos) 0en )a
enca2su)aci=n como 2oco m.s que Dmana incor+ianteE +e a)-unos 2or !acer )as cosas m.s
Dforma)esE
6'
" *in em6ar-o5 e) tiem2o )a e:2eriencia !an +emostra+o que )a enca2su)aci=n es5
sim2)emente5 e) camino a se-uir" Con enca2su)aci=n se consi-uen a2)icaciones m.s f)e:i6)es
manteni6)es5 se re+ucen )os errores"
En )os 2rimeros 2ro-ramas !ec!os en ensam6)a+or no !a6a enca2su)aci=n@ e) 2ro-rama+or 2o+a
acce+er a cua)quier +irecci=n +e )a memoria +e +atos" B.s a+e)ante5 en )os )en-ua4es funciona)es5
so)amente )e esta6a 2ermiti+o acce+er a )as 0aria6)es -)o6a)es +e) 2ro-rama a )as 0aria6)es
)oca)es +e )a funci=n que se est. e4ecutan+o" 3a 9;; aCa+a a?n m.s enca2su)aci=n5
intro+ucien+o )os atri6utos 2ri0a+os 2rote-i+os (que son )os que 2onen tan ner0iosos a )os
2ro-rama+ores ine:2ertos +e )os que !a6).6amos antes)" 9or ?)timo5 en )os *istemas
1istri6ui+os5 )a enca2su)aci=n es tan 2atente que inc)uso )os mto+os +e un o64eto no son
+irectamente accesi6)es (es necesario o6tener un interfa% antes)"
>m7itos
$ras esta 2equeCa +isertaci=n so6re enca2su)aci=n5 0amos a 2resentar e) mecanismo que se uti)i%a
!a6itua)mente 2ara im2)ementar)aF )os #m"itos"
/n .m6ito 2ue+e enten+erse como un con4unto +e i+entifica+ores que 2ue+en ser uti)i%a+os 2or
e) 2ro-rama+or en un 2unto +a+o +e) 2ro-rama" 3os i+entifica+ores 2ue+en ser0ir 2ara
+enominar tanto ti2os +e o64etos (c)ases) como instancias +e o64etos (atri6utos5 0aria6)es )oca)es5
2ar.metros) o ))ama+as a mto+os"
# -ran+es ras-os5 ca+a 0e% que e) com2i)a+or encuentre un i+entifica+or en )a entra+a5 +e6er.
6' # m mismo me 2as="
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2,)
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.-6 !l sistema @m+itoI?eclaraci(nITipo
consu)tar e) sistema +e .m6itos 2ara o6tener e) ti2o asocia+o a +ic!o i+entifica+or" /na 0e%
o6teni+o +ic!o ti2o5 se 2on+r. en marc!a e) sistema +e com2ro6aci=n +e ti2os (0er m.s
a+e)ante)"
3os .m6itos sue)en Dso)a2arseE@ ca+a nue0o .m6ito aCa+e i+entifica+ores a) .m6ito que )o
contiene@ tam6in 2ue+e enmascarar )os i+entifica+ores 2re0ios con otros nue0os" Consi+rese e)
si-uiente casoF
clase Solapamiento // Comienza el mbito de la clase Solapamiento
{
atributo Cadena a; // Declara el ATRIBUTO a
mtodo solapa(Entero a) // Comienza el mbito del mtodo solapa
{
Sistema.imprime(a); // Imprime el valor del PARMETRO a
Booleano a = falso;
Sistema.imprime(a); // Imprime el valor de la VARIABLE a falso
} // Termina el mbito del mtodo
} // Termina el mbito de la clase
E) com2ortamiento -enera) +e )os .m6itos se 2ue+e mo+e)ar con una D2i)a +e ta6)as +e nom6resE"
#Ca+ir e)ementos a )a 2i)a consiste5 2ues5 en a2i)ar +esa2i)ar ta6)as +e nom6res"
7orma)mente )a 2i)a no ten+r. m.s +e 3 ni0e)esF
X E) .m6ito Genera)5 que inc)ue )as c)ases Sistema Objeto5 )os ti2os 6.sicos +e) )en-ua4e
)os ti2os +e) usuario
X E) .m6ito C)ase5 que aCa+e )os nom6res +e )os atri6utos +e )a c)ase en )os mto+os +e )a c)ase"
X E) .m6ito Bto+o5 que aCa+e )os 2ar.metros )a 0aria6)e +e retorno a) cuer2o +e) mto+o"
X 9ue+e !a6er .m6itos a+iciona)es 2ara 6uc)es5 instrucciones con+iciona)es5 etc"
En -enera)5 ca+a 0e% que en 3e3i se uti)i%a una ))a0e a6ierta ([f[) se a6re un nue0o .m6ito5 que se
cierra a) ))e-ar a )a 2rimera ))a0e cerra+a ([g[)" Cuan+o se +ec)ara un o64eto se inserta en e) ?)timo
.m6ito a6ierto" 3as +os e:ce2ciones a esta re-)a son e) .m6ito -)o6a)5 que no comien%a ni
termina con ))a0es5 )os 2ar.metros en )os mto+os5 que a 2esar +e insertarse en e) .m6ito +e su
mto+o 2rece+en a )a ))a0e a6ierta"
En casi to+os )os )en-ua4es e:iste un .m6ito 2or +efecto5 en e) que se +efinen ciertos e)ementos
6.sicos +e) )en-ua4e" En 3e3i5 e) .m6ito 2or +efecto se ))ama D.m6ito -)o6a)E5 contiene )os
ti2os 6.sicos (Entero5 Real5 Cadena5 Booleano5 Objeto) )a c)ase Sistema"
3os .m6itos se im2)ementar.n uti)i%an+o )a c)ase antlraux.context.Scope5 que estu+aremos
en 6re0e"
:eclaraciones
3as +ec)araciones son )as uni+a+es mnimas +e informaci=n que -uar+a un .m6ito" Ca+a 0e% que
una c)ase5 mto+o5 atri6uto5 2ar.metro o 0aria6)e se +ec)are5 +e6eremos intro+ucir una
+ec)araci=n en e) .m6ito corres2on+iente"
/na +ec)araci=n 2ue+e enten+erse como un con4unto +e +atos" E) m.s e0i+ente +e to+os es e)
nom"reF to+a +ec)araci=n tiene un nom6re que )a i+entifica +iferencia +e )as +em.s
63
" ;tro +ato
re)e0ante es e) tipo +e )a +ec)araci=n"
9ara im2)ementar )as +ec)araciones uti)i%aremos )a c)ase antlraux.context.Declaration5 que
63 Como 0eremos en )a si-uiente secci=n5 esto no es +e) to+o cierto@ !a casos en )os que es necesario +esea6)e que 0arias
+ec)araciones ten-an e) mismo nom6re"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2,0
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.-6 !l sistema @m+itoI?eclaraci(nITipo
tam6in estu+iaremos m.s a+e)ante"
'ipos
E) ti2o +e una +ec)araci=n es5 como a !emos +ic!o5 su caracterstica 2rinci2a)" Es una manera +e
Dc)asificarE o Dcata)o-arE )os o64etos5 +e acuer+o con )as 2ro2ie+a+es atri6utos que tienen5 o )os
mto+os que 2ue+en in0ocar" ,ntuiti0amente5 2o+emos +ecir que una +ec)araci=n es +e ti2o
DenteroE5 Drea)E5 etc"
3as +ec)araciones no son )os ?nicos e)ementos con ti2o +e un )en-ua4e" $am6in tienen ti2o )as
e:2resiones (+e forma que una e:2resi=n 2ue+e ser DenteraE5 Drea)E5 etc)" 3os ti2os +e )as
e:2resiones se ca)cu)an +e forma recursi0aF )os accesos sim2)es (Dnom6res +e o64etosE) cuo ti2o
2ue+e ca)cu)arse sim2)emente consu)tan+o )a +ec)araci=n a+ecua+a en e) .m6ito actua)" 1es2us
se si-uen unas re-)as +etermina+asF )a suma +e +os e:2resiones enteras es tam6in entera5 etc"
#) 2roceso +e ca)cu)ar )os ti2os +e )as e:2resiones +e un 2ro-rama +urante )a fase +e com2i)aci=n
se )e ))ama c#lculo de tipos" 1urante e) c.)cu)o +e ti2os se +e6en rea)i%ar muc!as com2ro6aciones
+e o2eraciones in0.)i+as (2or e4em2)o restar un entero a una ca+ena) 2or )o que en muc!as
ocasiones a) c.)cu)o +e ti2os se )e ))ama compro"acin de tipos"
# )os )en-ua4es que rea)i%an )a com2ro6aci=n +e ti2os +urante )a fase +e com2i)aci=n se )es ))ama
)en-ua4es &uertemente tipados" # )os que )a rea)i%an en tiem2o +e e4ecuci=n5 se )es ))ama
d"ilmente tipados"
,m2)ementaremos nuestro sistema +e ti2os en torno a una serie +e interfaces c)ases )oca)i%a+as
en e) su62aquete5 antlraux.context.types" 3a interfa% m.s im2ortante +e este 2aquete ser.
antlraux.context.types.Type"
AS's especiali%ados
En )a 2.-ina 161 a estu0imos !a6)an+o +e )os #*$s !etero-neos" En )a secci=n ("1"3
2resentamos e) 2rimer ti2o +e #*$ que 0amos a uti)i%ar en nuestro com2i)a+or5 LexInfoAST K
un #*$ con informaci=n ):ica"
1urante e) an.)isis sem.ntico uti)i%aremos otras c)ases +e #*$s 2ara -uar+ar informaci=n
a+iciona) K )os 0eremos m.s a+e)ante"
-.3.3: /m'lementaci%n del sistema A6>: el 'aquete antlraux.context
3os conce2tos 6.sicos +e) sistema #1$ estar.n im2)ementa+os uti)i%an+o c)ases +e) su62aquete
+e ant)rau: ))ama+o antlraux.context" ;tras c)ases5 sin em6ar-o5 ser.n D+e2en+ientes +e)
)en-ua4e 3e3iE5 2or )o que se inc)uir.n en e) 2aquete )e)i a)-?n su62aquetes +e ste"
En )os si-uientes a2arta+os iremos 0ien+o 2au)atinamente c=mo im2)ementaremos )os .m6itos5
+ec)araciones ti2os en nuestro com2i)a+or5 2resentan+o )as so)uciones +e car.cter -enera) que
ofrece )a )i6rera ant)rau:" 9ero antes +e eso 0amos a 2resentar )a c)ase Conte:tE:ce2tion5 que
mo+e)i%a )as e:ce2ciones +e6i+as a errores +etecta+os +urante )a eta2a +e com2ro6aci=n +e
ti2os"
$a e-cepcin antlrau-.conte-t."onte-t+-ception
Ca+a 0e% que se 2ro+u%ca un error +urante e) $,C se )an%ar. una e:ce2ci=n +e ti2o
antlraux.context.ContextException"
3a c)ase antlraux.context.ContextException es una su6c)ase +e
antlaux.util.LexInfoException" Esta ?)tima es5 a su 0e%5 su6c)ase +e
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2,,
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.-6 !l sistema @m+itoI?eclaraci(nITipo
antlr.RecognitionException" 9or tanto5 ContextException es una Dsu6Asu6 c)aseE +e
RecognitionException"
Ilustracin 7.( SerarFua de antlraux.context.2ontextException
Esta +e2en+encia no es a) a%arF e) c=+i-o +e recu2eraci=n +e errores +e )os ana)i%a+ores
sem.nticos +e #7$38 se 6asa en ca2turar )as e:ce2ciones +e ti2o RecognitionException@
)an%an+o e:ce2ciones +e este ti2o conse-uiremos que )os ana)i%a+ores 2ue+an mane4ar )as
e:ce2ciones +e6i+as a errores +e conte:to5 si stas se 2ro+ucen"
ContextException im2)ementa )a interfa% antlraux.util.LexInfo5 2or )o que 2ue+e
uti)i%arse 2ara -enerar mensa4es +e error con informaci=n ):ica"
En 7uen sistema de identi)icacin : la dupla nom7re<NetiAuetaO
Cuan+o $erence 9arr +iseC= )a interfa% #*$5 +eci+i= que to+o no+o +e6era 2ro2orcionar +os
informacionesF una ca+ena5 Dte:tE un entero5 Dt2eE"E) 2rimero contiene en )a maora +e )os
casos De) te:to que forma6a e) toHenE" E) se-un+o sir0e 2ara +iferenciar entre s toHens
im2)ementa+os me+iante )a misma c)ase
64
"
Este sistema +e i+entificaci=n es mu 2otente f)e:i6)e5 !asta e) 2unto +e que )o usaremos 2ara
i+entificar )os .m6itos5 +ec)araciones ti2os +e nuestro sistema"
7o o6stante5 e:iste un 2equeCo 2ro6)ema con )a nomenc)atura uti)i%a+aF Dt2eE es un nom6re
-enrico que 2ue+e ))e0ar a confusi=n@ !emos +e +iferenciar entre Dti2o +e un #*$E Dti2o +e
una +ec)araci=n o e:2resi=nE@ mientras que e) 2rimero no es m.s que un entero5 que se esta6)ece
en e) ni0e) sint.ctico5 e) se-un+o 2ue+e ser )a instancia +e una c)ase m.s o menos com2)ica+a5
que se esta6)ece en e) ni0e) sem.ntico"
# fin +e a!orrar confusiones futuras5 !e +eci+i+o uti)i%ar un nom6re +iferente +e Dt2eE 2ara
+esi-nar a D)os enteros que co+ifican un ti2o +entro +e una c)aseEF uti)i%ar e) trmino in-)s tag5
que 0iene a si-nificar DetiquetaE" 3os .m6itos5 +ec)araciones ti2os ser.n 2ues i+enfica6)es con )a
+u2)a <tag,name>" 3a etiqueta ten+r. +i0ersas funciones en ca+a unoF en )os .m6itos co+ificar.
De) ti2o +e .m6itosE (+e c)ase5 +e mto+o5 +e con+iciona)""")@ en )as +ec)araciones5 e) Dti2o +e
+ec)araci=nE (c)ase5 2ar.metro5 0aria6)e""")@ en )os ti2os5 e) Dti2o +e ti2oE (error5 0aco5 6.sico5
+efini+o 2or e) usuario5 mto+o5 constructor5 c)ase5 atri6uto5 metac)ase)"
1e esta manera5 tanto )os .m6itos como )as +ec)araciones )os ti2os 2oseer.n setters getters
64 ; DtoHens !omo-neosE" >ueron e:2)ica+os en )a secci=n 4"6"'5 en )a 2.-ina 110"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2,7
antlr.RecognitionException
antlraux.util.LexInfoException
antlraux.context.ContextException
antlrau+.util.,e+Info
implementa
antlr
antlraux.util
antlraux.context
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.-6 !l sistema @m+itoI?eclaraci(nITipo
2ara un atri6uto entero ))ama+o tag5 que ten+r. una uti)i+a+ 2areci+a a) mto+o t!pe +e )os
#*$s"
-.3.": La clase antlraux.context.Bco'e
Esta c)ase (o una su6c)ase +e e))a) ser. )a que uti)icemos 2ara mo+e)ar )os .m6itos"
Identi)icacin: nom7re 3 etiAueta de los m7itos
/ti)i%aremos e) sistema +e i+entificaci=n nom6reAetiqueta que 0eamos anteriormente" #s5 to+a
instancia +e )a c)ase antlraux.context.Scope +e6er. 2oseer5 a) menos5 un nom6re (name)
una etiqueta (tag) que es2ecifique su Dti2o +e .m6itoE" name es +e ti2o String5 tag es un
entero" 3os +os cam2os ser.n com2)etamente +e2en+ientes +e) )en-ua4e que se est mo+e)an+o"
9ue+e uti)i%arse cua)quier +u2)a jetiqueta5 nom6reV 2ara i+entificar un .m6ito@ )a c)ase no !ace
nin-una su2osici=n con res2ecto a e))os"
3a 2rinci2a) uti)i+a+ +e) nom6re +e un .m6ito es +e cara a )os mensa4es +e error@ es mu ?ti)
2o+er in+icar e) nom6re +e un .m6ito en e) caso +e que se !aa 2ro+uci+o un error +e inserci=n"
En cuanto a )a etiqueta5 su 2rinci2a) funci=n es )a +e Dc!equeo +e insercionesEF un atri6uto +e una
c)ase no 2ue+e ser +ec)ara+o +entro +e) .m6ito +e un mto+o" 3a etiqueta tam6in sir0e 2ara
com2ro6ar que estamos cerran+o e) .m6ito a+ecua+o@ como 0eremos m.s a+e)ante5 )a c)ase
LeLiContext se sir0e +e )a etiqueta 2ara cerrar +e )a manera a+ecua+a )os +iferentes ti2os +e
.m6itos que 2ue+e encontrar"
$anto name como tag tienen mto+os -et set" #m6os 2ue+en ser nu))5 aunque es
+esaconse4a6)e"
Insercin de declaraciones
/n ?nico mto+o 2ermite insertar +ec)araciones en un .m6itoF e) mto+o insert"
public void insert(Declaration d) throws ContextException
Este mto+o insertar. autom.ticamente )a +ec)araci=n + en e) con4unto +e +ec)araciones .m6ito
actua)5 cua im2)ementaci=n se 0er. m.s a+e)ante" 3a im2)ementaci=n actua) no )an%ar. 4am.s
una e:ce2ci=n@ sta se inc)ue en )a +efinici=n +e) mto+o 2ara que )as su6c)ases 2ue+an )an%ar)a
si so6reescri6en e) mto+o"
Implementacin implcita de la pila de m7itos 3 7PsAuedas locales 3 no locales
3os .m6itos sue)en or-ani%arse en D2i)asE5 ta) como se 0io en )a secci=n anterior" Ia 0arias
maneras +e im2)ementar este com2ortamiento@ )a o2ci=n 2or )a que nos !emos +ecanta+o !a si+o
)a +e im2)ementar )a 2i)a im2)citamente en )os .m6itosF en )u-ar +e !a6er una c)ase D2i)a +e
.m6itosE5 se !a aCa+i+o un cam2o a )os .m6itos que )es 2ermite sa6er qu .m6ito es su D2a+reE"
E) cam2o que a2unta a) .m6ito 2a+re es +e ti2o antlraux.context.Scope 2osee mto+os -et
set" 9ue+e ser nu))5 si e) .m6ito carece +e .m6ito 2a+re (e) .m6ito es D-)o6a)E)"
/n .m6ito ofrecer. norma)mente +os ti2os +e mto+os +e 6?sque+aF uno D)oca)E5 2ara 6uscar en
)a ta6)a +e sm6o)os 2ro2ia +e) .m6ito5 otro Dno )oca)E5 2ara ir ascen+ien+o 2or )a 4erarqua +e
.m6itosF 2rimero se 6usca en e) .m6ito actua)5 )ue-o en e) 2a+re5 etc5 +etenin+ose )a 6?sque+a a)
))e-ar a) .m6ito ra%"
3as referencias circu)ares no se +etectanF si un .m6ito se !ace 2a+re +e uno +e sus 2a+res5
in0ocar una 6?sque+a no )oca) 2ro0ocar. una iteraci=n infinita con e) consi-uiente
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2,/
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.-6 !l sistema @m+itoI?eclaraci(nITipo
+es6or+amiento +e 2i)a"
4rgani%acin de las declaraciones dentro de un m7ito
Ja !emos comenta+o )a i+ea 6.sica so6re )a que -iran )os .m6itosF un con4unto +e +ec)araciones
con nom6re5 2resumi6)emente or-ani%a+as en forma +e ta6)a !as!5 sien+o )a c)a0e !as! e) nom6re
+e )as +ec)araciones"
3o m.s inme+iato es uti)i%ar )a c)ase Hashtable 2ro2orciona+a 2or )a #9, +e 4a0a"
/no +e )os 2rimeros 2ro6)emas que encontraremos 2ara uti)i%ar +ic!a c)ase es que no 2ermite )a
inserci=n +e 0arios e)ementos con e) mismo nom6re" Esto 2ue+e ser 2ermisi6)e en )en-ua4es
sim2)es (en )os que se esta6)e%ca que un i+entifica+or sea uti)i%a+o 2ara +ec)arar un so)o un
o64eto +e ca+a .m6ito)" *in em6ar-o en )a +efinici=n +e 3e3i se esta6)eci= e:2)citamente que
!a6ra situaciones en )as que 0arios o64etos estaran i+entifica+os con e) mismo nom6reF
concretamente en e) caso +e enmascaramiento 2o+ra !a6er un 2ar.metro5 un atri6uto una
0aria6)e (o m.s +e una) i+entifica+os con e) mismo nom6reF
clase enmascaramiento
{
atributo Cadena a;
metodo enmascarar (Entero a, Entero b)
{
Real a = parmetro.a + b + 1.5;
}
}
En e) e4em2)o anterior5 e) .m6ito +e) mto+o enmascarar contiene un 2ar.metro +e ti2o Entero
))ama+o a una 0aria6)e +e ti2o Real tam6in ))ama+a a (a+em.s5 )os +os est.n enmascaran+o un
atri6uto Cadena que tam6in se ))ama a5 aunque en +ic!o caso no !a 2ro6)ema 2orque e)
atri6uto est. +ec)ara+o en e) .m6ito +e )a c)ase no +e) mto+o)"
3a conc)usi=n +e to+o esto es que nuestra c)ase .m6ito 2oseer. una ta6)a !as! que en ca+a
2osici=n no ten+r. una so)a +ec)araci=n5 sino una )ista +e +ec)araciones" 1e esta forma5 )os
mto+os +e 6?sque+a +e +ec)araciones uti)i%an+o un nom6re no +e0o)0er.n una so)a +ec)araci=n5
sino una )ista +e +ec)araciones"
Esta or-ani%aci=n 2ue+e 0erse ref)e4a+a en )a i)ustraci=n ("4F
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2,<
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.-6 !l sistema @m+itoI?eclaraci(nITipo
Ilustracin 7.* Hm"itos ! enmascaramiento
3os mto+os +e 6?sque+a se 0er.n afecta+os 2or esta or-ani%aci=n5 +e0o)0ien+o )istas +e
+ec)araciones en )u-ar +e una so)a +ec)araci=nF
// Devuelve una lista de declaraciones, o null si no se encuentra ninguna
public LinkedList searchAllLocally(String name);
// Invoca searchLocally en toda la jerarqua de mbitos; devuelve una lista con
// todas las declaraciones llamadas name o null si no se ha encontrado
// ninguna
public LinkedList searchAll(String name);
9or como+i+a+ se !an inc)ui+o otros +os5 que +e0ue)0en +irectamente e) 2rimer e)emento +e )a
)ista (que ser. e) ?)timo inserta+o en e) .m6ito)F
// Devuelve la primera declaracin llamada name,
// o null si no se encuentra ninguna
public Declaration searchFirstLocally(String name);
// Invoca searchFirstLocally en toda la jerarqua de mbitos;
// devuelve la primera declaracin encontrada en la jerarqua
// ninguna
public Declaration searchFirst(String name);
+l do7le ordenamiento de los elementos
En muc!as ocasiones necesitaremos 6uscar Dto+as )as +ec)araciones ))ama+as :E en un .m6ito"
*in em6ar-o5 )a 6?sque+a D2or nom6reE no ser. e) ?nico ti2o +e 6?sque+a que rea)i%aremos@ en
otras ocasiones necesitaremos !acer una 6?sque+a D2or etiquetaE +e +ec)araci=n@ 2or e4em2)o5
necesitaremos o6tener to+os )os mto+os +e una c)ase5 o to+os sus atri6utos"
9ara 2ermitir este ti2o +e 6?sque+as !emos or-ani%a+o )as +ec)araciones +entro +e )os .m6itos
+e manera que se 2ue+an rea)i%ar )os +os ti2os +e 6?sque+as (uti)i%an+o +os ta6)as !as!
+iferentes5 una que Dor+ena 2or nom6reE otra que Dor+ena 2or etiquetaE)"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 27
variable Real a parmetro Entero a a
parmetro Entero b b
mbito clase enmascaramiento
atributo Cadena a a
mbito mtodo enmascarar
mtodo enmascarar enmascarar
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.-6 !l sistema @m+itoI?eclaraci(nITipo
Ilustracin 7., Do"le ordenamiento de las declaraciones en los #m"itos
E) 2rinci2a) 2ro6)ema +e esta im2)ementaci=n es un incremento en )a memoria consumi+a un
+ecremento en )a 0e)oci+a+ +e inserci=n"
// Devuelve una lista de declaraciones, o null si no se encuentra ninguna
public LinkedList searchAllLocally(int tag);
// Invoca searchLocally en toda la jerarqua de mbitos; devuelve una lista con
// todas las declaraciones de etiqueta tag o null si no se ha encontrado
// ninguna
public LinkedList searchAll(int tag);
// Devuelve la primera declaracin con etiqueta tag,
// o null si no se encuentra ninguna
public Declaration searchFirstLocally(int tag);
// Invoca searchFirstLocally en toda la jerarqua de mbitos;
// devuelve la primera declaracin encontrada en la jerarqua
// ninguna
public Declaration searchFirst(int tag);
#+em.s +e estos mto+os )os a e:2uestos5 e:isten otros que 2ermiten rea)i%ar consu)tas en )as
que se com6inan e) ti2o e) nom6re +e) e)emento 6usca+oF
public LinkedList searchAllLocally(int ta%? Strin% name);
public LinkedList searchAll(int ta%? Strin% name);
public Declaration searchFirstLocally(int ta%? Strin% name);
public Declaration searchFirst(int ta%? Strin% name);
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 271
variable Real a parmetro Entero a
Ordenacin por nombre
a
parmetro Entero b b
mbito clase enmascaramiento
Ordenacin por nombre
atributo Cadena a a
variable Real a
parmetro Entero a
variable
parmetro Entero b parmetro
mbito mtodo enmascarar
Ordenacin por tipo
mtodo enmascarar enmascarar
Ordenacin por tipo
atributo Cadena a atributo
atributo Cadena a mtodo
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.-6 !l sistema @m+itoI?eclaraci(nITipo
-.3.#: La clase antlraux.context.6eclaration
+lementos 7sicos: nom7re 3 tipo
En )a secci=n anterior a se mencionaron )os e)ementos 6.sicos que conforman una +ec)araci=nF
sta +e6e 2oseer5 a) menos5 un nom6re (name) un ti2o (t!pe)" E) 2rimero es una sim2)e ca+ena5
mientras que e) se-un+o es una instancia +e )a interfa% antlraux.types.Type5 que 0eremos con
m.s +etenimiento m.s a6a4o"
$anto e) nom6re como e) ti2o +e una +ec)araci=n tienen mto+os -et set"
Identi)icacin: +tiAueta 3 nom7re
3as +ec)araciones 2oseen un cam2o DetiquetaE (tag) que sir0e 2ara in+icar De) ti2o +e
+ec)araci=nE" En o2osici=n a) Dti2o +e) o64eto +ec)ara+oE5 anteriormente +escrito5 que in+ica si e)
o64eto +ec)ara+o es un DenteroE o un Drea)E5 )a etiqueta sir0e 2ara +iferenciar si una +ec)araci=n
es Dun 2ar.metroE5 Duna +ec)araci=n +e c)aseE o Dun mto+oE"
3a etiqueta es un atri6uto entero con mto+os -et set"
En nuestro caso !a si+o 2osi6)e uti)i%ar enteros a +efini+os 2or )os ana)i%a+ores +e nuestro
com2i)a+or@ aunque esto no es necesario en )as etiquetas5 es a)tamente recomen+a6)e5 2ues
mantiene )a !omo-enei+a+ +e) sistema"
3a etiqueta es com2)eta+a con e) nom"re de la declaracinF una ca+ena que -uar+a un nom6re"
9or e4em2)o5 cuan+o se +ec)ara )a c)ase 9ersona5 su +u2)a <etiqueta,nombre> es <RES_CLASE,
Persona>"
Iniciali%acin
Buc!as +ec)araciones requieren -uar+ar una e:2resi=n +e inicia)i%aci=n" En 3e3i5 2or e4em2)o5
)os atri6utos a6stractos )as 0aria6)es 2ue+en ser inicia)i%a+as con una e:2resi=nF
clase Persona
{
atributo abstracto Entero mayoraEdad & IS;
mtodo cualquiera()
{
Cadena mensaje & Hola mundo;
}
}
3a im2)ementaci=n +e 1ec)aration 2re0 esta 2osi6i)i+a+ ofrece un atri6uto5 ))ama+o
initialValue5 2ara -uar+ar +ic!a e:2resi=n" initialValue es +e ti2o #*$5 as que a+mite
cua)quier ti2o +e #*$ que se est uti)i%an+o 2ara re2resentar )as e:2resiones"
initialValue 2osee mto+os -et set5 2ue+e ser nu))"
4tros campos
3a maora +e )as +ec)araciones ser.n crea+as a 2artir +e un no+o #*$" #+iciona)mente a )os
cam2os a mostra+os5 )as +ec)araciones ofrecen un cam2o ))ama+o ast en e) que se 2ue+e
-uar+ar una referencia a +ic!o #*$5 +e manera que est +is2oni6)e en caso +e necesi+a+" ast es
+e ti2o #*$ 2osee mto+os -et set@ 2ue+e ser nu))"
>ina)mente5 Declaration im2)ementa )a interfa% antlraux.util.LexInfo5 as que ofrece )os
atri6utos filename5 line column !a6itua)es5 con sus res2ecti0os mto+os -et set5 as como
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 272
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.-6 !l sistema @m+itoI?eclaraci(nITipo
)os mto+os copyLexInfo(LexInfo) getLexInfoString"
-.3.+: l sistema de ti'os 9antlraux.context.ty'es.T;
3a )i6rera ant)rau: 2ro2orciona +i0ersas c)ases e interfaces 2ara tra6a4ar con )os ti2os +e un
)en-ua4e@ to+as e))as se encuentran en e) su62aquete antlraux.context.types"
Iden)i)icacin: la inter)a% antlrau-.conte-.t3pes.'3pe
$o+as )as c)ases e interfaces re)aciona+as con e) sistema +e ti2os en ant)rau: cum2)ir.n )a interfa%
antlraux.context.types.Type" 9ara cum2)ir esta interfa% 6asta con im2)ementar )os mto+os
-et set +e )os i+entifica+ores !a6itua)es5 es +ecir5 un nom6re (una ca+ena ))ama+a name) una
etiqueta(un entero ))ama+o tag)" Es +ecir5 que como a !a6amos a+0erti+o5 )a 2are4a
i+entifica+ora jnom6re5etiquetaV 0ue)0e a uti)i%arse"
E) sistema +e ti2os ofrece una c)ase5 ))ama+a CommonType5 que )o im2)ementa5 uti)i%an+o una
ca+ena (String) un entero" Esta c)ase se ofrece 2or como+i+a+@ )os ti2os 2ue+en !ere+arse +e
CommonType o im2)ementar e))os mismos )a interfa% Type"
4tras inter)aces 3 clases interesantes del sistema de tipos
#+em.s +e )a interfa% Type5 e) sistema +e ti2os ofrece otras interfaces 2ara mo+e)ar )os ti2os@
to+as e))as !ere+an +e Type5 ca+a una tiene uti)i+a+es concretasF
X antlraux.types.ModifiedTypeF 9ermite aCa+ir Dmo+ifica+oresE (como 2u6)ic5 2ri0ate o
static) a un ti2o" 9ara e))o ofrece )os mto+os addModifier(String) boolean
hasModifier(String)" ;frece otros 2ara recorrer to+a )a )ista +e mo+ifica+ores +e un ti2o5
2ero estos +os son )os 2rinci2a)es"
X antlraux.types.HeritableTypeF *ir0e 2ara mo+e)ar )a re)aci=n ti2oAsu2erti2o com?nmente
))ama+a Dis#E (es/n)" E) ?nico mto+o +e esta c)ase es e) mto+o boolean isA
(HeritableType)"
X antlraux.types.SimpleInheritanceTypeF Iere+a +e HeritableType" Bo+e)a )os ti2os
con !erencia sim2)e5 es +ecir5 aque))os ti2os que so)amente 2ue+en tener una su2erc)ase5 como
en 4a0a" *us mto+os son getSuperType() setSuperType(SimpleInheritanceType)"
X antlraux.types.ScopedTypeF Bo+e)a )os ti2os que tienen un .m6ito (una instancia +e
ant)rau:"conte:t"*co2e) como )os ti2os +e )as c)ases mto+os (que e:2on+remos en )os
si-uentes su6a2arta+os)" 3os mto+os +e esta interfa% son Scope getScope() setScope
(Scope)"
X antlraux.types.ClassMemberTypeF Bo+e)a ti2os es2ecia)es que se encuentran +entro +e
una c)ase" B.s en e) si-uiente su6 a2arta+o"
Estas interfaces est.n 2ensa+as 2ara +otar +e cierta !omo-enei+a+ a) sistema +e ti2os@ so)amente
!e inc)u+o en ant)rau: )as que me !an !ec!o fa)ta 2ara mo+e)ar e) )en-ua4e 3e3i@ 2ara ser
0er+a+eramente -enricos !a6ra que intro+ucir muc!as m.s interfaces5 2ero !a6r. que arre-)arse
con )o que !a"
9or como+i+a+ !e intro+uci+o a)-unas c)ases au:i)iares5 que im2)ementan a)-unos +e stos
interfacesF
X antlraux.types.CommonType im2)ementa5 como a !emos +ic!o5 )a interfa% Type"
X antlraux.types.DeclaredType es una su6c)ase +e CommonType que im2)ementa )a interfa%
ModifiedType5 +e manera que es un ti2o que a+mite nom6re5 etiqueta una )ista +e
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 27-
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.-6 !l sistema @m+itoI?eclaraci(nITipo
mo+ifica+ores (2?6)ico5 2ri0a+o5 etc)"
#+em.s +e estas +os c)ases ten+remos )a c)ase ClassType MethodType5 que 0eremos en )os
si-uientes a2arta+os"
3a 0arie+a+ +e ti2os en )os )en-ua4es +e 2ro-ramaci=n es mu am2)ia5 )os ti2os
ofreci+os en e) 2aquete antlraux.context.types.* son sim2)emente e4emplos"
>recuentemente no 6astar.n 2ara mo+e)ar )os ti2os +e un )en-ua4e5 ser. necesario
crear nue0as c)ases"
9or ?)timo5 2resentar )a e:ce2ci=n antlraux.types.TypeException" Esta su6c)ase +e
antlraux.ContextException ser0ir. 2ara mo+e)ar )os errores ocurri+os en e) sistema +e ti2os"
'ipos NespecialesO
3os 2ro-rama+ores so)emos tener un conce2to 6astante intuiti0o +e )o que es un Dti2oE"
,ntuiti0amente sa6emos que )os ti2os est.n 2resentes en +os sitiosF
X ca+a e:2resi=n ( ca+a una +e sus su6e:2resiones) tiene un ti2o"
X *e 2ue+en D+ec)ararE nue0os e)ementos en un .m6ito@ 2ara eso est.n )as instrucciones +e
+ec)araci=n )as +ec)araciones +e .m6itos" 9or e4em2)oF
mtodo miMtodo(Entero a) // Declara el parmetro a
{
Entero b = a + 1; // Declara la variable b
}
Estos ti2os son )os Dusua)esEF se uti)i%an en )as +ec)araciones que se rea)i%an +entro +e) .m6ito +e
un mto+o5 un 6uc)e o una instrucci=n con+iciona)" Es +ecir5 Dcaracteri%anE a 0aria6)es
2ar.metros +entro un mto+o" *on )os ti2os que se reconocen me+iante )a re-)a tipo +e nuestro
)en-ua4e (es +ecir5 Entero5 Booleano5 Objeto5 etc)
Esta conce2ci=n Dintuiti0aE +e )os ti2os 2ue+e ))e-ar a errores5 2orque confun+e un Dti2oE con
Dun ti2o +e) )en-ua4e +e) com2i)a+orE" 3a equi0ocaci=n est. 2ro0oca+a 2or e) !ec!o +e que )os
ti2os +e )as +ec)araciones que se insertan en e) .m6ito +e un mto+o Dcoinci+enE con )os ti2os +e)
)en-ua4e 3e3i"
E) esquema .m6ito^+ec)araci=n^ti2o no so)amente funciona a ni0e) +e mto+os" En otras 2a)a6ras5
3os 2ar.metros 0aria6)es no son )os ?nicos que 2ro0ocan )a inserci=n +e
+ec)araciones en un .m6ito" 3as clases tam6in son +ec)ara+as e inserta+as en un
.m6ito@ los mtodosB constructores atri"utos +e +ic!as c)ases tam6in son
+ec)araciones +entro +e un .m6ito requieren un ti2o"
3as +ec)araciones +e c)ases5 mto+os5 constructores atri6utos ten+r.n5 2or tanto5 sus 2ro2ios
Dti2osE5 que 2oco ten+r.n que 0er con )os Dti2os +e) )en-ua4eE"
Ramos a ana)i%ar ca+a uno +e estos +iferentes Dti2os es2ecia)esE"
+l tipo de un m2todo: antlrau-.conte-t.t3pes./et8od'3pe
En este su6a2arta+o 0amos a tratar +e reso)0er a)-unos interro-antes que -iran en torno a )os
mto+os5 a sa6erF
X OC=mo se inte-ran )os mto+os constructores +e una c)ase con e) sistema
.m6ito^+ec)araci=n^ti2oQ
X OC=mo mo+e)ar e) 2o)imorfismoQ
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 27)
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.-6 !l sistema @m+itoI?eclaraci(nITipo
X OCu.)es son )as restricciones +e inserci=n +e un mto+o o constructor en e) .m6ito +e una
c)aseQ Es +ecir5 Ocu.n+o se consi+erar. que un mto+o Dno se 2ue+e insertar en e) .m6ito +e
una c)aseEQ
8eso)0eremos aqu )as +os 2rimera cuestiones5 en e) si-uiente su6a2arta+o (com2ati6i)i+a+ +e
ti2os) )as tercera"
3os mto+os constructores +e una c)ase +e6en intro+ucirse en e) .m6ito +e una c)ase5 en forma
+e +ec)araciones5 +e forma 2areci+a a )os atri6utos" 9or )o tanto5 si somos ca2aces +e es2ecificar
c=mo ser.n )a instancias +e Declaration que mo+e)ar.n )as +ec)araciones +e )os mto+os
constructores !a6remos resue)to e) 2ro6)ema"
E) nom6re +e )as +ec)araciones ser. e) nom6re +e) mto+o 2ara )os mto+os5 )a ca+ena
DconstructorE 2ara )os constructores" Es +ecir5 si !a 0arios mto+os con e) mismo nom6re (se
usa e) 2o)imorfismo) ser.n inserta+os en )a misma )ista +e +ec)araciones@ +e )a misma forma5
to+os )os constructores ir.n inserta+os en una )ista ))ama+a DconstructorE" #s es como e)
2o)imorfismo tiene ca6i+a en e) sistema .m6ito^+ec)araci=n^ti2o"
3a etiqueta +e )as +ec)araciones tam6in ser. senci))aF RES_METODO 2ara )os mto+os
RES_CONSTRUCTOR 2ara )os constructores"
E) maor esco))o que encontraremos ser. mo+e)ar e) ti2o +e )as +ec)araciones" E) ti2o +e )a
+ec)araci=n +e6e ser0ir 2ara +iferenciar )os mto+os con e) mismo nom6re5 o )os +iferentes
constructores5 entre s
6&
"
3a manera estan+ari%a+a +e +iferenciar )os mto+os entre s5 cuan+o tienen e) mismo nom6re5 se
6asa en )a )ista +e 2ar.metrosF +os +ec)araciones +e mto+os son +iferentes si no tienen e) mismo
n?mero +e 2ar.metros5 o si +ic!os 2ar.metros no son to+os +e) mismo ti2o
66
"
E) ti2o que uti)i%aremos 2ara este menester estar. mo+e)a+o 2or )a c)ase
antlraux.context.types.MethodType" Es una su6c)ase +e 1ec)arate+$2e5 )ue-o a+mite
nom6re5 etiqueta una )ista +e mo+ifica+ores"
MethodType im2)ementa ScopedType5 as que se 2ue+e o6tener e) .m6ito +e) mto+o
re2resenta+o 2or e) ti2o"
;tro atri6uto esencia) +e MethodType es classType5 que es una referencia a) ti2o +e )a c)ase en
)a que se +efini= e) mto+o (0er )a c)ase ClassType en e) si-uiente su6a2arta+o)" MethodType
tiene mto+os -et set 2ara este atri6uto"
*in +u+a e) cam2o m.s im2ortante +e MethodType es params@ es una )ista en)a%a+a +e ti2os
(o64etos que cum2)en )a interfa% Type)" Est. 2rote-i+a5 2ero se 2ue+e acce+er en )ectura
uti)i%an+o e) mto+o Enumeration params()" #+em.s est.n )os mto+os addParam(Type)
clearParams() 2ara mo+ificar)a"
E) ?)timo atri6uto +e MethodType es e) ti2o +e retorno5 mo+e)a+o me+iante e) atri6uto
returnType5 que 2ue+e ser cua)quier o64eto que cum2)a )a interfa% Type" Este atri6uto tam6in
2ue+e ser acce+i+o con mto+os -et set"
MethodType cuenta con un constructor en e) que se 2ue+en es2ecificar etiqueta5 nom6re5 ti2o +e
retorno5 c)ase .m6ito +e) mto+oF
6& J no5 no 0a)e e) ti2o +e retorno +e ca+a mto+o 2ara eso" 3os ti2os +e )as +ec)araciones tienen que ser di&erenciadores"
66 Ca+a +os ti2os +e 2ar.metros5 a+em.s +e no ser i-ua)es5 tam2oco 2ue+en ser su6c)ases e) uno +e) otro@ aunque eso +e2en+e +e)
)en-ua4e"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 270
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.-6 !l sistema @m+itoI?eclaraci(nITipo
public MethodType( int tag, String Name, Type returnType,
ClassType classType, Scope s )
Reamos un e4em2)o" E) mto+o imprime +e )a c)ase Sistema (uno +e e))os) tiene )a si-uiente
+ec)araci=nF
clase Sistema
{
mtodo abstracto imprime(Cadena mensaje) {...}
}
*i uti)i%.ramos )a c)ase MethodType 2ara mo+e)ar e) ti2o +e este mto+o
6(
5 +e6eramos !acer )o
si-uienteF
// obtenemos el tipo de la clase Sistema
ClassType tipoSistema = ... ;
// obtenemos el mbito del mtodo imprime
MethodScope ms = ... ;
// Creamos el tipo de mtodo
MethodType mt =
new MethodType(RES_METODO, imprime, obtenerTipoVacio(), tipoSistema, ms);
// Aadimos el modificador abstracto al tipo
mt.addModifier(abstracto);
// Introducir mt en el mbito de tipoSistema
Declaration d = new Declaration(RES_METODO, imprime, mt);
((ClassScope)tipoSistema.getScope()).insertarDecMetodo(d);
"ompati7ilidad de m2todos
9or ?)timo5 seCa)ar una 2ro2ie+a+ im2ortante +e )os mto+osF +os ti2os +e mto+o 2ue+en ser
Dcom2ati6)esE" En ant)rau:5 +os mto+os son com2ati6)es siF
X tienen e) mismo nom6re5 o son )os +os constructores
X tienen e) mismo n?mero +e 2ar.metros
X ca+a 2ar.metro +e) 2rimer ti2o +e mto+o es com2ati6)e res2ecto a) 2aso +e 2ar.metros con
su equi0a)ente en e) otro ti2o +e mto+os"
Esto qui%.s 2ue+a enten+erse me4or con c=+i-o" MethodType ofrece e) si-uiente mto+oF
public boolean compatibleWith(MethodType other)
Este mto+o +e0ue)0e true si s=)o siF
X E) mto+o actua) tiene e) mismo nom6re que other"
X 3as )istas +e 2ar.metros +e )os +os mto+os son com2ati6)es"
9ara com2ro6ar si )as +os )istas +e 2ar.metros son com2ati6)es5 se uti)i%a e) mto+o
public boolean compatibleParamsLists(MethodType other)
Este mto+o +e0ue)0e true si s=)o siF
X 3as )istas +e 2ar.metros +e am6os mto+os tienen e) mismo n?mero +e 2ar.metros"
6( B.s tar+e 0eremos que )o que uti)i%aremos ser. una su6c)ase +e Bet!o+$2e5 2ero 2or a!ora nos 6asta con e))a"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 27,
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.-6 !l sistema @m+itoI?eclaraci(nITipo
X 3os 2ar.metros son com2ati6)es +os a +os"
1iremos que +os 2ar.metros myType hisType son com2ati6)es en )os mto+os cuan+o )a
))ama+a a) si-uiente mto+o +e0ue)0a trueF
public boolean compatibleParams(Type myType, Type hisType)
{
if( myType instanceof HeritableType &&
hisType instanceof HeritableType )
{
if ( ((HeritableType)hisType).isA((HeritableType)myType) )
return true;
}
else if( hisType.equals(myType)
|| myType.equals(hisType) )
return true;
return false;
}
3os tres mto+os +escritos (compatibleWith5 compatibleParamsList compatibleParams)
son 2?6)icos5 +e manera que 2ue+en ser uti)i%a+os 2or cua)quier c)ase 2or su2uesto reescritos
2or su6c)ases +e MethodType"
#+em.s +e estos tres mto+os5 e:iste una 0ersi=n am2)ia+a +e compatibleWith5 que inc)ue tres
6oo)eanos 2ara com2arar )a )ista +e mo+ifica+ores5 e) ti2o +e retorno e) nom6re" *u 2rototi2o
es e) si-uienteF
public boolean compatibleWith( MethodType other,
boolean compareName,
boolean compareReturnType,
boolean compareModifiers )
/na 0e% e:2uesta )a com2ati6i)i+a+ +e ti2os +e mto+os5 que+a un interro-ante 2or reso)0erF
O2ara qu sir0eQ"
Es senci))oF )a com2ati6i)i+a+ +e 2ar.metros 2ermite reso)0er +os situacionesF
X *a6er a qu mto+o est. ))aman+o una ))ama+a (uti)i%an+o )a )ista +e 2ar.metros +e )a ))ama+a)
X ,m2e+ir que e) mismo mto+o sea intro+uci+o 0arias 0eces en una c)ase"
J es que )a re-)a 2ara 2o+er insertar un ti2o +e mto+o en e) .m6ito +e una c)ase es )a si-uienteF
/n mto+o o constructor no +e6e 2o+er insertarse en una c)ase si en +ic!a c)ase a
!a otro que es com2ati6)e con )"
3a c)ase leli.scopes.ClassScope5 +e )a que !emos !a6)a+o anteriormente5 tiene en cuenta
este !ec!o5 )an%an+o una e:ce2ci=n cuan+o sea necesario"
Bet!o+$2e se uti)i%ar. 2ara mo+e)ar e) ti2o +e )os mto+os Dnorma)esE5 )os
a6stractos )os constructores (cam6ian+o etiqueta ti2o +e retorno)"
+l tipo de un atri7uto: antlrau-.conte-t.t3pes.Attri7ute'3pe
#) i-ua) que )os mto+os5 )os atri6utos tam6in son D+ec)ara+osE5 as que necesitan +e un ti2o
con e) que Di+entificarseE +entro +e su .m6ito"
En un 2rinci2io 2o+ra 2arecer que 2ara este 2ro2=sito nos 6asta con e) ti2o con e) que es
+ec)ara+o e) atri6utoF si es un atri6uto Entero5 uti)i%amos e) ti2o Entero@ si es Cadena5 e) ti2o
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 277
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.-6 !l sistema @m+itoI?eclaraci(nITipo
Cadena5 etc"
*in em6ar-o esto no es suficiente 2or una serie +e ra%onesF
X 1a+o un ti2o +e 2ar.metro5 +e6emos 2o+er sa6er a qu c)ase corres2on+e
X 1a+o un ti2o +e 2ar.metro5 +e6emos 2o+er sa6er si es un mto+o a6stracto o no
X $am6in +e6emos sa6er con qu ti2o fue +ec)ara+o e) atri6uto (Entero5 Cadena5 etc)
En otras 2a)a6ras5 necesitamos un ti2o que im2)emente )as interfaces ClassMember
ModifiedType" #+em.s necesitar. un atri6uto en e) que -uar+ar e) ti2o con e) que se +ec)ar=5
con sus mto+os -et set"
Esta c)ase e:iste se ))ama antlraux.context.types.AttributeType (n=tese que es
D#ttri6uteE5 no D#ttri6utedE)" #) ser una su6c)ase +e DeclaratedType5 im2)ementa
autom.ticamente )as interfaces Type ModifiedType" #+em.s im2)ementa )a interfa%
ClassMember (setClassType getClassType)"
9or ?)timo5 AttributeType contiene un atri6uto +e ti2o Type ))ama+o type5 con mto+os -et
set5 con e) que mo+e)ar e) ti2o +ec)ara+o +e) atri6uto"
AttributeType tiene un constructor en e) que se +efinen to+as sus 2ro2ie+a+es e:ce2to )os
mo+ifica+ores5 que se tienen que aCa+ir uti)i%an+o e) mto+o addModifier" E) 2rototi2o +e)
constructor +e )a c)ase esF
public AttributeType( int tag, String name, Type type, ClassType classType )
Reamos un e4em2)o" *u2on-amos e) si-uiente atri6uto a6stractoF
clase Persona
{
atributo abstracto Entero mayoriaEdad = 18;
}
Cuan+o se recono%ca ese c=+i-o 3e3i se e4ecutar. un c=+i-o 4a0a equi0a)ente a) si-uienteF
// Obtener el tipo de la clase Persona
ClassType tipoPersona = ... ;
// Crear el tipo del atributo
AttributeType at = new AttributeType( RES_ATRIBUTO, mayoriaEdad,
obtenerTipoEntero(), tipoPersona );
// Aadir modificador abstracto
at.addModifier(abstracto);
// Insertar el atributo en el mbito de tipoPersona
Declaration d = new Declaration( RES_ATRIBUTO, mayoriaEdad, at);
((ClassScope)tipoPersona.getScope()).insertarDecAtributo(d);
+l tipo de una clase: antlrau-.conte-t.t3pes."lass'3pe
1e i-ua) manera que )os mto+os 2ue+en insertarse en e) .m6ito +e una c)ase5 )as 2ro2ias c)ases
se insertan en e) .m6ito -)o6a)" Esto )an%a 0arios interro-antesF
X OC=mo re)acionar )as 2ro2ias c)ases con e) sistema .m6ito^+ec)araci=n^ti2oQ
X OC=mo mo+e)ar )os mto+os atri6utos a6stractosQ
X OC=mo mo+e)ar )a !erenciaQ
Comencemos con )a inte-raci=n con .m6ito^+ec)araci=n^ti2o"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 27/
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.-6 !l sistema @m+itoI?eclaraci(nITipo
8eso)0eremos e) 2ro6)ema +e )a inte-raci=n +e una manera simi)ar a )a que !emos em2)ea+o en e)
caso +e )os mto+osF uti)i%aremos una c)ase es2ecia) 2ara mo+e)ar )os ti2os +e )as c)asesF
antlraux.context.types.ClassType"
ClassType es una su6c)ase +e DeclaredType5 2or )o que im2)ementa ModifiedType" #+em.s
im2)ementa )as interfaces SimpleInheritanceType ScopedType" #) im2)ementar e) 2rimero
reso)0emos e) 2ro6)ema +e mo+e)ar )a !erencia (recor+emos que 3e3i es un )en-ua4e en e) que se
uti)i%a )a !erencia sim2)e)" #) im2)ementar e) se-un+o conse-uimos -estionar f.ci)mente )os
constructores5 atri6utos mto+os5 que se -uar+an en )a instancia +e Scope que )a c)ase
mantiene"
3a c)ase ClassScope tiene un ?nico constructor en e) que se es2ecifica )a etiqueta5 nom6re5
su2erc)ase .m6itoF
public ClassType( int tag, String typeName, ClassType superType, Scope s )
#+em.s +e )os mto+os +e )as +iferentes interfaces que im2)ementa5 ClassType tiene tres
mto+osF
public Declaration searchCompatibleMethod( int methodTag, MethodType mt)
*ir0e 2ara D6uscarE un mto+o com2ati6)e con mt (se 2ue+e uti)i%ar 2ara 6uscar e) mto+o que se
est. in0ocan+o en una ))ama+a)
public void addSuperClassMethods(int methodTag) throws ContextException
1a+a una c)ase # con una su2erC)ase G5 este mto+o inserta en # )os mto+os +e G Dque +e6a
insertarE" Es +ecir5 inserta en # )os mto+os +e G que no sean com2ati6)es con nin-uno +e )os
e:istentes en #" E) mto+o 2resu2one que to+as )as +ec)araciones +e mto+os en )os .m6itos +e
# G tienen )a misma etiqueta (methodTag)
public void addSuperClassAttributes(int attributesTag) throws ContextException
*imi)ar a) mto+o anterior5 2ero uti)i%a+o 2ara )os atri6utos en )u-ar +e 2ara )os mto+os"
3os +os ?)timos mto+os +e ClassType au+an a mane4ar )a !erencia"
-.3.-: AB>s es'eciali8ados
En este a2arta+o 2resentaremos otros #*$s 2ro2orciona+os 2or ant)rau: que son +e muc!a
au+a +urante e) an.)isis sint.ctico" *on tresF ScopeAST5 TypeAST ExpressionAST" 3os tres
forman e) 2aquete antlraux.context.asts.*"
antlrau-.conte-t.asts.ScopeAS'
3a i+ea +e este #*$ es mu senci))aF es una su6c)ase +e antlr.LexInfoAST (2resenta+a en )a
secci=n ("1"3) 2ero con )as mo+ificaciones necesarias 2ara 2o+er -uar+ar una referencia a una
instancia +e antlraux.context.Scope" Es +ecir5 es un #*$ que -uar+a informaci=n +e un
.m6ito"
Esta c)ase es mu ?ti) si5 como en e) caso +e nuestro com2i)a+or5 se +esea rea)i%ar una
com2ro6aci=n +e ti2os en +os 2asa+as (0er a2arta+o ("&"1 en )a 2.-ina '9')"
3a im2)ementaci=n +e ScopeAST es tan senci))a como 2areceF se !ere+an to+os )os mto+os +e
CommonAST5 so)amente que+a aCa+ir un atri6uto +e ti2o Scope (con sus res2ecti0os mto+os
-et set)" #+em.s5 se !a so6reescrito un mto+os +e inicia)i%aci=n (initialize(AST)) se !a
mo+ifica+o e) mto+o toString() 2ara que a2are%ca informaci=n +e) .m6ito"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 27<
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.-6 !l sistema @m+itoI?eclaraci(nITipo
antlrau-.conte-t.asts.'3peAS'
Este #*$ tam6in re2resenta un conce2to mu senci))oF es un #*$ con una instancia +e Type
(una instancia +e a)-una c)ase que im2)emente )a interfa% antlraux.context.types.Type)"
TypeAST es mu 2areci+a a ScopeASTF una su6c)ase +e LexInfoAST5 a )a que aCa+e un atri6uto5
aunque esta 0e% +e ti2o Type (con mto+os -et set)" $am6in mo+ifica initialize(AST)
toString()"
En )a re-)a tipo +e nuestros ana)i%a+ores sem.nticos uti)i%aremos TypeAST 2ara -uar+ar e) ti2o
+e 3e3i a) que se refiere ca+a o2ci=n +e )a re-)aF
tipo
{ Type t = null; }
: ( TIPO_ENTERO { t = obtenerTipoEntero(); }
| TIPO_REAL { t = obtenerTipoReal(); }
...
)
{
+ype*S+ ast & neH +ype*S+(..);
ast.set@<p+ype(t);
.. & ast;
}
;

#s es m.s eficiente o6tener e) ti2o +e 3e3i a 2artir +e )a re-)a tipo"
7=tese que en e) c=+i-o no se !a 2o+i+o escri6ir ast"set$2e(t) K setType es un mto+o +e )a
interfa% #*$ que no 2o+emos uti)i%ar 2ara )os ti2os +e) )en-ua4e (otra consecuencia +e una
nomenc)atura +emasia+o -enrica@ +e6era ))amarse Dta-E) as que !emos usa+o )a nomenc)atura
setExpType getExpType"
antlrau-.conte-t.+-pressionAS'
Es e) ti2o +e #*$ que +e6eremos uti)i%ar en )as e:2resiones +e) )en-ua4e" Es una su6c)ase +e
TypeAST5 as que autom.ticamente !ere+a +e ) )a ca2aci+a+ +e -uar+ar un ti2o +e 3e3i
(setExpType getExpType)" #+em.s aCa+e )os si-uientes atri6utosF
X boolean RValueF *i una e:2resi=n tiene 80a)ue a fa)se5 no 2o+r. ser uti)i%a+a en )a 2arte
+erec!a +e una asi-naci=n (m.s informaci=n so6re 80a)ue en )a 2.-ina '48)"
X boolean LValueF *i una e:2resi=n no tiene 3Ra)ue5 no 2o+r. ser uti)i%a+a en )a 2arte
i-Fuierda +e una asi-naci=n (m.s informaci=n so6re 30a)ue en )a 2.-ina '48)
X Object EValueF *ir0e 2ara -uar+ar un 0a)or que 2ue+a ca)cu)arse en tiem2o +e com2i)aci=n
(2or e4em2)o5 inicia)i%aci=n +e constantes)" $am6in 2ermite -uar+ar 0a)ores +e e:2resiones en
)en-ua4es inter2reta+os"
3os tres atri6utos anteriores tienen5 a) i-ua) que expType5 mto+os -et set corres2on+ientes"
ExpressionAST tambin sobreescribe el mtodo initialize(AST) y toString().
&otas so7re los r7oles
$o+os )os ti2os +e #*$ que !emos 2resenta+o en este a2arta+o tienen +os caractersticas
im2ortantes a +estacarF inicia)i%aciones 0oraces un to*trin- mane4a6)e"
1ecimos que *co2e#*$5 $2e#*$ E:2ression#*$ tienen Dinicia)i%aciones 0oracesE 2orque su
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2/
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.-6 !l sistema @m+itoI?eclaraci(nITipo
mto+o initia)i%e(#*$) no se )imita a co2iar e) ti2o te:to +e) #*$ que )e 2asanF a+em.s co2ia
su !i4o !ermano5 caractersticas a+iciona)es si e) #*$ es +e cierto ti2o" 9or e4em2)o5 e)
mto+o initia)i%e(#*$) +e ExpressionAST es e) si-uienteF
public void initialize(AST ast)
{
// Copiar tipo, texto e informacin lxica
super.initialize(ast);
// Copiar hijo y hermano
setFirstChild(ast.getFirstChild());
setNextSibling(ast.getNextSibling());
// Copiar datos adicionales si es un ExpressionAST
if(ast instanceof ExpressionAST)
{
ExpressionAST aux = (ExpressionAST)ast;
this.expType = aux.expType;
this.RValue = aux.RValue;
this.LValue = aux.LValue;
this.EValue = aux.EValue;
}
}
E) constructor que toma un #*$ ))ama a initialize(AST) internamente5 as que )os
constructores +e )as tres c)ases tam6in son D0oracesE"
3a ra%=n +e co2iar e) !i4o e) !ermano es que norma)mente estos #*$s ser.n uti)i%a+os 2ara
Dreem2)a%arE a) ast -enera+o 2or una re-)a 5 es +ecir5 a D##E" Rer como e4em2)o e) c=+i-o +e )a
2.-ina anterior"
1ecimos que )os tres ofrecen un mto+o toString Dmane4a6)eE 2orque uti)i%an )a misma
estrate-ia que LexInfoAST 2ara 2resentar informaci=n a+iciona)F 2or +efecto no 2resentan
informaci=n a)-una5 2ero 2ue+en 2resentar)a acti0.n+o)a con e) mto+o est.tico
setVerboseStringConversion(boolean)" 9or +efecto no se 2resentar. muc!a informaci=n@
+a+o que toString es e) mto+o que se uti)i%a en )as 0entanas ASTFrame5 2o+emos 0er
-r.ficamente )a me4ora" # continuaci=n mostramos una ASTFrame mostran+o un D!o)a mun+oE
+e 3e3i5 con to+a )a informaci=n a+iciona) +esacti0a+aF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2/1
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.-6 !l sistema @m+itoI?eclaraci(nITipo
Ilustracin 7.. /01s sin mostrar in&ormacin
adicional
*in em6ar-o o6sr0ese )o que ocurre si aCa+imos )as si-uientes )neas a leli.ToolF
BaseAST.setVerboseStringConversion(
true, LeLiParser._tokenNames);
LexInfoAST.setVerboseStringConversion(true);
ScopeAST.setVerboseStringConversion(true);
TypeAST.setVerboseStringConversion(true);
ExpressionAST.setVerboseStringConversion(true);
Entonces o6ten+remos esta otra 0entanaF
Ilustracin 7.7 /01s con in&ormacin adicional mostrada
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2/2
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.-6 !l sistema @m+itoI?eclaraci(nITipo
Es 2osi6)e +esacti0ar )a informaci=n +e LexInfoAST5 2ara no tener un e:ceso +e informaci=n"
-.3..: Resumen
En estas +os secciones !emos +escrito e) 2aquete ant)rau:"conte:t su su62aquete
antlraux.contex.types" En concreto !emos +efini+o )os si-uientes 2aquetes5 c)ases e
interfacesF
Ilustracin 7.9 EsFuema de paFuetes de antlraux.context
3as c)ases e interfaces m.s im2ortantes a2arecen som6rea+asF son Scope5 Declaration5 Type5
ClassType5 MethodType5 AttributeType )os asts5 ScopeAST5 ExpressionAST TypeAST"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2/-
antlraux
ContextException
context
Declaration
Scope
Context
types ...
CommonType
DeclaredType
Ty'e
Class-e."erTy'e
/erita"leTy'e
-odifiedTy'e
Sco'edTy'e
Si.'leIn0eritanceTy'e
ClassType
MethodType
TytpeAST
ExpressionAST
ScopeAST
asts
AttributeType
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.)6 A?T y LeLi
Becci%n -.": A6> y LeLi
-.".1: /ntroducci%n
En esta secci=n 0eremos c=mo !emos uti)i%a+o )as c)ases e interfaces 2ro2orciona+as 2or
ant)rau:"conte:t 2ara im2)ementar e) sistema #1$ en 3e3i" Esta secci=n se-uir. tenien+o un
esti)o 6astante Dte=ricoE5 6asa+o en +efiniciones@ mis +iscu)2as"
En )a si-uiente secci=n retomaremos e) enfoque Dtutoria)E"
-.".2: Las declaraciones en LeLi
Declaration es una Dc)aseAestructuraEF carece +e mto+os im2ortantes5 sim2)emente es una
a-ru2aci=n +e +atos" *u 2rinci2a) funci=n es ser mane4a+a 2or un .m6ito (una instancia +e )a
c)ase antlraux.contex.Scope)"
Declaration 2osee un constructor D6.sicoE5 que so)amente re))ena e) nom6re5 e) ti2o )a
etiqueta5 +e4an+o e) resto +e )os cam2os con 0a)ores 2or +efecto (nu))5 A1)" 0arios De:ten+i+osE5
que re))enan to+os )os atri6utos"
En 3e3i Declaration se uti)i%ar. Dta) cua)EF no se im2)ementar.n su6c)ases +e Declaration"
3as +u2)as i+entifica+oras jetiqueta5 nom6reV +e )as +ec)araciones en 3e3i ser.n )as si-uientesF
X <TIPO_ENTERO, Entero> 9ara e) ti2o 6.sico Entero"
X <TIPO_REAL, Real> 9ara e) ti2o 6.sico Real"
X <TIPO_BOOLEANO, Booleano> 9ara e) ti2o 6.sico Booleano"
X <TIPO_CADENA, Cadena> 9ara e) ti2o 6.sico Cadena"
X <RES_CLASE, nombreClase> 9ara cua)quier otra c)ase +efini+a en 3e3i (inc)uen+o )as
c)ases Objeto Sistema)
X <TIPO_VACIO, vaco> 9ara e) ti2o 0aco"
X <TIPO_ERROR, error> 9ara e) ti2o error"
-.".3: Los (mbitos en LeLi
Algunas restricciones
3a c)ase Scope 2ermite mo+e)ar muc!as situaciones que 2o+emos encontrarnos a) tra6a4ar con
.m6itos5 2orque es mu f)e:i6)eF i-nora com2)etamente )as etiquetas nom6res +e )as
+ec)araciones otros .m6itos" /na instancia +e *co2e ace2ta )a inserci=n +e cua)quier
+ec)araci=n5 se )e 2ue+e asi-nar cua)quier otra instancia +e *co2e como 2a+re5 sin que se !a-a
com2ro6aci=n a)-una" Esta actitu+5 necesaria 2ara 2ro0eer +e un esque)eto suficientemente
f)e:i6)e que se 2ue+a uti)i%ar en e) maor n?mero +e casos 2osi6)e5 2ue+e resu)tar +emasia+o
2ermisi0a en a)-unas situaciones"
En 3e3i5 2or e4em2)o5 !a ciertas situaciones que +e6en e0itarseF
X E) .m6ito -)o6a) no +e6e tener nin-?n .m6ito 2a+re to+as )as +ec)araciones que se )e inserten
+e6en ser +e etiqueta RES_CLASE" 3os nom6res +e +ic!as +ec)araciones no +e6en coinci+ir"
X En e) .m6ito +e una c)ase so)amente 2ue+en insertarse mto+os5 atri6utos constructores5 o )o
que es )o mismo5 +ec)araciones +e etiqueta RES_METODO5 RES_CONSTRUCTOR RES_ATRIBUTO"
3os .m6itos !i4os +e) .m6ito +e6en ser o6)i-atoriamente .m6itos +e mto+os o constructores"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2/)
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.)6 A?T y LeLi
#+em.s5 e) .m6ito +e una c)ase no +e6e ace2tar )a inserci=n +e cua)quier mto+o o
constructor@ e:isten re-)as concretas +e ace2taci=n5 que 0eremos m.s a+e)ante"
X E) .m6ito +e un mto+o o constructor a+mitir. )a inserci=n +e 2ar.metros o 0aria6)es"
*o)amente 2o+r.n !acerse !i4os +e e))os )os .m6itos +e 6uc)es o +e con+iciona)es"
X 1entro +e )os .m6itos +e 6uc)es o +e instrucciones con+iciona)es so)amente 2o+r.n
instanciarse 0aria6)es5 so)amente 2o+r.n ani+arse nue0os .m6itos +e 6uc)es o instrucciones"
$a clase antlrau-.conte-t."onte-t
Esta c)ase e:iste 2ara faci)itar e) tra6a4o con )os .m6itos 2ara automati%ar ciertas tareas +e
mane4o +e .m6itos (como mantener un D.m6ito actua)E rea)i%ar com2ro6aciones a) a6rir
cerrar +ic!o .m6ito)" Con )os mto+os a+ecua+os5 una su6c)ase +e Context 2ue+e !acer +e
Dfac!a+aE entre e) sistema #1$ )os ana)i%a+ores"
/na su6c)ase +e Context5 LeLiContext5 ser. uti)i%a+a a6un+antemente en e) an.)isis
sem.ntico"
Etili%acin de Scope 3 "onte-t
3a estrate-ia e)e-i+a 2ara im2)ementar )os .m6itos 2o+ra resumirse en una 2a)a6raF !erencia" *e
centra concretamente en e4es +e acci=nF
X 9ara contro)ar )as 2ecu)iari+a+es +e ca+a ti2o +e .m6ito uti)i%aremos +i0ersas su6c)ases +e
antlraux.context.Scope" Estas c)ases ser.n D+e2en+ientes +e) )en-ua4e 3e3iE5 2or )o que
no estar.n inc)ui+as en antlraux5 sino en leli" Concretamente +entro +e un su62aquete
))ama+o leli.scopes" 3os nom6res +e estas c)ases ser.n MlobalScope5 :lassScope5
BetAodScope e InternScope5 contro)ar.n )a inserci=n +e +ec)araciones me+iante mto+os
es2ecia)i%a+os@ 2or e4em2)o5 ClassScope tiene un mto+o 2ara insertar +ec)araciones +e
mto+os ))ama+o insertDecMetodo5 en e) que se rea)i%an to+as )as com2ro6aciones necesarias
antes +e insertar)o"
X #+em.s5 en e) 2aquete leli encontraremos una su6c)ase +e antlraux.context.Context5
))ama+a leli.LeLiContext" Esta c)ase ten+r. 0arias funciones@ 2or un )a+o ser. )a encar-a+a
+e mantener e) D.m6ito actua)E5 es +ecir5 e) .m6ito que est acti0o en ca+a momento" 9or otro
)a+o !ar. +e Dfac!a+aE entre )os ana)i%a+ores sem.nticos to+os )os .m6itos (instancias +e
*co2e o a)-una +e sus su6c)ases) 2ara sim2)ificar e) uso +e )os .m6itos@ 2or e4em2)o5 contar.
con un mto+o insertDecMetodo que Dcastear.E e) .m6ito actua) a ClassScope e in0ocar. e)
mto+o ClassScope.insertDecMetodo" 1e esta manera )os ana)i%a+ores sem.nticos
sim2)emente ten+r.n que !acer uso +e )a c)ase 3e3iConte:t 2ara mane4ar to+os )os as2ectos +e
)os .m6itos"
$n-ase en cuenta que e) se-un+o 2aso no es estrictamente necesarioF es 2osi6)e mane4ar
+irectamente )as +iferentes instancias +e Scope sin tener que uti)i%ar una c)ase interme+ia5 2ero e)
c=+i-o sera m.s i)e-i6)e menos manteni6)e +e esa forma"
3as +u2)as jetiqueta5 nom6reV +e )os .m6itos en 3e3i ser.nF
En e) caso concreto +e 3e3i5 )a +u2)a jnom6re5 etiquetaV ser.F
X jD.m6ito -)o6a)E5 PROGRAMAV 2ara e) .m6ito -)o6a) (?nica instancia +e
leli.scopes.GlobalScope)"
X jDc)ase nom6reC)aseE5 RES_CLASEV 2ara e) .m6ito +e )a c)ase ))ama+a Dnom6reC)aseE (que es
+e) ti2o leli.scopes.ClassScope)"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2/0
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.)6 A?T y LeLi
X jDmto+o nom6reBto+oE5 RES_METODOV 2ara e) .mtito +e) mto+o ))ama+o
Dnom6reBto+oE (instancias +e leli.scopes.MethodScope)"
X jDconstructorE5 RES_CONSTRUCTORV 2ara cua)quier constructor (tam6in se uti)i%ar. aqu )a
c)ase leli.scopes.MethodScope)"
X jDcon+iciona)E5 RES_SIV 2ara cua)quier a)ternati0a +e una instrucci=n con+iciona)5 inc)uen+o
)a 2rimera ()e)i"sco2es",ntern*co2e)"
X jD6uc)e mientrasE5 RES_MIENTRASV 2ara e) cuer2o +e un 6uc)e mientras
(leli.scopes.InternScope)"
X jD6uc)e !acerAmientrasE5 RES_HACERV 2ara e) cuer2o +e un 6uc)e hacer-mientras
(leli.scopes.InternScope)"
X jD6uc)e +es+eE5 RES_DESDEV 2ara e) cuer2o +e un 6uc)e desde
(leli.scopes.InternScope)"
-.".": l sistema de ti'os de LeLi
'ratamiento de errores semnticos 3 el 'ipo +rror
Comencemos con una sim2)e 2re-un+aF OPu ocurre cuan+o se +etecta un errorQ
Consi+eremos e) si-uiente e4em2)oF
mtodo errorSemntico(Entero ent1)
{
Sistema.imprime(en1);
}
En e) e4em2)o5 2resuntamente e) 2ro-rama+or !a queri+o iniciar )a 0aria6)e )oca) en2 con e) 0a)or
+e) 2ar.metro ent1" *in em6ar-o se !a equi0oca+o a) escri6ir)o (fa)ta una t) +e manera que se
-enera un error sem.ntico5 2or uti)i%ar en una e:2resi=n un i+entifica+or no +ec)ara+o (en1)"
Est. c)aro que e) com2i)a+or +e6er. anunciar que !a encontra+o un error sem.ntico c)aramente"
9ero )o interesante es )o que +e6e !acer +es2us" /na +e )as o2ciones sera emitir un mensa4e +e
error cance)ar )a creaci=n +e) #*$5 2ero aca6amos +e +ecir que !a que no 2o+emos D2ararEF
+e6emos construir un nue0o #*$ uti)i%an+o )a informaci=n +e conte:to5 aunFue existan errores"
9ero cuan+o se +a un error sem.ntico como e) +e) e4em2)o5 Oqu informaci=n sem.ntica se 2ue+e
uti)i%arQ OPu 0a)or +e6emos +ar)e a )a e:2resi=n en1Q
3a 2re-unta no es qu valor" Eso no tiene im2ortancia@ e) 0a)or es uti)i%a+o en tiem2o +e
e4ecuci=n5 como e) 2ro-rama !a teni+o un error no se -enerar. nin-?n e4ecuta6)e" 3o
im2ortante es qu tipo"
9ara mo+e)ar situaciones e:ce2ciona)es como )a 2resente )o i+ea) es contar con un ti2o es2ecia)5
con caractersticas es2ecia)es" Be esto refirien+o a) ti2o TIPO_ERROR"
TIPO_ERROR se +e6er. aCa+ir a )a secci=n +e toHens +e) ana)i%a+or como un toHen ima-inarioF
tokens
{
...
+ID8_@NN8N;
}
Este ti2o ser. e) asi-na+o a )as e:2resiones err=neas como )a anterior" #s5 e) an.)isis sem.ntico
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2/,
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.)6 A?T y LeLi
+iscurrir. +e )a si-uiente manera en e) an.)isis anteriorF
mtodo errorSemntico2(Entero ent1)
<
Recordar 1ue se 0a declarado el .2todo 3ac4o errorSe.5ntico2
No incluir 3aria"le de .2todo 6 es 3ac4o
Recordar 1ue se 0a decarado el 'ar5.etro Entero ent#
!
{
Entero ent2 = ent1;
<
Recordar 1ue se 0a declarado la 3aria"le ent2 Entera
,a e+'resi7n con la 1ue se inicia es de ti'o Entero
!
Sistema.imprime(en2);
<
Siste.a se reconoce co.o una clase reser3ada.
El .2todo i.'ri.e for.a 'arte de dic0a clase.
El identificador %en2& no es una e+'resi7n 35lida 6 no est5 declarado.
Infor.ar del error al usuario.
El ti'o de en2 ser5 TI8O_ERROR.
Continuar.
!
}
Ca+a 0e% que en una e:2resi=n TIPO_ERROR se )an%a un mensa4e +e error" 9or )o tanto5 )os
su6secuentes mensa4es +e error son reiterati0os" *i un 2ar.metro fue +ec)ara+o +e forma err=nea5
es uti)i%a+o m.s a+e)ante en una e:2resi=n5 no tiene senti+o anunciar que D)a suma no 2ue+e
rea)i%arse entre e) Entero TIPO_ERRORE5 2orque a se !a a0isa+o a) usuario +e un error 2re0io"
3os errores Dreiterati0osE como stos se +enominan Derrores en casca+aE"
9ara )os errores en casca+a 0amos a +otar a TIPO_ERROR +e a)-unas 2ro2ie+a+es interesantesF
X TIPO_ERROR es com2ati6)e con cua)quier otro ti2o res2ecto a cua)quier otro o2era+or5
inc)uen+o e) 2aso como 2ar.metro e) +e asi-naci=n"
X /na e:2resi=n con TIPO_ERROR 2ermite cua)quier acceso a un atri6uto ))ama+o +e cua)quier
manera (error.ident)" E) ti2o +e) acceso es tam6in TIPO_ERROR"
X TIPO_ERROR 2ermite cua)quier in0ocaci=n +e cua)quier mto+o con cua)quier ti2o +e
2ar.metros (error.mtodo(p1,p2,...))" E) ti2o +e )a e:2resi=n ser. tam6in TIPO_ERROR"
+l paAuete leli.t3pes
$o+as )as c)ases que ser.n uti)i%a+as 2ara mo+e)ar a)-?n ti2o en e) com2i)a+or +e 3e3i
(inc)uen+o e) ti2o error) estar.n +entro +e) 2aquete leli.types" $o+as e))as ser.n c)ases
+eri0a+as +e c)ases +e) 2aquete antlraux.context.types o im2)ementar.n a)-una interfa% +e
+ic!o 2aquete"
/odelado de los tipos NnormalesO de $e$i
3os ti2os Dnorma)esE +e 3e3i son aque))os ti2os que caracteri%an a una 0aria6)e5 un 2ar.metro o
un atri6uto en 3e3i" Esto inc)ue a )os ti2os 6.sicos +e 3e3i (Entero5 Booleano5 etc) a )os
ti2os +e 3e3i +efini+os 2or e) usuario" 3os ti2os norma)es ser.n mo+e)a+os uti)i%an+o )a c)ase
leli.types.6e6i+ype" csta es a su 0e% una su6c)ase +e antlraux.ClassType.
LeLiType es 6.sicamente )o mismo que ClassType5 sa)0o 2or a)-unos mto+os Den0o)torioE
($rapper) 2or su ca2aci+a+ +e uti)i%ar metac)ases (0er m.s a+e)ante)" $am6in conoce e)
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2/7
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.)6 A?T y LeLi
0oca6u)ario +e )os ana)i%a+ores +e 3e3i5 2orque im2)ementa
LeLiSymbolTreeParserVocabTokenTypes (que 0eremos en )a si-uiente secci=n)"
LeLiType ofrece +os constructores +iferentesF e) m.s sim2)e 2resu2one que )a etiqueta +e) nue0o
ti2o a -enerar es RES_CLASE5 mientras que e) se-un+o 2ermite es2ecificar uno +iferente"
public LeLiType( String name, LeLiType superType, Scope s,
LeLiMetaType metaClase )
public LeLiType( int tag, String name, LeLiType superType, Scope s,
LeLiMetaType metaClase )
3os +os 2ermiten +efinir e) nom6re5 su2erc)ase5 .m6ito metac)ase +e )as nue0as c)ases que se
+efinan" *i no se es2ecifica una etiqueta se asumir. )a etiqueta RES_CLASE"
Bestin de los tipos prede)inidos: $e$i'3pe/anager
3a manera usua) +e o6tener un ti2o estar. 6asa+a en 6uscar su +ec)araci=n en e) .m6ito -)o6a)5
uti)i%an+o su nom6re" Es +ecir5 si queremos o6tener e) ti2o re2resenta+o 2or )a ca+ena
D9ersonaE5 ten+remos queF
X ;6tener e) .m6ito ra%"
X Guscar una +ec)araci=n ))ama+a D9ersonaE
X ;6tener e) ti2o +e )a +ec)araci=n (con getType())
9ara o6tener D9ersonaE no ten+remos m.s reme+io que !acer)o +e esta forma5 2orque e) ti2o
9ersona so)amente se conocer. una 0e% comen%a+a )a com2i)aci=n" *in em6ar-o5 !acer )o mismo
con )os ti2os 2re+efini+os +e) sistema sera a)tamente ineficienteF t2icamente5 ten+remos que
6uscar DEnteroE5 D8ea)E o DCa+enaE un centenar +e 0eces5 2ara o6tener )a misma informaci=n"
En aras +e )a eficiencia se inc)u= )a c)ase leli.types.LeLiTypeManager5 que se encar-a +e
-uar+ar )os ti2os 6.sicos +e) )en-ua4e 3e3i en forma +e miem6ros est.ticos" E) c=+i-o com2)eto
+e LeLiTypeManager es e) si-uienteF
package leli.types;
import leli.LeLiSymbolTreeParserVocabTokenTypes;
public abstract class LeLiTypeManager
implements LeLiSymbolTreeParserVocabTokenTypes
{
public static LeLiType tipoError =
new LeLiType( TIPO_ERROR, "error", null, null,
new LeLiMetaType(TIPO_ERROR, "error", null) );
public static LeLiType tipoVacio =
new LeLiType( TIPO_VACIO, "vaco", tipoError, null,
new LeLiMetaType(TIPO_VACIO, "vaco", null) );
public static LeLiType tipoObjeto =
new LeLiType( RES_CLASE, "Objeto", tipoError, null,
new LeLiMetaType("Objeto") );
public static LeLiType tipoClase =
new LeLiType( METACLASE, "Clase", tipoObjeto, null, null);
public static LeLiType tipoEntero =
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2//
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.)6 A?T y LeLi
new LeLiType( TIPO_ENTERO, "Entero", tipoObjeto, null,
new LeLiMetaType("Entero"));
public static LeLiType tipoReal =
new LeLiType( TIPO_REAL, "Real", tipoEntero, null,
new LeLiMetaType("Real") );
public static LeLiType tipoBooleano =
new LeLiType( TIPO_BOOLEANO, "Booleano", tipoObjeto, null,
new LeLiMetaType("Booleano") );
public static LeLiType tipoCadena =
new LeLiType( TIPO_CADENA, "Cadena", tipoObjeto, null,
new LeLiMetaType("Cadena") );
}
E) c=+i-o comien%a +efinien+o e) ti2o error e) ti2o 0aco" 1es2us se +efinen e) ti2o Objeto
e) ti2o Clase (este ?)timo )o 0eremos en e) si-uiente su6 a2arta+o)" *e-ui+amente se +efinen e)
resto +e )os ti2os 6.sicos +e 3e3iF Entero5 Real5 Booleano Cadena" 7=tese que Objeto se
!ace su6 c)ase +e error@ esto !ace m.s f.ci) reconocer ))ama+as a mto+os que no !an si+o
+efini+os correctamente (que tienen a)-?n error en sus 2ar.metros)"
/na 0e% +efini+a LeLiTypeManager5 2ara tra6a4ar con e) ti2o Entero so)amente !a que escri6irF
LeLiType t = LeLiTypeManager.tipoEntero;
/etaclases
9ara reso)0er e) 2ro6)ema +e )os accesos a6stractos !e inc)u+o un nue0o ti2o +e c)ase ))ama+o
Dmetac)aseE"
/na +e metac)ase 2o+ra ser D)a re2resentaci=n +e una c)ase me+iante una instanciaE" #unque
2ara nosotros ser. muc!o m.s senci))oF una metac)ase ser.5 sim2)emente5 un ti2o es2ecia) +e
Dti2o +e c)aseE que so)amente tiene atri6utos mto+os a6stractos" ;60iamente no se +iferencia
muc!o +e una c)ase norma) corriente"
E:isten a+em.s otras +iferencias5 +eri0a+as +e) tratamiento es2ecia) que requieren )os miem6ros
a6stractos +e una c)ase" Este tratamiento inc)ue queF
X 3os mto+os atri6utos a6stractos son Dim2ermea6)es a )a !erenciaEF no 2ue+en ser
Dso6reescritosE5 como )os mto+os Dnorma)esE
X 1entro +e) .m6ito +e un mto+o a6stracto so)amente 2ue+en uti)i%arse atri6utos a6stractos"
J sin +u+a )a +iferencia m.s im2ortanteF
X 3os mto+os a6stractos no requieren instancias +e una c)ase 2ara ser e4ecuta+osF 6asta con
escri6ir e) nom6re +e )a c)ase5 se-ui+o +e )a ))ama+a a) mto+o"
9or e4em2)o5 )os mto+os +e im2resi=n +e )a c)ase 6.sica Sistema son a6stractos@ 2ue+en
in0ocarse escri6ien+o e) nom6re +e )a c)ase se-ui+o +e) mto+oF
Sistema.imprime(Hola mundo!+nl);
J a!ora es cuan+o se 2)antea e) 2ro6)emaF necesitamos un ti2o nue0o 2ara e) acceso D*istemaE5
seCa)a+o en e) c=+i-oF Com2armos)os con e) acceso seCa)a+o en este otroF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2/<
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.)6 A?T y LeLi
Persona mortadelo;
mortadelo.decir(Hola mundo!+nl)
3as +iferencias son c)asesF
X D*istemaE so)amente 2ue+e uti)i%arse 2ara acce+er a mto+os atri6utos a6stractos +e )a c)ase
*istema5 mientras que Dmorta+e)oE 2ue+e acce+er a )os mto+os atri6utos est.ticos ! no
est#ticos +e )a c)ase Persona o de cualFuier superclase de 8ersona..
X Dmorta+e)oE 2ue+e con0ertirse (con )a construcci=n convertir) a cua)quier su2erc)ase"
X Dmorta+e)oE tiene constructores"
X *i )a c)ase Persona tu0iera a)-?n miem6ro a6stracto5 !a que +iferenciar )os accesos
Da6stractosE Dno a6stractosEF
clase Persona
{
atributo abstracto Entero mayoraEdad = 18;
atributo Entero edad;
}
...
Persona mortadelo;
si(mortadelo.edad >= Dersona.mayoraEdad)
{ Sistema.imprime(Mortadelo es mayor de edad); }
| otras
{ Sistema.imprime(Mortadelo no es mayor de edad); }
Est. c)aro que )os accesos Dmorta+e)oE D9ersonaE seCa)a+os en e) c=+i-o no 2ue+en ser +e)
mismo ti2o@ D9ersonaE5 2or e4em2)o5 no 2ue+e acce+er a) atri6uto no a6stracto De+a+E"
1iremos que mientras Dmorta+e)oE es una instancia +e )a c)ase Persona5 D9ersonaE es una
referencia a )a metaclase Persona"
E) ti2oAmetac)ase se im2)ementa me+iante leli.types.LeLiMetaType" LeLiMetaType es una
su6c)ase +e LeLiType5 a+em.s uno +e )os atri6utos +e LeLiType" En )en-ua4e /B3 2o+ra
re2resentarse asF
Ilustracin 7.I ?elacin entre LeLi1!pe ! LeLi@eta1!pe
Esta estructura es un 2oco De:traCaEF )a c)ase LeLiType tiene un atri6uto cuo ti2o es una
su6c)ase +e LeLiType (c)ases recursi0as)" 3a estructura funciona 2orque que LeLiType no !ace
nin-?n uso +e LeLiMetaType@ so)amente -uar+a una referencia"
7o !a +iferencias im2ortantes +e im2)ementaci=n entre LeLiType LeLiMetaType@ )as
+iferencias son +e ti2o )=-icoF
X 3a etiqueta +e LeLiMetaType es siem2re METACLASE5 mientras que )a +e LeLiType es
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2<
LeLiType
LeLiMetaType
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.)6 A?T y LeLi
RES_CLASE5 TIPO_ENTERO5 TIPO_REAL5 TIPO_BOOLEANO5 TIPO_CADENA5 TIPO_ERROR o
TIPO_VACIO"
X LeLiMetaType 2osee un .m6ito 2ro2io en e) que so)amente !a6r. +ec)araciones +e mto+os
atri6utos a6stractos"
X LeLiMetaType no 2artici2a en )a !erenciaF to+as )as metac)ases se consi+erar.n D!i4asE +e )a
metac)ase LeLiTypeManager.tipoClase"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2<1
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.06 %ompro+aci(n de tipos K 3rimera pasada
Becci%n -.#: &om'robaci%n de ti'os J @rimera 'asada
-.#.1: &om'robaci%n de ti'os en dos 'asadas
Iasta a!ora to+os )os an.)isis que !emos rea)i%a+o !an requeri+o Dun so)o tratamientoE +e )os
+atosF e) ana)i%a+or ):ico trata6a )os caracteres Duna so)a 0e%E5 es +ecir5 ca+a car.cter era
trata+o una so)a 0e% a no se 0o)0a a tener en cuenta" #)-o 2areci+o ocurra con e) f)u4o +e
toHensF e) ana)i%a+or sint.ctico )o recorra una so)a 0e%5 construa e) #*$"
9ara im2)ementar )a com2ro6aci=n +e ti2os (C$ +e a!ora en a+e)ante) sin em6ar-o5 0amos a
necesitar un an.)isis que recorra e) #*$ dos 0eces ( 2or )o tanto +e6eremos im2)ementar +os
ana)i%a+ores +iferentes)"
O9or qu es necesario im2)ementar +os ana)i%a+ores +iferentesQ $iene que 0er con )a manera en
que !emos estructura+o )a informaci=n +e )as +ec)araciones (.m6itos5 +ec)araciones5 etc)"
Consi+rese e) si-uiente fra-mento +e c=+i-oF
El siguiente &ragmento de cdigo est# "asado en un &ragmento de cdigo de la leccin M del tutorial de >D60cript de peroxide
(2ttp6IIDDD.pero8ide.d7)
clare Recursiva
{
mtodo Entero a(Entero valor)
{
si (valor > 0)
{ a = b(valor - 1) ; }
| otras
{ a = 0; }
}
mtodo Entero b(Entero valor)
{
si (valor > 0)
{ b = a(valor - 1) ; }
| otras
{ b = 0; }
}
}
*****
En este e4em2)o5 e) mto+o b se in0oca +es+e e) mto+o a5 a) mismo tiem2o a es in0oca+o
+es+e b" 8ecorrien+o una so)a 0e% e) #*$ no 2o+ramos Dsa6erE qu si-nifica b(valor -1) )a
2rimera 0e% que )o encontramos" Pue+a 2ues c)aro que es necesario rea)i%ar +os D2asa+asEF
X /na 2rimera 2asa+a que se encar-ue +e Dre-istrarE )as +ec)araciones +e) )en-ua4e"
X /na se-un+a que uti)ice estas +ec)araciones 2ara rea)i%ar )as com2ro6aciones +e ti2os
2ro2iamente +ic!as
68
"
#) ana)i%a+or que rea)i%ar. )a 2rimera 2asa+a )o ))amaremos LeLiSymbolTreeParser5 a)
se-un+o LeLiTypeCheckTreeParser" En esta secci=n estu+iaremos e) 2rimero5 en )a si-uiente
e) se-un+o"
68 En C^C++ so)amente se rea)i%a una 2asa+a5 2ero e) 2ro-rama+or est. o6)i-a+o a es2ecificar )os ti2os +e )as funciones que 0a a
uti)i%ar 2or a+e)anta+o5 uti)i%an+o )os D2rototi2os +e funcionesE D2rototi2os +e c)asesE"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2<2
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.06 %ompro+aci(n de tipos K 3rimera pasada
+-plicacin detallada de los o7*etivos del anali%ador
3a tarea 2rinci2a) +e) ana)i%a+or ser. 2re2arar e) sistema #1$5 crean+o to+os )os .m6itos e
intro+ucien+o )as +ec)araciones que sean 2ertinentes en +ic!os .m6itos" Esto inc)ueF
X Crear to+os )os .m6itos 2ertinentesF e) -)o6a)5 e) +e ca+a c)ase5 mto+o5 instrucci=n
con+iciona) 6uc)e"
X ,ntro+ucir )as +ec)araciones +e c)ases en e) .m6ito -)o6a)
X ,ntro+ucir )as +ec)araciones +e atri6utos5 mto+os constructores en e) .m6ito +e ca+a c)ase
X ,ntro+ucir )as +ec)araciones +e 2ar.metros en )os mto+os
7=tese que )as +ec)araciones +e 0aria6)es )oca)es no se inc)uir.n en sus .m6itos en )a 2rimera
2asa+a@ esto ocurre 2orque )as +ec)araciones +e 0aria6)es no +e6en estar D+is2oni6)es en to+o su
.m6itoE como ocurre con )os mto+os@ so)amente +e6en 2o+er uti)i%arse 2or )as intrucciones que
suce+en a )as +ec)araciones" Es +ecir5 que mientras e) si-uiente c=+i-o es 0.)i+oF
mtodo a(Entero e) // a conoce a b
{
si( e>0 ) { b(e-1); }
}
mtodo b(Entero e) // y simultneamente b conoce a a
{
a( e-1 );
}
Este otro no )o esF
mtodo c()
{
si (i>0) { b(i); } // i est indefinido en este punto
Entero i=9;
}
1e esta forma5 )as 0aria6)es ser.n inserta+as en )os .m6itos +urante )a se-un+a 2asa+a"
*imu)t.neamente5 )a 2rimera 2asa+a sir0e 2ara crear e) #*$ !etero-neo que 2ermitir. rea)i%ar )a
com2ro6aci=n +e ti2os" 9ara e))o +e6er. uti)i%ar )as c)ases +efini+as en e) 2aquete
antlraux.context.asts.*" #s5 e) ana)i%a+or +e6eF
X Crear no+os +e) ti2o antlraux.context.asts.ScopeAST 2ara )os no+os +e +efinici=n +e )os
e)ementos con .m6itos +e 3e3i5 es +ecir )as c)ases5 )os mto+os5 )os mto+os5 )as a)ternati0as
+e )as instrucciones con+iciona)es )os cuer2os +e )os 6uc)es" Es +ecir5 +e6er. !acer que )os
no+os +e ti2o RES_CLASE5 RES_METODO5 RES_CONSTRUCTOR5 RES_MIENTRAS5 RES_HACER5
RES_DESDE5 RES_SI5 BARRA_VERT RES_OTRAS"
X Crear no+os +e) ti2o antlraux.context.asts.ExpressionAST 2ara to+os )os no+os +e )as
e:2resiones"
X Crear no+os +e) ti2o antlraux.context.asts.TypeAST 2ara to+as )as a)ternati0as +e )a re-)a
tipo"
9or ?)timo5 e) 2rimer ana)i%a+or sem.ntico +e6e 2re2arar e) .m6ito -)o6a)5 insertan+o en ) )os
ti2os 2re+efini+os +e) )en-ua4e (Objeto5 Entero5 Cadena5 Real5 Booleano5 Sistema5 error
vaco) +e manera que estn +is2oni6)es 2ara su uti)i%aci=n antes +e em2e%ar a )eer e) c=+i-o +e)
usuario" Como 0eremos esta tarea no es tri0ia)"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2<-
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.06 %ompro+aci(n de tipos K 3rimera pasada
$as )ases del anali%ador
1i0i+iremos )as re-)as +e) ana)i%a+or en cuatro -ran+es D-ru2osE5 a )os que ))amaremos DfasesE"
X En )a 2rimera fase se 2re2arar.n )os .m6itos se Den-anc!ar.nE en )os no+os #*$ que se
crear.n 2ara e))os5 es +ecir5 )as instancias +e antlraux.context.asts.ScopeAST" En esta
fase tam6in se intro+ucir.n )as +ec)araciones 2ertinentes +entro +e )os .m6itos"
X En )a se-un+a fase se 2re2arar.n )os #*$s +e )as e:2resiones (se crear.n )as instancias +e )a
c)ase antlraux.context.asts.ExpressionAST 2ara )as e:2resiones)"
X En )a tercera fase se 2re2arar.n )os #*$s +e )os ti2os (instancias +e
antlraux.context.asts.TypeAST)"
X 3a cuarta fase +e) ana)i%a+or es )a que se encar-a +e aCa+ir to+os )os ti2os 2re+efini+os +e
3e3i a) .m6ito -)o6a)"
-.#.2: 6e!inici%n del anali8ador
"a7ecera
LeLiSymbolTreeParser 2ertenecer.5 como e) resto +e )os ana)i%a+ores que !emos
im2)ementa+o5 a) 2aquete )e)i5 como es !a6itua) as )o es2ecificaremos en )a secci=n header
4unto con )as im2ortaciones necesarias5 que ser.n muc!asF
header{
package leli;
import ... ; // importaciones variadas
}
E) se 6asar. en e) esque)eto 2ro2orciona+o 2or e) itera+or sim2)e +e .r6o)es5 LeLiTreeParser5
que +escri6imos en )a secci=n ("' D,tera+or sim2)e +e .r6o)esE5 uti)i%an+o )a !erencia +e
-ram.ticas una 0e% m.s"
class LeLiSymbolTreeParser extends LeLiTreeParser;
5ona de opciones
3as o2ciones ser.n )as que si-uenF
options
{
importVocab=LeLiParserVocab;
exportVocab=LeLiSymbolTreeParserVocab;
buildAST = true;
ASTLabelType = antlraux.util.LexInfoAST;
}
X importVocab exportVocab sir0en 2ara im2ortar e:2ortar e) con4unto +e sm6o)os" 7=tese
que no es necesario im2ortar e) con4unto +e sm6o)os +e) ana)i%a+or sint.ctico con to)erancia a
errores (LeLiErrorRecoveryParserVocab) 2orque en +ic!o ana)i%a+or no se +efini= nin-?n
nue0o sm6o)o"
X buildAST acti0a )a construcci=n 2or +efecto +e) #*$ K Leste ana)i%a+or5 a) contrario que
3e3i$ree9arser5 s construir. un nue0o #*$N
X ASTLabelType est. a! 2or como+i+a+@ como a !emos e:2)ica+o en )a secci=n ("1"35
D#Ca+ien+o informaci=n ):ica a )os #*$sE5 to+os )os no+os #*$s que se crear.n en nuestro
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2<)
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.06 %ompro+aci(n de tipos K 3rimera pasada
ana)i%a+or sint.ctico ser.n +e )a c)ase LexInfoAST o +e una +e sus su6c)ases@ as ser. m.s
senci))o acce+er a )a informaci=n ):ica +e )os #*$s (+e otra forma ten+ramos que uti)i%ar
infini+a+ +e castings en mu)titu+ +e sitios)"
5ona de to9ens
3a secci=n +e toHens tam2oco 2resentar. -ran+es sor2resasF se )imitar. a +efinir +os nue0os
ti2os +e toHen5 necesarios 2ara im2)ementar e) ti2o error )as metac)ases +e 3e3iF
tokens
{
TIPO_ERROR = "error";
METACLASE = "metaclase" ;
}
5ona de cdigo nativo
Ie aqu )a %ona +e c=+i-o nati0o +e este ana)i%a+orF
{
private LeLiContext contexto;
private Logger logger;
public LeLiSymbolTreeParser(Logger logger)
throws RecognitionException
{
this();
this.logger = logger;
this.contexto = new LeLiContext(logger);
setASTNodeClass("antlraux.util.LexInfoAST");
}
public LeLiSymbolTreeParser(Logger logger, LeLiContext contexto)
throws RecognitionException
{
this();
this.logger = logger;
this.contexto = contexto;
setASTNodeClass("antlraux.util.LexInfoAST");
}
public LeLiContext obtenerContexto()
{ return contexto; }
public void reportError( String msg,
String filename,
int line,
int column )
{
if(null==logger)
{
logger = new Logger("error", System.err);
}
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2<0
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.06 %ompro+aci(n de tipos K 3rimera pasada
logger.log( msg, 1, filename, line, column);
}
public void reportError(RecognitionException e)
{
reportError( e.getMessage(), e.getFilename(),
e.getLine(), e.getColumn() );
e.printStackTrace(System.out);
}
}
3a %ona comien%a con )a +efinici=n +e +os atri6utos +e) ana)i%a+orF una instancia +e 3o--er5 una
c)ase que a !emos estu+ia+o en ca2tu)os anteriores5 que sir0e 2ara re-istrar )os errores5 una
instancia +e 3e3iConte:t"
LeLiContext es )a Dc)ase fac!a+aE que 2ermitir. a )os ana)i%a+ores sint.cticos uti)i%ar e) sistema
.m6ito^+ec)araci=n^ti2o casi tota)mente"
# continuaci=n se +ec)aran +os constructores mu senci))os5 cua ra%=n +e ser que+ar. c)ara en
6re0e" 9or ?)timo se so6reescri6e e) mto+o reportError(RecognitionException) se aCa+e
reportError(String,String,int,int)5 +e )a misma manera que se !i%o en e) ca2tu)o 65 en
e) ana)i%a+or con recu2eraci=n +e errores"
-.#.3: 5ase 1: &reaci%n de (mbitos
;rograma
Como 0iene sien+o !a6itua)5 comen%aremos con )a re-)a 2ro-rama +e) ana)i%a+or" /n 2ro-rama
se-uir. sien+o una )ista +e +ec)araciones5 aunque en esta ocasi=n con un 2equeCo aCa+i+o"
ReamosF
programa
: #( PROGRAMA
instalar+iposBasicos
(decClase)+ )
{ ## = new ScopeAST(##, contexto.getCurrentScope()); }
;
exception catch [RecognitionException ce] { reportError(ce); }
En esta ocasi=n se in0oca una re-)a5 ))ama+a instalarTiposBasicos5 antes +e reconocer )as
+ec)araciones +e )as c)ases" instalarTiposBasicos es )a fase 4 +e) ana)i%a+or5 )a
estu+iaremos m.s a+e)ante"
E) ?nico as2ecto que que+a 2or comentar +e )a re-)a es )a acci=n que se encuentra a) fina)" En
e))a5 e) #*$ -enera+o 2or )a re-)a se sustitue 2or una instancia +e ScopeAST" $n-ase 2resente
que ScopeAST uti)i%a un constructor D0ora%E (que co2ia e) !ermano e) 2rimer !i4o +e) #*$ que
se )e 2asa como 2ar.metro) )ue-o no es necesario !acer na+a m.s 2ara construir)o"
E) resto +e )as re-)as +e )a fase 1 aca6an to+as con una acci=n 2areci+a@ +e a!ora en a+e)ante
2rescin+iremos +e comentar)a"
7=tese tam6in e) mane4a+or +e e:ce2ciones5 que se )imita a im2rimir e) error5 cance)an+o )a
recu2eraci=n"
:eclaracin de clases
3a si-uiente re-)a que 0amos a estu+iar es )a que reconoce )a +ec)araci=n +e )as c)ases5 es +ecir5
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2<,
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.06 %ompro+aci(n de tipos K 3rimera pasada
decClase" 3a re-)a tiene )a si-uiente formaF
decClase
{
LeLiType claseActualTipo = null;
ScopeAST ast = null;
}:
#( RES_CLASE nombre:IDENT #(RES_EXTIENDE padre:IDENT)
{
ast = new ScopeAST(##, contexto.abrirAmbitoClase (#nombre));
if(contexto.tiposBasicosLeidos == true)
{
LeLiType tipoPadre = contexto.obtenerTipo(#padre);
claseActualTipo =
new LeLiType( #nombre.getText(),
tipoPadre,
contexto.getCurrentScope(),
new LeLiMetaType(#nombre.getText()) );
} else {
claseActualTipo =
LeLiTypeManager.obtenerTipoBasico(
#nombre.getText(), #nombre );
claseActualTipo.setScope( contexto.getCurrentScope() );
}
claseActualTipo.insertarAtributosSuperClase();
contexto.insertarDecClase(##, #nombre, claseActualTipo);
}
listaMiembrosContexto[ claseActualTipo ] )
{
contexto.cerrarAmbitoClase();
claseActualTipo.insertarMetodosSuperClase();
## = ast;
}
;
exception catch [RecognitionException ce] { reportError(ce); }
3a re-)a comien%a con )a +efinici=n +e +os 0aria6)es )oca)es" claseActualTipo sir0e 2ara
-uar+ar e) ti2o +e )a c)ase que se est. reconocien+o5 mientras que ast sir0e 2ara -uar+ar e) #*$
que -enera )a re-)a (2orque no se 2ue+e uti)i%ar ee en 0arias acciones +e una misma re-)a)"
1es2us se reconocen )os no+os inicia)es +e) #*$ +e +ec)araci=n +e )as c)ases" Esto inc)ue )a
ra% (RES_CLASE)5 e) nom6re +e )a c)ase )a c).usu)a De:tien+eE con e) nom6re +e )a c)ase 2a+re"
$ras reconocer )os no+os inicia)es comien%a una acci=n en )a que se inicia)i%an )as 0aria6)es
crea+as a) 2rinci2io +e )a re-)a5 es +ecir5 ast claseActualTipo" 7o !a muc!o que +ecir
so6re )a 0aria6)e astF es sim2)emente una 0aria6)e tem2ora) 2ara -uar+ar e) #*$ 2ro+uci+o 2or
)a re-)a"
claseActualTipo5 2or su 2arte5 sir0e 2ara -uar+ar e) ti2o +e )a c)ase ()a instancia +e 3e3i$2e
que ser0ir. 2ara caracteri%ar )a +ec)araci=n +e )a c)ase en e) .m6ito -)o6a))" 3a forma +e iniciar)a
+e2en+e +e si estamos reconocien+o )as c)ases Dusua)esE +e un 2ro-rama 3e3i (+efini+as 2or un
usuario) o )os ti2os 2or +efecto +e) )en-ua4e" Ro)0eremos a esto en )a fase 4"
3as ?)timas +os )neas +e )a acci=n aCa+en )os atri6utos +e )a su2erc)ase a )a c)ase actua)5 )a
insertan en e) .m6ito -)o6a)5 +e manera que )os mto+os constructores +e )a c)ase )a 2ue+en
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2<7
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.06 %ompro+aci(n de tipos K 3rimera pasada
uti)i%ar"
1es2us +e )a acci=n se reconocen )os atri6utos5 constructores mto+os +e )a re-)a5 con )a re-)a
listaMiembrosContexto" Esta re-)a es simi)ar a listaMiembros5 con )a sa)0e+a+ +e que
a+mite como 2ar.metro e) ti2o +e )a c)ase que se est. +ec)aran+oF
listaMiembrosContexto [LeLiType claseActual]
: #( LISTA_MIEMBROS ( decAtributoContexto[claseActual]
| decMetodoContexto[claseActual]
| decConstructorContexto[claseActual]
)*
)
;
exception catch [RecognitionException ce] { reportError(ce); }
3a ?)tima acci=n +e )a re-)a se encar-a +e DterminarE e) .m6ito +e )a c)ase" $am6in inserta )os
mto+os +e )a su2erc)ase en e) .m6ito +e )a c)ase5 con e) fin +e ace)erar 6?sque+as" 9or ?)timo
!ace que ast sea e) .r6o) -enera+o 2or )a re-)a (##=ast)"
:eclaraciones de m2todos
3as +ec)araciones +e mto+os son reconoci+as con )a re-)a decMetodoContextoF
decMetodoContexto [LeLiType claseActual]
{
ScopeAST ast = null;
boolean abstracto = false;
LeLiDecMetodoType metodoActual = null;
}
: #( RES_METODO ( RES_ABSTRACTO {abstracto=true;} )?
tr:tipo nombre:IDENT
{
contexto.abrirAmbitoMetodo(#nombre);

LeLiType tret = (LeLiType)((TypeAST)#tr).getExpType();

metodoActual =
new LeLiDecMetodoType( #nombre.getText(),
tret,
claseActual,
contexto.getCurrentScope() );
if(abstracto) metodoActual.addModifier("abstracto");
}
listaDecParamsContexto[metodoActual]
{
ast = new ScopeAST( ##, contexto.getCurrentScope());
contexto.insertarVariableMetodo(ast, #nombre, tret);
}
listaInstrucciones
)
{
contexto.cerrarAmbitoMetodo();
## = ast;
contexto.insertarDecMetodo(##, #nombre, metodoActual);
}
;
exception catch [RecognitionException ce] { reportError(ce); }
3a re-)a comien%a +e forma 2areci+a a decClaseF tras +ec)ararse ciertas 0aria6)es )oca)es5 se
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2</
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.06 %ompro+aci(n de tipos K 3rimera pasada
reconoce )a Dca6eceraE +e )a +ec)araci=n" Esto inc)ue )a ra%5 RES_METODO@ )a 2a)a6ra reser0a+a
RES_ABSTRACTO si 2roce+e@ )ue-o se reconoce e) ti2o +e) mto+o (e) ti2o +e )a 0aria6)e que
+e0ue)0e K 2ue+e ser 0aco)@ +es2us e) nom6re +e) mto+o"
1es2us !a una acci=n en )a que se crea e) ti2o +e )a +ec)araci=n e) .m6ito +e) mto+o" 3ue-o
se reconocen )os 2ar.metros con )a re-)a listaDecParametrosContexto" /na nue0a acci=n
inicia)i%a )a 0aria6)e )oca) ast e inc)ue )a +ec)araci=n +e )a 0aria6)e +e) mto+o en e) .m6ito +e)
mto+o5 si ste no es 0aco"
$ras to+o este 2roceso a es 2osi6)e recorrer )as instrucciones"
3a acci=n a) fina) +e )a re-)a termina e) .m6ito +e) mto+o e inserta e) #*$ 2ro+uci+o 2or )a
re-)a en e) .m6ito +e )a c)ase corres2on+iente"
:eclaraciones de constructores
3a +ec)araci=n +e un constructor se reconoce con )a re-)a decConstructorContextoF
decConstructorContexto[ LeLiType claseActual ]
{ LeLiDecConstructorType tipoConstructor = null; }
: #( RES_CONSTRUCTOR
{
tipoConstructor =
new LeLiDecConstructorType( claseActual,
contexto.abrirAmbitoConstructor() );
}
listaDecParamsContexto [tipoConstructor]
listaInstrucciones )
{
## = new ScopeAST ( ##, contexto.cerrarAmbitoConstructor());
contexto.insertarDecConstructor( ##, tipoConstructor );
}
;
exception catch [RecognitionException ce] { reportError(ce); }
Como 2ue+e 0erse5 )as +ec)araciones +e constructores se reconocen m.s senci))amente que )as +e
mto+os" 7o o6stante )a forma +e reconocer)as es simi)ar"
$ras )a +ec)araci=n +e 0aria6)es )oca)es5 se reconoce )a ca6ecera +e )a +ec)araci=n (constitui+a
?nicamente 2or )a ra% +e) #*$5 RES_CONSTRUCTOR)" 1es2us !a una acci=n en )a que se
inicia)i%a e) ti2o +e )a +ec)araci=n" 3ue-o se reconocen )os 2ar.metros )as instrucciones +e)
constructor" >ina)mente !a una acci=n que se encar-a +e cerrar e) .m6ito re-istrar e)
constructor en e) .m6ito +e )a c)ase a )a que 2ertenece"
:eclaracin de 7ucles
,m2)ementar e) com2ortamiento +e )os .m6itos +e )os 6uc)es es mu senci))o5 2orque no se
aCa+en +ec)araciones +e 6uc)es a) .m6ito +e) mto+o a) que 2ertenecen@ so)amente !a que crear
+estruir e) .m6ito +e) 6uc)e5 reconocer )as instrucciones en su interior" #s5 e) 6uc)e mientras
se reconoce asF
instMientras
: #( RES_MIENTRAS
{ contexto.abrirAmbitoMientras(); }
expresion
listaInstrucciones
)
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota 2<<
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.06 %ompro+aci(n de tipos K 3rimera pasada
{ ## = new ScopeAST(##, contexto.cerrarAmbitoMientras()); }
;
exception catch [RecognitionException ce] { reportError(ce); }
E) 6uc)e hacer-mientras asF
instHacerMientras
: #( RES_HACER
{ contexto.abrirAmbitoHacerMientras(); }
listaInstrucciones
expresion
)
{ ## = new ScopeAST(##, contexto.cerrarAmbitoHacerMientras()); }
;
exception catch [RecognitionException ce] { reportError(ce); }
J e) 6uc)e desde +e esta otra formaF
instDesde
: #( RES_DESDE
{ contexto.abrirAmbitoDesde(); }
listaExpresiones
listaExpresiones
listaExpresiones
listaInstrucciones
)
{ ## = new ScopeAST(##, contexto.cerrarAmbitoDesde()); }
;
exception catch [RecognitionException ce] { reportError(ce); }
Instrucciones condicionales
3as instrucciones con+iciona)es 2resentan )a 2articu)ari+a+ +e que requieren un nue0o .m6ito 2or
ca+a alternativa +e )a instrucci=n" 1a+o que +e6emos Den-anc!arE )os .m6itos en )as races +e
)os #*$s en )os que se inician5 +e6eremos aCa+ir un .m6ito en )os no+os RES_SI5 BARRA_VERT
RES_OTRAS5 re2resentan+o res2ecti0amente e) .m6ito +e )a 2rimera a)ternati0a5 +e to+as )as
a)ternati0as interme+ias +e )a a)ternati0a DotrasE +e una instrucci=n si" 1e esta forma5 e) c=+i-o
+e )a re-)a instSi ser. e) si-uienteF
instSi
{ Scope s = null; }
: #( RES_SI
{ contexto.abrirAmbitoCondicional(); }
expresion
listaInstrucciones
{ s = contexto.cerrarAmbitoCondicional(); }
(alternativaSi)*
)
{ ## = new ScopeAST(##, s); }
;
exception catch [RecognitionException ce] { reportError(ce); }
E) resto +e )os .m6itos se aCa+en en )a re-)a alternativasSiF
alternativaSi
{ Scope s = null; }
: ( #( BARRA_VERT
{ contexto.abrirAmbitoCondicional(); }
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.06 %ompro+aci(n de tipos K 3rimera pasada
expresion
listaInstrucciones
{ s = contexto.cerrarAmbitoCondicional(); }
)
| #( RES_OTRAS
{ contexto.abrirAmbitoCondicional(); }
listaInstrucciones
{ s = contexto.cerrarAmbitoCondicional(); }
)
)
{ ## = new ScopeAST(##, s); }
;
exception catch [RecognitionException ce] { reportError(ce); }
:eclaracin de atri7utos
3a +ec)araci=n +e un atri6uto no im2)ica )a creaci=n +e un .m6ito@ so)amente )a instro+ucci=n +e
una nue0a +ec)araci=n en un .m6ito a e:istente (e) +e )a c)ase que 2osee e) .m6ito)" $enien+o
esto en cuenta5 reconocer )as +ec)araciones +e atri6utos es re)ati0amente senci))o" 3as
+ec)araciones +e atri6uto se reconocen con )a re-)a decAtributoContextoF
decAtributoContexto [LeLiType claseActual]
{ boolean abstracto = false; }
: #( RES_ATRIBUTO (RES_ABSTRACTO {abstracto=true;})?
t:tipo
nombre:IDENT (v:expresion)? )
{
LeLiType tipo = (LeLiType)((TypeAST)#t).getExpType();
AttributeType tipoAtributo =
new AttributeType( RES_ATRIBUTO,
#nombre.getText(),
tipo,
claseActual );
if(abstracto) tipoAtributo.addModifier("abstracto");
contexto.insertarDecAtributo( ##, #nombre, tipoAtributo, #v);
}
;
exception catch [RecognitionException ce] { reportError(ce); }
3a re-)a5 a 2esar +e 2arecer a2aratosa5 es senci))aF )a estructura com2)eta +e )a +ec)araci=n se
reconoce5 +es2us se crea e) ti2o +e )a +ec)araci=n (e) ti2o es en este caso una instancia +e
antlraux.context.types.AttributeType)" *i e) atri6uto es a6stracto5 se aCa+e e)
mo+ifica+or Da6stractoE a) ti2o" >ina)mente5 e) mto+o insertarDecAtributo +e contexto se
encar-a +e crear e intro+ucir )a +ec)araci=n corres2on+iente"
:eclaraciones de parmetros
3a +ec)araci=n +e un 2ar.metro tam2oco im2)ica )a creaci=n +e un nue0o .m6ito5 so)amente )a
inserci=n +e una +ec)araci=n" 3as +ec)araciones +e 2ar.metros5 a+em.s5 no requieren +e Dti2os
es2ecficosE como )os atri6utos o )os mto+os (2ue+en uti)i%arse )os ti2os 6.sicos +e) sistema5
DEnteroE5 D8ea)E5 etc como ti2os +e )as +ec)araciones
69
)" 3a re-)a que reconoce )as +ec)araciones
+e 2ar.metros es decParametroContextoF
69 Esto ocurre 2orque )os 2ar.metros en 3e3i no a+miten mo+ifica+ores (2or e4em2)o5 2ara in+icar 2aso 2or referencia o 2or
0a)or)" *i ste fuera e) caso5 sera necesario uti)i%ar una c)ase +e ti2o es2ecfica 2ara )as +ec)araciones +e 2ar.metros"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -1
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.06 %ompro+aci(n de tipos K 3rimera pasada
decParametroContexto[LeLiMethodType decMetodo]
: #(RES_PARAMETRO t:tipo nombre:IDENT)
{
LeLiType tipoParametro = (LeLiType)((TypeAST)#t).getExpType();
decMetodo.addParam(tipoParametro);
contexto.insertarDecParametro( ##, #nombre, tipoParametro );
}
;
exception catch [RecognitionException ce] { reportError(ce); }
Como 2ue+e 0erse5 es mu senci))a"
decParametroContexto es uti)i%a+a 2or listaDecParametrosContextoF
listaDecParamsContexto [LeLiMethodType decMetodo]
: #(LISTA_DEC_PARAMS (decParametroContexto[decMetodo])* )
;
exception catch [RecognitionException ce] { reportError(ce); }
-.#.": 5ase 2: @re'araci%n de las ex'resiones
3as re-)as +e esta fase se )imitan a D2re2ararE )os #*$s que re2resentan e:2resiones en 3e3i5
con0irtin+o)os en instancias +e antlraux.context.asts.ExpressionAST" 7in-?n 0a)or +e
e:2resi=n (3A0a)ue5 8A0a)ue5 etc) es ca)cu)a+o en esta fase@ sim2)emente se 2re2aran )os #*$s5 +e
manera que no !aa que crear nin-?n nue0o #*$ en )a se-un+a 2asa+a"
E) c=+i-o +e )a re-)a expresion ser. e) si-uienteF
expresion
: ( #( OP_MAS expresion expresion )
| #( OP_MENOS expresion expresion )
| #( OP_ASIG expresion expresion )
| #( OP_O expresion expresion )
| #( OP_Y expresion expresion )
| #( OP_IGUAL expresion expresion )
| #( OP_DISTINTO expresion expresion )
| #( OP_MAYOR expresion expresion )
| #( OP_MENOR expresion expresion )
| #( OP_MAYOR_IGUAL expresion expresion )
| #( OP_MENOR_IGUAL expresion expresion )
| #( OP_PRODUCTO expresion expresion )
| #( OP_DIVISION expresion expresion )
| #( OP_MENOS_UNARIO expresion)
| #( OP_MASMAS expresion)
| #( OP_MENOSMENOS expresion)
| #( OP_NO expresion)
| #( RES_ESUN acceso tipo)
)
{ ## = new ExpressionAST(##); }
| acceso
;
exception catch [RecognitionException ce] { reportError(ce); }
3os accesos tam6in son mu senci))os +e reconocer en esta faseF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -2
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.06 %ompro+aci(n de tipos K 3rimera pasada
acceso : #(ACCESO raizAcceso (subAcceso)* )
{ ## = new ExpressionAST(##); }
;
exception catch [RecognitionException ce] { reportError(ce); }
Ia que actuar +e forma simi)ar con raizAcceso subAccesoF
raizAcceso : ( IDENT
| RES_PARAMETRO
| RES_ATRIBUTO
| RES_SUPER
)
{ ## = new ExpressionAST(##); }
| literal
| llamada
| conversion
| expresion
;
exception catch [RecognitionException ce] { reportError(ce); }
subAcceso : llamada
| IDENT { ## = new ExpressionAST(##); }
| RES_SUPER { ## = new ExpressionAST(##); }
;
exception catch [RecognitionException ce] { reportError(ce); }
>ina)mente5 )as re-)as literal5 llamada conversion requieren +e )a misma o2eraci=nF
literal : ( LIT_ENTERO
| LIT_REAL
| LIT_CADENA
| LIT_NL
| LIT_TAB
| LIT_COM
| LIT_CIERTO
| LIT_FALSO
)
{ ## = new ExpressionAST(##); }
;
exception catch [RecognitionException ce] { reportError(ce); }
llamada : ( #(LLAMADA IDENT listaExpresiones )
| #(RES_CONSTRUCTOR listaExpresiones )
)
{ ## = new ExpressionAST(##); }
;
exception catch [RecognitionException ce] { reportError(ce); }
conversion : #(RES_CONVERTIR expresion tipo)
{ ## = new ExpressionAST(##); }
;
exception catch [RecognitionException ce] { reportError(ce); }
-.#.#: 5ase 3: @re'araci%n de los ti'os
3a fase 3 +e) ana)i%a+or est. forma+a 2or una ?nica re-)a5 tipo" 3os #*$s 2ro+uci+os 2or esta
re-)a +e6en ser mo+ifica+os 2ara ser instancias +e )a c)ase antlraux.context.asts.TypeAST"
Es +ecir5 !a que rea)i%ar una con0ersi=n 2areci+a a )as +e )a fase '"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota --
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.06 %ompro+aci(n de tipos K 3rimera pasada
En )a 2re2araci=n +e ti2os5 sin em6ar-o5 )as instancias +e TypeAST se Dre))enar.nE con )os +atos
2ertinentes (en este caso e) ti2o)5 2orque son necesarias en )a %ona 1 +e) ana)i%a+or"
3a re-)a tipo ten+r. e) si-uiente as2ectoF
tipo
{ Type t = null; }
: ( TIPO_ENTERO { t = LeLiTypeManager.tipoEntero; }
| TIPO_REAL { t = LeLiTypeManager.tipoReal; }
| TIPO_BOOLEANO { t = LeLiTypeManager.tipoBooleano; }
| TIPO_CADENA { t = LeLiTypeManager.tipoCadena; }
| TIPO_VACIO { t = LeLiTypeManager.tipoVacio; }
| i:IDENT { t = contexto.obtenerTipo(i); }
)
{
## = new TypeAST(##);
((TypeAST)##).setExpType(t);
}
;
exception catch [RecognitionException ce] { reportError(ce); }
7=tese )a sim2)ici+a+ +e )a re-)aF cuan+o se reconocen ti2os 6.sicos +e 3e3i5 se )es asi-na un
#*$ cuo ti2o se o6tiene +e) -estor +e ti2os 2re+efini+os +e 3e3i (LeLiTypeManager)" En e)
caso +e )os i+entifica+ores5 se 6uscan e) e) conte:to +ec)araciones +e c)ases +efini+as 2or e)
usuario"
-.#.+: 5ase ": @re'araci%n del (mbito global
3a maor 2arte +e) c=+i-o +e )a fase 4 est. conteni+o en )a re-)a instalarTiposBasicos"
instalarTiposBasicos es in0oca+a 2or )a re-)a 2ro-rama5 a) inicio +e )a >ase 1 +e) an.)isisF
programa: #(PROGRAMA instalar+iposBasicos (decClase)+) {...} ;
3a re-)a instalarTiposBasicos ser. una re-)a que e0a)uar. a Dna+aE@ su cuer2o estar.
forma+o 2or una ?nica acci=nF
instalarTiposBasicos: /* nada */
{
<< Cuerpo de la accin >>
}
#!ora so)amente que+a +efinir << Cuerpo de la accin >>"
+l )ic8ero de tipos 7sicos
Ia 0arias maneras +e +efinir )os ti2os 2or +efecto +e un )en-ua4e" /na +e e))as consiste en crear
)os #*$s +e sus +ec)araciones Da manoE )ue-o aCa+ir)os como +ec)aracionesF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -)
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.06 %ompro+aci(n de tipos K 3rimera pasada
AST decObjeto_Aserto =
#( #[RES_METODO], #[RES_ABSTRACTO], #[TIPO_VACIO], #[IDENT, aserto],
#( #[LISTA_PARAMS],
#( #[RES_PARAMETRO], #[TIPO_BOOLEANO], #[IDENT, condicion]) ),
#( #[RES_PARAMETRO], #[TIPO_CADENA], #[IDENT, mensaje] ) ) );
AST decObjeto =
#( #[RES_CLASE], #[IDENT,Objeto], #(#[RES_EXTIENDE], #[IDENT,Objeto]),
#(#[LISTA_MIEMBROS], decObjeto_aserto) );
... // Lo mismo con Cadena, Real, Booleano y Sistema
9ero este mto+o es mu 2oco 2r.cticoF escri6ir )os #*$s a mano es mu en-orroso5 )ento
2ro2enso a 2ro+ucir errores"
En )u-ar +e +efinir )os ti2os 2re+efini+os Da manoE5 uti)i%aremos un &ic%ero de de&inicin" 3o
))amaremos TiposBasicos.leli5 ser. e) si-uienteF
clase ___Objeto
{
mtodo abstracto aserto(Booleano condicin; Cadena mensaje)
{ }
}
clase ___Cadena
{
mtodo Entero longitud() { }
mtodo Cadena subCadena (Entero inicio, fin) { }
}
clase ___Entero {}
clase ___Real extiende ___Entero {}
clase ___Booleano {}
clase Sistema
{
mtodo abstracto imprime(Real r) { }
mtodo abstracto imprime(Booleano b) { }
mtodo abstracto imprime(Entero e) { }
mtodo abstracto imprime(Cadena c) { }
}
#s nos a!orramos )a a2aratosi+a+ +e) #*$ -enera+o a mano5 aunque a2arecen otros 2ro6)emasF
X E) reconocimiento TiposBasicos.leli es +iferente +e) reconocimiento +e un fic!ero 3e3i
norma) corriente@ e) an.)isis +e6e rea)i%arse +e formas +iferentes" 9ara e))o5 )a c)ase
LeLiContext 2ro2orciona e) atri6uto tiposBasicosLeidos5 que es fa)so !asta que se )ee e)
fic!ero"
X *er. necesario reconocer com2)etamente e) fic!ero" Esto im2)ica )a instanciaci=n +e un nue0o
ana)i%a+or ):ico5 uno sint.ctico uno sem.ntico" #fortuna+amente 2o+remos uti)i%ar )os a
e:istentes"
X 3os ti2os se uti)i%an antes +e ser +ec)ara+os" 9or e4em2)o5 )a c)ase Cadena se uti)i%a en un
mto+o +e )a c)ase Objeto" 9ara miti-ar este 2ro6)ema ser. necesario intro+ucir unos ti2os
Dfa)sosE en e) .m6ito -)o6a)5 e ir sustitun+o)os 2or )os 0er+a+eros a) ir reconocin+o)os"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -0
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.06 %ompro+aci(n de tipos K 3rimera pasada
X 7o se 2ue+en uti)i%ar )os nom6res +e )os ti2os 2or +efecto (DEnteroE5 D8ea)E5 """) 2orque e)
ana)i%a+or ):ico )os reconoce como 2a)a6ras reser0a+as5 e) ana)i%a+or sint.ctico es2era un
IDENT" #s que 2rece+emos )os nom6res +e )os ti2os 6.sicos con +os caracteres +e su6raa+o5
que son e)imina+os +urante e) an.)isis"
X 7=tese que no 2ro2orcionamos im2)ementaci=n a)-una 2ara )os mto+os +e )os ti2os
2re+efini+os@ cons?)tese e) si-uiente ca2tu)o 2ara m.s informaci=n"
E) c=+i-o +e )a acci=n +e instalarTiposBasicos es como si-ue" Comien%a insta)an+o )os ti2os
Dfa)sosE5 como +ecamos anteriormenteF
instalarTiposBasicos :
{
contexto.instalarTiposBasicos(); // Instala los tipos falsos
1es2us crean+o un f)u4o 2ara e) fic!ero TiposBasicos.leliF
String nombreFichero = "TiposBasicos.leli";
FileInputStream is = null;
try
{
is = new FileInputStream(nombreFichero);
}catch (FileNotFoundException fnfe){
throw new RecognitionException(
"El fichero '"+nombreFichero+"' no se encontr");
}
3ue-o crean+o un ana)i%a+or ):icoF
LeLiLexer lexer = new LeLiLexer(is);
lexer.setTokenObjectClass("antlraux.util.LexInfoToken");
lexer.setFilename(nombreFichero);
J uno sint.cticoF
// Crea el analizador sintctico
LeLiErrorRecoveryParser parser =
new LeLiErrorRecoveryParser(lexer,logger);
parser.setASTNodeClass("antlraux.util.LexInfoAST");
parser.setFilename(nombreFichero);
try{
parser.programa();
}catch (TokenStreamException tse){
throw new RecognitionException (
"Excepcin TokenStreamException encontrada "+
"mientras se lea el fichero TiposBasicos.leli");
}
;6tenemos e) #*$ -enera+o 2or e) ana)i%a+or sint.cticoF
AST ast = parser.getAST();
3)e-a+os a este 2unto +e6emos crear un ana)i%a+or sem.ntico +e 2rimera 2asa+a dentro de una
accin del anali-ador sem#ntico de primera pasada" 9or eso e) ana)i%a+or tiene +os
constructoresF uno 2ara e) que D)eeE e) fic!ero TiposBasicos.leli otro 2ara e) que )ee )os
fic!eros norma)es +e 3e3i"
// Crea el analizador semntico
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -,
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.06 %ompro+aci(n de tipos K 3rimera pasada
LeLiSymbolTreeParser tp =
new LeLiSymbolTreeParser(logger, contexto);
/na 0e% crea+o e) ana)i%a+or sem.ntico5 !a que )an%ar e) an.)isis" 7orma)mente se in0ocara e)
mto+o tp.programa()" #!ora 6ien5 +a+o que 2ro-rama in0oca )a re-)a
insertarTiposBasicos5 ten+ramos una recursi=n infinita si )o !iciramos" En )u-ar +e e))o
0amos a uti)i%ar una re-)a es2ecia)5 programaBasicoF
tp.programaBasico(ast);
programaBasico es como programa5 2ero sin insertarTiposBasicosF
programaBasico
: #( PROGRAMA (decClase)+ )
{ ## = new ScopeAST(##, contexto.getCurrentScope()); }
;
exception catch [RecognitionException ce] { reportError(ce); }
insertarTiposBasicos programaBasico son )as +os ?nicas re-)as +e )a fase 4 +e) ana)i%a+or"
9ero 0o)0amos a instertarTiposBasicos" /na 0e% que se !a in0oca+o programaBasico5 )os
ti2os 6.sicos est.n inserta+os en e) .m6ito -)o6a)" *o)amente que+a rea)i%ar unos 2equeCos
a4ustes"
9ara em2e%ar5 e) #*$ +e )a )ista +e c)ases -enera+a se +e0ue)0e" Esto es un arre-)o meramente
0isua)F a) +e0o)0er ste #*$ 2o+remos 0er )os .r6o)es +e )as +efiniciones +e )os ti2os
2re+efini+os en e) #*$ +e) 2ro-ramaF
// Devolver el primer hijo del programa, que lleva "atados"
// sus "hermanos" (siblings)
## = (LexInfoAST)(tp.getAST().getFirstChild());
>ina)mente !a unas cuantas acciones a+iciona)esF se acti0an )as com2ro6aciones se marca e)
conte:to5 2ara in+icar que )os ti2os 6.sicos a !an si+o )e+os"
contexto.activarComprobaciones();
contexto.tiposBasicosLeidos = true;
}
;
3a fase 4 es )a m.s D+is2ersaE +e) ana)i%a+or" 9ara no tener que uti)i%ar +os ana)i%a+ores
+iferentes5 en a)-unas re-)as +e) ana)i%a+or a)-unos mto+os +e LeLiContext se consu)ta )a
0aria6)e tiposBasicosLeidos 2ara 0er qu es )o que !a que !acer" /na im2)ementaci=n un
2oco m.s D)im2iaE5 2ero m.s com2)ica+a +e com2ren+er5 sera uti)i%ar )a !erencia 2ara mo+ificar
e) com2ortamiento +e )as re-)as mto+os que )o necesitasen"
-.#.-: 5ic*ero LeLiBymbol>ree@arser.g
# continuaci=n mostramos e) )ista+o com2)eto +e) fic!eroF
header
{
package leli;
/*-----------------------------------------------*\
| Un intrprete para un Lenguaje Limitado(LeLi) |
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -7
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.06 %ompro+aci(n de tipos K 3rimera pasada
| _____________________________________________ |
| |
| ANALISIS SEMNTICO -- Instalacin de smbolos |
| _____________________________________________ |
| |
| Enrique J. Garcia Cota |
\*-----------------------------------------------*/
import antlraux.context.ContextException;
import antlraux.context.Scope;
import antlraux.context.asts.*;
import antlraux.context.types.Type;
import antlraux.context.types.AttributeType;
import leli.types.*;
import antlraux.util.LexInfoAST;
import antlraux.util.Logger;
import antlr.TokenStreamException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
}
class LeLiSymbolTreeParser extends LeLiTreeParser;
options
{
importVocab=LeLiParserVocab;
exportVocab=LeLiSymbolTreeParserVocab;
buildAST = true;
ASTLabelType = antlraux.util.LexInfoAST;
}
tokens
{
TIPO_ERROR = "error";
METACLASE = "metaclase" ;
}
{
/**
* La clase {link LeLiContext} es una fachada que facilita la manipulacin
* contextual
**/
private LeLiContext contexto;
/** El logger de la clase **/
private Logger logger;
/** Constructor habitual **/
public LeLiSymbolTreeParser(Logger logger)
throws RecognitionException
{
this();
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -/
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.06 %ompro+aci(n de tipos K 3rimera pasada
this.logger = logger;
this.contexto = new LeLiContext(logger);
setASTNodeClass("antlraux.util.LexInfoAST");
}
/** Constructor privado (utilizado para leer TiposBasicos.leli **/
public LeLiSymbolTreeParser(Logger logger, LeLiContext contexto)
throws RecognitionException
{
this();
this.logger = logger;
this.contexto = contexto;
setASTNodeClass("antlraux.util.LexInfoAST");
}
public LeLiContext obtenerContexto()
{ return contexto; }
public void reportError( String msg,
String filename,
int line,
int column )
{
if(null==logger)
{
logger = new Logger("error", System.err);
}
logger.log( msg, 1, filename, line, column);
}
public void reportError(RecognitionException e)
{
reportError( e.getMessage(), e.getFilename(),
e.getLine(), e.getColumn() );
e.printStackTrace(System.out);
}
}
// ------------------- FASE 1: Creacin de mbitos -----------------
//
// La fase 1 consiste en:
// * Crear la jerarqua de mbitos
// * Insertar las declaraciones de parmetros, variables, atributos, clases,
// mtodos y constructores en sus respectivos mbitos
// * Asociar el mbito adecuado a la raz de los ASTs de objetos con mbito
// (clases, mtodos, constructores, bucles y alternativas condicionales)
//
/** Regla que sirve para recorrer el AST de definicin de un programa LeLi **/
programa
: #( PROGRAMA
instalarTiposBasicos
(decClase)+ )
{ ## = new ScopeAST(##, contexto.getCurrentScope()); }
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -<
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.06 %ompro+aci(n de tipos K 3rimera pasada
;
exception catch [RecognitionException ce] { reportError(ce); }
/** Declaracin de una clase **/
decClase
{
LeLiType claseActualTipo = null;
ScopeAST ast = null;
}:
#( RES_CLASE nombre:IDENT #(RES_EXTIENDE padre:IDENT)
{
ast = new ScopeAST(##, contexto.abrirAmbitoClase (#nombre));
if(contexto.tiposBasicosLeidos == true)
{
LeLiType tipoPadre = contexto.obtenerTipo(#padre);
claseActualTipo =
new LeLiType( #nombre.getText(),
tipoPadre,
contexto.getCurrentScope(),
new LeLiMetaType(#nombre.getText()) );
} else {
claseActualTipo =
LeLiTypeManager.obtenerTipoBasico(
#nombre.getText(), #nombre );
claseActualTipo.setScope( contexto.getCurrentScope() );
}
claseActualTipo.insertarAtributosSuperClase();
contexto.insertarDecClase(##, #nombre, claseActualTipo);
}
listaMiembrosContexto[ claseActualTipo ] )
{
contexto.cerrarAmbitoClase();
claseActualTipo.insertarMetodosSuperClase();
## = ast;
}
;
exception catch [RecognitionException ce] { reportError(ce); }
/** Lista de miembros de una clase **/
listaMiembrosContexto [LeLiType claseActual]
: #( LISTA_MIEMBROS ( decAtributoContexto[claseActual]
| decMetodoContexto[claseActual]
| decConstructorContexto[claseActual]
)*
)
;
exception catch [RecognitionException ce] { reportError(ce); }
/** Declaracin de un mtodo **/
decMetodoContexto [LeLiType claseActual]
{
ScopeAST ast = null;
boolean abstracto = false;
LeLiDecMetodoType metodoActual = null;
}
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -1
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.06 %ompro+aci(n de tipos K 3rimera pasada
: #( RES_METODO ( RES_ABSTRACTO {abstracto=true;} )?
tr:tipo nombre:IDENT
{
contexto.abrirAmbitoMetodo(#nombre);

LeLiType tret = (LeLiType)((TypeAST)#tr).getExpType();

metodoActual =
new LeLiDecMetodoType( #nombre.getText(),
tret,
claseActual,
contexto.getCurrentScope() );
if(abstracto) metodoActual.addModifier("abstracto");
}
listaDecParamsContexto[metodoActual]
{
ast = new ScopeAST( ##, contexto.getCurrentScope());
contexto.insertarVariableMetodo(ast, #nombre, tret);
}
listaInstrucciones
)
{
contexto.cerrarAmbitoMetodo();
## = ast;
contexto.insertarDecMetodo(##, #nombre, metodoActual);
}
;
exception catch [RecognitionException ce] { reportError(ce); }
/** Declaracin de un atributo **/
decConstructorContexto[ LeLiType claseActual ]
{ LeLiDecConstructorType tipoConstructor = null; }
: #( RES_CONSTRUCTOR
{
tipoConstructor =
new LeLiDecConstructorType( claseActual,
contexto.abrirAmbitoConstructor() );
}
listaDecParamsContexto [tipoConstructor]
listaInstrucciones )
{
## = new ScopeAST ( ##, contexto.cerrarAmbitoConstructor());
contexto.insertarDecConstructor( ##, tipoConstructor );
}
;
exception catch [RecognitionException ce] { reportError(ce); }
/** Bucle mientras **/
instMientras
: #( RES_MIENTRAS
{ contexto.abrirAmbitoMientras(); }
expresion
listaInstrucciones
)
{ ## = new ScopeAST(##, contexto.cerrarAmbitoMientras()); }
;
exception catch [RecognitionException ce] { reportError(ce); }
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -11
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.06 %ompro+aci(n de tipos K 3rimera pasada
/** Bucle hacer-mientras **/
instHacerMientras
: #( RES_HACER
{ contexto.abrirAmbitoHacerMientras(); }
listaInstrucciones
expresion
)
{ ## = new ScopeAST(##, contexto.cerrarAmbitoHacerMientras()); }
;
exception catch [RecognitionException ce] { reportError(ce); }
/** Bucle desde **/
instDesde
: #( RES_DESDE
{ contexto.abrirAmbitoDesde(); }
listaExpresiones
listaExpresiones
listaExpresiones
listaInstrucciones
)
{ ## = new ScopeAST(##, contexto.cerrarAmbitoDesde()); }
;
exception catch [RecognitionException ce] { reportError(ce); }
/** Instruccin condicional **/
instSi
{ Scope s = null; }
: #( RES_SI
{ contexto.abrirAmbitoCondicional(); }
expresion
listaInstrucciones
{ s = contexto.cerrarAmbitoCondicional(); }
(alternativaSi)*
)
{ ## = new ScopeAST(##, s); }
;
exception catch [RecognitionException ce] { reportError(ce); }
/** Alternativas de la instruccin condicional **/
alternativaSi
{ Scope s = null; }
: ( #( BARRA_VERT
{ contexto.abrirAmbitoCondicional(); }
expresion
listaInstrucciones
{ s = contexto.cerrarAmbitoCondicional(); }
)
| #( RES_OTRAS
{ contexto.abrirAmbitoCondicional(); }
listaInstrucciones
{ s = contexto.cerrarAmbitoCondicional(); }
)
)
{ ## = new ScopeAST(##, s); }
;
exception catch [RecognitionException ce] { reportError(ce); }

Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -12
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.06 %ompro+aci(n de tipos K 3rimera pasada
/** Declaracin de un atributo **/
decAtributoContexto [LeLiType claseActual]
{ boolean abstracto = false; }
: #( RES_ATRIBUTO (RES_ABSTRACTO {abstracto=true;})?
t:tipo
nombre:IDENT (v:expresion)? )
{
LeLiType tipo = (LeLiType)((TypeAST)#t).getExpType();
AttributeType tipoAtributo =
new AttributeType( RES_ATRIBUTO,
#nombre.getText(),
tipo,
claseActual );
if(abstracto) tipoAtributo.addModifier("abstracto");
contexto.insertarDecAtributo( ##, #nombre, tipoAtributo, #v);
}
;
exception catch [RecognitionException ce] { reportError(ce); }
listaDecParamsContexto [LeLiMethodType decMetodo]
: #(LISTA_DEC_PARAMS (decParametroContexto[decMetodo])* )
;
exception catch [RecognitionException ce] { reportError(ce); }
/** Declaracin de un parmetro **/
decParametroContexto[LeLiMethodType decMetodo]
: #(RES_PARAMETRO t:tipo nombre:IDENT)
{
LeLiType tipoParametro = (LeLiType)((TypeAST)#t).getExpType();
decMetodo.addParam(tipoParametro);
contexto.insertarDecParametro( ##, #nombre, tipoParametro );
}
;
exception catch [RecognitionException ce] { reportError(ce); }
// -------------- FASE 2: Preparacin de las expresiones ----------
//
// La fase 2 consiste en transformar los AST de las expresiones
// en instancias de antlraux.context.asts.ExpressionAST. Aunque se
// crean los nodos, estn "vacos"; se rellenarn en la segunda pasada
//
expresion
: ( #( OP_MAS expresion expresion )
| #( OP_MENOS expresion expresion )
| #( OP_ASIG expresion expresion )
| #( OP_O expresion expresion )
| #( OP_Y expresion expresion )
| #( OP_IGUAL expresion expresion )
| #( OP_DISTINTO expresion expresion )
| #( OP_MAYOR expresion expresion )
| #( OP_MENOR expresion expresion )
| #( OP_MAYOR_IGUAL expresion expresion )
| #( OP_MENOR_IGUAL expresion expresion )
| #( OP_PRODUCTO expresion expresion )
| #( OP_DIVISION expresion expresion )
| #( OP_MENOS_UNARIO expresion)
| #( OP_MASMAS expresion)
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -1-
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.06 %ompro+aci(n de tipos K 3rimera pasada
| #( OP_MENOSMENOS expresion)
| #( OP_NO expresion)
| #( RES_ESUN acceso tipo)
)
{ ## = new ExpressionAST(##); }
| acceso
;
exception catch [RecognitionException ce] { reportError(ce); }
acceso : #(ACCESO raizAcceso (subAcceso)* )
{ ## = new ExpressionAST(##); }
;
exception catch [RecognitionException ce] { reportError(ce); }
raizAcceso : ( IDENT
| RES_PARAMETRO
| RES_ATRIBUTO
| RES_SUPER
)
{ ## = new ExpressionAST(##); }
| literal
| llamada
| conversion
| expresion
;
exception catch [RecognitionException ce] { reportError(ce); }
literal : ( LIT_ENTERO
| LIT_REAL
| LIT_CADENA
| LIT_NL
| LIT_TAB
| LIT_COM
| LIT_CIERTO
| LIT_FALSO
)
{ ## = new ExpressionAST(##); }
;
exception catch [RecognitionException ce] { reportError(ce); }
llamada : ( #(LLAMADA IDENT listaExpresiones )
| #(RES_CONSTRUCTOR listaExpresiones )
)
{ ## = new ExpressionAST(##); }
;
exception catch [RecognitionException ce] { reportError(ce); }
conversion : #(RES_CONVERTIR expresion tipo)
{ ## = new ExpressionAST(##); }
;
exception catch [RecognitionException ce] { reportError(ce); }
subAcceso : llamada
| IDENT { ## = new ExpressionAST(##); }
| RES_SUPER { ## = new ExpressionAST(##); }
;
exception catch [RecognitionException ce] { reportError(ce); }
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -1)
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.06 %ompro+aci(n de tipos K 3rimera pasada
// -------------- FASE 3: Preparacin de los tipos ----------
//
// En esta fase se transforman los nodos reconocidos por la regla
// "tipo" y se convierten en instancias de antlraux.context.asts.TypeAST.
// Los nodos se inicializan con el tipo que representan
//
tipo
{ Type t = null; }
: ( TIPO_ENTERO { t = LeLiTypeManager.tipoEntero; }
| TIPO_REAL { t = LeLiTypeManager.tipoReal; }
| TIPO_BOOLEANO { t = LeLiTypeManager.tipoBooleano; }
| TIPO_CADENA { t = LeLiTypeManager.tipoCadena; }
| TIPO_VACIO { t = LeLiTypeManager.tipoVacio; }
| i:IDENT { t = contexto.obtenerTipo(i); }
)
{
## = new TypeAST(##);
((TypeAST)##).setExpType(t);
}
;
exception catch [RecognitionException ce] { reportError(ce); }
// ------------ Fase 4: Instalacin de tipos bsicos ---------------
//
// Las reglas de esta fase sirven para insertar los tipos predefinidos
// del lenguaje (tambin llamados "tipos bsicos") en el mbito global
// antes de comenzar a reconocer un nuevo reconocimiento.
//
programaBasico
: #( PROGRAMA (decClase)+ )
{ ## = new ScopeAST(##, contexto.getCurrentScope()); }
;
exception catch [RecognitionException ce] { reportError(ce); }
instalarTiposBasicos : /* nada */
{
contexto.instalarTiposBasicos();
String nombreFichero = "TiposBasicos.leli";
FileInputStream is = null;
try
{
is = new FileInputStream(nombreFichero);
}catch (FileNotFoundException fnfe){
throw new RecognitionException(
"El fichero '"+nombreFichero+"' no se encontr");
}
LeLiLexer lexer = new LeLiLexer(is);
lexer.setTokenObjectClass("antlraux.util.LexInfoToken");
lexer.setFilename(nombreFichero);
LeLiErrorRecoveryParser parser =
new LeLiErrorRecoveryParser(lexer,logger);
parser.setASTNodeClass("antlraux.util.LexInfoAST");
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -10
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.06 %ompro+aci(n de tipos K 3rimera pasada
parser.setFilename(nombreFichero);
try{
parser.programa();
}catch (TokenStreamException tse){
throw new RecognitionException (
"Excepcin TokenStreamException encontrada "+
"mientras se lea el fichero TiposBasicos.leli");
}
AST ast = parser.getAST();
LeLiSymbolTreeParser tp =
new LeLiSymbolTreeParser(logger, contexto);
tp.programaBasico(ast);
// Devolver el primer hijo del programa, que lleva "atados"
// sus "hermanos" (siblings)
## = (LexInfoAST)(tp.getAST().getFirstChild());
contexto.activarComprobaciones();
contexto.tiposBasicosLeidos = true;
}
;
-.#..: $otas !inales sobre el anali8ador
Buc!a +e )a funciona)i+a+ +e este ana)i%a+or se rea)i%a entre 6asti+ores@ )a c)ase LeLiContext
e4erce +e Dfac!a+aE entre e) ana)i%a+or )a 4erarqua +e .m6itos +e 3e3i5 +e manera que en e)
ana)i%a+or no es necesario5 2or e4em2)o5 sa6er que e) ti2o +e) .m6ito -)o6a) es
leli.scopes.GlobalScope o que e) +e )os mto+os es leli.scopes.MethodScope5 que es
una su6c)ase +e) +e )os 6uc)es e instrucciones co+iciona)es5 leli.scopes.InternScope"
*im2)emente se uti)i%an mto+os como abrirAmbitoBucle o insertarDecParametro5
LeLiContext se encar-a +e rea)i%ar to+os )os castin-s )as com2ro6aciones necesarias" En caso
+e que a)-una +e estas com2ro6aciones no sea correcta5 se )an%a una e:ce2ci=n +e) ti2o
antlraux.context.ContextException5 que a) ser una su6c)ase
antlr.RecognitionException se transmite a+ecua+amente a) ana)i%a+or"
;tra ra%=n 2ara uti)i%ar LeLiContext como una c)ase in+e2en+iente en )u-ar +e meter to+o e)
c=+i-o en acciones +e) ana)i%a+or es que +e esta forma LeLiContext 2ue+e ser uti)i%a+o tanto en
)a 2rimera 2asa+a como en )a se-un+a"
Cam6ian+o +e tema5 !a que reseCar que no !emos 4ustifica+o )a necesi+a+ +e tener que
D-uar+arE e) .m6ito actua) en no+os es2ecia)es +e) .r6o) ()as instancias +e ScopeAST)" 7o se
uti)i%an en nin-una 2arte +e) ana)i%a+or O2or qu no )imitarse a sim2)emente construir )a 4erarqua
+e .m6itosQ
Es e0i+ente K L2orque !ace fa)ta +urante )a se-un+a 2asa+aN 3o 0eremos m.s +eteni+amente en )a
fase 1 +e) 2r=:imo ana)i%a+or"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -1,
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
Becci%n -.+: &om'robaci%n de ti'os segunda 'asada
-.+.1: /ntroducci%n
En )a 2rimera 2asa+a +e) ana)i%a+or !emos construi+o )a 4erarqua +e .m6itos +e nuestro
2ro-rama" En )os .m6itos +e +ic!a 4erarqua !emos inc)ui+o )as +ec)araciones +e to+as )as c)ases5
atri6utos5 mto+os5 constructores 2ar.metros 2ertinentes5 +e manera que est.n +is2oni6)es en )a
se-un+a 2asa+a" #s5 )as referencias circu)ares o recursi0as son com2)etamente 2osi6)es"
47*etivos
3a tarea m.s im2ortante +e )a se-un+a 2asa+a ser. com2)etar )os +atos +e )os ExpressionAST
que LeLiSymbolTreeParser se encar-= +e crear" Es +ecir5 !a6r. que ca)cu)ar e) 3A0a)ue5 8A
0a)ue5 EA0a)ue5 e) ti2o +e to+as ca+a una +e )as e:2resiones +e) 2ro-rama"
1os tareas secun+arias tam6in son necesariasF 2or un )a+o es necesario mantener
constantemente e) D.m6ito actua)E K cuan+o se DentraE en e) cuer2o +e una c)ase se +e6e cam6iar
e) .m6ito actua) a) .m6ito +e +ic!a c)ase5 si )ue-o se entra en un mto+o +e +ic!a c)ase 0o)0er a
cam6iar)o5 !asta que se termine" 3a otra tarea consiste en insertar )as +ec)araciones +e )as
varia"les en )os .m6itos" 8ecor+emos que )as 0aria6)es no 2ue+en ser uti)i%a+as en referencias
circu)ares (no 2ue+en ser uti)i%a+as antes +e ser +ec)ara+as)" 9ara e0itar)o5 no se insertan +urante
)a 2rimera 2asa+a5 sino +urante )a se-un+a"
,ases del anlisis
1e nue0o 2or DfaseE enten+eremos Dun con4unto +e re-)as que sir0en 2ara rea)i%ar una tareaE"
Iemos +i0i+i+o e) an.)isis +e )a se-un+a 2asa+a en cuatro fasesF
X En )a fase 1 se mantiene e) D.m6ito actua)E"
X En )a fase ' se insertan )as +ec)araciones +e 0aria6)es en e) .m6ito actua)"
X En )a fase 3 se ca)cu)an )as 2ro2ie+a+es (3A0a)ue5 8A0a)ue5 etc) +e )as e:2resiones +e 3e3i5
e:ce2to +e )os accesos"
X En )a fase 4 ca)cu)amos )as 2ro2ie+a+es +e )as e:2resiones +e )os accesos"
-.+.2: 6e!inici%n del anali8ador
"a7ecera
En )a ca6ecera +e) fic!ero LeLiTypeCheckTreeParser.g encontramos )as o2ciones !a6itua)esF
2rimero )a +e 2ertenencia a) 2aquete leli5 se-ui+a +e )as im2ortaciones"
header
{
package leli;
import ... ; // Importaciones varias
}
3ue-o 0iene )a +ec)araci=n +e )a c)ase +e) ana)i%a+or" LeLiTypeCheckTreeParser es un itera+or
+e .r6o)es +e) )en-ua4e 3e3i5 2or )o tanto es una su6c)ase +e LeLiTreeParserF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -17
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
class LeLiTypeCheckTreeParser extends LeLiTreeParser;
5ona de opciones
3as o2ciones +e) ana)i%a+or son )as que se muestran a continuaci=nF
options
{
importVocab=LeLiSymbolTreeParserVocab;
exportVocab=LeLiTypeCheckTreeParserVocab;
buildAST = false;
ASTLabelType = antlraux.util.LexInfoAST;
}
$ras )as o2ciones +e im2ortaci=n e:2ortaci=n +e 0oca6u)ario5 0emos que buildAST est.
+esacti0a+o@ no es necesario construir nin-?n nue0o #*$ 2orque en )a 2rimera 2asa+a a se
construeron to+os )os no+os necesarios5 aunque )os no+os +e) ti2o ExpressionAST no ten-an
sus 2ro2ie+a+es inicia+as a) 0a)or correcto"
3a ?)tima o2ci=n5 como e) )ector a +e6era sa6er5 automati%a )os Dcastin-sE +e )os no+os5
!acien+o que to+os se 0ean como instancias +e LexInfoAST en )as acciones"
5ona de to9ens
7o se +efine nin-?n toHen nue0o en este ana)i%a+or5 as que )a %ona +e toHens es ine:istente"
5ona de cdigo nativo
3a %ona +e c=+i-o nati0o comien%a con )as !a6itua)es +ec)araciones +e atri6utos +e) ana)i%a+or"
En este caso son tresF
public Logger logger=null;
private LeLiContext contexto;
private LeLiType claseActual = null;
E) 2rimero +e e))os es e) )o--er +e) ana)i%a+or" contexto sir0e 2ara -uar+ar una referencia a)
contexto resu)tante +e )a 2rimera 2asa+a (LeLiSymbolTreeParser.contexto)" 9or ?)timo5
claseActual es una 0aria6)e que 2ermitir. a) ana)i%a+or conocer )a c)ase actua)" Esto es
necesario 2ara im2)ementar )os accesos que in0o)ucran uti)i%ar )a 2a)a6ra reser0a+a super"
$ras )os atri6utos !a +ec)araciones +e atri6utos est.ticos que re2resentan +os ti2os Des2ecia)esE"
*on )os ti2os que se uti)i%ar.n 2ara caracteri%ar )os accesos que comien%an con )a 2a)a6ras
reser0a+as D2ar.metroE o Datri6utoE" *e +iferenciar.n +e) resto +e )os 2ar.metros 2or sus
etiquetas5 que son RES_PARAMETRO RES_ATRIBUTO res2ecti0amente"
public static final LeLiType tipoParametroAux =
new LeLiType(RES_PARAMETRO,"parmetro", null, null, null);
public static final LeLiType tipoAtributoAux =
new LeLiType(RES_ATRIBUTO,"atributo", null, null, null);
Estos +os ti2os no !an si+o inc)ui+os en LeLiTypeManager como e) resto +e )os ti2os
2re+efini+os +e 3e3i 2orque so)amente se uti)i%an en )a se-un+a 2asa+a"
$ras )as +ec)araciones +e atri6utos tenemos )a e) constructor +e )a c)aseF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -1/
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
LeLiTypeCheckTreeParser( Logger logger,
LeLiContext contexto )
{
this();
this.logger = logger;
this.contexto = contexto;
}
J tras e) constructor !a 0arias formas +e reportErrorF
public void reportError( String msg,
String filename,
int line,
int column )
{
if(null==logger)
{
logger = new Logger("error", System.err);
}
logger.log( msg, 1, filename, line, column);
}
public void reportError(RecognitionException e)
{
reportError( e.getMessage(), e.getFilename(),
e.getLine(), e.getColumn() );
}
public void reportError( String msg,
LexInfo info )
{
reportError( msg, info.getFilename(),
info.getLine(), info.getColumn()) ;
}
3os +os 2rimeros son )os !a6itua)es" E) tercero es nue0oF se 2ro2orciona un mensa4e un
3e:,nfo5 se -enera e) )o- +e error a 2artir +e )"
-.+.3: 5ase 1 Fantener el (mbito actual
1urante )a 2rimera 2asa+a nos !emos toma+o )a mo)estia +e DinsertarE ciertas referencias a
.m6itos en ciertos no+os +e) ti2o ScopeAST" O9or quQ
3a ra%=n es senci))aF necesitamos sa6er cu.n+o cam6iar +e .m6ito +urante )a se-un+a fase" Es
cierto que 2o+ramos rea)i%ar)o +e otra formaF ca+a 0e% que ))e-.ramos a )a +ec)araci=n +e una
c)ase nue0a5 ten+ramos que 6uscar en e) .m6ito -)o6a) )a +ec)araci=n +e )a c)ase5 o6tener +e e))a
e) .m6ito5 !acer)o e) D.m6ito actua)E" Ia6ra que rea)i%ar o2eraciones 2areci+as 2ara ca+a
mto+o5 constructor5 6uc)e o a)ternati0a con+iciona)" Esto se con0ertira en una canti+a+
im2ortante +e )neas +e c=+i-o5 m.s +e )as necesarias 2ara rea)i%ar)o +e esta otra manera (si
e:c)uimos e) c=+i-o +e )a c)ase ScopeAST5 que es ama6)emente 2ro2orciona+a 2or antlraux)"
#+em.s5 e) c=+i-o sera m.s ineficiente sin ScopeASTs"
9ara ir cam6ian+o e) .m6ito actua) uti)i%aremos +os mto+os es2ecficos +e )a fase 1 que
aCa+iremos a )a %ona +e c=+i-o nati0oF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -1<
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
public void cambiaAmbitoActual(LexInfoAST ast)
{
Scope nuevoAmbito = ((ScopeAST)ast).getScope();
contexto.setCurrentScope(nuevoAmbito);
}
public void cierraAmbitoActual()
{ contexto.toFather(); }
Estos +os mto+os se encar-an +e o6tener e) .m6ito a 2artir +e una instancia +e ScopeAST +e
Dterminar)oE" Cuan+o un .m6ito se termina +e4a +e ser e) actua)5 2asan+o a ser)o su 2a+re"
LEm2ecemosN
;rograma
E) 2rimer .m6ito que contro)aremos ser. e) .m6ito inicia)5 a) )eer )a ra% +e) #*$F
programa
: { cambiaAmbitoActual( #programa ); }
#( PROGRAMA (decClase)+ )
;
exception catch [RecognitionException ce] { reportError(ce); }
7orma)mente )as acciones +e esta fase comen%ar.n con una acci=n en )a que se in0oque a
cambiaAmbitoActual5 fina)i%ar.n con otra en )a que se in0oque a cierraAmbitoActual" En
este caso5 no o6stane5 no se cierra e) .m6ito5 2ues cerrar e) .m6ito -)o6a) +e4ara a LeLiContext
en una situaci=n 2e)i-rosa (currentScope==null)"
7=tese que ca2turamos e) error 2ara que e) )o--er +e) ana)i%a+or 2ue+a +ar cuenta +e )" 3os
mane4a+ores +e e:ce2ciones +e esta fase +e) ana)i%a+or son to+os i-ua)es5 as que no !a6)aremos
m.s +e e))os"
:eclaraciones de clases
3as +ec)araciones +e c)ases se reconocen f.ci)menteF
decClase
: { cambiaAmbitoActual( #decClase ); }
#( RES_CLASE nombre:IDENT
{ claseActual = contexto.obtenerTipo(nombre); }
clausulaExtiende
listaMiembros )
{ cierraAmbitoActual(); }
;
exception catch [RecognitionException ce] { reportError(ce); }
3o ?nico +i-no +e ser resa)ta+o en esta re-)a es que se actua)i%a e) atri6uto claseActual"
:eclaraciones de m2todos 3 constructores
3as +ec)araciones +e mto+os constructores son senci))as@ sim2)emente se reconocen )os
e)ementos que )as forman5 a6rien+o cerran+o )os .m6itos con0enientemente"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -2
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
decMetodo
: { cambiaAmbitoActual( #decMetodo ); }
#( RES_METODO ( RES_ABSTRACTO )? tipo
IDENT listaDecParams listaInstrucciones
)
{ cierraAmbitoActual(); }
;
exception catch [RecognitionException ce] { reportError(ce); }
decConstructor
: { cambiaAmbitoActual( #decConstructor ); }
#( RES_CONSTRUCTOR listaDecParams listaInstrucciones )
{ cierraAmbitoActual(); }
;
exception catch [RecognitionException ce] { reportError(ce); }
Bucles
J )os 6uc)es tam6in son mu senci))os" *im2)emente !a que reconocer)os5 a6rien+o cerran+o
.m6itos"""
instMientras
: { cambiaAmbitoActual( #instMientras ); }
#( RES_MIENTRAS expresion listaInstrucciones )
{ cierraAmbitoActual(); }
;
exception catch [RecognitionException ce] { reportError(ce); }
instHacerMientras
: { cambiaAmbitoActual( #instHacerMientras ); }
#( RES_HACER listaInstrucciones expresion )
{ cierraAmbitoActual(); }
;
exception catch [RecognitionException ce] { reportError(ce); }
instDesde
: { cambiaAmbitoActual( #instDesde ); }
#( RES_DESDE
listaExpresiones listaExpresiones listaExpresiones
listaInstrucciones )
{ cierraAmbitoActual(); }
;
exception catch [RecognitionException ce] { reportError(ce); }
Instrucciones condicionales
3as re-)as que reconocen )as instrucciones con+iciona)es son tan senci))as como )as anterioresF
instSi
: { cambiaAmbitoActual( #instSi ); }
#( RES_SI expresion listaInstrucciones
{ cierraAmbitoActual(); }
(alternativaSi)* )
;
exception catch [RecognitionException ce] { reportError(ce); }
alternativaSi
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -21
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
: { cambiaAmbitoActual ( #alternativaSi ); }
( #(BARRA_VERT expresion listaInstrucciones)
| #(RES_OTRAS listaInstrucciones)
)
{ cierraAmbitoActual(); }
;
exception catch [RecognitionException ce] { reportError(ce); }
-.+.": 5ase 2: Adici%n de las variables locales a los (mbitos
*e trata +e una fase mu corta@ so)amente cuenta con una re-)a5 instDecVarF
instDecVar
: #(INST_DEC_VAR t:tipo nombre:IDENT (valor:expresion|le:listaExpresiones)?)
{
LeLiType type = (LeLiType) ((TypeAST)t).getExpType();
contexto.insertarDecVariable( #instDecVar, nombre, type, valor, le);
}
;
exception catch [RecognitionException ce] { reportError(ce); }
Esta re-)a es un ca)co +e )a re-)a decParametro +e )a 2rimera 2asa+a" 3as 0aria6)es +e 3e3i
2ue+en ser caracteri%a+as +irectamente con su ti2o (no necesitan un ti2o Des2ecia)E como )os
atri6utos o )os mto+os)"
En )a si-uiente fase es +on+e )as cosas se com2)ican"
-.+.#: 5ase 3: x'resiones
3)amaremos caractersticas de las expresiones a) ti2o5 3A0a)ue5 8A0a)ue EA0a)ue" En esta fase
+e) ana)i%a+or ca)cu)aremos )as caractersticas +e )as e:2resiones +e ca+a 2ro-rama" 9or )o tanto
0amos a estar tratanto con )os #*$s que se reconocen con )a re-)a e:2resion"
E) mo+o +e actuaci=n ser. e) si-uiente" 9ara ca+a e:2resi=n o con4unto +e e:2resionesF
X 3as e:2resiones +e esta fase est.n forma+as 2or un o2era+or uno o m.s o2eran+os" E)
2rimer 2aso es com2ro6ar que 2ue+en )eerse )os o2eran+os que +e6en 2o+er )eerse 2ue+en
escri6irse )os que +e6en 2o+er escri6irse" Es +ecir5 !a que com2ro6ar que )os 3A0a)ues 8A
0a)ues +e )os o2eran+os son correctos"
X 1es2us ca)cu)aremos )os 0a)ores +e 3A0a)ue 8A0a)ue 2ara )a e:2resi=n que estemos
recorrien+o"
X 1es2us ca)cu)aremos e) ti2o" 1e6eremos tener en cuenta incom2ati6i)i+a+es +e ti2os" En caso
+e error irre2ara6)e5 !aremos que e) ti2o +e )a e:2resi=n sea TIPO_ERROR"
X >ina)mente ca)cu)aremos5 si es 2osi6)e5 e) EA0a)ue +e )a e:2resi=n"
$o+as )as e:2resiones +e 3e3i se reconocen con )a re-)a e:2resion5 as que 2or e))a +e6emos
em2e%ar" 9ara sim2)ificar un 2oco )as cosas en e) ni0e) )a !emos +i0i+i+o en cuatro su6 re-)asF
expresion : expresionBinaria
| expresionUnaria
| expresionEsUn
| acceso
;
3as 0eremos to+as en este a2arta+o e:ce2to acceso sus re-)as asocia+as5 que son o64eto +e
estu+io en e) si-uiente"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -22
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
error+-presion
1urante )as fases ' tres5 frecuentemente tenemos que !acer com2ro6aciones que no siem2re
son satisfec!as 2or e) c=+i-o +e) usuario +e 3e3i" 9or e4em2)o5 2ue+e intentar restar un entero a
una ca+ena5 o intentar )eer una e:2resi=n sin 3A0a)ue" En ta) caso se )an%ar. una e:ce2ci=n5 que
+e6er. ser ca2tura+a 2or e) mane4a+or +e e:ce2ciones a+ecua+o" E) mensa4e +e error ser.
mostra+o 2or 2anta))a +e )a forma usua)5 2ero a+em.s ser. necesario mo+ificar )as caractersticas
+e) no+o +on+e se !aa 2ro+uci+o e) error5 2ara ase-urarse +e que no se 2ro+ucen Dcasca+as +e
erroresE" 9ara e))o +e6emos !acer que )as caractersticas +e )a e:2resi=n +on+e se !a 2ro+uci+o e)
error tomen 0a)ores Dse-urosE" 3os 0a)ores se-uros son cierto 2ara e) 3A0a)ue e) 8A0a)ue5 e)
ti2o error 2ara e) ti2o nu)) 2ara e) EA0a)ue +e )a e:2resi=n" 1e esta forma5 2o+emos uti)i%ar e)
mto+o errorExpresion (que +e6e ser aCa+i+o en )a %ona +e c=+i-o nati0o +e) itera+or) 2ara
automati%ar e) 2roceso en e) caso +e que se 2ro+u%ca un errorF
public void errorExpresion( RecognitionException re,
ExpressionAST ast )
{
errorExpresion( re, ast, true, true,
LeLiTypeManager.tipoError,null);
}
Este mto+o se )imita a in0ocar una 0ersi=n De:ten+i+aE5 que 2ermite es2ecificar )os 0a)ores
se-uros +e )a e:2resi=n en )u-ar +e )os que se uti)i%an 2or +efectoF
public void errorExpresion( RecognitionException re, ExpressionAST ast,
boolean Rvalue, boolean LValue,
LeLiType tipo, Object EValue )
{
reportError(re);
ast.setExpType(tipo);
ast.setRValue(RValue);
ast.setLValue(LValue);
ast.setEValue(EValue);
}
#m6as formas +e errorE:2resion 2ue+en ser uti)i%a+as en )os mane4a+ores +e e:ce2ciones +e )as
re-)as +e esta fase )a si-uiente" Pui%.s se 0er. m.s c)aro cuan+o )as 0eamos"
+-presin NesEnO
Esta e:2resi=n es )a que uti)i%a )a 2a)a6ra reser0a+a Des/nE" 3a sinta:is es un no+o +e ti2o
RES_ESUN en )a ra%5 una e:2resi=n en e) 2rimer !i4o un ti2o en e) se-un+oF
expresionEsUn : #(RES_ESUN e:expresion t:tipo)
/na 0e% reconoci+a )a estructura5 +e6emos rea)i%ar nuestras o2eraciones con una acci=n"
Comen%aremos !acien+o e) casting a ExpressionAST +e )a re-)aF
{
ExpressionAST ast = (ExpressionAST)#expresionEsUn;
3o 2rimero que +e6emos !acer es com2ro6ar que )a e:2resi=n DeE tiene 8A0a)ue (se 2ue+e
D)eerE)" *i no es e) caso5 +e6emos )an%ar una e:ce2ci=nF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -2-
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
ExpressionAST exp = (ExpressionAST)e;
if(!exp.getRValue())
{
throw new ContextException(
"Se necesita una expresin con R-value",
ast );
}
$o+a e:2resi=n esUn +e0ue)0e un 6oo)eano5 in+e2en+ientemente +e su conteni+o" #+em.s5 e)
6oo)eano es +e Dso)o )ecturaE@ es +e+ir5 que tiene 8A0a)ue 2ero no 3A0a)ue" *i tra+ucimos to+o
esto )itera)mente ten+remosF
ast.setExpType(LeLiTypeManager.tipoBooleano);
ast.setLValue(false);
ast.setRValue(true);
3o que nos +e4a ?nicamente e) EA0a)ue 2or +eterminar" E) EA0a)ue +e una e:2resi=n es e) D0a)orE
+e una e:2resi=n" 9or e4em2)o5 e) EA0a)ue +e 1 esUn Entero es e) 6oo)eano cierto"
E) 2ro6)ema +e ca)cu)ar e) EARa)ue +e )a e:2resi=n es que !a que tener en cuenta 0arias re-)as"
#s5 sea tipoExpresion e) ti2o +e )a e:2resi=n +e )a i%quier+a +e) esUn sea tipoDer e) ti2o a
su +erec!a" EntoncesF
X *i e) tipoExpresion es e) ti2o error (ocurri= un error mientras se reso)0a )a e:2resi=n)
entonces e) 0a)or +e )a e:2resi=n esUn es cierta (2orque e) ti2o error es 2or +efecto
Dcom2ati6)e con to+oE)"
X *i tipoDer es err=neo (e) usuario !a escrito e) nom6re +e una c)ase ine:istente) entonces
tam6in es cierto"
X *i tipoDer es Objeto5 entonces )a e:2resi=n es siem2re cierta"
X *i tipoExpresion es una su6c)ase +e tipoDer5 entonces )a e:2resi=n es siem2re cierta"
X *i tipoExpresion no es una su6c)ase +e tipoDer a su 0e% tipoDer no es una su6c)ase +e
tipoExpresion5 entonces )a e:2resi=n esUn es 4alsa"
X En cua)quier otro caso (tipoDer es una su6c)ase +e tipoExpresion) e) resu)ta+o +e )a
e0a)uaci=n no 2ue+e conocerse en tiem2o +e com2i)aci=n5 +e6e ca)cu)arse en tiem2o +e
e4ecuci=n"
$ra+ucimos to+as estas re-)as a c=+i-o 4a0a5 o6tenemos )o si-uienteF
LeLiType tipoExpresion = (LeLiType)((ExpressionAST)e).getExpType();
LeLiType tipoDer = (LeLiType)((TypeAST)t).getExpType();
if( tipoExpresion.getTag()==TIPO_ERROR
|| ( tipoDer.getTag()==TIPO_ERROR ||
tipoDer.getName().equals("Objeto") )
|| tipoExpresion.isA(tipoDer) )
{
ast.setEValue(new Boolean(true));
}
else if ( !tipoExpresion.isA(tipoDer) &&
!tipoDer.isA(tipoExpresion) )
{
ast.setEValue(new Boolean(false));
} // en otro caso E-value se queda como est (a null)
}
;
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -2)
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
9ara fina)i%ar5 uti)i%aremos un mane4a+or +e e:ce2ciones que 2on+r. 0a)ores Dse-urosE en )a
e:2resi=n a+em.s +e im2rimir e) mensa4e +e error corres2on+iente" 9ara e))o in0ocaremos e)
mto+o errorExpresion que !a6amos +efini+o en )a %ona +e c=+i-o nati0o +e) ana)i%a+orF
exception catch [RecognitionException re]
{
errorExpresion( re, (ExpressionAST)#expresionEsUn,
false, true, LeLiTypeManager.tipoBooleano, null );
}
En este caso no uti)i%amos )os 0a)ores se-uros 2or +efecto +e) )en-ua4e5 sino que uti)i%amos unos
2ersona)i%a+os 2ara )a re-)a" 1e a!ora en a+e)ante 2rescin+iremos +e comentar )os mane4a+ores
+e e:ce2ciones +e )as re-)as +e )as fases 3 4@ to+os son mu simi)ares"
+-presiones unarias
3as e:2resiones unarias +e 3e3i son )as que tienen un o2era+or como ra% un ?nico o2eran+o
como !i4o" Esto inc)ue )as o2eraciones +e cam6io +e si-no5 2ost incremento5 2ost +ecremento
ne-aci=n )=-icaF
expresionUnaria
:
( #(OP_MENOS_UNARIO expresion)
| #(OP_MASMAS expresion)
| #(OP_MENOSMENOS expresion)
| #(OP_NO expresion)
)
{
// accin
}
7=tese que !emos a-ru2a+o )os cuatro 2atrones .r6o) en una so)a su6 re-)a (+e)imita+a 2or )os
2arntesis seCa)a+os en e) c=+i-o) 2orque )a acci=n ser. )a misma 2ara to+os"
Comen%aremos con e) 3A0a)ue 8A0a)ue" *e +a )a casua)i+a+ +e que to+as )as e:2resiones
unarias +e0ue)0en 0a)ores +e Dso)o )ecturaE K con 8A0a)ue 2ero sin 3A0a)ue" #s que so)amente
!a que +ar)es )os 0a)ores a+ecua+osF
// Hacemos el casting
ExpressionAST raiz = (ExpressionAST) #expresionUnaria;
raiz.setLValue(false);
raiz.setRValue(true);
#!ora 0ienen )as com2ro6aciones" Es necesario que e) o2eran+o ten-a 8A0a)ue 2ara que )a
e:2resi=n sea 0.)i+a5 as que en caso contrario se )an%a una e:ce2ci=nF
ExpressionAST operandoAST = (ExpressionAST)(raiz.getFirstChild());
if(!operandoAST.getRValue())
throw new ContextException(
"Se necesita una expresin con rvalue", operando );
En e) caso +e )as o2eraciones +e 2ost incremento 2ost +ecremento es necesario5 a+em.s5 que e)
o2eran+o ten-a 3A0a)ue (sea Dmo+ifica6)eE)F
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -20
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
if( ( raiz.getType()==OP_MASMAS ||
raiz.getType()==OP_MENOSMENOS) &&
!operandoAST.getLValue() )
throw new ContextException(
"Se necesita una expresin con lvalue", operandoAST );
Iemos termina+o con 3A0a)ue 8A0a)ue5 as que 2asamos a) ti2o +e )a e:2resi=n" 3o 2rimero
que !emos +e !acer es o6tener e) ti2o +e) o2eran+o" 1a+o que so)amente a)-unos ti2os 6.sicos
+e 3e3i 2ue+en inter0enir en )as e:2resiones unarias (Entero5 Real Booleano) que )os ti2os
6.sicos +e 3e3i 2ue+en +iferenciarse +irectamente con su etiqueta5 0amos a uti)i%ar un entero
2ara )os ti2os5 )os +iferenciaremos con sus etiquetasF
int tipoOperando = operandoAST.getExpType().getTag();
Type t = null; // aqu guardaremos el tipo de la expresin
3o 2rimero que com2ro6aremos es que e) ti2o +e) o2eran+o no sea err=neo@ +e ser as5 tam6in
)o ser. e) +e )a e:2resi=n5 !a6remos aca6a+o +e ca)cu)ar su ti2oF
if(tipoOperando==TIPO_ERROR)
t = LeLiTypeManager.tipoError;
*i e) o2eran+o no es err=neo5 entonces e) ti2o +e )a e:2resi=n 2ue+e ser ca)cu)a+o con )as
si-uientes re-)asF
X En e) caso +e) cam6io +e si-no5 e) 2ost incremento e) 2ost +ecremento5 e) ti2o +e )a
e:2resi=n coinci+e con e) +e) o2eran+o5 siem2re cuan+o ste sea numrico (Entero o 8ea))"
En otro caso se 2ro+uce un error"
X En e) caso +e )a ne-aci=n5 )a e:2resi=n unaria es 6oo)eana si e) o2eran+o es 6oo)eano5
err=nea en otro caso"
X En cua)quier otro caso )a situaci=n es in+efini+a5 2or )o tanto err=nea"
3as re-)as anteriores se tra+ucen a) si-uiente c=+i-o (inc)uimos )a com2ro6aci=n +e
tipoOperando==TIPO_ERROR 2or c)ari+a+)
if(tipoOperando==TIPO_ERROR)
t = LeLiTypeManager.tipoError;
else
{
switch(raiz.getType())
{
case OP_MENOS_UNARIO: case OP_MASMAS:
case OP_MENOSMENOS:
if(isNumeric(tipoOperando))
t = operandoAST.getExpType();
else t = null;
break;
case OP_NO:
if(tipoOperando==TIPO_BOOLEANO)
t = LeLiTypeManager.tipoBooleano;
else t = null;
break;
default :
t = null;
break;
}
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -2,
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
}
if(null==t)
{
throw new ContextException(
"El tipo '"+ operandoAST.getExpType() +
"' no es compatible con el operador unario'" +
raiz.getText() + "'", operandoAST);
}
raiz.setExpType(t);
;6sr0ese e) mto+o isNumeric" *u im2)ementaci=n no 2o+ra ser m.s sim2)eF
public boolean isNumeric(int id)
{ return (id==TIPO_ENTERO || id==TIPO_REAL); }
Ia que insertar)o en )a %ona +e c=+i-o nati0o"
#!ora so)amente nos que+a ca)cu)ar e) EA0a)ue +e )a e:2resi=n" 3as re-)as 2ara ca)cu)ar)o sonF
X *i e) o2eran+o no tiene EA0a)ue5 entonces )a e:2resi=n unaria com2)eta no tiene EARa)ue"
X En )as e:2resiones +e ne-aci=n5 si e) EA0a)ue +e) o2eran+o es un 6oo)eano5 entonces e) EA0a)ue
es )a ne-aci=n +e +ic!o 6oo)eano"
X En e) 2ost incremento5 e) o2eran+o +e6e tener un EA0a)ue entero o f)otante" Entonces e) EA
0a)ue +e) 2ost incremento ser. e) EA0a)ue +e) o2eran+o + 1"
X E) 2ost +ecremento es i+ntico5 2ero restan+o en 0e% +e suman+o"
X E) cam6io +e si-no so)amente 2ue+e a2)icarse a ti2os numricos5 su EA0a)ue es e) EA0a)ue +e)
o2eran+o (a sea rea) o entero) cam6ia+o +e si-no"
X En to+os )os +em.s casos e) EA0a)ue no 2ue+e ca)cu)arse5 ser. nu))"
3o que en c=+i-o 0iene a ser )o si-uienteF
if(null==o)
raiz.setEValue(null);
else
{
switch(raiz.getType())
{
case OP_NO:
if(o instanceof Boolean)
raiz.setEValue(new Boolean(!((Boolean)o).booleanValue()));
break;
case OP_MENOS_UNARIO:
if(o instanceof Integer)
raiz.setEValue(new Integer(-((Integer)o).intValue()) );
else if (o instanceof Float)
raiz.setEValue(new Float(-((Float)o).floatValue()) );
break;
case OP_MASMAS:
if(o instanceof Integer)
raiz.setEValue(new Integer( ((Integer)o).intValue()+1 ) );
else if (o instanceof Float)
raiz.setEValue(new Float( ((Float)o).floatValue()+1) );
break;
case OP_MENOSMENOS:
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -27
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
if(o instanceof Integer)
raiz.setEValue(new Integer( ((Integer)o).intValue()-1 ) );
else if (o instanceof Float)
raiz.setEValue(new Float( ((Float)o).floatValue()-1) );
default: raiz.setEValue(null); break;
}
}
#qu se aca6a )a acci=n )a re-)a" Como siem2re +e6e ir suce+i+a +e) mane4a+or +e e:ce2ciones
corres2on+ienteF
exception catch [RecognitionException re]
{
errorExpresion( re, (ExpressionAST)#expresionUnaria,
false, true, LeLiTypeManager.tipoError, null );
}
+-presiones 7inarias
3as caractersticas +e )as e:2resiones 6inarias no son m.s +ifci)es +e ca)cu)ar que e) resto" E)
?nico 2ro6)ema que 2resentan es e) n?mero +e 2osi6i)i+a+es que 2resentanF !a 13 o2era+ores
6inarios en 3e3i" #+em.s5 a)-unos +e e))os5 como )a suma5 son trementamente 0ers.ti)es se
uti)i%an en un mont=n +e situaciones 2areci+as5 2ero +iferentes" $o+os estos casos !a que
tener)os en cuenta5 e))o 2ro+uce un c=+i-o 6astante Da2aratosoE"
3os 13 o2era+ores 6inarios son )a suma5 resta5 2ro+ucto5 +i0isi=n5 +isunci=n ([o[)5 con4unci=n
([[)5 i-ua)+a+5 +esi-ua)+a+5 maor5 maor o i-ua)5 menor5 menor o i-ua) asi-naci=n"
expresionBinaria
:
( #(OP_MAS expresion expresion)
| #(OP_MENOS expresion expresion)
| #(OP_O expresion expresion)
| #(OP_Y expresion expresion)
| #(OP_IGUAL expresion expresion)
| #(OP_DISTINTO expresion expresion)
| #(OP_MAYOR expresion expresion)
| #(OP_MENOR expresion expresion)
| #(OP_MAYOR_IGUAL expresion expresion)
| #(OP_MENOR_IGUAL expresion expresion)
| #(OP_PRODUCTO expresion expresion)
| #(OP_DIVISION expresion expresion)
| #(OP_ASIG expresion expresion)
)
{
// acciones aqu
}
;
Como 0eremos5 )as acciones a rea)i%ar no son 2ocas"
Comencemos 2or com2ro6ar e) 3A0a)ue 8A0a)ue +e )os o2eran+os que )o 2recisen"
*o)amente )a asi-naci=n 2recisa +e 3A0a)ue en uno +e sus o2eran+os (e) +e )a i%quier+a)" En este
caso concreto resu)ta m.s c=mo+o !acer e) test 4usto +e6a4o +e )a re-)a5 en )u-ar +e +entro +e )a
acci=n -)o6a)" #sF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -2/
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
expresionBinaria
:
( #(OP_MAS expresion expresion)
...
| #(OP_ASIG eizq:expresion expresion)
{
if( !((ExpressionAST)eizq).getLValue() )
throw new ContextException(
"La parte izquierda de la asignacin no tiene l-value",
#expresionBinaria );
}
)
Ja en )a acci=n5 )as o2eraciones re)aciona+as con e) 3A0a)ue e) 8A0a)ue son mu senci))as@ e)
si-uiente c=+i-o +e6era ser com2rensi6)e 2ara e) )ectorF
ExpressionAST raiz = (ExpressionAST) #expresionBinaria;
// Calculamos r-value y l-value
raiz.setLValue(false); // L value siempre falso
raiz.setRValue(true); // R siempre cierto
3o si-uiente que 0amos a !acer ser. com2ro6ar e) 8A0a)ue +e )os o2era+ores5 que +e6e ser cierto
2ara )os +os en to+os )os casos" 9ara e))o +e6eremos o6tener )os #*$s +e +ic!os o2era+ores"
7=tese que se uti)i%an )os mto+os +e na0e-aci=n +e )os #*$s (getFirstChild
getNextSibling) 2ara o6tener)os5 en )u-ar +e uti)i%ar etiquetas" En este caso era m.s eficiente
senci))o (#7$38 no 2ermite uti)i%ar )a misma etiqueta 0arias 0eces en )a misma re-)a" ; 6ueno5
s )o 2ermite5 2ero e) c=+i-o -enera+o no com2i)a)"
// Obtenemos los dos operandos
ExpressionAST ei = (ExpressionAST)(raiE.%etJirst:Aild());
ExpressionAST ed = (ExpressionAST)(ei.%et5e<tSiblin%());
if(!ei.getRValue())
throw new ContextException(
"Se necesita una expresin con r-value", ei );
if(!ed.getRValue())
throw new ContextException(
"Se necesita una expresin con r-value", ed );
#!ora !a que ca)cu)ar e) ti2o +e )a e:2resi=n" 3as re-)as son )as si-uientesF
X *i e) ti2o +e cua)quiera +e )os +os o2eran+ose es err=neo5 entonces e) ti2o +e )a e:2resi=n es
err=neo"
X 3a suma 2ermite sumar Entero/Entero (resu)ta+oF Entero)5 Entero/Real (Real)5
Real/Entero(Real)5 Real/Real(Real)5 Cadena/cua)quier ti2o 6.sico (resu)ta+oF Cadena)"
X 3a resta e) 2ro+ucto )a +i0is=nF Entero/Entero (resu)ta+oF Entero)5 Entero/Real
(Real)5 Real/Entero(Real)5 Real/Real(Real)
X 3a asi-naci=n siem2re tiene un ti2o 0aco"
X 3a con4unci=n )a +isunci=n son +e ti2o 6oo)eano5 siem2re cuan+o se a2)iquen so6re
o2eran+os 6oo)eanos"
X 3a com2araci=n )a i-ua)+a+ funcionan entre ti2os i-ua)es ti2os numricos5 son
e:2resiones 6oo)eanas"
X Baor5 menor5 maor o i-ua) menor o i-ua) act?an so)amente so6re ti2os numricos (no se
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -2<
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
2ue+en com2arar ca+enas) en caso +e que )os +os o2eran+os sean numricos )a e:2resi=n es
+e ti2o 6oo)eano"
X En cua)quier otro caso e) ti2o es err=neo5 !a que )an%ar un error"
E) c=+i-o necesario 2ara im2)ementar este com2ortamiento es simi)ar a) que 0eamos en )as
e:2resiones unariasF
if(ti==TIPO_ERROR || td==TIPO_ERROR)
t = LeLiTypeManager.tipoError;
else
{
switch(raiz.getType())
{
case OP_MAS:
if(ti==TIPO_CADENA || td==TIPO_CADENA)
t = LeLiTypeManager.tipoCadena;
else if(ti==TIPO_ENTERO && td==TIPO_ENTERO)
t = LeLiTypeManager.tipoEntero;
else if(isNumeric(ti) && isNumeric(td))
t = LeLiTypeManager.tipoReal;
break;
case OP_MENOS: case OP_PRODUCTO: case OP_DIVISION:
if(ti==TIPO_ENTERO && td==TIPO_ENTERO)
t = LeLiTypeManager.tipoEntero;
else if(isNumeric(ti) && isNumeric(td))
t = LeLiTypeManager.tipoReal;
break;
case OP_ASIG:
t = LeLiTypeManager.tipoVacio;
break;
case OP_Y: case OP_O:
if(ti==TIPO_BOOLEANO && td==TIPO_BOOLEANO)
t = LeLiTypeManager.tipoBooleano;
break;
case OP_IGUAL: case OP_DISTINTO:
if( ti==TIPO_BOOLEANO && td==TIPO_BOOLEANO ||
ti==TIPO_CADENA && td==TIPO_CADENA ||
isNumeric(ti) && isNumeric(td) )
t = LeLiTypeManager.tipoBooleano;
break;
case OP_MAYOR: case OP_MENOR:
case OP_MAYOR_IGUAL: case OP_MENOR_IGUAL:
if( isNumeric(ti) && isNumeric(td) ||
TIPO_CADENA==ti && TIPO_CADENA==td )
t = LeLiTypeManager.tipoBooleano;
break;
}
}
if(null==t)
{
throw new ContextException( "El tipo '"+
ei.getExpType() + "' no es compatible con '" +
ed.getExpType() + "' con respecto al operador '"+
raiz.getText() + "'",
raiz);
}
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota --
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
raiz.setExpType(t);
9or ?)timo que+a ca)cu)ar e) EA0a)ue +e )as e:2resiones 6inarias" csta !a si+o una +e )as tareas
m.s )a6oriosas a )as que !e teni+o que enfrentarme@ se trata +e un -i-antesco 6uc)e s<itc! con
)itera)mente 4' com2ro6aciones DifE" 7o es +ifci) +e com2ren+er5 es sim2)emente mu )a6orioso"
Be a6sten+r +e e:2)icar una a una to+as )as re-)as5 tam6in +e 2resentar aqu e) c=+i-o" E)
)ector que )o +esee 2o+r. encontrar)o a) fina) +e) a2arta+o"
/na 0e% ca)cu)a+o e) EA0a)ue +e )a e:2resi=n so)amente que+ar. ca2turar )as e:ce2ciones" En
este caso 0amos a uti)i%ar )os 0a)ores se-uros 2or +efectoF
}
; // fin de la regla
exception catch [RecognitionException re]
{ errorExpresion(re, (ExpressionAST)#expresionBinaria); }
-.+.+: 5ase ": Accesos
3os accesos son un ti2o es2ecia) +e e:2resi=n5 que no im2)ica )a uti)i%aci=n +e nin-?n o2era+or"
*on )as 2artcu)as 6.sicas a 2artir +e )as cua)es se construen )as e:2resiones (to+as )as !o4as +e)
#*$ +e una e:2resi=n son accesos)" #) formar 2arte +e )as e:2resiones com2arten con e))as sus
caractersticas (ti2o5 3A0a)ue5 8A0a)ue5 EA0a)ue)" En este a2arta+o ca)cu)aremos esas otras
caractersticas"
/n acceso est. forma+o 2or un 2rimer e)emento5 ))ama+o )a Dra% +e) accesoE5 se-ui+a 2or cero o
m.s Dsu6AaccesosE" $anto )a ra% como )os su6 su6accesos tienen caractersticas +e e:2resiones"
Cuan+o no !a su6accesos5 )as caractersticas +e) acceso son )as +e su ra%" En otro caso5 )as
caractersticas +e) acceso son )as +e) ?)timo su6acceso +e )a )ista"
*int.cticamente5 )a ra% a2arece a) 2rinci2io5 ca+a su6 acceso se ani+a uti)i%an+o un 2untoF
raiz.subAcceso1.subAcceso2.subAcceso3
E) #*$ que re2resenta un acceso uti)i%a e) toHen ima-inario ACCESO como ra%" *u 2rimer !i4o es
e) #*$ +e )a ra% +e) acceso5 si !a su6 accesos stos son !i4os a+iciona)es" /na i)ustraci=n
2ue+e au+ar a ac)arar este -a)imatasF
Ilustracin 7.1: /01 de un acceso
Ca+a su6 acceso (e:ce2to 2ro6a6)emente e) ?)timo) tiene un .m6ito asocia+o en e) cua) +e6e
encontrarse e) si-uiente acceso +e )a )ista" 9or e4em2)o5 su2on-amos )a c)ase Persona que tiene
un atri6uto Nombre +e ti2o ca+ena que a su 0e% tiene un mto+o Entero )on-itu+" E) si-uiente
acceso ser. 0.)i+o entoncesF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota --1
ACCESO
AST
de la
raz
AST
del
subacceso 1
AST
del
subacceso 2
...
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
Persona cid(Rodrigo, Daz de Vivar);
Sistema.imprime(cid.5ombre.lon%itud()); // Imprime 7
1e )o anterior se +e+uce que cada punto de la lista de su"accesos implica un cam"io de #m"ito"
9ara 2o+er tra6a4ar con0enientemente con ca+a su6acceso necesitamos 2or )o tanto conocer a)
menos e) .m6ito +e) su6acceso anterior en )a )ista +e su6 accesos" En otras 2a)a6ras5 ca+a su6
acceso D+e2en+eE +e) acceso anterior en )a )ista K +e6eremos 2as.rse)o como 2ar.metro a )a
re-)a que )o recono%ca
(0
"
En nuestro itera+or 6.sico +e #*$s reconocamos un acceso con4u-an+o )as re-)as raizAcceso
subAcceso" En )a situaci=n actua)5 +a+o que +e6emos 2asar)e un 2ar.metro a su6acceso5
uti)i%aremos una re-)a 2ro2ia ))ama+a subAccesoContexto" Banten+remos una referencia a)
#*$ m.s actua)5 sus caractersticas ser.n co2ia+as a) acceso a) fina)i%ar e) reconocimiento"
Con to+o esto en mente5 )a re-)a acceso que+ar. como si-ueF
acceso
{ ExpressionAST arbolActual = null; }
: #( ACCESO r:raizAcceso
{ arbolActual = (ExpressionAST)r; }
( s:subAccesoContexto[arbolActual]
{ arbolActual = (ExpressionAST)s; }
)*
)
{
// Copiar caractersticas del ltimo subacceso
ExpressionAST raiz = (ExpressionAST)#acceso;
raiz.setRValue(arbolActual.getRValue());
raiz.setLValue(arbolActual.getLValue());
raiz.setEValue(arbolActual.getEValue());
raiz.setExpType(arbolActual.getExpType());
}
;
exception catch [RecognitionException re]
{ errorExpresion(re, (ExpressionAST)#acceso); }
#!ora ))e-= e) momento +e reconocer )as races +e un acceso"
(a% de un acceso
3as races +e un acceso se reconocen con )a re-)a raizAcceso" csta comien%a con )a +ec)araci=n
+e una 0aria6)e au:i)iar que nos a!orrar. tener que rea)i%ar te+iosos castings en )as acciones +e )a
re-)aF
raizAcceso
{ ExpressionAST ast = (ExpressionAST)#raizAcceso; }
:
1es2us !a una serie +e a)ternati0as" 3a ra% +e un acceso 2ue+e serF
X /n i+entifica+or
X 3a 2a)a6ra reser0a+a super
X 3a 2a)a6ra reser0a+a atributo
X 3a 2a)a6ra reser0a+a parmetro
X /n )itera)
(0 9o+ramos 2asar so)amente e) .m6ito5 2ero es m.s c=mo+o 2asar +irectamente e) #*$"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota --2
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
X /na in0ocaci=n +e un mto+o +e )a c)ase actua) (una ))ama+a)
X /na con0ersi=n +e ti2os
X Cua)quier e:2resi=n entre 2arntesis
Comencemos 2or )a 2rimeraF un i+entifica+or" 3os i+entifica+ores 2ue+en )eerse escri6irse 2or
+efecto5 as que tienen 8A0a)ue 3A0a)ue"
i:IDENT
{
ast.setRValue(true);
ast.setLValue(true);
Ja tenemos 8A0a)ue 3A0a)ue" 3o si-uiente que !a que !acer es ca)cu)ar e) ti2o"
9ara e))o +e6emos em2e%ar 2or o6tener una +ec)araci=n ))ama+a DiEF
Declaration d = contexto.obtenerDeclaracion(i);
/na 0e% ))e-a+os a ste 2unto5 2ue+en +arse tres situacionesF
X Pue d sea una +ec)araci=n +e una 0aria6)e o un 2ar.metro (su etiqueta es INST_DEC_VAR o
RES_PARAMETRO)" En ta) caso o6tener e) ti2o es tri0ia) (d.getType())"
X Pue sea una +ec)araci=n +e) atri6uto +e una c)ase ()a etiqueta es RES_ATRIBUTO)" Entonces
ser. un 2oco m.s com2)ica+o5 2orque recor+emos que )as +ec)araciones +e atri6utos tienen un
ti2o Des2ecia)E(antlraux.context.types.AttributeType) a) que !a que De:traer)eE e)
ti2o Drea)E"
X 9or ?)timo5 2ue+e que e) i+entifica+or sea e) nom6re +e una c)ase (2ue+e ser5 2or e4em2)o5
D;64etoE5 D*istemaE)" 3os accesos con races +e este ti2o son accesos a miem6ros a6stractos
+e )as c)ases (e4" Sistema.imprime(Hola))" 3a etiqueta +e )a +ec)araci=n en ta) caso es o
6ien RES_CLASE o 6ien una +e )as etiquetas +e )os ti2os 6.sicos (TIPO_ENTERO5 TIPO_REAL5
TIPO_BOOLEANO5 TIPO_CADENA)" 9ara o6tener e) ti2o +e )a ra% ser. necesario uti)i%ar )as
metac)ases"
X *i no se +a nin-uno +e )os casos anteriores5 e) ti2o es err=neo"
En c=+i-oF
switch(d.getTag())
{
case INST_DEC_VAR: case RES_PARAMETRO:
ast.setExpType(d.getType());
break;
case RES_ATRIBUTO: // acceso a un atributo
// Obtener el "tipo atributo" (AttributeType)
// Recordar que AttributeType es similar a MethodType
AttributeType tipoAtributo = (AttributeType)(d.getType());
// Y de ah el verdadero tipo (Entero, Cadena, etc)
ast.setExpType(tipoAtributo.getType());
break;
case RES_CLASE: // acceso a un miembro abstracto
case TIPO_ENTERO: case TIPO_REAL:
case TIPO_BOOLEANO: case TIPO_CADENA:
LeLiType clase = (LeLiType)(d.getType());
LeLiMetaType metaClase = clase.getMetaType();
ast.setExpType(metaClase);
break;
default: // incluye TIPO_ERROR
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota ---
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
ast.setExpType(LeLiTypeManager.tipoError);
break;
}
9or ?)timo que+a ca)cu)ar e) EA0a)ue" 9ues 6ien5 no !ace fa)ta" En 3e3i no !a constantes5 +e
manera que nin-?n atri6uto5 a sea a6stracto o no a6stracto5 2ue+e tener un 0a)or 2reca)cu)a+o
en tiem2o +e com2i)aci=n"
*in em6ar-o5 si !u6iera a)-una manera +e es2ecificar constantes en 3e3i5 (2or e4em2)o5 si )os
atri6utos a6stractos fueran constantes) entonces se 2o+ra o6tener e) EA0a)ue +e )os
i+entifica+ores a 2artir +e )a e:2resi=n +e inicia)i%aci=n +e )a +ec)araci=n
(1
"
3a c)ase Declaration inc)ue un cam2o +e ti2o #*$ ))ama+o initialValue" *ir0e 2ara
-uar+ar e:2resiones +e inicia)i%aci=n en +ec)araciones5 2or e4em2)o staF
int a = 2+3;
*i )a e:2resi=n +e inicia)i%aci=n e:iste tiene EA0a)ue5 entonces ste ser. e) EA0a)ue +e) accesoF
// Clculo del E-Value
ExpressionAST iv = (ExpressionAST)d.getInitialValue();
if(iv!=null)
ast.setEValue(iv.getEValue());
Estas )neas a2arecer.n comenta+as en e) itera+or"
Gueno5 con eso se terminan )os i+entifica+ores" #fortuna+amente e) resto +e )as races +e
acceso son muc!o m.s senci))as"
$omemos5 2or e4em2)o5 )as races con 2a)a6ras reser0a+as5 es +ecir5 parmetro5 atributo
super" *e 2ue+en reconocer con )a si-uiente a)ternati0aF
| ( RES_PARAMETRO { ast.setExpType(tipoParametroAux); }
| RES_ATRIBUTO { ast.setExpType(tipoAtributoAux); }
| RES_SUPER { ast.setExpType(claseActual.getSuperType()); }
)
{
ast.setLValue(false);
ast.setRValue(true);
ast.setEValue(null);
}
3as tres 2a)a6ras reser0a+as tienen i+nticas caractersticas como e:2resi=n5 0arian+o e) ti2o" *on
+e Dso)o )ecturaE5 as que tienen 8A0a)ue 2ero no 3A0a)ue" En nin-?n caso 2ue+en tener EA0a)ue"
En cuanto a) ti2o5 e) m.s senci))o es e) +e super@ se o6tiene )a su2erc)ase +e )a c)ase actua)" 3os
ti2os +e parmetro atributo son )os ti2os au:i)iares que +efinimos como atri6utos est.ticos
+e) ana)i%a+or en )a %ona +e c=+i-o nati0o"
E) resto +e )as a)ternati0as +e rai%#cceso tienen sus 2ro2ias re-)as5 as que sim2)emente !a que
in0ocar)asF
| literal
| llamadaContexto [claseActual]
| conversion
| expresion
;
exception catch [RecognitionException re]
(1 #unque se-uramente !a6ra que mo+ificar un 2oco )a forma +e ca)cu)ar e) 3A0a)ue"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota --)
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
{ errorExpresion(re, ast); }
$iterales
3os )itera)es son mu f.ci)es +e tratar" 9ara em2e%ar5 to+os e))os son +e Dso)o )ecturaEF
literal
{
ExpressionAST ast = (ExpressionAST)#literal;
// Antes de hacer nada, ya hemos colocado L-value y R-value
ast.setRValue(true);
ast.setLValue(false);
}
Ca)cu)ar e) ti2o EA0a)ue +e )os +iferentes )itera)es es mu senci))oF
: LIT_ENTERO
{
ast.setEValue(new Integer(ast.getText()));
ast.setExpType(LeLiTypeManager.tipoEntero);

}
| LIT_REAL
{
ast.setEValue(new Float(ast.getText()));
ast.setExpType(LeLiTypeManager.tipoReal);
}
| LIT_CADENA
{
ast.setEValue(ast.getText());
ast.setExpType(LeLiTypeManager.tipoCadena);
}
| LIT_NL
{
ast.setEValue("\n");
ast.setExpType(LeLiTypeManager.tipoCadena);
}
| LIT_TAB
{
ast.setEValue("\t");
ast.setExpType(LeLiTypeManager.tipoCadena);
}
| LIT_COM
{
ast.setEValue("\"");
ast.setExpType(LeLiTypeManager.tipoCadena);
}
| LIT_CIERTO
{
ast.setEValue(new Boolean(true));
ast.setExpType(LeLiTypeManager.tipoBooleano);
}
| LIT_FALSO
{
ast.setEValue(new Boolean(false));
ast.setExpType(LeLiTypeManager.tipoBooleano);
}
;
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota --0
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
exception catch [RecognitionException re]
{ errorExpresion(re, (ExpressionAST)#ast); }
Invocaciones
3as in0ocaciones (o D))ama+asE) en este ana)i%a+or son reconoci+as con )a re-)a
llamadaContexto en )u-ar +e ))ama+a" Como )as ))ama+as 2ue+en ser un su6acceso5 no que+a
m.s reme+io que D2asar)esE un 2ar.metro con )a Dc)ase in0oca+oraE"
3a re-)a comien%a con )a +ec)araci=n +e a)-unas 0aria6)es )oca)es a )a re-)a"
llamadaContexto [ LeLiType llamador ]
{
ExpressionAST ast = (ExpressionAST)#llamadaContexto;
Declaration d = null;
LeLiMethodType lmt = null;
1es2us se rea)i%a una com2ro6aci=n +e se-uri+a+F )as 2a)a6ras reser0a+as parmetro
atributo no son in0oca+ores 0.)i+os (no se 2ue+e escri6ir parametro.m())"
// Comprobar si se est usando la palabra reservada
// "parmetro" o "atributo" seguidas de una llamada a
// un mtodo o constructor
if( llamador.getTag() == RES_PARAMETRO ||
llamador.getTag() == RES_ATRIBUTO )
{
throw new ContextException(
"Las palabras reservadas 'parmetro' y 'atributo' no pueden "+
"ir seguidas de una llamada a un mtodo o un constructor",
ast );
}
3a re-)a llamadaContexto a+mite tanto ))ama+as a mto+os como a constructores" #)
reconocer)os5 inicia)i%amos )as 0aria6)es )oca)es d lmt5 +efini+as a) 2rinci2io +e )a 2resente
re-)aF
( #( LLAMADA nombre:IDENT
{ lmt = new LeLiLlamadaType(nombre.getText(), llamador); }
listaExpresionesContexto [lmt]
{ d = llamador.buscarMetodoCompatible(lmt); }
)
| #( RES_CONSTRUCTOR
{ lmt = new LeLiLlamadaConstructorType(llamador); }
listaExpresionesContexto[lmt]
{ d = llamador.buscarConstructorCompatible(lmt); }
)
)
{
// accin
}
7=tese que )as +os a)ternati0as est.n entre 2ar.ntesis5 forman+o una ?nica su6 re-)a" 1e esta
forma5 2o+emos aCa+ir una acci=n com?n a )as +os a)ternati0as5 que tra6a4e con d lmt"
Ia que o6tener )as caractersticas +e) su6acceso5 +e2en+ien+o +e) 0a)or +e d lmt" #s5
X *i e) ))ama+or es err=neo5 entonces se asumen 0a)ores se-uros (ti2o error5 3 8 0a)ue5 EA0a)ue
nu)))"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota --,
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
X *i d es nu))5 entonces no se !a encontra+o un mto+o o constructor com2ati6)e" 3an%ar un
error"
X En otro caso se trata +e una in0ocaci=n norma) corriente" 3as in0ocaciones no tienen 3A0a)ue
ni EA0a)ue" *u ti2o es e) ti2o que +e0ue)0an )os mto+os que in0ocan5 su 8A0a)ue +e2en+e +e
si ste es 0aco o no"
; +ic!o +e otra formaF
if( llamador.getTag()==TIPO_ERROR )
{
ast.setExpType(LeLiTypeManager.tipoError);
ast.setRValue(true);
ast.setLValue(true);
}
else if( null==d )
{
throw new ContextException(
"La clase '" + llamador.getName() +
"' no contiene un mtodo o constructor compatible con " +
lmt.toString(), ast );
}
else
{
ast.setLValue(false);
ast.setEValue(null);

LeLiMethodType decMetodo= (LeLiMethodType)d.getType();

ast.setExpType(decMetodo.getReturnType());
if( ast.getExpType().getTag()==TIPO_VACIO )
ast.setRValue(false);
else
ast.setRValue(true);
}
}
;
exception catch [RecognitionException re]
{ errorExpresion(re, ast); }
/na nota a+iciona)F e) c=+i-o +e )a re-)a listaExpresionesContexto es e) si-uienteF
listaExpresionesContexto [LeLiMethodType lmt]
: #( LISTA_EXPRESIONES
( e:expresion
{ lmt.addParam(((ExpressionAST)e).getExpType()); }
)* )
;
exception catch [RecognitionException re] { reportError(re); }
"onversiones de tipo
3as con0ersiones se rea)i%an me+iante )a 2a)a6ra reser0a+a convertir" *e trata +e con0ertir una
e:2resi=n a un ti2o +a+o" 3as con0ersiones se reconocen uti)i%an+o )a re-)a conversion" 3a
re-)a comien%a con )a +ec)araci=n +e una 0aria6)e 2ara faci)itar )os castings )a inicia)i%aci=n +e)
3A0a)ue e) 8A0a)ue"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota --7
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
conversion
{
ExpressionAST ast = (ExpressionAST)#conversion;
ast.setLValue(false);
ast.setRValue(true);
}
E) #*$ reconoci+o 2or esta re-)a tiene RES_CONVERTIR como ra%5 +os !i4osF una e:2resi=n
un ti2o"
: #(RES_CONVERTIR e:expresion t:tipo)
Ia que ca)cu)ar e) ti2o EA0a)ue +e )a e:2resi=n5 cuan+o sea 2osi6)e" Ramos a 0erF
X Cuan+o t es e) ti2o D;64etoE5 e) resu)ta+o +e )a con0ersi=n siem2re e:istir. ser. +e ese
mismo ti2o"
X Cuan+o t sea err=neo5 e) ti2o +e )a e:2resi=n ser. err=neo"
X *i )a e:2resi=n es +e un ti2o que es su6c)ase +e t5 entonces )a con0ersi=n siem2re se 2o+r.
rea)i%ar5 sien+o t e) ti2o +e )a con0ersi=n"
X 1e6en contem2)arse )as con0ersiones entre ti2os" E:isten con0ersiones entre Cadena )os
+em.s ti2os 6.sicos +e 3e3i5 entre Entero Real" E) resto +e )as con0ersiones no son
2osi6)es o no se 2ue+en rea)i%ar en tiem2o +e com2i)aci=n"
X *i e) ti2o +e )a e:2resi=n no es una su6c)ase +e t ni 0ice0ersa5 entonces no !a con0ersi=n
2osi6)e" 3an%ar un error"
X En otro caso5 !a que +eci+ir en tiem2o +e e4ecuci=n"
E) c=+i-o que im2)ementa estas re-)as es e) si-uienteF
{
ExpressionAST ee = (ExpressionAST)e;
LeLiType te = (LeLiType)ee.getExpType();
LeLiType tt = (LeLiType)((TypeAST)t).getExpType();
if( tt.getTag()==TIPO_ERROR ||
tt.getName().equals("Objeto") )
{
ast.setExpType(tt);
}
else if( te.isA(tt) )
{
ast.setExpType(tt);
}
// Convertir tipos bsicos y el resto
switch( tt.getTag() )
{
case TIPO_CADENA: // Convertir a cadena
switch(te.getTag())
{
case TIPO_ENTERO: case TIPO_REAL:
ast.setExpType(tt);
if(null==ee.getEValue())
ast.setEValue(null);
else
ast.setEValue(ee.getEValue().toString());
break;
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota --/
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
case TIPO_BOOLEANO:
ast.setExpType(tt);
if(null==ee.getEValue())
ast.setEValue(null);
else
{
boolean b = ((Boolean)ee.getEValue()).booleanValue();
ast.setEValue(b?"cierto":"falso");
}
// Comprobar el resto en tiempo de ejecucin
// (ej. conversin Objeto->Cadena)
}
break;
case TIPO_REAL: // Convertir a Real
switch(te.getTag())
{
case TIPO_ENTERO:
ast.setExpType(tt);
if(null==ee.getEValue())
ast.setEValue(null);
else
{
int i = ((Integer)ee.getEValue()).intValue();
ast.setEValue(new Float(i));
}
break;
// Comprobar el resto en tiempo de ejecucin
// (ej. conversin Objeto->Real)
}
break;
default:
if( !te.isA(tt) && !tt.isA(te))
throw new ContextException(
"La expresin no es convertible al tipo '"+tt+"'",
e );
ast.setExpType(tt);
ast.setEValue(null);
// Comprobar el resto en tiempo de ejecucin
// (ej. conversin Objeto->Tipo def. usuario)
}
}
;
exception catch [RecognitionException re]
{ errorExpresion(re, (ExpressionAST)ast); }
$os su7accesos
3a ?)tima re-)a que nos que+a 2or ana)i%ar es subAccesoContexto" 3a re-)a comien%a fuerte5
inicia)i%an+o casi to+os )as caractersticas +e e:2resi=n a) inicio5 amn +e +ec)aran+o a)-unas
0aria6)es )oca)es que ser.n mu ?ti)es"
subAccesoContexto [ExpressionAST anteriorAST]
{
ExpressionAST ast = (ExpressionAST)#subAccesoContexto;
ast.setExpType(LeLiTypeManager.tipoError);
ast.setRValue(true);
ast.setLValue(true);
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota --<
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
ast.setEValue(null);
LeLiType tipoAnterior = (LeLiType)(anteriorAST.getExpType());
}
Como 2ue+e 0erse5 en 3e3i en 2rinci2io to+o su6 acceso tiene 8A0a)ue 3A0a)ue5 carece +e EA
0a)ue
('
" #s que )o ?nico que !a que ca)cu)ar es e) ti2o"
3os su6accesos en 3e3i so)amente 2ue+en ser +e tres ti2osF i+entifica+ores5 ))ama+as )a 2a)a6ra
reser0a+a super"
E) tra6a4o +e reconocer )as ))ama+as a )o tenemos !ec!oF 6asta con uti)i%ar llamadaContextoF
: llamadaContexto [tipoAnterior]
E) su6acceso con su2er tam6in es mu f.ci) +e im2)ementar" Gasta con o6tener )a su2erc)ase +e)
su6acceso anteriorF
| RES_SUPER
{
ast.setExpType(contexto.obtenerSuperTipo(tipoAnterior, ast));
}
9or ?)timo que+an )os i+entifica+ores" Como 0eremos no ser. tan f.ci)"
E) mo+o +e actuar +e2en+er. +e) ti2o anterior"
X *i e) ti2o anterior es e) ti2o au:i)iar tipoParametroAux (su etiqueta es TIPO_PARAMETRO)
entonces !a que !acer una 6?sque+a es2ecfica +e 2ar.metros en e) .m6ito actua)"
X #)-o simi)ar ocurre con e) ti2o au:i)iar tipoAtributoAux (su etiqueta es RES_ATRIBUTO)"
*o)amente !a que tener en cuenta que )as +ec)araciones +e )os atri6utos tienen ti2os
Des2ecia)esE5 a )os que !a que De:traer)esE e) ti2o rea)"
X *i no se +a nin-uno +e )os +os casos anteriores5 estamos ante un su6acceso norma) corriente
a un atri6uto +e una c)ase" Ia que 6uscar e) atri6uto en e) .m6ito +e )a c)ase5 De:traerE e)
ti2o como en e) caso anterior"
J 2or fin e) c=+i-oF
| nombre:IDENT
{
Declaration d = null;
switch(tipoAnterior.getTag())
{
case RES_PARAMETRO:
d = contexto.obtenerObjeto(RES_PARAMETRO, nombre);
ast.setExpType(d.getType());
break;

case RES_ATRIBUTO:
{
d = contexto.obtenerObjeto(RES_ATRIBUTO, nombre);
AttributeType tipoAtributo = (AttributeType)d.getType();
ast.setExpType(tipoAtributo.getType());
}
break;

default:
{
(' Como a !emos menciona+o5 esto 2o+ra ser +iferente +e 2o+er +ec)ararse DconstantesE en 3e3i"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -)
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
d = contexto.obtenerAtributo( tipoAnterior, nombre );
AttributeType tipoAtributo = (AttributeType)d.getType();
ast.setExpType(tipoAtributo.getType());
}
break;
}
ExpressionAST valorAST = (ExpressionAST)d.getInitialValue();
if(valorAST!=null)
ast.setEValue(valorAST.getEValue());
}
;
exception catch [RecognitionException re]
{ errorExpresion(re, (ExpressionAST)#subAccesoContexto); }
LJ sa era )a ?)tima re-)aN
-.+.-: 5ic*ero LeLi>y'e&*ec:>ree@arser.g
# continuaci=n se )ista e) fic!ero com2)etoF
header
{
package leli;
/*-----------------------------------------------*\
| Un intrprete para un Lenguaje Limitado(LeLi) |
| _____________________________________________ |
| |
| ANALISIS SEMNTICO -- chequeo de tipos |
| _____________________________________________ |
| |
| Enrique J. Garcia Cota |
\*-----------------------------------------------*/
import antlraux.context.Context;
import antlraux.context.Scope;
import antlraux.context.Declaration;
import antlraux.context.ContextException;
import antlraux.context.asts.*;
import antlraux.context.types.Type;
import antlraux.context.types.AttributeType;
import antlraux.util.LexInfo;
import antlraux.util.LexInfoAST;
import antlraux.util.Logger;
import leli.types.*;
}
class LeLiTypeCheckTreeParser extends LeLiTreeParser;
options
{
importVocab=LeLiSymbolTreeParserVocab;
exportVocab=LeLiTypeCheckTreeParserVocab;
buildAST = false;
ASTLabelType = antlraux.util.LexInfoAST;
}
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -)1
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
{
public Logger logger=null;
private LeLiContext contexto;
private LeLiType claseActual = null;
// se usa en los accesos, cuando aparece la palabra reservada
// "parmetro" (ej parmetro.a)
public static final LeLiType tipoParametroAux =
new LeLiType(RES_PARAMETRO,"parmetro", null, null, null);
// Idem para atributo (ej atributo.p1)
public static final LeLiType tipoAtributoAux =
new LeLiType(RES_ATRIBUTO,"atributo", null, null, null);
LeLiTypeCheckTreeParser( Logger logger,
LeLiContext contexto )
{
this();
this.logger = logger;
this.contexto = contexto;
}
public void reportError( String msg,
String filename,
int line,
int column )
{
if(null==logger)
{
logger = new Logger("error", System.err);
}
logger.log( msg, 1, filename, line, column);
}
public void reportError(RecognitionException e)
{
reportError( e.getMessage(), e.getFilename(),
e.getLine(), e.getColumn() );
}
public void reportError( String msg,
LexInfo info )
{
reportError( msg, info.getFilename(),
info.getLine(), info.getColumn()) ;
}
// ------ Mtodos de la fase 1
public void cambiaAmbitoActual(LexInfoAST ast)
{
Scope nuevoAmbito = ((ScopeAST)ast).getScope();
contexto.setCurrentScope(nuevoAmbito);
}
public void cierraAmbitoActual()
{ contexto.toFather(); }
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -)2
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
// ------ Mtodos de la fase 3
public boolean isNumeric(int id)
{ return (id==TIPO_ENTERO || id==TIPO_REAL); }
public void errorExpresion( RecognitionException re,
ExpressionAST ast )
{
errorExpresion( re, ast, true, true,
LeLiTypeManager.tipoError,null);
}
public void errorExpresion( RecognitionException re,
ExpressionAST ast,
boolean LValue,
boolean RValue,
LeLiType tipo,
Object EValue )
{
reportError(re);
ast.setExpType(tipo);
ast.setRValue(RValue);
ast.setLValue(LValue);
ast.setEValue(EValue);
}
}
//-------------- FASE 1: Controlar el mbito actual -------------
programa
: { cambiaAmbitoActual( #programa ); }
#( PROGRAMA (decClase)+ )
;
exception catch [RecognitionException ce] { reportError(ce); }
decClase
: { cambiaAmbitoActual( #decClase ); }
#( RES_CLASE nombre:IDENT
{ claseActual = contexto.obtenerTipo(nombre); }
clausulaExtiende
listaMiembros )
{ cierraAmbitoActual(); }
;
exception catch [RecognitionException ce] { reportError(ce); }
decMetodo
: { cambiaAmbitoActual( #decMetodo ); }
#( RES_METODO ( RES_ABSTRACTO )? tipo
IDENT listaDecParams listaInstrucciones
)
{ cierraAmbitoActual(); }
;
exception catch [RecognitionException ce] { reportError(ce); }
decConstructor
: { cambiaAmbitoActual( #decConstructor ); }
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -)-
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
#( RES_CONSTRUCTOR listaDecParams listaInstrucciones )
{ cierraAmbitoActual(); }
;
exception catch [RecognitionException ce] { reportError(ce); }
instMientras
: { cambiaAmbitoActual( #instMientras ); }
#( RES_MIENTRAS expresion listaInstrucciones )
{ cierraAmbitoActual(); }
;
exception catch [RecognitionException ce] { reportError(ce); }
instHacerMientras
: { cambiaAmbitoActual( #instHacerMientras ); }
#( RES_HACER listaInstrucciones expresion )
{ cierraAmbitoActual(); }
;
exception catch [RecognitionException ce] { reportError(ce); }
instDesde
: { cambiaAmbitoActual( #instDesde ); }
#( RES_DESDE
listaExpresiones listaExpresiones listaExpresiones
listaInstrucciones )
{ cierraAmbitoActual(); }
;
exception catch [RecognitionException ce] { reportError(ce); }
instSi
: { cambiaAmbitoActual( #instSi ); }
#( RES_SI expresion listaInstrucciones
{ cierraAmbitoActual(); }
(alternativaSi)* )
;
exception catch [RecognitionException ce] { reportError(ce); }
alternativaSi
: { cambiaAmbitoActual ( #alternativaSi ); }
( #(BARRA_VERT expresion listaInstrucciones)
| #(RES_OTRAS listaInstrucciones)
)
{ cierraAmbitoActual(); }
;
exception catch [RecognitionException ce] { reportError(ce); }
//------ FASE 2: Adicin de las variables locales a los mbitos --------
//
// Esta fase consiste simplemente en aadir las declaraciones de las
// variables locales a los mbitos. Se hace aqu en lugar de en el
// primer paso porque no deseamos que las variables declaradas
// "ms tarde" conozcan las que estn declaradas "antes". Adems,
// preparamos las expresiones de los objetos declarados.
//
instDecVar
: #(INST_DEC_VAR t:tipo nombre:IDENT (valor:expresion|le:listaExpresiones)?)
{
LeLiType type = (LeLiType) ((TypeAST)t).getExpType();
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -))
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
contexto.insertarDecVariable( #instDecVar, nombre, type, valor, le);
}
;
exception catch [RecognitionException ce] { reportError(ce); }
//--------------- FASE 3: Expresiones ----------------
//
// Toda expresin de LeLi es de algn tipo. La mayora de las
// expresiones tienen un tipo bsico (Cadena, Booleano...).
//
// En esta fase calcularemos los tipos de cada expresin, as
// como otros valores importantes de las expresiones como son
// el L-value y el R-value.
//
expresion : expresionBinaria
| expresionUnaria
| expresionEsUn
| acceso
;
expresionEsUn
: #(RES_ESUN e:expresion t:tipo)
{
ExpressionAST ast = (ExpressionAST)#expresionEsUn;
ExpressionAST exp = (ExpressionAST)e;
if(!exp.getRValue())
{
throw new ContextException(
"Se necesita una expresin con R-value",
ast );
}
ast.setExpType(LeLiTypeManager.tipoBooleano);
ast.setLValue(false);
ast.setRValue(true);
LeLiType tipoExpresion = (LeLiType)exp.getExpType();
LeLiType tipoDer = (LeLiType)((TypeAST)t).getExpType();
if( tipoExpresion.getTag()==TIPO_ERROR
|| ( tipoDer.getTag()==TIPO_ERROR ||
tipoDer.getName().equals("Objeto") )
|| tipoExpresion.isA(tipoDer) )
{
ast.setEValue(new Boolean(true));
}
else if ( !tipoExpresion.isA(tipoDer) &&
!tipoDer.isA(tipoExpresion) )
{
ast.setEValue(new Boolean(false));
}
}
;
exception catch [RecognitionException re]
{
errorExpresion( re, (ExpressionAST)#expresionEsUn,
false, true, LeLiTypeManager.tipoBooleano, null );
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -)0
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
}
expresionUnaria
:
( #(OP_MENOS_UNARIO expresion)
| #(OP_MASMAS expresion)
| #(OP_MENOSMENOS expresion)
| #(OP_NO expresion)
)
{
ExpressionAST raiz = (ExpressionAST) #expresionUnaria;
// Calculamos r-value y l-value
raiz.setLValue(false);
raiz.setRValue(true);
ExpressionAST operandoAST = (ExpressionAST)(raiz.getFirstChild());
if(!operandoAST.getRValue())
throw new ContextException(
"Se necesita una expresin con rvalue", operandoAST );
if( ( raiz.getType()==OP_MASMAS ||
raiz.getType()==OP_MENOSMENOS) &&
!operandoAST.getLValue() )
throw new ContextException(
"Se necesita una expresin con lvalue", operandoAST );
// Calculamos tipo de la expresin
int tipoOperando = operandoAST.getExpType().getTag();
Type t = null;
if(tipoOperando==TIPO_ERROR)
t = LeLiTypeManager.tipoError;
else
{
switch(raiz.getType())
{
case OP_MENOS_UNARIO: case OP_MASMAS:
case OP_MENOSMENOS:
if(isNumeric(tipoOperando))
t = operandoAST.getExpType();
else t = null;
break;
case OP_NO:
if(tipoOperando==TIPO_BOOLEANO)
t = LeLiTypeManager.tipoBooleano;
else t = null;
break;
default :
t = null;
break;
}
}
if(null==t)
{
throw new ContextException(
"El tipo '"+ operandoAST.getExpType() +
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -),
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
"' no es compatible con el operador unario'" +
raiz.getText() + "'", operandoAST);
}
raiz.setExpType(t);
// Calculamos el valor de la expresin unaria, si se puede
Object o = operandoAST.getEValue();
if(null==o)
raiz.setEValue(null);
else
{
switch(raiz.getType())
{
case OP_NO:
if(o instanceof Boolean)
raiz.setEValue(new Boolean(!((Boolean)o).booleanValue()));
break;
case OP_MENOS_UNARIO:
if(o instanceof Integer)
raiz.setEValue(new Integer(-((Integer)o).intValue()) );
else if (o instanceof Float)
raiz.setEValue(new Float(-((Float)o).floatValue()) );
break;
case OP_MASMAS:
if(o instanceof Integer)
raiz.setEValue(new Integer( ((Integer)o).intValue()+1 ) );
else if (o instanceof Float)
raiz.setEValue(new Float( ((Float)o).floatValue()+1) );
break;
case OP_MENOSMENOS:
if(o instanceof Integer)
raiz.setEValue(new Integer( ((Integer)o).intValue()-1 ) );
else if (o instanceof Float)
raiz.setEValue(new Float( ((Float)o).floatValue()-1) );
default: raiz.setEValue(null); break;
}
}
}
;
exception catch [RecognitionException re]
{
errorExpresion( re, (ExpressionAST)#expresionUnaria,
false, true, LeLiTypeManager.tipoError, null );
}
expresionBinaria
:
( #(OP_MAS expresion expresion)
| #(OP_MENOS expresion expresion)
| #(OP_O expresion expresion)
| #(OP_Y expresion expresion)
| #(OP_IGUAL expresion expresion)
| #(OP_DISTINTO expresion expresion)
| #(OP_MAYOR expresion expresion)
| #(OP_MENOR expresion expresion)
| #(OP_MAYOR_IGUAL expresion expresion)
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -)7
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
| #(OP_MENOR_IGUAL expresion expresion)
| #(OP_PRODUCTO expresion expresion)
| #(OP_DIVISION expresion expresion)
| #(OP_ASIG eizq:expresion expresion)
{
if( !((ExpressionAST)eizq).getLValue() )
throw new ContextException(
"La parte izquierda de la asignacin no tiene l-value",
#expresionBinaria );
}
)
{
ExpressionAST raiz = (ExpressionAST) #expresionBinaria;
// Calculamos r-value y l-value
raiz.setLValue(false);
raiz.setRValue(true);
ExpressionAST ei = (ExpressionAST)(raiz.getFirstChild());
ExpressionAST ed = (ExpressionAST)(ei.getNextSibling());
if(!ei.getRValue())
throw new ContextException(
"Se necesita una expresin con r-value", ei );
if(!ed.getRValue())
throw new ContextException(
"Se necesita una expresin con r-value", ed );
int ti = ei.getExpType().getTag();
int td = ed.getExpType().getTag();
Type t = null;
// Calculamos el tipo de la expresin binaria
if(ti==TIPO_ERROR || td==TIPO_ERROR)
t = LeLiTypeManager.tipoError;
else
{
switch(raiz.getType())
{
case OP_MAS:
if(ti==TIPO_CADENA || td==TIPO_CADENA)
t = LeLiTypeManager.tipoCadena;
else if(ti==TIPO_ENTERO && td==TIPO_ENTERO)
t = LeLiTypeManager.tipoEntero;
else if(isNumeric(ti) && isNumeric(td))
t = LeLiTypeManager.tipoReal;
break;
case OP_MENOS: case OP_PRODUCTO: case OP_DIVISION:
if(ti==TIPO_ENTERO && td==TIPO_ENTERO)
t = LeLiTypeManager.tipoEntero;
else if(isNumeric(ti) && isNumeric(td))
t = LeLiTypeManager.tipoReal;
break;
case OP_ASIG:
t = LeLiTypeManager.tipoVacio;
break;
case OP_Y: case OP_O:
if(ti==TIPO_BOOLEANO && td==TIPO_BOOLEANO)
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -)/
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
t = LeLiTypeManager.tipoBooleano;
break;
case OP_IGUAL: case OP_DISTINTO:
if( ti==TIPO_BOOLEANO && td==TIPO_BOOLEANO ||
ti==TIPO_CADENA && td==TIPO_CADENA ||
isNumeric(ti) && isNumeric(td) )
t = LeLiTypeManager.tipoBooleano;
break;
case OP_MAYOR: case OP_MENOR:
case OP_MAYOR_IGUAL: case OP_MENOR_IGUAL:
if( isNumeric(ti) && isNumeric(td) ||
TIPO_CADENA==ti && TIPO_CADENA==td )
t = LeLiTypeManager.tipoBooleano;
break;
}
}
if(null==t)
{
throw new ContextException( "El tipo '"+
ei.getExpType() + "' no es compatible con '" +
ed.getExpType() + "' con respecto al operador '"+
raiz.getText() + "'",
raiz);
}
raiz.setExpType(t);
// Calculamos el valor de la expresin (si se puede)
Object izq = ei.getEValue();
Object der = ed.getEValue();
if( null==izq || null==der )
raiz.setEValue(null);
else
{
String si = null, sd = null;
Integer ii = null, id = null;
Float fi = null, fd = null;
Boolean bi = null, bd = null;
if (izq instanceof String) si = (String)izq;
else if(izq instanceof Integer) ii = (Integer)izq;
else if(izq instanceof Float) fi = (Float)izq;
else if(izq instanceof Boolean) bi = (Boolean)izq;
if (der instanceof String) sd = (String)der;
else if(der instanceof Integer) id = (Integer)der;
else if(der instanceof Float) fd = (Float)der;
else if(der instanceof Boolean) bd = (Boolean)der;
switch(raiz.getType())
{
case OP_MAS:
if(si!=null && (sd!=null || id!=null || fd!=null) )
raiz.setEValue( si + der.toString() );
if(si!=null && (bd!=null))
raiz.setEValue( si + (bd.booleanValue()?"cierto":"falso") );
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -)<
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
if(sd!=null && (ii!=null || fi!=null) )
raiz.setEValue( izq.toString() + sd );
if(sd!=null && (bi!=null))
raiz.setEValue( (bi.booleanValue()?"cierto":"falso") + sd );
if(ii!=null && id!=null)
raiz.setEValue( new Integer(ii.intValue()+id.intValue()) );
if(fi!=null && fd!=null)
raiz.setEValue( new Float(fi.floatValue()+fd.floatValue() ));
if(fi!=null && id!=null)
raiz.setEValue( new Float(fi.floatValue()+id.intValue()) );
if(ii!=null && fd!=null)
raiz.setEValue( new Float(ii.intValue()+fd.floatValue()) );
break;
case OP_MENOS:
if(ii!=null && id!=null)
raiz.setEValue( new Integer(ii.intValue()-id.intValue()) );
if(fi!=null && fd!=null)
raiz.setEValue( new Float(fi.floatValue()-fd.floatValue()) );
if(fi!=null && id!=null)
raiz.setEValue( new Float(fi.floatValue()-id.intValue()) );
if(ii!=null && fd!=null)
raiz.setEValue( new Float(ii.intValue()-fd.floatValue()) );
break;
case OP_PRODUCTO:
if(ii!=null && id!=null)
raiz.setEValue( new Integer(ii.intValue()*id.intValue()) );
if(fi!=null && fd!=null)
raiz.setEValue( new Float(fi.floatValue()*fd.floatValue()) );
if(fi!=null && id!=null)
raiz.setEValue( new Float(fi.floatValue()*id.intValue()) );
if(ii!=null && fd!=null)
raiz.setEValue( new Float(ii.intValue()*fd.floatValue()) );
break;
case OP_DIVISION:
if(ii!=null && id!=null)
raiz.setEValue( new Integer(ii.intValue()/id.intValue()) );
if(fi!=null && fd!=null)
raiz.setEValue( new Float(fi.floatValue()/fd.floatValue()) );
if(fi!=null && id!=null)
raiz.setEValue( new Float(fi.floatValue()/id.intValue()) );
if(ii!=null && fd!=null)
raiz.setEValue( new Float(ii.intValue()/fd.floatValue()) );
break;
case OP_O:
if(bi!=null && bd!=null)
raiz.setEValue( new Boolean(bi.booleanValue() || bd.booleanValue()
) );
break;
case OP_Y:
if(bi!=null && bd!=null)
raiz.setEValue( new Boolean(bi.booleanValue() && bd.booleanValue()
) );
break;
case OP_IGUAL:
raiz.setEValue( new Boolean(izq.equals(der)) );
break;
case OP_DISTINTO:
raiz.setEValue( new Boolean(!izq.equals(der)) );
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -0
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
break;
case OP_MAYOR:
if(si!=null && sd!=null)
raiz.setEValue( new Boolean(si.compareTo(sd)>0) );
if(ii!=null && id!=null)
raiz.setEValue( new Boolean(ii.compareTo(id)>0) );
if(fi!=null && fd!=null)
raiz.setEValue( new Boolean(fi.compareTo(fd)>0) );
if(fi!=null && id!=null)
raiz.setEValue( new Boolean(fi.compareTo(id)>0) );
if(ii!=null && fd!=null)
raiz.setEValue( new Boolean(ii.compareTo(fd)>0) );
break;
case OP_MENOR:
if(si!=null && sd!=null)
raiz.setEValue( new Boolean(si.compareTo(sd)<0) );
if(ii!=null && id!=null)
raiz.setEValue( new Boolean(ii.compareTo(id)<0) );
if(fi!=null && fd!=null)
raiz.setEValue( new Boolean(fi.compareTo(fd)<0) );
if(fi!=null && id!=null)
raiz.setEValue( new Boolean(fi.compareTo(id)<0) );
if(ii!=null && fd!=null)
raiz.setEValue( new Boolean(ii.compareTo(fd)<0) );
break;
case OP_MAYOR_IGUAL:
if(si!=null && sd!=null)
raiz.setEValue( new Boolean(si.compareTo(sd)>=0) );
if(ii!=null && id!=null)
raiz.setEValue( new Boolean(ii.compareTo(id)>=0) );
if(fi!=null && fd!=null)
raiz.setEValue( new Boolean(fi.compareTo(fd)>=0) );
if(fi!=null && id!=null)
raiz.setEValue( new Boolean(fi.compareTo(id)>=0) );
if(ii!=null && fd!=null)
raiz.setEValue( new Boolean(ii.compareTo(fd)>=0) );
break;
case OP_MENOR_IGUAL:
if(si!=null && sd!=null)
raiz.setEValue( new Boolean(si.compareTo(sd)<=0) );
if(ii!=null && id!=null)
raiz.setEValue( new Boolean(ii.compareTo(id)<=0) );
if(fi!=null && fd!=null)
raiz.setEValue( new Boolean(fi.compareTo(fd)<=0) );
if(fi!=null && id!=null)
raiz.setEValue( new Boolean(fi.compareTo(id)<=0) );
if(ii!=null && fd!=null)
raiz.setEValue( new Boolean(ii.compareTo(fd)<=0) );
break;
default :
raiz.setEValue(null);
break;
}
}
}
;
exception catch [RecognitionException re]
{ errorExpresion(re, (ExpressionAST)#expresionBinaria); }
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -01
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
//-------------- FASE 4: Manejo de tipos en acceso --------------
//
// Esta es la fase ms complicada. Aqu se tratan accesos como
//
// Persona pedro(19,"Pedro");
// Cadena ro = pedro.obtenerNombre().subcadena(4,5);
//
// El problema est en que en cada subacceso
// (cada punto "." de "pedro.obtenerNombre().subcadena(4,5))
// hay que cambiar de juego de subaccesos vlidos (hay que
// cambiar de mbito).
//
acceso
{ ExpressionAST arbolActual = null; }
: #( ACCESO r:raizAcceso
{ arbolActual = (ExpressionAST)r; }
( s:subAccesoContexto[arbolActual]
{ arbolActual = (ExpressionAST)s; }
)*
)
{
ExpressionAST raiz = (ExpressionAST)#acceso;
raiz.setRValue(arbolActual.getRValue());
raiz.setLValue(arbolActual.getLValue());
raiz.setEValue(arbolActual.getEValue());
raiz.setExpType(arbolActual.getExpType());
}
;
exception catch [RecognitionException re]
{ errorExpresion(re, (ExpressionAST)#acceso); }
raizAcceso
{ ExpressionAST ast = (ExpressionAST)#raizAcceso; }
:
i:IDENT
{
ast.setRValue(true);
ast.setLValue(true);
Declaration d = contexto.obtenerDeclaracion(i);
// Clculo del tipo
switch(d.getTag())
{
case INST_DEC_VAR: case RES_PARAMETRO:
ast.setExpType(d.getType());
break;
case RES_ATRIBUTO: // acceso a un atributo
// Obtener el "tipo atributo" (AttributeType)
// Recordar que AttributeType es similar a MethodType
AttributeType tipoAtributo = (AttributeType)(d.getType());
// Y de ah el verdadero tipo (Entero, Cadena, etc)
ast.setExpType(tipoAtributo.getType());
break;
case RES_CLASE: // acceso a un miembro abstracto
case TIPO_ENTERO: case TIPO_REAL:
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -02
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
case TIPO_BOOLEANO: case TIPO_CADENA:
LeLiType clase = (LeLiType)(d.getType());
LeLiMetaType metaClase = clase.getMetaType();
ast.setExpType(metaClase);
break;
default: // incluye TIPO_ERROR
ast.setExpType(LeLiTypeManager.tipoError);
break;
}
// Clculo del E-Value
// ExpressionAST iv = (ExpressionAST)d.getInitialValue();
// if(iv!=null)
// ast.setEValue(iv.getEValue());
}
| ( RES_PARAMETRO { ast.setExpType(tipoParametroAux); }
| RES_ATRIBUTO { ast.setExpType(tipoAtributoAux); }
| RES_SUPER { ast.setExpType(claseActual.getSuperType()); }
)
{
ast.setLValue(false);
ast.setRValue(true);
ast.setEValue(null);
}
| literal
| llamadaContexto [claseActual]
| conversion
| expresion
;
exception catch [RecognitionException re]
{ errorExpresion(re, ast); }
literal
{
ExpressionAST ast = (ExpressionAST)#literal;
ast.setRValue(true);
ast.setLValue(false);
}
: LIT_ENTERO
{
ast.setEValue(new Integer(ast.getText()));
ast.setExpType(LeLiTypeManager.tipoEntero);

}
| LIT_REAL
{
ast.setEValue(new Float(ast.getText()));
ast.setExpType(LeLiTypeManager.tipoReal);
}
| LIT_CADENA
{
ast.setEValue(ast.getText());
ast.setExpType(LeLiTypeManager.tipoCadena);
}
| LIT_NL
{
ast.setEValue("\n");
ast.setExpType(LeLiTypeManager.tipoCadena);
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -0-
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
}
| LIT_TAB
{
ast.setEValue("\t");
ast.setExpType(LeLiTypeManager.tipoCadena);
}
| LIT_COM
{
ast.setEValue("\"");
ast.setExpType(LeLiTypeManager.tipoCadena);
}
| LIT_CIERTO
{
ast.setEValue(new Boolean(true));
ast.setExpType(LeLiTypeManager.tipoBooleano);
}
| LIT_FALSO
{
ast.setEValue(new Boolean(false));
ast.setExpType(LeLiTypeManager.tipoBooleano);
}
;
exception catch [RecognitionException re]
{ errorExpresion(re, (ExpressionAST)#ast); }
llamadaContexto [ LeLiType llamador ]
{
ExpressionAST ast = (ExpressionAST)#llamadaContexto;
Declaration d = null;
LeLiMethodType lmt = null;
// Comprobar si se est usando la palabra reservada
// "parmetro" o "atributo" seguidas de una llamada a
// un mtodo o constructor
if( llamador.getTag() == RES_PARAMETRO ||
llamador.getTag() == RES_ATRIBUTO )
{
throw new ContextException(
"Las palabras reservadas 'parmetro' y 'atributo' no pueden "+
"ir seguidas de una llamada a un mtodo o un constructor",
ast );
}
}
:
( #( LLAMADA nombre:IDENT
{ lmt = new LeLiLlamadaType(nombre.getText(), llamador); }
listaExpresionesContexto [lmt]
{ d = llamador.buscarMetodoCompatible(lmt); }
)
| #( RES_CONSTRUCTOR
{ lmt = new LeLiLlamadaConstructorType(llamador); }
listaExpresionesContexto[lmt]
{ d = llamador.buscarConstructorCompatible(lmt); }
)
)
{
if( llamador.getTag()==TIPO_ERROR )
{
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -0)
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
ast.setExpType(LeLiTypeManager.tipoError);
ast.setRValue(true);
ast.setLValue(true);
}
else if( null==d )
{
throw new ContextException(
"La clase '" + llamador.getName() +
"' no contiene un mtodo o constructor compatible con " +
lmt.toString(), ast );
}
else
{
ast.setLValue(false);
ast.setEValue(null);

LeLiMethodType decMetodo= (LeLiMethodType)d.getType();

ast.setExpType(decMetodo.getReturnType());
if( ast.getExpType().getTag()==TIPO_VACIO )
ast.setRValue(false);
else
ast.setRValue(true);
}
}
;
exception catch [RecognitionException re]
{ errorExpresion(re, ast); }
listaExpresionesContexto [LeLiMethodType lmt]
: #( LISTA_EXPRESIONES
( e:expresion
{ lmt.addParam(((ExpressionAST)e).getExpType()); }
)* )
;
exception catch [RecognitionException re] { reportError(re); }
conversion
{
ExpressionAST ast = (ExpressionAST)#conversion;
ast.setLValue(false);
ast.setRValue(true);
}
:
#(RES_CONVERTIR e:expresion t:tipo)
{
ExpressionAST ee = (ExpressionAST)e;
LeLiType te = (LeLiType)ee.getExpType();
LeLiType tt = (LeLiType)((TypeAST)t).getExpType();
if( tt.getTag()==TIPO_ERROR ||
tt.getName().equals("Objeto") )
{
ast.setExpType(tt);
}
else if( te.isA(tt) )
{
ast.setExpType(tt);
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -00
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
}
// Convertir tipos bsicos y el resto
switch( tt.getTag() )
{
case TIPO_CADENA: // Convertir a cadena
switch(te.getTag())
{
case TIPO_ENTERO: case TIPO_REAL:
ast.setExpType(tt);
if(null==ee.getEValue())
ast.setEValue(null);
else
ast.setEValue(ee.getEValue().toString());
break;
case TIPO_BOOLEANO:
ast.setExpType(tt);
if(null==ee.getEValue())
ast.setEValue(null);
else
{
boolean b = ((Boolean)ee.getEValue()).booleanValue();
ast.setEValue(b?"cierto":"falso");
}
// Comprobar el resto en tiempo de ejecucin
// (ej. conversin Objeto->Cadena)
}
break;
case TIPO_REAL: // Convertir a Real
switch(te.getTag())
{
case TIPO_ENTERO:
ast.setExpType(tt);
if(null==ee.getEValue())
ast.setEValue(null);
else
{
int i = ((Integer)ee.getEValue()).intValue();
ast.setEValue(new Float(i));
}
break;
// Comprobar el resto en tiempo de ejecucin
// (ej. conversin Objeto->Real)
}
break;
default:
if( !te.isA(tt) && !tt.isA(te))
throw new ContextException(
"La expresin no es convertible al tipo '"+tt+"'",
e );
ast.setExpType(tt);
ast.setEValue(null);
// Comprobar el resto en tiempo de ejecucin
// (ej. conversin Objeto->Tipo def. usuario)
}
}
;
exception catch [RecognitionException re]
{ errorExpresion(re, (ExpressionAST)ast); }
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -0,
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
subAccesoContexto [ExpressionAST anteriorAST]
{
ExpressionAST ast = (ExpressionAST)#subAccesoContexto;
ast.setExpType(LeLiTypeManager.tipoError);
ast.setRValue(true);
ast.setLValue(true);
ast.setEValue(null);
LeLiType tipoAnterior = (LeLiType)(anteriorAST.getExpType());
}
: llamadaContexto [tipoAnterior]
| RES_SUPER
{
ast.setExpType(contexto.obtenerSuperTipo(tipoAnterior, ast));
}
| nombre:IDENT
{
Declaration d = null;
switch(tipoAnterior.getTag())
{
// Comprobar si se est usando la palabra reservada
// "parmetro" o "atributo" como raz del acceso
case RES_PARAMETRO:
d = contexto.obtenerObjeto(RES_PARAMETRO, nombre);
ast.setExpType(d.getType());
break;

case RES_ATRIBUTO:
{
d = contexto.obtenerObjeto(RES_ATRIBUTO, nombre);
// La clase que representa el tipo de los atributos
// es "AttributeType". Hay que obtener el tipo
// "real" (Entero, Cadena) del atributo,
// haciendo getType().
AttributeType tipoAtributo = (AttributeType)d.getType();
ast.setExpType(tipoAtributo.getType());
}
break;

// Atributos "normales" - tambin hay que "sacar" el atributo
default:
{
d = contexto.obtenerAtributo( tipoAnterior, nombre );
AttributeType tipoAtributo = (AttributeType)d.getType();
ast.setExpType(tipoAtributo.getType());
}
break;
}
ExpressionAST valorAST = (ExpressionAST)d.getInitialValue();
if(valorAST!=null)
ast.setEValue(valorAST.getEValue());
}
;
exception catch [RecognitionException re]
{ errorExpresion(re, (ExpressionAST)#subAccesoContexto); }
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -07
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.,6 %ompro+aci(n de tipos P segunda pasada
-.+..: $otas !inales sobre el anali8ador
3a 2rimera nota so6re e) ana)i%a+or es 2areci+a a )a que se !aca so6re LeLiSymbolTreeParserF
+e2en+e 2rofun+amente +e LeLiContext5 +on+e se rea)i%an 6uen n?mero +e acciones"
;tra nota im2ortante es que con este ana)i%a+or +amos 2or termina+o e) an.)isis sem.ntico5 2ero
no est# realmente terminado" #)-unas +e )as cosas que no !emos rea)i%a+o sonF
X Com2ro6ar que )as e:2resiones +e )as instrucciones con+iciona)es son siem2re +e ti2o
6oo)eano (es mu f.ci) +e rea)i%ar)
X l+em con )as con+iciones +e sa)i+a +e )os 6uc)es
X En )os constructores +e )as c)ases to+os )os atri6utos +e6eran ser inicia)i%a+os" csto +e6era
com2ro6arse"
X Iace fa)ta testear m.s a)-unas %onas +e) c=+i-o" *e-uro que a)-unos "ugs se !an esca2a+o a
2esar +e mis esfuer%os"
X 7o !a recu2eraci=n +e errores en nin-uno +e )os +os itera+ores@ e) com2i)a+or no es ca2a% +e
recu2erarse +e errores que -eneren un #*$ incom2)eto"
7ota n?mero tresF # )a !ora +e ca)cu)ar e) ti2o EA0a)ue +e )as e:2resiones (es2ecia)mente )as
e:2resiones 6inarias unarias) !e o2ta+o 2or a-ru2ar to+as )as a)ternati0as en un so)o 6)oque
uti)i%ar D6)oques s<itc! masi0osE5 en )u-ar +e rea)i%ar acciones in+e2en+ientes en ca+a
a)ternati0a" 8esu)ta que +e )a 2rimera forma e) c=+i-o ocu2a menos ()as 0aria6)es so)amente se
+ec)aran una 0e%5 en a)-unos casos se 2ue+en a-ru2ar 0arias o2ciones +e) switch en un so)o
case)"
9or ?)timo5 tn-ase 2resente que en )a 2rimera 2asa+a se inc)ueron )os #*$s +e )as
+ec)araciones +e )os ti2os 6.sicos en e) #*$ -enera+o" Esto tiene )a interesante consecuencia +e
que la segunda pasada actTa tam"in so"re los /01s de los tipos prede&inidos"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -0/
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.76 %ompilaci(n y e5ecuci(n
Becci%n -.-: &om'ilaci%n y ejecuci%n
-.-.1: &om'ilaci%n
Com2i)ar )os ana)i%a+ores es senci))o si tenemos en cuenta c=mo )o !emos !ec!o en ocasiones
anteriores"
Com2i)ar e) itera+or sim2)e es tan senci))o como escri6irF
C:\> java antlr.Tool LeLiParser.g
9ara com2i)ar LeLiSymbolTreeParser.g necesitaremos que LeLiParser.g est accesi6)e en e)
path" 3ue-o !a que escri6irF
C:\> java antlr.Tool -glib LeLiParser.g LeLiSymbolTreeParser.g
LeLiTypeCheckTreeParser 2ue+e com2i)arse +e forma simi)ar"
C:\> java antlr.Tool -glib LeLiParser.g LeLiTypeCheckTreeParser.g
LeLiSymbolTreeParser.g +e6e com2i)arse antes +e com2i)ar
LeLiTypeCheckTreeParser.g5 2ues e) se-un+o im2orta e) 0oca6u)ario +e) 2rimero"
3ue-o !a que com2i)ar )os fic!eros Y"4a0a -enera+osF
C:\> javac *.java
-.-.2: jecuci%n
"am7ios en la clase 'ool
#unque ten-a 2oco inters 2ara e) usuario me+io +e un com2i)a+or5 a m me !a resu)ta+o mu
?ti) 2o+er )an%ar mis itera+ores in+e2en+ientemente con un coman+o es2ecia)5 sin tener que
recom2i)ar" 9ara 2o+er !acer)o5 !e aCa+i+o a Tool un nue0o coman+o que 2ermite es2ecificar
con un n?mero entero e) Dni0e)E +e an.)isis sem.ntico que se +esee 2ro+ucir (0 2ara una
Diteraci=n 2asi0a so6re e) #*$E5 1 2ara a2)icar)e ?nicamente LeLiSymbolTreeParser ' 2ara
a2)icar)e tam6in LeLiTypeCheckTreeParser"
*e !an aCa+i+o a)-unas )neas 2ara acti0ar )a nomenc)atura D0er6osaE +e )os #*$s5 +e manera
que muestren informaci=n a+iciona) a) ser im2rimi+os 2or 2anta))a" 3a confi-uraci=n actua) es )a
+e mostrar )a informaci=n a+iciona) +e to+os )os ti2os +e #*$ e:ce2to LexInfoAST" Este
com2ortamiento so)amente 2ue+e cam6iarse recom2i)an+o"
"digo de la nueva clase 'ool
# continuaci=n se )ista e) c=+i-o +e )a nue0a c)ase $oo)" 3as %onas que !an cam6ia+o a2arecen
seCa)a+as"
package leli; // Tool forma parte del paquete LeLi
import java.io.*;
import antlr.collections.AST;
import antlr.collections.impl.*;
import antlr.debug.misc.*;
import antlr.*;
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -0<
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.76 %ompilaci(n y e5ecuci(n
import antlraux.clparse.*;
import antlraux.context.*;
import antlraux.context.asts.*;
import antlraux.util.*;
import antlraux.util.LexInfoAST;
import antlraux.util.Logger;
public class Tool
{
public String mensajeAyuda="";
public boolean mostrarVentana=false;
public int nivelSemantico=1;
public String nombreFichero="";
public FileInputStream fis=null;
public boolean recuperacion=true;
public boolean imprimeArbol=false;
public void fijarMostrarVentana(Boolean B)
{ mostrarVentana=B.booleanValue(); }
public void =i9ar5ivelSemantico(Inte%er I)
{ nivelSemantico&I.int>alue(); !
public void fijarNombreFichero(String s)
{ nombreFichero=s; }
public void fijarRecuperacion(Boolean B)
{ recuperacion = B.booleanValue(); }
public void fijarImprimeArbol(Boolean B)
{ imprimeArbol = B.booleanValue(); }
public Tool ()
{ }
public void leeLC(String args[])
throws CommandLineParserException
{
CommandLineParser clp =
new CommandLineParser("leli.Tool", args);
clp.addCommand(this, "-ventana", "fijarMostrarVentana", "b",
"Ensea o no la ventana del AST (defecto no)");
clp.add:ommand(tAis? K$nsemK? K=i9ar5ivelSemanticoK? KiK?
K5ivel semTntico/ nada? I solo recorrer (de=ecto)?K#
KC cAeUueo de tipos F totalK);
clp.addCommand(this, "-f", "fijarNombreFichero", "s",
"Fija el nombre del fichero a reconocer");
clp.addCommand(this, "-erec", "fijarRecuperacion", "b",
"Activa/desactiva la recuperacin de errores
sintcticos" );
clp.addCommand(this, "-imprime", "fijarImprimeArbol", "b",
"Imprime el AST en la salida estndar");
mensajeAyuda = clp.getUsageMessage(true);
clp.parseWhilePossible();
clp.executeWhilePossible();
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -,
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.76 %ompilaci(n y e5ecuci(n
if( nombreFichero==null ||
nombreFichero.equals("") )
{
throw new CommandLineParserException(
"Se necesita un nombre de fichero");
}
try
{
fis = new FileInputStream(nombreFichero);
}catch (FileNotFoundException fnfe){
throw new
CommandLineParserException(
"El fichero '"+nombreFichero+"' no se pudo abrir");
}
}
public void imprimeAyuda()
{
System.err.println(mensajeAyuda);
}
public void trabaja()
{
Logger logger = new Logger("error", System.err);
try
{
System.out.println("Reconociendo el fichero '"+nombreFichero+"'");
// PASOS 2 y 3. Crear analizador lxico y pasarle nombreFichero
// y nueva clase Token
LeLiLexer lexer = new LeLiLexer(fis);
lexer.setFilename(nombreFichero);
lexer.setTokenObjectClass("antlraux.util.LexInfoToken");
// PASOS 4 y 5. Crear analizador sintctico y pasarle
// nombre fichero
antlr.Parser parser = null;
if(recuperacion)
parser = new LeLiErrorRecoveryParser(lexer, logger);
else
parser = new LeLiParser(lexer);
parser.setFilename(nombreFichero);
parser.setASTNodeClass("antlraux.util.LexInfoAST");
// PASO 6. Comenzar el anlisis
if(recuperacion)
((LeLiErrorRecoveryParser)parser).programa();
else
((LeLiParser)parser).programa();
int erroresSint = logger.getLogCounter();
if(erroresSint>0)
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -,1
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.76 %ompilaci(n y e5ecuci(n
{
System.err.println("errores sintcticos: "+ erroresSint);
}
// PASO 7. Obtener el AST
AST ast = parser.getAST();
// Aux: verboseStringConversion
BaseAST.setVerboseStringConversion(
true,
LeLiSymbolTreeParser._tokenNames);
Scope*S+.set>erboseStrin%:onversion(true);
6e<In=o*S+.set>erboseStrin%:onversion(=alse);
@<pression*S+.set>erboseStrin%:onversion(true);
+ype*S+.set>erboseStrin%:onversion(true);
Leclaration*S+.set>erboseStrin%:onversion(true);
// PASO 8. Recorrer el AST
+reeDarser treeDarser & null;
i=(nivelSemantico&&)
{
treeDarser & neH 6e6i+reeDarser();
((6e6i+reeDarser)treeDarser).pro%rama(ast);
!
i=(nivelSemantico>&I)
{
treeDarser &
neH 6e6iSymbol+reeDarser(lo%%er);
((6e6iSymbol+reeDarser)treeDarser).pro%rama(ast);
ast & treeDarser.%et*S+();
!
i=(nivelSemantico>&C)
{
6e6i:onte<t conte<to &
((6e6iSymbol+reeDarser)treeDarser).obtener:onte<to();
treeDarser &
neH 6e6i+ype:Aec7+reeDarser(lo%%er? conte<to);
((6e6i+ype:Aec7+reeDarser)treeDarser).pro%rama(ast);
}
// PASO 9. Mostrar el AST por pantalla
if(imprimeArbol==true)
{
System.out.println(ast.toStringList());
}
// PASO 10. Representacin en ventana del AST
if(mostrarVentana)
{
ASTFrame frame = new ASTFrame(nombreFichero, ast);
frame.setVisible(true);
}
}
catch (TokenStreamException tse)
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -,2
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7.76 %ompilaci(n y e5ecuci(n
{
tse.printStackTrace(System.err);
}
catch (RecognitionException re)
{
re.printStackTrace(System.err);
}
}
public static void main(String args[])
{
Tool t = new Tool();
try{
t.leeLC(args);
t.trabaja();
}catch(CommandLineParserException clpe){
System.err.println(clpe.getMessage());
System.err.println(t.mensajeAyuda);
}
}
}
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -,-
%aptulo 76 Anlisis semntico de LeLi 1ecci(n 7./6 %onclusi(n
Becci%n -..: &onclusi%n
E) an.)isis sem.ntico es e) ca2tu)o m.s )ar-o +e) +ocumento" 9or un )a+o !a teora en
a6un+ancia5 2or e) otro se +escri6en en 2rofun+i+a+ tres ana)i%a+ores5 cuan+o )o norma) es
+escri6ir uno 2or ca2tu)o" #+em.s5 se +escri6e e) funcionamiento +e) 2aquete m.s 0o)uminoso
+e ant)rau:"
9o+ramos !a6ernos e:ten+i+o muc!o m.s@ a) an.)isis sem.ntico )e 2asa un 2oco como a )a
-esti=n +e errores K se e:tien+e !asta +on+e uno est +is2uesto a to)erar" Ja mencion en )as
notas +e LeLiTypeCheckTreeParser que fa)tan a)-unos fi)os 2or 2u)ir"
9ero e) o64eti0o +e este +ocumento no es cu6rir e) +esarro))o +e un com2i)a+or i+ea)" Es muc!o
m.s +i+.cticoF enseCar a !acer un com2i)a+or5 uti)i%an+o e) +esarro))o +e uno como e4em2)o" J
no 0eo c=mo aCa+ir m.s ni0e)es a) an.)isis 2ue+e contri6uir a a)can%ar este o64eti0o"
Ie aqu e) #*$ +e un DIo)a mun+oE con errores sint.cticos (+e )os que e) com2i)a+or se
recu2er= sin 2ro6)emas)" 7=tese que a2arecen )os ti2os 2re+efini+os +e) sistema a+em.s +e )a
c)ase InicioF
Ilustracin 7.11 /01 de un OPola mundoO
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -,)
Captulo 8:
Generacin de cdigo
"i torturas suficiente a los datos, acabar#n confesando
8ona)+ Coase
Captulo 8:
Generacin de cdigo.......................................................................365
Seccin #.1: Introduccin......................................................................................................360
..1.1: $o generaremos c%digo.......................................................................................................... 3+-
..1.2: structura del ca'Atulo............................................................................................................. 3+-
Seccin #.2: $as /Auinas....................................................................................................36#
..2.1: 6e!iniciones............................................................................................................................. 3+.
..2.2: &om'onentes 'rinci'ales........................................................................................................ 3+.
La ,AL.............................................................................................................................................................3+.
La memoria......................................................................................................................................................3+1
Los registros....................................................................................................................................................3+1
Los buses......................................................................................................................................................... 3+1
Otros com'onentes.........................................................................................................................................3-C
..2.3: Uuego de %rdenes.................................................................................................................... 3-C
Las %rdenes.....................................................................................................................................................3-C
Yrdenes de movimiento y modos de direccionamiento..................................................................................3-C
Yrdenes de c(lculo aritm0tico.........................................................................................................................3-1
Yrdenes de salto incondicional.......................................................................................................................3-2
Baltos condicionales........................................................................................................................................3-2
Otras ...............................................................................................................................................................3-3
l tamaQo im'orta...........................................................................................................................................3-3
..2.": Las otras m(quinas................................................................................................................. 3-"
Seccin #.3: Bestin de la memoria.....................................................................................306
..3.1: 6e!inici%n................................................................................................................................. 3-+
..3.2: 6ivisi%n cl(sica de la memoria................................................................................................ 3-+
La 8ona de c%digo............................................................................................................................................ 3-+
Lona de datos est(ticos................................................................................................................................... 3--
La 'ila..............................................................................................................................................................3--
l montAculo.....................................................................................................................................................3--
..3.3: Acerca de la 'ila...................................................................................................................... 3-.
OrAgenes de la 'ila........................................................................................................................................... 3-.
/nvocando !unciones........................................................................................................................................3-1
l *ard)are de la 'ila......................................................................................................................................3.C
/nvocando !unciones en &...............................................................................................................................3.C
/nvocando m0todos.........................................................................................................................................3.3
l valor de retorno de una !unci%n o un m0todo.............................................................................................3.#
..3.": Acerca del motAculo................................................................................................................. 3.+
Fotivaci%n del montAculo.................................................................................................................................3.+
/m'lementaci%n...............................................................................................................................................3.-
Liberaci%n ex'lAcita de memoria: Fodelo de &S&OO.......................................................................................3..
Liberaci%n im'lAcita de memoria: Recolecci%n de basura..............................................................................31C
Kard)are del montAculo...................................................................................................................................311
l montAculo y LeLi..........................................................................................................................................311
..3.#: Acerca del o!!set...................................................................................................................... 311
@roblema.......................................................................................................................................................... 311
La jerarquAa de declaraciones.........................................................................................................................311
>amaQo de un ti'o...........................................................................................................................................312
6is'osici%n de los objetos en la memoria.......................................................................................................312
l des'la8amiento...........................................................................................................................................313
&(lculo de las direcciones de las instancias...................................................................................................313
Seccin #.!: "digo intermedio............................................................................................31
..".1: /ntroducci%n............................................................................................................................. 31#
Gua prctica de ANTLR 2.7.2 v 1. -,0
..".2: @ro'osiciones.......................................................................................................................... 31#
..".3: Objetivos y ventajas del c%digo intermedio............................................................................. 31+
Seccin #.: Beneracin de instrucciones 3 e-presiones.................................................310
..#.1: /ntroducci%n............................................................................................................................. 31-
..#.2: /nstrucciones condicionales..................................................................................................... 31-
&aso sim'le: un solo bloque condicional........................................................................................................31-
&aso 2: varios bloques condicionales.............................................................................................................31-
&aso 3: /nstrucci%n condicional com'leta.......................................................................................................31.
Gesti%n de las etiquetas..................................................................................................................................31.
..#.3: 4ucles...................................................................................................................................... 31.
4ucle mientras.................................................................................................................................................31.
4ucle *acerJmientras.......................................................................................................................................311
4ucle desde.....................................................................................................................................................311
..#.": /nstruccionesSex'resiones....................................................................................................... 311
x'resiones aritm0ticoJl%gicas: registros y valores tem'orales.....................................................................311
Asignaciones.................................................................................................................................................... "CC
Accesos a atributos 9$O a m0todos;.............................................................................................................."CC
Accesos a m0todos 9invocaciones;................................................................................................................."C1
Seccin #.6: 4ptimi%acin de cdigo................................................................................... !.2
..+.1: /ntroducci%n............................................................................................................................. "C2
..+.2: O'timi8aciones inde'endientes de la m(quina objetivo......................................................... "C2
liminaci%n de subex'resiones comunes......................................................................................................."C2
liminaci%n de c%digo inactivo........................................................................................................................"C2
>rans!ormaciones algebraicas........................................................................................................................"C3
O'timi8aciones relacionadas con constantes e invariantes..........................................................................."C3
O'timi8aciones de reordenamiento de c(lculo..............................................................................................."C3
..+.3: O'timi8aciones de'endientes de la m(quina objetivo............................................................ "C"
Asignaci%n de registros..................................................................................................................................."C"
>rans!ormaciones de reordenamiento............................................................................................................"C"
6esenrollado de bucles..................................................................................................................................."C"
,so de *ard)are es'ecA!ico............................................................................................................................"C#
..+.": @ortabilidad vs. e!iciencia........................................................................................................ "C+
&%digo abierto.................................................................................................................................................. "C+
LibrerAas del sistema......................................................................................................................................."C+
&om'ilaci%n U/>..............................................................................................................................................."C-
Seccin #.0: /iscelnea........................................................................................................ !.#
..-.1: /ntroducci%n............................................................................................................................. "C.
..-.2: Fa'eado de ti'os.................................................................................................................... "C.
Fa'eado de !lotantes sobre enteros..............................................................................................................."C.
Fa'eado de caracteres y booleanos..............................................................................................................."C1
Fa'eado de cadenas de caracteres y tablas.................................................................................................."C1
Fa'eado de ti'os de!inidos 'or el usuario......................................................................................................"C1
..-.3: LibrerAas y ti'os b(sicos del sistema....................................................................................... "1C
O'ci%n 1: &%digo embebido............................................................................................................................"1C
O'ci%n 2: &ondiciones es'eciales controladas.............................................................................................."11
O'ci%n 3: Bo'orte nativo................................................................................................................................."11
Seccin #.#: "onclusin........................................................................................................ !12
Gua prctica de ANTLR 2.7.2 v 1. -,,
%aptulo /6 Generaci(n de c(digo 1ecci(n /.16 &ntroducci(n
Becci%n ..1: /ntroducci%n
3a -eneraci=n +e c=+i-o es )a ?)tima fase +e) 2roceso +e com2i)aci=nF
Ilustracin 9.1 La Tltima &ase del proceso
3a -eneraci=n +e c=+i-o toma como entra+a una re2resentaci=n a6stracta +e) c=+i-o fuente
2ro+uce como resu)ta+o un c=+i-o equi0a)ente"
..1.1: $o generaremos c%digo
# 2esar +e ser una 2arte mu im2ortante +e un com2i)a+or5 no im2)ementaremos nin-?n
-enera+or +e c=+i-o 2ara e) nuestro" 3a 2rinci2a) ra%=n +e esta +ecisi=n es que un -enera+or +e
c=+i-o no i)ustra nin-una ca2aci+a+ +e #7$38 que no !aamos 0isto a@ )a ?nica K si se usa
a)-una K es )a +e recorrer #*$s5 cosa que a !emos !ec!o 0arias 0eces en )a fase +e) an.)isis
sem.ntico" Ie +eci+i+o concentrarme en e) an.)isis sem.ntico 2ara i)ustrar e) funcionamiento +e
#7$385 !e +e4a+o +e )a+o )a im2)ementaci=n +e) -enera+or +e c=+i-o"
# )o 2oco i)ustrati0o +e) caso se !an uni+o estas otras ra%onesF
X Bi inca2aci+a+ 2or +eci+irme so6re )a m.quina o64eti0o +e) com2i)a+or
X E) !ec!o +e que en nin-?n caso estamos im2)ementan+o un com2i)a+or comercia)F como a
mencion en )a intro+ucci=n +e este +ocumento5 3e3i a+o)ece +e 0arias carencias que )o !acen
in0ia6)e 2ara este 2ro2=sito (como )a inca2aci+a+ 2ara uti)i%ar 2unteros o ta6)as)"
X En muc!os casos )a -eneraci=n +e c=+i-o no es necesariaF )a maora +e )os )ectores +e este
+ocumento se contentar.n con rea)i%ar )as acciones 2ertinentes tras !a6er constru+o un #*$
a+ecua+o5 como !icimos en e) ca2tu)o ' con microca)c"
1ic!o esto5 me -ustara !acer una ac)araci=nF aunque no im2)ementemos -enera+or a)-uno5 s
que in+icaremos c=mo se +e6e im2)ementar ca+a as2ecto +e) -enera+or"
..1.2: structura del ca'Atulo
$o+o -enera+or +e c=+i-o tiene una Dm.quina o64eti0oE@ es +ecir5 )a m.quina so6re )a cua) se
e4ecutar. e) c=+i-o -enera+o" Buc!os +e )os a)-oritmos +e o2timi%aci=n +e c=+i-o se 6asan en
un 2rofun+o conocimiento +e )a m.quina o64eti0o" En )a si-uiente secci=n ana)i%aremos )a
estructura que tienen )as com2uta+oras actua)es"
3a secci=n 8"3 estar. +e+ica+a a) tema +e )a -esti=n +e memoria +urante )a -eneraci=n +e c=+i-o@
+efiniremos conce2tos como offset5 2i)a montcu)o"
En )a seccion 8"4 nos +eten+remos a ana)i%ar e) c=+i-o interme+io"
9osteriormente5 en )a secci=n 5 ana)i%aremos c=mo tratar )os Dcasos es2ecia)esE que a2arecen en
e) )en-ua4e (Oc=mo tratar )os ti2os 6.sicos +e) )en-ua4eQ O)a informaci=n +e ti2osQ)"
En otra secci=n5 )a 8"65 trataremos e) tema +e )a o2timi%aci=n"
9or ?)timo !a6r. una secci=n +e+ica+a a )as conc)usiones su-erencias"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -,7
#n.)isis ):ico
#n.)isis
sint.ctico
#n.)isis
sem.ntico
Generaci=n
+e c=+i-o
%aptulo /6 Generaci(n de c(digo 1ecci(n /.26 Las C"uinas
Becci%n ..2: Las F(quinas
..2.1: 6e!iniciones
7orma)mente e) c=+i-o -enera+o +urante )a -eneraci=n +e c=+i-o tiene como fina)i+a+ ser
De4ecuta+oE en a)-?n +is2ositi0o" # este +is2ositi0o )o ))amaremos )a Dm.quina o64eti0oE"
9or Dm.quinaE enten+eremos Dcua)quier mecanismo ca2a% +e rea)i%ar )as acciones co+ifica+as en
un c=+i-o -enera+o 2or un com2i)a+orE" #) 2roceso +e Drea)i%ar )as acciones co+ifica+as en un
c=+i-o -enera+oE se )e sue)e ))amar e4ecutar un c=+i-o"
Es una +efinici=n 6astante 2o6re@ no se +efine qu es un DmecanismoE ni qu son DaccionesE ni
Dc=+i-oE" $oman+o )a +efinici=n a) 2ie +e )a )etra5 un coc!e que se +etu0iera ante un sem.foro en
ro4o es2erara a que se 2usiera en 0er+e 2ara continuar entrara +entro +e esta +efinici=n" #) fin
a) ca6o5 se trata +e un DmecanismoE (un coc!e) que e4ecuta una Dacci=nE (es2erar )a 0er+e 2ara
continuar) co+ifica+a en un Dc=+i-oE (e) +e )os sem.foros)"
9ara restrin-ir un 2oco esta +efinici=n5 aCa+iremos que De) c=+i-oE es De) resu)ta+o +e un
2roceso satisfactorio +e com2i)aci=n +e un c=+i-o fuente uti)i%an+o un com2i)a+orE5 )as
DaccionesE son D)os a)-oritmos conteni+os en +ic!o c=+i-o fuenteE"
7os a6sten+remos 2or e) momento +e +efinir estrictamente qu enten+emos 2or DmecanismoE"
8etomaremos )a cuesti=n en e) ?)timo a2arta+o +e )a secci=n"
..2.2: &om'onentes 'rinci'ales
Como a in+icamos en )a secci=n 1"'"1 DConce2tos 6.sicosF soft<are !ar+<areE en un
2rocesa+or !a 3 e)ementos 6.sicosF una uni+a+ aritmticoA)=-ica5 o /#35 un con4unto +e
re-istros5 un m=+u)o +e memoria5 uni+os to+os me+iante 6uses +e informaci=nF
Ilustracin 9.2 EsFuema de una 2>
$a EA$
Es e) con4unto +e mecanismos +e )a com2uta+ora cua funci=n es rea)i%ar )os c.)cu)os +e)
2ro-rama" 9or Dc.)cu)osE enten+emos cua)quier o2eraci=n aritmtica (suma5 resta5
mu)ti2)icaci=n5 +i0isi=n) o )=-ica (com2araci=n) entre e)ementos 2ro0inentes tanto +e )a memoria
como +e )os re-istros"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -,/
/#3
BEB;8,#
8e-istros
%aptulo /6 Generaci(n de c(digo 1ecci(n /.26 Las C"uinas
$a memoria
9or DmemoriaE enten+eremos cua)quier ti2o +e +is2ositi0o +e a)macenamiento +e +atos que !aa
en e) or+ena+or" Esto inc)ue memoria 8#B5 cac! +e) 2rocesa+or5 +iscos +uros f)e:i6)es5 C1A
8;B* etc" 7o se inc)uen )os re-istros en este con4unto"
Es en )a memoria +on+e se a)macenan )os +atos necesarios 2ara 2o+er e4ecutar 2ro-ramas@ esto
inc)ue )os 2ro2ios 2ro-ramas (e) so&t$are +e) que !a6).6amos en e) 2rimer ca2tu)o)"
$os registros
3os re-istros son 2equeCas uni+a+es +e memoria +e mu 6a4a ca2aci+a+5 2ero que 2ue+en ser
acce+i+os m.s r.2i+amente que )a memoria" E:isten +os ti2os +e re-istroF )os +e uso -enera)
)os es2ecficos"
3os re-istros +e uso -enera) son aque))os que 2ue+en ser uti)i%a+os 2or )os 2ro-ramas 2ara
a)macenar +atos que inter0ienen en )os c.)cu)os" E) n?mero +e re-istros +e uso -enera) 0ara +e
un mo+e)o +e micro2rocesa+or a otro5 tam6in cam6ia su tamaCo )os nom6res que reci6en"
,nicia)mente !a6a 4 re-istros +e uso -enera) en )as m.quinas 80:86 (+esarro))a+as 2or ,nte)
#B1 en )a actua)i+a+)F #5 G5 C 15 tenan 8 6its +e ca2aci+a+" B.s tar+e Dse e:ten+ieronE5
))e-an+o a tener 16 6its5 ))am.n+ose E#5 EG5 EC5 E1" #5 G5 C 1 2o+an se-uir sien+o
referencia+os 2or e) c=+i-o m.quina como )os 8 6its menos si-nificati0os +e sus !ermanos
maores" En )a si-uiente 0ersi=n +e )a arquitectura se 0o)0ieron a e:ten+er )os re-istros5 ))e-an+o
a )os 3' 6its5 ))am.n+ose E#X5 EGX5 ECX5 E1X" $anto )os re-istros +e 8 como )os +e 16 6its
si-uien sien+o uti)i%a6)es como )a 2arte menos si-nificati0a +e estos re-istros"
3os re-istros es2ecficos tam6in 2ue+en ser uti)i%a+os 2or )os 2ro-ramas5 2ero no +e )a misma
forma que )os re-istros +e uso -enera)@ en e))os no 2ue+e insertarse cua)quier +ato que inter0en-a
en un c.)cu)o@ !a que insertar +atos concretos que mo+ifican e) com2ortamiento +e )a m.quina"
#)-unos e4em2)os +e re-istros es2ecficos sonF
X E) conta+or +e) 2ro-ramaF es e) re-istro en e) que se -uar+a )a si-uiente )nea +e c=+i-o
m.quina que se e4ecutar." Bo+ific.n+o)o se consi-ue cam6iar e) f)u4o +e) 2ro-rama"
X E) re-istro +e com2araciones 6an+erasF es e) re-istro en e) que se -uar+an )os resu)ta+os +e
a)-unas o2eraciones@ en uno +e sus 6its se -uar+a e) resu)ta+o +e )a ?)tima com2araci=n
6oo)eana (1 o 0 2ara cierto o fa)so) en otros 6its !a +i0ersas D6an+erasE (&lags) +e+ica+as a
in+icar si !a !a6i+o un over&lo$ o si )a memoria acce+i+a es Descri6i6)eE"
E) conta+or +e) 2ro-rama en )as m.quinas com2ati6)es con )a arquitectura 80:86 se ))ama E,9
(Extended Instruction >ointer)" 3os resu)ta+os +e )as com2araciones se -uar+an en e) re-istro #
(E#X)"
$os 7uses
3a ?nica uti)i+a+ +e )os 6uses +e +atos es )a +e trans2ortar informaci=n" *on e)ementos
D2asi0osE5 en e) senti+o +e que no mo+ifican )a estructura )=-ica +e )a C9/@ son so)amente un
trans2orte5 un so2orte fsico5 como e) 2).stico que so2orta e) si)icio"
#!ora 6ien5 +es+e e) 2unto +e 0ista 2r.ctico5 )os 6uses son im2ortantes 2orque 2ue+en constituir
cue))os +e 6ote))a +e) sistemaF 2ue+e que )os com2onentes -eneren informaci=n +emasia+o
+e2risa +e )o que )os 6uses sean ca2aces +e mane4ar5 )o que 2ue+e 2ro0ocar errores
+isminuci=n +e )a eficiencia" *i !a 6uses +e +iferentes 0e)oci+a+es en )a m.quina5 esto su2on+r.
interesantes 2ro6)emas +e o2timi%aci=n +e) c=+i-o"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -,<
%aptulo /6 Generaci(n de c(digo 1ecci(n /.26 Las C"uinas
4tros componentes
/n com2uta+or que so)amente +is2on-a +e )os 4 com2onentes enuncia+os 2re0iamente ser.
in?ti)" 3os or+ena+ores necesitan +e otros e)ementos que5 aun no sien+o Desencia)esE +es+e e)
2unto +e 0ista )=-ico5 en )a 2r.ctica con0ierten un sim2)e amasi4o +e circuitos en una !erramienta
mu 2otente" #)-unos +e estos e)ementos sonF
X 3a circuitera +e contro)F Es )a 2arte !ar+<are +e) 2rocesa+or que se encar-a +e Dcontro)arE e)
2rocesa+or5 2ro+ucien+o seCa)es +e contro) a )os +iferentes com2onentes a 2artir +e )os
c=+i-os 6inarios +e )a memoria"
X 1is2ositi0os +e sa)i+aF ,m2resoras5 monitores5 a)ta0oces5 etc5 4unto con )as tar4etas 2uertos
que )os conectan a) 2rocesa+or"
X 1is2ositi0os +e entra+aF Como un tec)a+o5 un micr=fono o una tar4eta +e re+"
X #)imentaci=nF *istema +e +istri6uci=n +e ener-a e)ctrica"
X 8efri-eraci=nF 9ara +etermina+as %onas que a)can%an a)tas tem2eraturas"
X *istema +e arranqueF Es e) con4unto +e e)ementos e)ctricos )=-icos que !ace 2osi6)e e)
arranque +e) or+ena+or (interru2tor +e encen+i+o5 circuitera 8;B +e )a G,;*)
..2.3: Uuego de %rdenes
$as rdenes
3os 2ro-ramas que e4ecuta una m.quina son secuencias +e =r+enes -ra6a+as en una %ona +e )a
memoria" >sicamente son secuencias +e ceros unos@ )=-icamente co+ifican una serie +e
acciones a rea)i%ar" ;tros nom6res que se )es +an a )as =r+enes son DinstruccionesE o
D2ro2osicionesE"
Es mu infrecuente escri6ir +irectamente e) c=+i-o 6inario +e un 2ro-rama en un )i6ro" En )u-ar
+e e))o se uti)i%a un 2seu+o )en-ua4e que es una tra+ucci=n +irecta +e )as =r+enes conteni+as en )a
memoria5 2ero que es m.s inte)i-i6)e 2ara )os !umanos" Es e) )en-ua4e ensam6)a+or
(3
" 3os
e)ementos 2rinci2a)es +e) ensam6)a+or son )os mnem=nicos5 que i+entifican qu es )o que !acen
)as +iferentes =r+enes"
3as =r+enes 2ue+en c)asificarse en +i0ersos -ru2os se-?n su funciona)i+a+F
X =r+enes +e mo0imiento +e +atos
X =r+enes +e c.)cu)os aritmticos
X =r+enes +e sa)to incon+iciona)
X or+enes +e sa)to con+iciona)
X otras
3as iremos 0in+o)as una a una en )os si-uientes su6a2arta+os"
Rrdenes de movimiento 3 modos de direccionamiento
$ienen )a forma
MOV fuente, destino
1on+e
(3 Ja !a6)amos +e) ensam6)a+or en )a secci=n 1"'"' 2osteriores"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -7
%aptulo /6 Generaci(n de c(digo 1ecci(n /.26 Las C"uinas
X fuente es una +irecci=n +e memoria5 un re-istro o un 0a)or"
X destino es una +irecci=n +e memoria o un re-istro"
3os 0a)ores norma)mente se es2ecifican sim2)emente con un n?mero" 3os re-istros se referencian
con su nom6re" #s5 )a or+en Dinsertar e) 0a)or 1 en e) re-istro #E ten+r. )a formaF
MOV 1, A
3as +irecciones +e memoria son un 2oco m.s com2)ica+as +e referenciar5 a que 2ue+en !a
0arios Dmo+os +e referenciaE" *e )es ))ama modos de direccionamiento" 3a sinta:is concreta 2ara
ca+a mo+o 0ara se-?n e) ensam6)a+or que se uti)ice@ nosotros 2o+remos i+entificar un acceso a
memoria -racias a )os corc!etes (ST)"
E) mo+o m.s senci))o es e) mo+o a"soluto5 consistente en uti)i%ar +irectamente un n?mero" #sF
MOV 1, [1024]
Escri6e e) 0a)or 1 en )a 2osici=n +e memoria 10'4" 7orma)mente )as 2osiciones +e memoria son
6tesF )a 10'4 es 1 6te5 )a 10'& es e) si-uiente etc"
;tro mo+o +e +ireccionamiento es e) mo+o registro" Esta 0e% )a +irecci=n +e memoria es )a que
se encuentra en e) re-istro" 9or e4em2)oF
MOV 255, A # guarda el valor 255 en el registro A
MOV 13, [A] # guarda el valor 13 en la direccin contenida en A
Estas +os instrucciones -uar+an e) 0a)or 13 en )a +irecci=n +e memoria '&&5 que es +irecciona+a
a tra0s +e) re-istro #" 7=tese )a sinta:is uti)i%a+a 2ara +efinir )os comentarios"
/n mo+o +eri0a+o +e) mo+o re-istro es e) mo+o registro indi-ado o registro con
despla-amiento" Este mo+o inc)ue una constante que +e6e aCa+irse a) 0a)or +e) re-istro 2ara
ca)cu)ar )a +irecci=n +e memoria" 9or e4em2)oF
MOV 255, A
MOV 0, 6[A] # la direccin modificada es 2050+6 = 2056
E) si-uiente mo+o +e +ireccionamiento es un 2oco m.s com2)ica+o" *e ))ama mo+o indirecto"
Este mo+o uti)i%a un re-istro 2ara a2untar a una +irecci=n +e memoria Fue a su ve- apunta a
otra direccin de memoria" *i estu0iramos !a6)an+o +e) )en-ua4e C +iramos que en e) re-istro
se -uar+a )a +irecci=n +e memoria +on+e est. -uar+a+o un 2untero"
9ara +enotar e) mo+o in+irecto uti)i%aremos e) asterisco (Y)5 +e )a misma forma que )o uti)i%amos
en C" /n e4em2)o +e uso +e) mo+o in+irecto es e) si-uienteF
MOV 150 , [252] # guarda el valor 150 en la lnea 252
MOV 252 , A # guarda el valor 252 en el registro A
MOV *[A], B # guarda el valor 150 en el registro B
9or ?)timo5 est. e) mo+o indi-ado indirecto5 o indirecto con despla-amiento" Es simi)ar a)
anterior 2ero aCa+ien+o una constanteF
MOV 150 , [252] # guarda el valor 150 en la lnea 252
MOV 250 , A # guarda el valor 250 en el registro A
MOV *2[A], B # guarda el valor 150 en el registro B
Rrdenes de clculo aritm2tico
3as o2eraciones aritmticas tienen una forma 2areci+a a )a +e mo0imientoF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -71
%aptulo /6 Generaci(n de c(digo 1ecci(n /.26 Las C"uinas
op fuente, destino
1on+e
X fuente es una +irecci=n +e memoria5 un re-istro o un 0a)or"
X destino es una +irecci=n +e memoria o un re-istro"
X op es un mnem=nico +e) si-uiente con4untoF f#115 */G5 B/35 1,Rg" 3os mnem=nicos
re2resentan res2ecti0amente )a suma5 resta5 mu)ti2)icaci=n +i0isi=n"
ADD A, B # suma el contenido de los registros A y B y lo guarda en B
SUB 32,[120] # resta 32 al contenido de la lnea 120
MUL *[B], [340] # multiplica el contenido de *[B] y [340] y lo guarda
# en la lnea 340
DIV 2, B # divide el contenido del registro B por dos
Ia a)-unos casos es2ecia)es en )os cua)es )as o2eraciones aritmticas no +e0ue)0en )os
resu)ta+os que +e6eran" ConcretamenteF
X #11 B/3 2ue+en 2ro0ocar over&lo$5 es +ecir5 que 2ue+en 2ro+ucir un resu)ta+o
+emasia+o -ran+e 2ara ser -uar+a+o en fuente"
X 1,R 2ue+e 2ro0ocar un error +e +i0isi=n 2or cero"
7orma)mente e) com2ortamiento +e) com2uta+or ante estas situaciones 2ue+e D2ro-ramarseE"
#qu su2on+remos que sim2)emente se )imita a Da2untarE en un Dre-istro +e 6an+erasE (0er m.s
a+e)ante) si !a ocurri+o a)-?n 2ro6)ema"
Rrdenes de salto incondicional
9ara 2o+er uti)i%ar )as instrucciones +e sa)to incon+iciona) e:i-en que a) menos una +e )as
=r+enes +e) 2ro-rama ten-a una etiFueta" /na etiqueta es una ca+ena +e te:to que i+entifica a
or+en" *e sit?a +e)ante +e e))a5 se2ara+a con )os +os 2untos (F)" 7o 2ue+e !a6er +os etiquetas
i-ua)es en un mismo 2ro-ramaF
etiqueta1: MOV 0, A # Esta orden tiene la etiqueta etiqueta1
3a instrucci=n +e sa)to con+iciona) tiene )a si-uiente formaF
JMP etiqueta
1on+e etiqueta es una etiqueta 0.)i+a +e) 2ro-rama"
/na instrucci=n +e sa)to con+iciona) mo+ifica e) f)u4o natura) +e) 2ro-rama (e4ecutar una or+en
+etr.s +e otra) 2ermitien+o Dsa)tarE a una or+en cua)quiera +e) 2ro-rama" /na 0e% e4ecuta+a )a
or+en5 e) f)u4o +e) 2ro-rama contin?a con )a si-uiente or+en"
ZeroA: MOV 0,A
JMP ZeroA
E) c=+i-o anterior es un D6uc)e infinitoEque nunca +e4a +e 2oner a cero e) re-istro #"
Saltos condicionales
3os sa)tos con+iciona)es se rea)i%an si se cum2)e cierta con+ici=n )=-ica5 que norma)mente
im2)ica una com2araci=n numrica"
3a or+en JE (Sump i& EFual) sir0e 2ara 0er si +os 0a)ores son i-ua)esF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -72
%aptulo /6 Generaci(n de c(digo 1ecci(n /.26 Las C"uinas
JE A,B,etiqueta
MOV 0,B
etiqueta: MOV 0,A
En e) c=+i-o anterior5 si # es i-ua) a G5 # se !ace 0" En otro caso5 tanto # como G se !acen 0"
J7E (Sump i& Aot EFual) es )a instrucci=n contraria a JEF sa)ta si so)o si )os 0a)ores son
distintos" 1e esta manera5 )a 0ersi=n +e) c=+i-o anterior con J7E sera asF
JNE A,B,etiqueta
MOV 0,A
etiqueta: MOV 0,B
(7=tese que )a se-un+a tercera or+en se !an intercam6ia+o)"
JG JGE sir0en 2ara 0er si un 0a)or es DmaorE o Dmaor o i-ua)E que otro5 sa)tan+o si es as"
*us mnem=nicos si-nifican res2ecti0amente Sump i& Nreater Sump i& Nreater or EFual"
9or e4em2)oF
JG A, 0, et1 # salta a et1 si A>0
JGE A, 0, et1 # dem, pero salta si A>=0
*imi)ares a JG JGE son )as =r+enes J3 J3E ( Sump i& Lesser Sump i& Lesser or EFual )5 que
sa)tan si un 0aor es DmenorE o Dmenor o i-ua)E que otro +a+oF
JL A, 10, et1 # salta a et1 si A<10
JLE A, 10, et1 # dem, pero salta si A <=10
4tras
E:isten muc!simas otras instrucciones en )os 2rocesa+ores actua)es@ enunciaremos so)amente
a)-unas"
Est.n 2or e4em2)o )as instrucciones +e c.)cu)os so6re 0a)ores en coma f)otante5 que uti)i%an
re-istros es2ecia)es" 7orma)mente se escri6en 2rece+ien+o +e una DfEa sus equi0a)entes enteros"
#s5 >B;R sir0e 2ara mo0er 0a)ores f)otantes5 >#11 2ara sumar)os5 etc"
$am6in est.n )as instrucciones +e 2rocesamiento en 2ara)e)o5 como e) 4ue-o +e instrucciones
BBX que #B1 e ,nte) inc)uen en sus 2rocesa+ores +es+e !ace 6astantes aCos" #unque estas
=r+enes tienen muc!as a2)icaciones5 son uti)i%a+as maoritariamente 2ara e) 2rocesamiento
-r.fico"
+l tama6o importa
Ia un +eta))e que qui%.s !a 2asa+o un 2oco 0e)a+o a )o )ar-o +e este a2arta+oF e) tamaCo (en
6its) +e )os o2era+ores +e ca+a or+en"
Iemos menciona+o que )os re-istros +e una m.quina :86 2ue+en ser acce+i+os +e +iferentes
maneras@ 2or e4em2)o5 e) re-istro +e 3' 6its E#X 2ue+e acce+erse como D#E ( se o6tiene e) 6te
menos si-nificati0o) o como E# (16 6its)5 a+em.s +e como E#X"
En otras 2a)a6rasF )as m.-inas :86 2ue+en mane4ar +atos +e +iferentes tamaCos"
Es necesario 2or )o tanto es2ecificar una 2o)tica +e mane4o +e +atos +e +iferentes tamaCos"
1ic!a 2o)tica +e6e +ar res2uesta a 2re-untas ta)es como DOqu 2asa cuan+o se suman un n?mero
+e 16 6its uno +e 8Q OEst. 2ermiti+o que e) +estino ten-a 8 6its en +ic!o casoQE o DOC=mo se
inserta un re-istro +e 3' 6its en )a %ona +e memoria 10'4Q O*o)amente se 2ue+en insertar en )as
%onas +e memoria m?)ti2)os +e 4 o se 2ue+en insertar en cua)quierQE"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -7-
%aptulo /6 Generaci(n de c(digo 1ecci(n /.26 Las C"uinas
..2.": Las otras m(quinas
Iasta a!ora !emos nos !emos referi+o a D)a m.quinaE como una arquitectura 2rofun+amente
estan+ari%a+aF memoria5 c.)cu)o5 re-istros5 6uses" 1a )a im2resi=n +e que aunque )a canti+a+5
ca2aci+a+ 0e)oci+a+ +e +ic!os com2onentes 0are5 )as com2uta+oras son esos cuatro
com2onentes uni+os +e una u otra forma" J 2or )o tanto su 4ue-o +e instrucciones es un ca)co
+e) !ar+<are que !a 2or +e6a4o"
9ues 6ien5 esto no es cierto@ +es+e !ace tiem2o se conocen otros mo+os +e e4ecutar c=+i-o"
7=tese )a +efinici=n +e Dm.quinaE +e +.6amos a) 2rinci2io +e )a secci=nF Duna m.quina es
cua)quier mecanismo que sea ca2a% +e e4ecutar )as acciones co+ifica+as en un c=+i-oE" En nin-?n
momento se !ace referencia a Duni+a+es +e memoriaE o Dre-istrosE en +ic!a +efinici=n" #s5 es
2osi6)e im2)ementar una m.quina sin re-istros5 que uti)ice +irectamente )a memoria5 como )a
m.quina 0irtua) que e) equi2o 9ero:i+e (2ttp6IIDDD.pero8ide.d7) uti)i%a 2ara e) )en-ua4e
91X*cri2t
(4
" Esta m.quina uti)i%a so)amente )a 2i)a5 +e manera que 2ara sumar +os n?meros
2rimero !a que a2i)ar)os" 1es2us5 una or+en es2ecia) se encar-a +e +esa2i)ar )os +os n?meros
+e )a cima +e )a 2i)a5 sumar)os -uar+ar e) resu)ta+o" #s5 2ara sumar 1 ' !a que -enerar )o
si-uienteF
PUSH 1 # Estado de la pila: (1)
PUSH 2 # Estado de la pila: (1,2)
ADD # Estado de la pila: (3)
1e !ec!o5 si e:aminamos nuestra +efinici=n +e m.quina5 0eremos que no se !ace referencia a
ningTn componente %ard$are" *o)amente se menciona )a 2a)a6ra DmecanismoE" Es cierto que )a
ace2ci=n !a6itua) +e )a 2a)a6ra es Din-enio mec.nico !ec!o +e una o 0arias 2ie%as m=0i)esE" *in
em6ar-o no es e) ?nicoF un 2ro-rama soft<are es tam6in un mecanismo"
1e !ec!o5 una m.quinas mu famosa usa+a en e) mun+o no tiene un so)o circuito5 tuerca o
so)+a+uraF es un 2ro-rama soft<are5 se ))ama )a B.quina Rirtua) +e Ja0a (o Sava Mirtual
@ac%ineB JRB)" Es D0irtua)E 2recisamente 2orque no e:iste fsicamenteF es un 2ro-rama +e
or+ena+or" Eso s5 necesita +e un sistema o2erati0o so6re e) que e4ecutarse
(&
"
E:isten 0ersiones +e )a JRB 2ara muc!os sistemas o2erati0os@ tam6in !a una 0ersi=n +e )a
JRB que se e4ecuta so6re Bicrosoft \in+o<s" Es e) e4ecuta6)e J#R#"EXE que se uti)i%a 2ara
e4ecutar )as a2)icaciones 4a0a ( e) 2ro2io #7$38)"
Es f.ci) 0er +=n+e est.n )as DaccionesE De) c=+i-oE +e JRB" 3as =r+enes 2ara )a JRB est.n
Dco+ifica+asE +entro +e )os fic!eros Y"c)ass5 que )os D)eeE rea)i%a )as DaccionesE co+ifica+as en
e))os"
/na 0enta4a que tiene )a JRB so6re )as m.quinas tra+iciona)es es que5 a) carecer +e un so2orte
fsico rea)5 e) 4ue-o +e =r+enes +e )as que +is2one no est. )imita+o 2or +ic!o so2orte" #s5 e)
)en-ua4e +e )os fic!eros Y"c)ass es una es2ecie +e D)en-ua4e 4a0a en 6inarioE@ 2or e4em2)o5 a+mite
nati0amente cualFuier tipo declarado en 4ava5 no so)amente DenterosE Df)otantesE como !acen
)as me4ores m.quinas c).sicas actua)mente
(6
" Es +ecir5 que )os ti2os no Dse 2iertenE a) -enerar e)
c=+i-o"
3a 2rinci2a) +es0enta4a +e )a JRB es )a eficienciaF )a m.quina 0irtua) Docu2aE 2arte +e) tiem2o +e
2roceso5 +e manera que )os 2ro-ramas 4a0a son casi siem2re a)-o m.s )entos que sus equi0a)entes
(4 3a JRB tam2oco uti)i%a re-istros@ so)amente )a 2i)a"
(& #ctua)mente !a +i0ersos 2roectos que !acen que esto a no sea tan necesario" 9or e4em2)o5 3E; es un intento +e !acer un
sistema o2erati0o en Ja0a (+e manera que )os 6inarios +e) sistema sean )os 2ro2ios fic!eros Y"c)ass)" Ia otras a)ternati0as 2ara
so2ortar Ja0a a ni0e) +e !ar+<are"
(6 E) ti2o 6oo)ean es emu)a+o con un ti2o entero 0a)ien+o 0 o 15 se-?n )a +ocumentaci=n +e )a 4+H 1"1"4"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -7)
%aptulo /6 Generaci(n de c(digo 1ecci(n /.26 Las C"uinas
com2i)a+os 2ara )a m.quina Drea)E so6re )a que se e4ecutan"
;tro e4em2)o +e m.quina 0irtua) es )a 2)ataforma "7E$ +e Bicrosoft" E) )en-ua4e en este caso se
))ama C38 (2ommon Langua4e ?untime) tiene )a 0enta4a +e que 2ue+e -enerarse +es+e
com2i)a+ores 2ara 0arios )en-ua4es" *u 2rinci2a) +efecto es que 2or e) momento so)amente !a
0ersiones +e "7E$ 2ara a)-unas 0ersiones +e \in+o<s
((
"
"7E$ so)uciona e) 2ro6)ema +e )a eficiencia +e Ja0a -racias a )a com2i)aci=n J,$ (Sust In 1ime)
que transforma )os fic!eros C38 en fic!eros e4ecuta6)es +irectamente so6re <in+o<s"
#nte esta 2ers2ecti0a es mu +ifci) +efinir 2or com2)eto qu es una m.quina" 7os que+aremos
con )a me4or +efinici=n que )e !emos +a+oF una m.quina es Dcua)quier mecanismo ca2a% +e
e4ecutar )os a)-oritmos +e un 2ro-rama fuente a 2artir +e) 2ro+ucto +e una com2i)aci=n
satisfactoria so6re +ic!o 2ro-ramaE"
Pue )os 0a)ientes intenten +efinir DmecanismoE"
(( 1efecto que e) 2roecto B;7;5 +e )a em2resa Ximian5 2o+ra so)ucionar en un futuro cercano"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -70
%aptulo /6 Generaci(n de c(digo 1ecci(n /.-6 Gesti(n de la memoria
Becci%n ..3: Gesti%n de la memoria
..3.1: 6e!inici%n
3os 2ro-ramas que -eneremos +e6er.n -uar+ar sus +atos en )a memoria +e )a m.quina o64eti0o"
9or tanto5 -estionar +ic!a memoria es una tarea ca2ita)"
,m2)ementar )a -esti=n +e )a memoria 0ariar. +e +ificu)ta+ +e2en+ien+o +e )a m.quina o64eti0o"
#s5 en )as m.quinas 0irtua)es +e ?)tima -eneraci=n5 como )a JRB5 )a -esti=n es senci))aF cuenta
con =r+enes ta)es como new5 que 2ermiten ais)ar a) -enera+or +e c=+i-o +e )os +eta))es +e )a
-esti=n"
*i en cam6io estamos -eneran+o c=+i-o 2ara una m.quina m.s Dc).sicaE5 encontraremos a)-unas
+ificu)ta+es" En esta secci=n su-eriremos c=mo su2erar a)-unos +e estos 2ro6)emas"
..3.2: 6ivisi%n cl(sica de la memoria
E:iste una manera estan+ari%a+a +e +i0i+ir )a memoria en %onas5 +e2en+ien+o +e )a funci=n que
rea)i%e ca+a %ona" 3as %onas son c=+i-o5 +atos est.ticos5 2i)a montcu)o5 a+em.s +e una %ona
0aca Dtierra +e na+ieE"
La siguiente ilustracin aparece en 82ompiladores. >rincipiosB tcnicas ! %erramientas; Ded. >earsonE de /%oB 0et%i ! llmanB
en la seccin 7.2 83rgani-acin de la memoria;
Ilustracin 9.( Divisin cl#sica de la memoria
*****
$a %ona de cdigo
Es )a %ona +on+e se -uar+an )as secuencias +e =r+enes que constituen e) 2ro-rama a e4ecutar"
9or )o -enera) se trata +e una %ona Dtranqui)aE5 en e) senti+o +e que sus +atos no sue)en ser
mo+ifica+os +urante to+a )a e4ecuci=n +e) 2ro-rama
(8
"
Ja !emos menciona+o c=mo se co+ifican )as =r+enes en )a memoria +e una m.quina c).sica"
7orma)mente )os 6its m.s si-nificati0os co+ifican e) ti2o +e )a instrucci=n (B;R5 #115 JB9""")5
)os si-uientes son uti)i%a+os 2ara -uar+ar )os 2ar.metros"
(8 3a e:ce2ci=n son )os 2ro-ramas con c=+i-o automo+ifica+o" Gron Ia2-oo+ tiene un artcu)o mu 6ueno so6re esto en DName
>rogramming Nems 2E (e+" C!ar)es 8i0er Be+ia)5 secci=n 1"14"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -7,
C=+i-o
1atos est.ticos
9i)a
Bontcu)o
%aptulo /6 Generaci(n de c(digo 1ecci(n /.-6 Gesti(n de la memoria
Ilustracin 9.* 1pica lnea de cdigo
E) esquema +e )a fi-ura anterior sir0e 2ara 2a)a6ras +e cua)quier tamaCo@ sim2)emente in+ica que
)os 2rimeros 6its re2resentan e) ti2o +e or+en e) resto )os 2ar.metros"
Es im2ortante tener en cuenta que inc)uso en una misma m.quina e) n?mero +e 6its +e+ica+o a
co+ificar e) o2era+or es 0aria6)e@ 2or e4em2)o5 en e) Botoro)a 68000 un sa)to ocu2a6a unos
2ocos 6its5 e) resto era uti)i%a+o 2ara )a )nea a )a que sa)tar" ;tras =r+enes uti)i%a6an m.s 6its
2ara co+ificarse5 2or )o tanto tenan menos es2acio 2ara co+ificar )os 2ar.metros"
9or su2uesto5 )o mismo que ocurre con )os o2era+ores ocurre con )os 2ar.metrosF no to+os
ocu2an )o mismo"
En ocasiones )os 2ar.metros +e una or+en ocu2an tanto es2acio que )a or+en ocu2a 0arias )neas
+e memoriaF
Ilustracin 9., 3rden en varias lneas de memoria
9or su2uesto esto no es +esea6)e en trminos +e eficiencia@ 2ero en a)-unas ocasiones
sim2)emente no !a otra so)uci=n"
5ona de datos estticos
Esta %ona5 como su 2ro2io nom6re in+ica5 tam2oco cam6iar. muc!o +urante e) curso +e)
2ro-rama" Es )a %ona +e+ica+a a -uar+ar +atos Dinmuta6)es 2ero necesariosE 2ara )a e4ecuci=n
+e) 2ro-rama" #)-unos e4em2)os +e informaci=n que se 2ue+e -uar+ar en esta %onaF
X Constantes +e) 2ro-rama (si no !an si+o sustitui+as en e) an.)isis sem.ntico)
X ,nformaci=n so6re e) sistema +e ti2osF c)ases5 su6c)ases5 etc5 necesaria 2ara 2o+er rea)i%ar
conversiones de tipo %acia a"a4o (con0ertir una c)ase a una su6c)ase) +e forma se-ura"
X $i2os funciones 6.sicos +e) sistema"
X Ca+enas +e te:to que a2arecen se uti)icen en e) c=+i-o (como e) DIo)a mun+oE)"
X """
$a pila
3a 2i)a es una +e )as %onas D0aria6)esE +e )a memoria" Es a)) +on+e +e6emos a)o4ar )os o64etos
que se instancien +urante e) 2ro-rama@ )os o64etos se crean +estruen continuamente5 2or )o
tanto )a 2i)a est. continuamente cam6ian+o"
Estu+iaremos e) funcionamiento +e )a 2i)a con m.s +etenimiento en e) si-uiente a2arta+o"
+l montculo
Es )a otra -ran %ona D0aria6)eE +e )a memoria" En 2rinci2io tiene )a misma uti)i+a+ que )a 2i)aF
a)o4ar )as instancias +e )os o64etos +urante )a e4ecuci=n +e un 2ro-rama" B.s informaci=n en e)
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -77
;2era+or 9ar.metro1
9ar.metro' 9ar.metro3
;2era+or 9ar.metro1 9ar.metro'
%aptulo /6 Generaci(n de c(digo 1ecci(n /.-6 Gesti(n de la memoria
si-uiente a2arta+o"
..3.3: Acerca de la 'ila
4rgenes de la pila
En un 2rinci2io )os )en-ua4es +e 2ro-ramaci=n mu sim2)es +e mu 6a4o ni0e) (mu cercanos a
)a m.quina o64eto)" Eran tam sim2)es que so)amente !a6a una funci=n 2or 2ro-rama@
2rinci2a)mente se uti)i%an6an en e) .m6ito uni0ersitario 2ara rea)i%ar c.)cu)os matem.ticos" *e
2arecan a estoF
5 dim a, b, c, aux, x1, x2 as Float
10 input a
20 input b
30 input c
40 if a=0 then goto 200
60 let aux = sqrt(b*b - 4*a*c)
70 let x1 = (-b + aux)/2*a
80 let x2 = (-b - aux)/2*a
90 print solutions: ; x1 ; and ; x2
100 exit
200 print No solution
210 exit
Este c=+i-o en 2seu+oAG#*,C
(9
ca)cu)a )a so)uci=n +e una ecuaci=n +e se-un+o -ra+o" 7o es
mu com2)ica+o +e mane4ar a ni0e) +e memoriaF to+as )as 0aria6)es +e6an ser +ec)ara+as a)
2rinci2io +e) 2ro-rama5 eran sim2)emente a)oca+as en )a %ona +e +atos est.ticos"
E) 2ro6)ema sur-i= con )os 2rimeros 2ara+i-mas funciona)es5 o Dsu6rutinasEF
5 dim a, b, c, aux, x1, x2 as Float
10 input a
20 input b
30 input c
40 %osub I
50 print solutions: ; x1 ; and ; x2
60 exit
100 rem ---- comienza la subrutina de clculo ------
110 if a=0 then goto 150
120 let aux = sqrt(b*b - 4*a*c)
130 let x1 = (-b + aux)/2*a
140 let x2 = (-b - aux)/2*a
150 return
200 print No solution
210 exit
3as 2rimeras su6rutinas eran meros 2e+a%os +e c=+i-o a )os que no se )es 2asa6a 2ar.metro
a)-uno@ acce+an a 0aria6)es -)o6a)es 2or su nom6re" 1entro +e sus )imitaciones5 )as su6rutinas
tenan su uti)i+a+F comen%aron a 2ermitir )a reuti)i%aci=n +e c=+i-o"
3a instrucci=n gosub era una e0o)uci=n +e goto(una instrucci=n +e sa)to incon+iciona) norma))"
Cuan+o se uti)i%a6a )a instrucci=n gosub xxx5 e) f)u4o +e) 2ro-rama cam6ia6a !acien+o ::: )a
si-uiente )nea a e4ecutar +e i-ua) manera que )o !ara con goto xxx5 con la salvedad de Fue al
llegar a la instruccin return el &lu4o del programa de"a reco"rarse donde se de4 ()a )nea
si-uiente a a que))a que in0oc= e) gosub)" Esta6a c)aro que era necesario D-uar+arE )a instrucci=n
(9 7=tense )os n?meros +e )nea@ )as 2rimeras 0ersiones +e G#*,C no eran suficientemente 2otentes 2ara mane4ar etiquetas" *e
numera6an +e 10 en 10 2or si !aca fa)ta insertar c=+i-o interme+io m.s a+e)ante"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -7/
%aptulo /6 Generaci(n de c(digo 1ecci(n /.-6 Gesti(n de la memoria
que e4ecuta6a )a su6rutina en a)-una 2arte"
9ero 2o+a com2)icarse m.sF +a+o que )as su6rutinas 2o+an Dani+arseE (in0ocarse )as unas a )as
otras) e) 2ro-rama 2o+a 2resentar n gosub ani+a+os K )ue-o ten+ra que recor+ar n n?meros +e
)nea +iferentes"
Entonces es cuan+o nace )a 2i)a +e) 2ro-ramaF )a 2i)a inicia) era una 2equeCa secci=n +e memoria
en )a que e) 2rocesa+or Da2i)a6aE e) conta+or +e) 2ro-rama en ca+a gosub5 )o D+esa2i)a6aE en
ca+a return" *u nom6re 0iene +e ese com2ortamiento tan t2icamente >,3;
80
"
Ilustracin 9.. 2omportamiento de la pila con gosu"
$n-ase 2resente que a 2esar +e) uso +e )a 2i)a5 sta si-ue sien+o un 2e+a%o +e memoria5 2or )o
tanto sus e)ementos accesi6)e a)eatoriamente K 2ara acce+er a) tercer 0a)or +e )a 2i)a no !ace fa)ta
+esa2i)ar )os +os 2rimeros" En esto se +iferencia +e) ti2o a6stracto +e +atos D9i)aE5 que se enseCa
a )os estu+iantes +e )os 2rimeros cursos +e inform.tica"
Invocando )unciones
E) si-uiente 2aso en )a e0o)uci=n +e )os )en-ua4es fueron )as D0er+a+eras funcionesE" cstas
ace2ta6an 2ar.metros5 a+em.s 2ermitan )a +ec)araci=n +e 0aria6)es )oca)es" 3as funciones
tam6in 2ue+en Dani+arseE5 como )as su6rutinas" $am6in !a Dfunciones recursi0asE5 es +ecir5
funciones que se ))aman a s mismas" #+em.s5 )os )en-ua4es a son +e m.s a)to ni0e)F )a m.quina
o64eto se 0a !acien+o m.s in0isi6)e" #! tenemos a) )en-ua4e CF
long factorial(long n)
{
if(n<=1) return 1;
else return(n*factorial(n-1));
}
int main (int argc, char*[] argv )
{
int n;
long l = 0;
sscanf(argv[1], %d, &n);
80 D)irst InB Last 3ut; o D3o 2rimero que entra es )o ?)timo que sa)eE" /na 2i)a es )a estructura +e +atos >,3; 2or e:ce)encia"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -7<
10 gosub 100
20 ...
100 gosub 250
150 return
110 ...
250 ...
290 return
160 ...
Pila en T1
T1
T2
T3
T4
20
Pila en T2
20
120
Pila en T4
Pila en T3
20
Cdigo
Cambios en el
flujo del programa
%aptulo /6 Generaci(n de c(digo 1ecci(n /.-6 Gesti(n de la memoria
l = factorial(n);
printf(El factorial de %d es %l, n, l );
}
E) 2ro6)ema5 es2ecia)mente con )as funciones recursi0as5 es que !a que !acer m.s cosas a )a
!ora +e in0ocar una funci=n que )as que !a6a que !acer a) in0ocar una su6rutinaF
X Ia que 2asar)e 2ar.metros5 en caso +e que )os ten-a@ )os 2ar.metros +e una funci=n se
Da2i)anE"
X Ia que -uar+ar )as 0aria6)es )oca)es +e )a funci=n" 9ara eso tam6in se uti)i%ar. )a 2i)a"
X Ia que -uar+ar 0a)ores tem2ora)es que se uti)icen en )as e:2resiones" *e reser0ar. es2acio
2ara e))os en )a 2i)a"
X Ia que -uar+ar en )a 2i)a e) esta+o +e )os re-istros +e )a m.quinaF a) 2o+er in0ocarse una
funci=n +es+e 0arios sitios5 )a ?nica manera +e uti)i%ar)os +e forma se-ura en una funci=n es
Da2i).n+o)os +esa2i).n+o)osE"
X 9or su2uesto5 tam6in !a que -uar+ar )a +irecci=n +e retorno"
+l 8ardDare de la pila
En )os inicios +e) 2ara+i-ma funciona)5 )a tarea +e -esti=n +e )a 2i)a era m.s com2)ica+a +e )o
+esea6)eF )os 2ro-ramas +e6an im2)ementar sus 2ro2ias 2i)as a 2artir +e )a memoria Den 6rutoE5
rea)i%an+o )as a2i)aciones +esa2i)aciones con au+a +e a)-?n re-istro +e )a m.quina (que
a2unta6a siem2re a )a cima +e )a 2i)a)"
Este com2ortamiento ))e-= a ser tan !a6itua) K te+ioso K que )os fa6ricantes +e !ar+<are
+eci+ieron im2)ementar ca2aci+a+es +e mane4o +e )a 2i)a a ni0e) +e !ar+<are5 a sa6erF
X 1i0isi=n automati%a+a +e )a memoria5 inc)uen+o )a creaci=n +e una 2i)a"
X /n re-istro es2ecia)i%a+o en a2untar a )a cima +e )a 2i)a5 otro +e+ica+o a a2untar a su D6ase
tem2ora)E (a)) +on+e em2ie%an )os +atos interesantes 2ara e) mto+o actua))"
X mr+enes es2ecia)es +e mane4o +e )a 2i)a5 2rinci2a)mente 9/*I5 9;95 otras m.s
secun+arias5 como C#335 3E#RE 8E$ (0er m.s a6a4o)"
E) re-istro que a2unta a )a cima +e )a 2i)a en )as m.quinas :86 se ))ama E*9 (Extended 0tac+
>ointer)" E) re-istro +e 6ase +e )a 2i)a en )as m.quinas :86 es e) EG9 (Extended Base >ointer)"
# 2artir +e )a a2arici=n +e) 2ara+i-ma funciona)5 )a 2i)a -ana re)e0ancia con res2ecto a )a %ona +e
+atos est.ticosF se 0ue)0e )a 2rota-onista a6so)uta +e )a -eneraci=n +e c=+i-o" 7=tese que
inc)uso e) D!i)o 2rinci2a) +e) 2ro-ramaE ()a funci=n main) !ace uso +e )a 2i)a (2ara reci6ir )os
2ar.metros +e )a )nea +e coman+os 2ara +ec)arar )as 0aria6)es )oca)es n l)" 1e !ec!o )a %ona
+e +atos est.ticos 2ue+e im2)ementarse con )a 2i)a"
Invocando )unciones en "
El proceso Fue se muestra a continuacin &ue o"tenido del documento 82 &unction call conventions;B @B2 2@02 (1(B
disponi"le gratuitamente para usos no lucrativos en 2ttp6IIDDD.csee.um+c.eduIJc2angIcs-1-.42Istac7.s2tml. @is
agradecimientos al pro&esor ?ic%ard 2%ang.
*u2on-amos que estamos e4ecutan+o e) c=+i-o -enera+o +e) cuer2o +e una funci=n f1 +es+e
+ic!a funci=n se in0oca otra funci=n f'" E) esta+o inicia) +e )a 2i)a )os re-istros ser. e) que se
muestra en )a si-uiente fi-uraF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -/
%aptulo /6 Generaci(n de c(digo 1ecci(n /.-6 Gesti(n de la memoria
Ilustracin 9.7 Estado inicial de la m#Fuina
3os 2asos 2ara in0ocar una funci=n f' a 2artir +e una funci=n f1 en e) )en-ua4e C son
a2ro:ima+amente )os si-uientesF
X #2i)amos e) esta+o +e )a m.quina en )a 2i)a5 es +ecir5 )os re-istros
81
"
X #2i)amos )os 2ar.metros +e )a funci=n"
X #2i)amos e) 0a)or +e) conta+or +e) 2ro-rama (E,9) en )a 2i)a5 +e manera que )a +irecci=n +e
retorno est. en )a cima +e )a 2i)a5 )ue-o )o cam6iamos" En )u-ar +e !acer)o con +os =r+enes5
(9/*I + G;$;)5 )o que !aremos ser. uti)i%ar )a or+en CALL f25 que rea)i%a )as +os acciones"
En este momento e) esta+o +e )a m.quina es e) si-uienteF
Ilustracin 9.9 Ma a empe-ar a e4ecutarse &2
3)e-a+os a este 2unto e) f)u4o +e c=+i-o 2asa a e4ecutar e) c=+i-o +e f'" csta +e6e rea)i%ar unos
cuantos D2re2arati0osE antes +e 2o+er em2e%ar a uti)i%ar )a 2i)a"
X 3o 2rimero que +e6e !acer es 2re2arar su 2ro2ia 2i)a" EG9 est. a2untan+o a un )u-ar en )a 2i)a
+e f15 ste 0a)or +e6e conser0arse" #s que e) 0a)or +e EG9 se a2i)a"
X 1es2us se transfiere e) 0a)or +e E*9 a EG9" Esto 2ermite referenciar )os ar-umentos con un
offset a 2artir +e EG9 )i6era E*9 2ara !acer otras cosas" #s5 )a maora +e )as funciones +e
C comien%an con )as =r+enesF
81 /na o2timi%aci=n mu com?n es so)amente a2i)ar )os re-istros que estn sien+o usa+os 2or e) mto+o"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -/1
ESP(1')
Pila
EBP(1)
...
EIP(2)
EAX+ECX+EDX
Argumentos
para f2
EIP(1)
ESP(1)
Pila
EBP(1)
...
EIP(1)
%aptulo /6 Generaci(n de c(digo 1ecci(n /.-6 Gesti(n de la memoria
PUSH EBP
MOV ESP, EBP
Ilustracin 9.I >rimeros preparativos de &2
En e) si-uiente 2aso5 f' +e6e a)o4ar es2acio en )a 2i)a 2ara sus 0aria6)es )oca)es 0a)ores
tem2ora)es +e )as e:2resiones que uti)ice" *u2onien+o que en tota) sumen '0 6tes5 entonces
!a6r. que restar a E*9 '0F
SUB 20, ESP
#!ora tanto )as 0aria6)es )oca)es como )os 0a)ores tem2ora)es 2ue+en ser referencia+os a 2artir
+e EG9"
>ina)mente5 f' +e6e 2reser0ar )os 0a)ores +e otros re-istros +e )a m.quina (EGX5 E*, E1,) en
caso +e que )os uti)ice5 a2i).n+o)os" 3a 2i)a que+ar. como se muestra en )a fi-ura 8"10"
3)e-a+os a ste 2unto5 e) c=+i-o +e f' 2ue+e e4ecutarse" Esto 2ue+e im2)icar a2i)ar +esa2i)ar
0a)ores en )a 2i)a5 cam6ian+o E*9" *in em6ar-o EG9 2ermanece fi4o" Esto es con0eniente 2orque
si-nifica que siem2re 2o+emos referirnos a) 2rimer ar-umento +e )a funci=n como EG9+8"
3a e4ecuci=n +e )a funci=n f' 2o+ra in0o)ucrar )a in0ocaci=n +e otras funciones5 e inc)uso
in0ocaciones recursi0as +e f'" *in em6ar-o5 mientras EG9 sea restaura+o a) 0o)0er +e +ic!as
in0ocaciones5 )os 2ar.metros 0aria6)es +e )a funci=n si-uen 2u+ien+o referenciarse como
+es2)a%amientos so6re EG9"
Cuan+o e) c=+i-o +e f' se termina5 +e6e rea)i%ar una 2equeCa D)im2ie%aEF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -/2
ESP(2)
Pila
EBP(2)
...
EIP(2)
EAX+ECX+EDX
Argumentos
para f2
EIP(1)
EBP(1)
%aptulo /6 Generaci(n de c(digo 1ecci(n /.-6 Gesti(n de la memoria
X 3o 2rimero que +e6e !acer f' es -uar+ar e) 0a)or +e
retorno en e) re-istro E#X" 3as funciones que necesitan +e
m.s +e 4 6tes 2ara un 0a)or +e retorno se DtransformanE
en una funci=n con un 2ar.metro e:tra +e ti2o D2unteroE
sin 0a)or +e retorno"
X 1es2us5 si f' !a mo+ifica+o )os 0a)ores +e EGX5 E*, o
E1,5 +e6er. restaurar)os con )os 0a)ores conteni+os en )a
2i)a"
X 9or ?)timo5 no necesitamos )as 0aria6)es )oca)es o
tem2ora)es5 )ue-o restauramos EG9 E*9 a )os 0a)ores
que tenan en f1" Es +ecir5 e4ecutamosF
MOV EBP, ESP
POP EBP
# 2artir +e) i386 !a +os =r+enes equi0a)entesF
LEAVE
RET
3)e-a+os a este 2unto5 e) as2ecto +e )a 2i)a es e) mismo que
mostr.6amos en )a i)ustraci=n 8"8"
En este momento e) contro) 0ue)0e a f15 que a su 0e% +e6er. rea)i%ar a)-unas acciones +e
restauraci=n" Concretamente +e6er. D+esa2i)arE )os 2ar.metros que )e 2as= a f' +e )a 2i)a" 9ara
e))o5 +e6er. aCa+ir)e a E*9 e) n?mero +e 6tes ocu2a+os 2or +ic!os 2ar.metros" 9or e4em2)o5 si
)os 2ar.metros +e f' ocu2an 1' 6tes5 entonces )a instrucci=n que 0iene +es2us +e CALL f2 en
f1 esF
ADD 12, ESP
1es2us f1 +e6era -uar+ar e) 0a)or +e retorno +e f' (conteni+o en E#X o en a)-?n )u-ar +e )a
2i)a) en )a +irecci=n a2ro2ia+a5 se-uramente !acien+o un B;R"
>ina)mente5 f1 2ue+e +esa2i)ar )os 0a)ores +e E#X5 ECX E1X +e )a 2i)a5 +e4an+o )a 2i)a )os
re-istros ta) como esta6an antes +e em2e%ar to+o e) 2roceso +e in0ocaci=n (es +ecir5 como en
)a fi-ura 8"()"
*****
Invocando mtodos
9or ?)timo ))e-= )a orientaci=n a o64etos" Esta nue0a e0o)uci=n tra4o consi-o nue0os cam6ios en
)a +istri6uci=n +e )a memoria5 no so)amente en )a 2i)aF )as %onas +e cdigo ! datos est#ticos
tam6in sufrieron cam6ios +e otra manera"
3a !erencia e) 2o)imorfismo !acen que )a tarea +e conocer qu mto+o estamos in0ocan+o en
ca+a caso no sea tri0ia)" ,ma-nese e) )ector e) si-uiente escenarioF
clase A
{
mtodo m() { Sistema.imprime(A:m); }
}
clase B extiende A
{
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -/-
Ilustracin 9.1: Listo para e4ecutar &2
ESP(3)
Pila
EBP(2)
EIP(2)
EAX+ECX+EDX
Argumentos
para f2
EIP(1)
EBP(1)
Variables
Locales (f2)
Temporales
(f2)
EBX+ESI+EDI
%aptulo /6 Generaci(n de c(digo 1ecci(n /.-6 Gesti(n de la memoria
mtodo m() { Sistema.imprime(B:m); }
}
clase Inicio
{
mtodo abstracto inicio()
{
B b;
convertir(A,b).m();
}
}
En este caso5 a 2esar +e que )a 0aria6)e b es tem2ora)mente con0erti+a a) ti2o A5 )a sa)i+a +e)
2ro-rama es DB:mE5 a que 0er+a+eramente se trata +e una instancia +e B"
E) secreto +e esta im2)ementaci=n est. en )as ta6)as 0irtua)es5 o vta"les5 que son ta6)as en )as que
e) com2i)a+or a2unta )as +irecciones +on+e em2ie%a )a im2)ementaci=n +e )os mto+os Drea)esE
+e ca+a ti2o +e) )en-ua4e" #s5 su2on-amos que e) mto+o #Fm se em2ie%a a -enerar en )a )nea
1111 +e )a %ona +e c=+i-o ''''" 3as vta"les +e # G ser.n +iferentesF
Ilustracin 9.11 Las vta"les
Esto !ace que 2ara in0ocar un mto+o sea necesario conocer )a 0ta6)e +e) o64eto in0oca+or" 1e
manera que )as vta"les +e to+as )as 0aria6)es )oca)es 2ar.metros +e) c=+i-o +e6en inc)uirse en )a
2i)a"
9ero nos o)0i+amos +e un e)emento im2ortanteF )os atri6utos"
Cuan+o una instancia con atri6utos se +ec)ara5 sus atri6utos son -uar+a+os en )a 2i)a5 uno tras
otro5 como si se tratara +e 0aria6)es )oca)es in+e2en+ientes"
Es mu frecuente mo+ificar )os atri6utos +e una c)ase +entro +e sus mto+osF
clase Persona
{
atributo Cadena nombre;
constructor (Cadena n)
{ cambiaNombre(n); }
mtodo cambiaNombre(Cadena n)
{ nombre = n; }
}
clase Inicio
{
mtodo inicio()
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -/)
Zona de cdigo
1111 A:m
2222 B:m
vtable de A
1111
vtable de B
2222
Zona de datos estticos
%aptulo /6 Generaci(n de c(digo 1ecci(n /.-6 Gesti(n de la memoria
{
Persona J(Juan), P(Pedro), M(Mara);
P.cambiaNombre(Paco);
}
}
En e) c=+i-o anterior !a +i0ersas instancias +e )a c)ase Persona5 2or )o que en )a 2i)a !a6r. una
serie +e Datri6utos nom6reE a2i)a+os"
E) mto+o cambiaNombre es in0oca+o 4 0eces (3 en )os constructores 1 e:2)citamente) +es+e
+iferentes instancias +e Persona5 as que +e6e cam6iar ca+enas que est.n en +iferentes
+irecciones +e )a 2i)a"
OC=mo im2)ementar este com2ortamientoQ
Es e0i+enteF necesitamos D2asarE un 2ar.metro m.s a) mto+o cambiaNombre5 a 2artir +e) cua) e)
mto+o 2ue+a +eci+ir +=n+e est. )a ca+ena +e te:to a cam6iar" En este caso5 0amos a 2asar)e )a
+irecci=n en )a que em2ie%a )a instancia +e 9ersona" En otras 2a)a6ras5 0amos a com2ortarnos
como si e) mto+o cambiaNombre tu0iera un 2ar.metro e:traF
mtodo cambiaNombre(Dersona p? Cadena n)
{
p.nombre = n;
}
9or otro )a+o cuan+o in0oquemos e) mto+o cambiaNombreF
P.cambiaNombre(Paco);
*e aCa+ir. autom.ticamente e) o64eto ))ama+or a )a 2i)a" *er. como si !u6iramos escrito )o
si-uienteF
cambiaNombre(D? Paco);
$o+o esto +e6er. rea)i%arse +e forma trans2arente 2ara e) 2ro-rama+or5 que se )imitar. a escri6ir
e in0ocar cambiaNombre norma)mente"
#s que ten+remos )a instancia +e) o64eto ))ama+or en )a 2rimera 2osici=n +e )a 2i)a cuan+o
in0oquemos mto+os +e c)ases" Este com2ortamiento es mu com?n en )os )en-ua4es orienta+os
a o64etos que -eneran c=+i-o 2ara m.quinas c).sicas"
OC=mo se conecta to+o esto con )as vta"lesQ Bu senci))oF to+a instancia +e una c)ase +e6e
D-uar+ar un 2unteroE a )a %ona +e memoria +e +atos est.ticos en )a que se +escri6e su ti2o (
+on+e est. +is2oni6)e )a vta"le +e )a c)ase)" 9or e4em2)o5 si )a +escri2ci=n +e )a c)ase
9ersona comen%ase en )a )nea 3333 +e )a %ona +e +atos est.ticos5 )as 0aria6)es J5 9 B en )a 2i)a
ten+ran e) si-uiente as2ectoF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -/0
%aptulo /6 Generaci(n de c(digo 1ecci(n /.-6 Gesti(n de la memoria
Ilustracin 9.12 Instancias de una clase apuntando a su descriptor
7=tese que no !acemos que )as instancias a2unten +irectamente a )a 0ta6)e5 sino a una enti+a+
que ))amamos D+escri2ci=n +e )a c)aseE" Esta es una 2equeCa secci=n +e memoria en )a que se
inc)uen otras informaciones a+em.s +e )a vta"le5 como )a +escri2ci=n +e )a su2erc)ase"
+l valor de retorno de una )uncin o un m2todo
Iasta a!ora !emos e0ita+o !a6)ar +e un as2ecto im2ortante so6re funciones mto+osF Oc=mo
se mane4an )os 0a)ores +e retorno con )a 2i)aQ
E:isten 0arias a)ternati0as@ 2ara +atos 2equeCos5 es usua) uti)i%ar a)-?n re-istro +e )a m.quina5 en
aras +e )a eficiencia (+a+o que )os re-istros son a2i)a+os +esa2i)a+os en )as in0ocaciones5 esto
no su2one 2e)i-ro a)-uno)"
9ara +atos m.s -ran+es 2o+emos ser0irnos +e )a 2i)aF 2ue+e uti)i%arse una secci=n +e )a 2i)a tan
-ran+e como sea necesario 2ara a)o4ar e) 0a)or +e retorno"
B.s so6re e) 0a)or +e retorno en )a si-uiente secci=n"
..3.": Acerca del motAculo
/otivacin del montculo
Ia un +eta))e im2ortante que a !emos menciona+o so6re )a 2i)a5 2ero 0o)0eremos a !acer)o
aqu a mo+o +e recor+atorioF
3os +atos +e uti)i%a+os en )a 2i)a son tremen+amente 2erece+eros"
$o+a 0aria6)e )oca) +e una funci=n que sea a)o4a+a en )a 2i)a tiene sus +as conta+os@ cuan+o )a
funci=n se termine5 L2o2N ser. +esa2i)a+a"
Este com2ortamiento es +esea6)e 2ara )a maor 2arte +e )as 0aria6)es" *in em6ar-o5 !a otras
ocasiones en )as que se +esea que )as 0aria6)es Dso6re0i0anE a )a funci=n que )as cre=" 9or
e4em2)oF
X +atos com2arti+os entre 0arios !i)os +e 2rocesamiento
X ca+enas +e te:to
X """
En a2)icaciones +e tamaCo me+io o -ran+e5 es frecuente que !aa 0arios !i)os +e 2rocesamiento
tra6a4an+o en 2ara)e)o so6re +atos com2arti+os" 7orma)mente +ic!os +atos son Dcrea+osE 2or
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -/,
vtable de Persona
Zona de datos estticos
descripcin de Persona 3333
Pila
3333
Juan
3333
Pedro
3333
Mara
variable J
variable P
variable M
%aptulo /6 Generaci(n de c(digo 1ecci(n /.-6 Gesti(n de la memoria
una funci=n5 +e6en 2ermanecer accesi6)es 2or to+os )os !i)os mientras sean necesarios"
B.s f)a-rante a?n es e) caso +e) mane4o +e ca+enas +e te:to" Bane4ar ca+enas +e te:to con )a
2i)a es mu en-orroso@ 2rue6a +e e))o es que )os estu+iantes +e C con frecuencia escri6en
2ro-ramas como e) si-uienteF
#include <stdio.h>
char * obtenerNombre()
{
char nombre[12];
printf(Introduzca un nombre: );
scanf(%s, nombre);
return nombre;
}
void main(void)
{
char * nombre = obtenerNombre();
printf(El nombre introducido es %s\n, nombre);
}
Este 2ro-rama se )imita a 2e+ir )a intro+ucci=n +e un nom6re 2or )a entra+a est.n+ar+ )ue-o )o
muestra en 2anta))a" # 2esar +e )o sim2)e que es5 escon+e un error im2ortante5 fruto +e)
+esconocimiento +e )a 2i)a"
Cuan+o )a funci=n obtenerNombre es in0oca+a5 )o 2rimero que !ace es reser0ar un es2acio +e
1' caracteres en la pila" E) )en-ua4e C im2)ementa )as ca+enas +e caracteres como ta6)as +e
caracteres5 )as ta6)as con 2unteros5 +e ta) suerte que )a 0aria6)e nombre es un 2untero que
a2unta a) inicio +e +ic!o es2acio"
3a funci=n scanf uti)i%a e) 2untero 2ara Dre))enarE e) es2acio +e2en+ien+o +e )o que intro+u%ca
e) usuario (su2onien+o que no se intro+u%can m.s +e 11 caracteres 2or e) tec)a+o)"
>ina)mente5 se co2ia e) 2untero en e) re-istro E#X 2ara +e0o)0er)o (en C e) 0a)or +e retorno se
-uar+a en E#X)"
9ero 4usto antes +e que se termine )a e4ecuci=n +e o6tener7om6re5 e) es2acio +e )a 2i)a ocu2a+o
2or sus 0aria6)es )oca)es se )i6era (se marca como D)i6reE)5 +e ta) manera que cua)quier otra 2arte
+e) c=+i-o 2ue+e so6reescri6ir +ic!a 2arte Da2i)an+o +esa2i)an+oE" Esto inc)ue )os 1'
caracteres +e) nom6re"
Cuan+o e) f)u4o +e) c=+i-o 0ue)0e a )a funci=n main5 se -uar+a e) 0a)or +e E#X en un nue0o
2untero +e )a 2i)a5 que tam6in !emos ))ama+o nom6re (n=tese que se co2ia e) puntero5 no los 12
caracteres Fue empie-an donde indica el puntero)"
>ina)mente se in0oca )a funci=n printf" E) com2ortamiento +e) 2ro-rama en este 2unto se
0ue)0e +e2en+iente +e) com2i)a+or@ +e2en+e +e )a im2)ementaci=n concreta +e printf que se
em2)eeF e) 2ro-rama 2ue+e funcionar como se es2era (mostran+o e) mensa4e correctamente) si
printf uti)i%a D2ocoE )a 2i)a" 3o m.s 2ro6a6)e5 sin em6ar-o5 es que e) mensa4e a2are%ca
corru2to5 2orque )os 1' caracteres +e) nom6re se !aan so6reescrito" #?n en e) caso +e que
2rintf funcione correctamente !a6r. un "ug escon+i+oF a) aCa+ir nue0as instrucciones ())ama+as)
a) mto+o main e) nom6re se corrom2er."
Es necesario una %ona +e memoria en )a que 2o+amos -uar+ar )as 0aria6)es Dque so6re0i0an a )a
funci=n que )as cre=E" 1e momento no entraremos en +eta))es so6re cu.n+o +e6en ser +estrui+as
estas 0aria6)es"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -/7
%aptulo /6 Generaci(n de c(digo 1ecci(n /.-6 Gesti(n de la memoria
Esto es e) montcu)o"
Implementacin
E) montcu)o es una %ona +e memoria como otra cua)quiera" En )a +i0isi=n +e memoria que
!icimos en )a fi-ura 8"3 (2.-ina 3(6) re2resent.6amos )a 2i)a e) montcu)o5 com2artien+o )a
memoriaF mientras )a 2i)a crece D!acia a6a4oE e) montcu)o )o !ace D!acia arri6aE5 +e manera que
se o2timi%a e) es2acio" Esta es so)amente una +e )as o2ciones@ en otras ocasiones )a 2i)a e)
montcu)o son com2)etamente +is4untos"
1a+o e) uso que queremos +ar)e a) montcu)o5 ste no 2ue+e im2)ementarse como una estructura
>,3;5 como )a 2i)a"
E) montcu)o se or-ani%a en D2e+a%osE que ))amaremos segmentos" En a)-unos casos estos
se-mentos son +e tamaCo fi4o5 +e forma que cuan+o se tiene que a)o4ar un +ato en )a memoria5
6ien ocu2a 2arcia)mente un se-mento (si e) +ato es m.s 2equeCo que e) se-mento) o 6ien ocu2a
0arios se-mentos consecuti0os (si ocurre a) contrario)"
*in em6ar-o5 )o norma) es que e) montcu)o est forma+o 2or se-mentos +e tamaCo 0aria6)eF
inicia)mente !a un so)o se-mento que ocu2a to+o e) montcu)o5 conforme 0an ))e-an+o
2eticiones +e a)o4amiento se 0a D2articionan+oE5 -eneran+o se-mentos m.s 2equeCos" 7os
centraremos en esta a)ternati0a5 +e4aremos +e )a+o )os montcu)os +e tamaCo +e se-mento fi4o"
Cuan+o ))e-an )as 2rimeras 2eticiones e) com2ortamiento +e) montcu)o se 2arece a) +e )a 2i)aF +a
)a im2resi=n +e que )os se-mentos se Da2i)anE" 9or e4em2)o5 en )a si-uiente fi-ura mostramos e)
esta+o +e un montcu)o tras rea)i%arse & 2eticiones +e a)o4amiento +e +atos +e tamaCo 0aria6)eF
Ilustracin 9.1( @ontculo con , elementos alo4ados
*in em6ar-o5 como a !emos +ic!o5 un montcu)o no es una estructura >,3;" 9ue+e que e)
se-un+o cuarto +ato +e4en +e ser necesarios antes que )os +em.s5 as que se +ec)arar.n como
D)i6resE5 +an+o )u-ar a )o que se +enomina Dfra-mentaci=n +e )a memoriaEF
Ilustracin 9.1* @ontculo con segmentos li"res ! ocupados
3a fra-mentaci=n su2one un 2ro6)ema 2orque no se 2ue+e a)o4ar en e) montcu)o un 6)oque +e
+atos maor que e) maor +e )os se-mentos )i6res5 aunque en e) montcu)o !aa es2acio 2ara e))o"
1e to+o )o anterior 2ue+en +e+ucirse +os consecuencias 2rinci2a)esF
X Pue es necesario ))e0ar un contro) +e )os se-mentos que est.n )i6res +e )os que est.n
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -//
espacio libre
Montculo
espacio libre
Montculo
%aptulo /6 Generaci(n de c(digo 1ecci(n /.-6 Gesti(n de la memoria
ocu2a+os"
X Pue 2ue+e ser necesario Dcom2actarE )os +atos"
Contro)ar )os se-mentos )i6res ocu2a+os es senci))oF -enera)mente se uti)i%a una )ista en)a%a+a
cuos e)ementos a2untan a) inicio fina) +e )os se-mentos )i6res5 que sue)en ser minora"
3a com2actaci=n es un 2oco m.s com2)e4a@ +a+o que nuestro )en-ua4e 2ue+e contener D2unteros
a memoriaE5 )a com2actaci=n !ara que )os 2unteros no a2untaran a )as +irecciones a+eca+as"
Esto 2ue+e so)ucionarse uti)i%an+o una ca2a interme+ia en )as +irecciones (en )u-ar +e uti)i%ar un
D2untero a )a +irecci=n '34& +e )a memoriaE ten+remos un D2untero a) tercer se-mento +e)
montcu)oE)"
$i7eracin e-plcita de memoria: /odelo de "?"SS
Ja sa6emos cuan+o se Da)o4aE )a memoria +e) montcu)o K cuan+o se +eman+a e:2)citamente"
3o que no !emos 0isto to+a0a es cu.n+o se li"era +ic!a memoria"
En rea)i+a+ es senci))oF un o64eto !a +e ser 6orra+o +e) montcu)o cuando !a no %aga &alta" OJ
cu.n+o +e4a +e !acer fa)ta un o64etoQ
3a res2uesta +e C C++ es Dcuan+o )o +i-a e) 2ro-rama+orE" En C C++ e) 2ro-rama+or est.
encar-a+o +e contro)ar e) cic)o +e 0i+a +e )os o64etos que crea en e) montcu)o5 +e or+enar su
+estrucci=n cuan+o a no son necesarios"
3as !erramientas que 2ermiten )a -esti=n +e) montcu)o en C son )as funciones malloc free"
char nombre [12] ; /* reserva 12 caracteres en la PILA */
/* Los caracteres son liberados al terminar el mtodo donde se
declararon */
// reserva 12 caracteres en el montculo
char * nombre = (char*)malloc(12*sizeof(char));
// Los caracteres no son liberados hasta que se invoca free()
free(nombre);
7=tese que malloc se )imita a reser0ar un n?mero +etermina+o +e 6tes en e) montcu)o5 +e
manera que !a que ca)cu)ar manua)mente e) tamaCo a reser0ar5 !acer un casting a) ti2o +e
+atos que estemos reser0an+o" En e) caso concreto +e) e4em2)o !a c=+i-o reiterati0o@
12*sizeof(char)=125 a+em.s e) castin- no es necesario (malloc +e0ue)0e un char*)" 9ero )o
!e aCa+i+o 2or correcci=n@ es casi o6)i-atorio in0ocar malloc +e esta forma"
#+em.s +e )a necesi+a+ +e con0ersi=n +e c.)cu)o manua) +e) tamaCo5 )a memoria +e0ue)ta 2or
ma))oc no est. Dinicia)i%a+aE +e forma a)-una@ norma)mente contiene 6asura5 +e manera que
frecuentemente es necesario inicia)i%ar)a a 0a)ores correctos antes +e em2e%ar a uti)i%ar)a"
;tro +eta))e im2ortante es )a )i6eraci=n@ cuan+o un o64eto : contiene 2unteros a otros o64etos +e)
montcu)o5 stos son ?nicos (no !a m.s 2unteros que a2unten a estos +atos)5 entonces si
!acemos free(x) nos que+aremos con D6asuraE en e) montcu)oF !a6r. se-mentos marca+os
como Docu2a+osE que nunca se 2o+r.n )i6erar (2orque !emos 2er+i+o )os 2unteros 2ara 2o+er
!acer free)"
7=tese tam6in que malloc free no son 2restaciones +e) )en-ua4eF son funciones +e una
)i6rera estan+ar +e) )en-ua4e"
$o+os estos incon0enientes se reso)0ieron en C++ con )as 2a)a6ras reser0a+as new delete5
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -/<
%aptulo /6 Generaci(n de c(digo 1ecci(n /.-6 Gesti(n de la memoria
su re)aci=n con )os constructores +estructores +e c)ases"
class Banana
{
public:
Banana(); // Constructor
~Banana(); // Destructor
}
...
Banana b; // Crea una instancia de Banana en la PILA
// inicializndola con el constructor
// La instancia ser destruda (llamando al destructor) al terminar el
// mtodo actual
...
// Crea una instancia de Banana en el MONTICULO, y la inicializa
Banana b = new Banana();
...
// b no se destruye hasta que en algn mtodo se invoca delete
delete b;
// delete invoca al destructor antes de desalojar el objeto de memoria
Con new delete se resue)0en casi to+os )os 2ro6)emas +e malloc freeF
X 7o es necesario !acer castings"
X 3a memoria que+a autom.ticamente inicia)i%a+a a) ))amar a) constructor (si ste est. 6ien
escrito5 2or su2uesto)"
X 3a D)i6eraci=n +e otros o64etos con 2unterosE 2ue+e ser resue)ta a) ))amar a) constructor (+e
nue0o si ste est. 6ien escrito)"
X #) ser una 2restaci=n +e) )en-ua4e5 e) tamaCo a reser0ar se ca)cu)a autom.ticamente5 inc)uso
con )as ta6)as (2ue+e !acerse new Banana [10])"
*in em6ar-o !a un asunto que no se resue)0eF e) 2ro-rama+or" *i e) 2ro-rama+or se o)0i+a +e
in0ocar delete una 0e% 2or ca+a 0e% que !i%o un new5 o si no im2)ementa )os +estructores
a+ecua+amente5 corremos e) ries-o +e tener 6asura en nuestro montcu)o"
$i7eracin implcita de memoria: (ecoleccin de 7asura
#unque )a estrate-ia +e C++ resue)0e muc!os +e )os 2ro6)emas +e) montcu)o5 si-ue tenien+o
+eficiencias5 2ues +e2en+e +e )a 2ericia +e) 2ro-rama+or 2ara +eterminar qu se-mentos +e)
montcu)o a no son necesarios 2or )o tanto 2ue+en ser )i6era+os"
Ja0a resue)0e e) 2ro6)ema +e )a )i6eraci=n +e memoria +e) montcu)o +e una forma +iferenteF en
)u-ar +e +e4ar e) asunto en manos +e) 2ro-rama+or5 es e) 2ro2io 2ro-rama e) que +eci+e qu
fra-mentos +e memoria a no son necesarios 2ue+en e)iminarse +e manera se-ura" E) criterio
que )a m.quina 0irtua) +e Ja0a si-ue 2ara a0eri-uar si un o64eto a no est. sien+o usa+o 2or e)
sistema es e) conteo de re&erencias"
9ara em2e%ar5 en Ja0a to+os )os o64etos son alo4ados en el montculo" 3a 2i)a tam6in se uti)i%a5
2ero so)amente 2ara -uar+ar 2unteros a )as 0aria6)es +e) montcu)o"
3a JRB caracteri%a ca+a se-mento +e) montcu)o con un entero" Este entero5 inicia)mente a 15 es
e) contador de re&erencias del o"4eto" Cuan+o se aCa+e un nue0o 2untero a) se-mento en )a 2i)a
se aumenta +ic!o conta+or" Cuan+o )a referencia +e4a +e ser 0.)i+a (se +esa2i)a) se )e resta una
uni+a+ a) conta+or"
Cuan+o un se-mento tiene su conta+or +e referencias a 0 entonces a no es accesi6)e +es+e e)
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -<
%aptulo /6 Generaci(n de c(digo 1ecci(n /.-6 Gesti(n de la memoria
c=+i-o" *e !a con0erti+o en D6asuraE5 a no es necesario 2ara )a e4ecuci=n +e) 2ro-rama5 2or )o
que e) se-mento 2ue+e ser )i6era+o
8'
"
3os se-mentos no se )i6eran en cuanto su conta+or +e referencias se !ace 05 2or moti0os +e
eficiencia" En )u-ar +e e))o5 ca+a cierto tiem2o se acti0a e) recolector de "asura" E) reco)ector +e
6asura es un !i)o que se encar-a +e recorrer e) montcu)o )i6eran+o )os se-mentos D6asuraE"
Esta estrate-ia so)uciona )os 2ro6)emas +e C++@ en e) momento en que )a )i6eraci=n +e)
montcu)o a no est. en manos +e) 2ro-rama+or5 )a +e-eneraci=n +e) montcu)o +e6i+a a errores
!umanos es muc!o m.s 2equeCa"
*in em6ar-o e:iste un 2equeCo incon0enienteF e) reco)ector +e 6asuras consume tiem2o +e
2rocesamiento" Esto 2ro0oca inquietu+es en a)-unos 2ro-rama+ores5 que no +esean sacrificar un
2orcenta4e +e )a C9/ e4ecutan+o una tarea que 2o+ran im2)ementar e))os mismos con
+estructores5 como en C++"
;tros 2ro-rama+ores5 2or e) contrario5 +efien+en que )a estrate-ia +e Ja0a es m.s eficiente que )a
+e C++F mantienen que 4a0a Drea)i%a to+as )as )i6eraciones +e memoria +e una 0e%5 recorrien+o
una so)a 0e% e) montcu)o ca+a cierto tiem2oE5 mientras que C++ D!ace 2equeCas )i6eraciones
constantemente5 o6)i-an+o a recorrer e) montcu)o muc!as 0ecesE"
3a con0eniencia o no +e uti)i%ar un reco)ector +e 6asura en un )en-ua4e es uno +e esos 2untos
que +i0i+en a )os 2ro-rama+ores +e manera irreconci)ia6)e5 como ocurre con )as ta6u)aciones o )a
2osici=n +e )a ))a0e en 4a0a C++"
=ardDare del montculo
9or norma -enera) no !a un soft<are es2ecfico encar-a+o +e -estionar e) montcu)o5 a)
contrario +e )o que ocurre con )a 2i)a" E) 2rinci2a) moti0o es que !a muc!as estrate-ias +e
im2)ementaci=n5 ca+a una es a+ecua+a 2ara un uso"
3os sistemas o2erati0os ofrecen mto+os +e a)o4amiento +e memoria5 que 2ue+en ser uti)i%a+os
2or )os 2ro-rama+ores 2ara crear montcu)os" *in em6ar-o5 )a )i6eraci=n +e )a memoria es
res2onsa6i)i+a+ +e) 2ro-rama5 no +e) sistema o2erati0o"
+l montculo 3 $e$i
3os )en-ua4es necesitan montcu)os cuan+o sus nom6res 2ue+en a2untar a m.s +e una +irecci=n
+e memoria5 es +ecir5 cuanto tienen D2unterosE" 3e3i5 2or su 2arte5 carece +e 2unteros o a)-o
que se )e 2are%ca5 2or )o que creemos que 2o+ra im2)ementarse con una 2i)a5 e:ce2to 2ara
mane4ar )as ca+enas +e te:to"
..3.#: Acerca del o!!set
;ro7lema
3a +is2osici=n +e )os o64etos en )a memoria5 tanto en )a 2i)a como en e) montcu)o5 es en forma
+e D6)oquesE5 o Dtro%osE +e memoria5 en )a que se -uar+a informaci=n so6re ca+a instancia"
Estos 6)oques comien%an en una cierta +irecci=n5 +e6en Dre)acionarseE con )os accesos en e)
c=+i-oF Cuan+o e) 2ro-rama+or escri6a 9"nom6re e) )en-ua4e tiene que sa6er que tiene que
-enerar un acceso 2ara )a +irecci=n 0:>>C1#"
OC=mo se re)aciona un nom6re con su +irecci=nQ
8' Esta es una +escri2ci=n mu sim2)e +e) a)-oritmo" Ia casos e:ce2ciona)es que +e6en ser teni+os en cuenta 2ara im2)ementar
un a)-oritmo +e reco-i+a +e 6asuras" Cons?)tese 2ttp6II5ava.sun.com 2ara m.s +eta))es so6re )a reco)ecci=n +e 6asuras"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -<1
%aptulo /6 Generaci(n de c(digo 1ecci(n /.-6 Gesti(n de la memoria
3as 2a)a6ras c)a0e aqu !a +os 2a)a6ras c)a0e" 3a 2rimera es declaracin"
$a *erarAua de declaraciones
Con e) sistema +e .m6itos conse-uimos re)acionar ca+a acceso +e) c=+i-o con una +ec)araci=n"
*i aCa+iramos una +irecci=n a )as +ec)araciones5 2o+ramos o6tener )as +irecciones +e ca+a
acceso a tra0s +e )as +ec)araciones"
En un )en-ua4e me+ianamente estructura+o5 )as +ec)araciones se or-ani%an con una cierta
4erarqua" 9or e4em2)oF )os mto+os se +ec)aran +entro +e c)ases5 )as 0aria6)es +entro +e mto+os"
Casi to+a +ec)araci=n tiene una D+ec)araci=n 2a+reE"
*u2on-amos que tenemos una +irecci=n +e memoria en )a 2i)a (2or e4em2)o 1111) a 2artir +e )a
cua) 0amos a -uar+ar una instancia +e )a c)ase Persona5 con )a si-uiente im2)ementaci=nF
clase Persona
{
atributo Cadena Nombre;
atributo Cadena Apellidos;
atributo Entero Edad;
}
Entonces se nos 2)antear. e) 2ro6)ema +e a0eri-uar cu.n+o es2acio reser0ar en )a memoria
83
2ara
ca+a instancia +e 9ersona" 3o que nos ))e0a a otra 2a)a6ra c)a0eF e) tamaRo +e un ti2o"
'ama6o de un tipo
*e nos !a 2)antea+o e) 2ro6)ema +e a0eri-uar e) tamaCo +e) ti2o 9ersona" 9or tamaCo +e un ti2o
enten+eremos )a canti+a+ +e 6tes que ocu2a ca+a instancia +e +ic!o ti2o en memoria"
En e) caso +e 3e3i e) tamaCo +e ca+a ti2o es mu senci))o +e ca)cu)ar" 9ara em2e%ar5 )os ti2os
6.sicos tienen un tamaCo 2re+efini+oF
X 1+1 6tes 2ara )os 6oo)eanos
X 1+4 6tes 2ara )as ca+enas
X 1+4 6tes 2ara )os enteros
X 1+4 6tes 2ara )os f)otantes
(3as ca+enas usan so)amente 4 6tes 2orque Da2untanE a una %ona +e) montcu)o +on+e est. )a
0er+a+era informaci=n)
E) 2rimer 6te +e ca+a ti2o est. reser0a+o 2ara )a informaci=n +e ti2oF es un i+entifica+or +e
ti2o@ +e a! se +e+uce que so)amente 2ue+e !a6er '&6 ti2os +iferentes en un 2ro-rama 3e3i"
3os mto+os constructores tienen siem2re un tamaCo +e 0 6tes"
E) tamaCo +e )as c)ases es +e 1 6tes + )a suma +e )os tamaCos +e to+os sus atri6utos" #s5 e)
tamaCo +e )a c)ase Persona es 1+(1+4)+(1+4)+(1+4) U 16 6tes"
:isposicin de los o7*etos en la memoria
Ja sa6emos que e) ti2o Persona ocu2a 16 6tes en memoria" 9ero a?n no sa6emos c=mo se
or-ani%an esos 6tes"
Es mu senci))o" E) 2rimer 6te +e memoria es un i+entifica+or +e ti2o" Este i+entifica+or 2ermite
rea)i%ar o2eraciones re)aciona+as con e) ti2o +e) o64eto" $o+as )as instancias comien%an con este
83 7=tese que no uti)i%amos )os trminos D2i)aE o Dmontcu)oE en este a2arta+o@ )os ra%onamientos que 0amos a 2resentar son
0.)i+os en )as +os %onas +e memoria"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -<2
%aptulo /6 Generaci(n de c(digo 1ecci(n /.-6 Gesti(n de la memoria
6te i+entifica+or"
1es2us5 )os atri6utos +e) o64eto +e6en +is2onerse en cierto or+en" # fa)ta +e un or+en me4or5
nosotros se-uiremos e) or+en +e +ec)araci=nF )os 2rimeros atri6utos +ec)ara+os ser.n )os
2rimeros atri6utos en )a memoria" #s5 )a memoria ocu2a+a 2or una instancia +e Persona ten+r.
e) si-uiente as2ectoF
Ilustracin 9.1, Disposicin en memoria de >ersona
+l despla%amiento
1e )a +is2osici=n en memoria +e )os o64etos sur-e e) conce2to +e +es2)a%amiento" E)
+es2)a%amiento +e un atri6uto # +e una c)ase C es e) n?mero +e 6tes +e +istancia entre e) inicio
+e una instancia +e C !asta que em2ie%a )a memoria +e+ica+a a #" 9or e4em2)o5 e)
+es2)a%amiento +e )a e+a+ en Persona es +e 9 6tes"
3o que es a2)ica6)e a )os atri6utos es a2)ica6)e a) resto +e )os o64etos que ocu2an memoria en e)
)en-ua4eF )os 2ar.metros tienen un offset con res2ecto a) inicio +e )a 2i)a +e su mto+o" 3as
0aria6)es son un 2oco +iferentes5 2orque 2ue+en !acerse +ec)araciones +entro +e un 6uc)e +e
manera que )os offsets no 2ue+an ca)cu)arse com2)etamente en tiem2o +e com2i)aci=n"
"lculo de las direcciones de las instancias
3as +irecciones +e ca+a e)emento +e) )en-ua4e 2ue+en ser ca)cu)a+as en tiem2o +e com2i)aci=n
uti)i%an+o e) +es2)a%amiento" #sF
X 9rimero se crea )a %ona +e +atos est.ticos5 +on+e se -uar+an )as informaciones +e ti2o )as
constantes"
X 9or otro )a+o se 0a -eneran+o )a %ona +e c=+i-o"
X E) es2acio reser0a+o a )a 2i)a a2arece +es2us" Ca+a 0e% que se 0a a in0ocar un mto+o5 se
a2i)a un nue0o ni0e) (-uar+an+o re-istros 2ar.metros en )a 2i)a) se mo+ifican )os re-istros
+e 2i)a"
X Ca+a 0e% que se termina )a e4ecuci=n +e un mto+o5 se recu2era e) ni0e) +e 2i)a anterior"
X 3as 0aria6)es )oca)es que se 0an +ec)aran+o se a2i)an en )a 2i)a"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -<-
Identificador Persona
Identificador Cadena
Identificador Cadena
Identificador Entero
Nombre
Apellidos
Edad
%aptulo /6 Generaci(n de c(digo 1ecci(n /.-6 Gesti(n de la memoria
X Ca+a 0e% que se +ec)ara un nue0o o64eto5 se ca)cu)a su +es2)a%amiento se -uar+a en )a
+ec)araci=n
X 3as +irecciones +e )os accesos se resue)0en uti)i%an+o )os +es2)a%amientos"
3as instancias +e Declaration necesitar.n un nue0o cam2o5 ))ama+o offset5 2ara -uar+ar e)
+es2)a%amiento +e ca+a o64eto que se +ec)ara"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -<)
%aptulo /6 Generaci(n de c(digo 1ecci(n /.)6 %(digo intermedio
Becci%n ..": &%digo intermedio
..".1: /ntroducci%n
En e) D)i6ro +e) +ra-=nE (DCom2i)a+oresF 9rinci2ios5 tcnicas !erramientasE5 +e #!o5 *et!i
/))man) !a un ca2tu)o entero +e+ica+o a )a -eneraci=n +e c=+i-o interme+io"
Esta seccin est# enteramente "asada en el captulo 9 de dic%o li"ro.
E) c=+i-o interme+io es una forma m.s +e re2resentar )a informaci=n interme+ia +e un 2ro-rama"
E) c=+i-o 2ro2uesto 2or #!o5 *et!i /))man es una secuencia +e instrucciones ())ama+as
D2ro2osicionesE en e) )i6ro) +e )a si-uiente formaF
x := y op Z
1on+e :5 % son nom6res o 0aria6)es tem2ora)es5 o2 es un o2era+or5 como una suma
aritmtica o una com2araci=n" ;6ser0ese que )as e:2resiones com2)e4as no se 2ermiten@ +e6en
ser +escom2uestas en series +e 2ro2osiciones m.s sim2)es"
#) c=+i-o interme+io 2ro2uesto tam6in se )e ))ama Dc=+i-o +e tres +ireccionesE5 2orque siem2re
uti)i%a tres +atos (:55%)"
..".2: @ro'osiciones
#+em.s +e )a forma -enera) +e una 2ro2osici=n5 e:isten otras"
x := op y
*ir0e 2ara mo+e)ar )os o2era+ores unarios"
x := y
9ara rea)i%ar co2ias"
goto etiqueta
*ir0e 2ara rea)i%ar sa)tos incon+iciona)es"
if x opcomp y goto etiqueta
*ir0e 2ara rea)i%ar sa)tos con+iciona)es" opcomp so)amente 2ue+e ser un o2era+or +e
com2araci=n (j5 V5 U5 etc")
3as ))ama+as a 2roce+imientos se mo+e)an uti)i%na+o )as 2ro2osiciones param call" 1e esta
forma5 una ))ama+a a un 2roce+imiento consta +e cero o m.s 2ro2osiciones param se-ui+as +e
callF
param x1
param x2
param x3
call f, 3
*ir0e 2ara in0ocar e) mto+o f(x1,x2,x3)"
x := y[i];
Esta 2ro2osici=n es +e )as ))ama+as 2ro2osiciones con n+ices" 3o que se )e asi-na a : no es e)
0a)or +e 5 sino e) que se encuentra a DiE 2osiciones +e memoria +e " i +e6e ser un o64eto +e
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -<0
%aptulo /6 Generaci(n de c(digo 1ecci(n /.)6 %(digo intermedio
+atos5 una constante o una 0aria6)e tem2ora)"
x[i] := y;
Es simi)ar a )a 2ro2osici=n anterior5 2ero a )a in0ersaF )a +irecci=n que se mo+ifica es e) +estino5
no )a fuente"
x := &y; x := *Y; *x := y;
*on )as tres formas +is2oni6)es 2ara tra6a4ar con 2unteros"
..".3: Objetivos y ventajas del c%digo intermedio
E) c=+i-o interme+io es un 2aso interme+io entre e) #*$ enriqueci+o e) c=+i-o -enera+oF
Ilustracin 9.1. Lugar del cdigo intermedio
/ti)i%ar un c=+i-o interme+io 2resenta 0arias 0enta4as" Es suficientemente a6stracto 2ara ser
in+e2en+iente +e )a m.quina +estino5 2ero suficientemente concreto 2ara 2o+er ser someti+o a
ciertas o2timi%aciones ()as in+e2en+ientes +e )a m.quina)"
$am6in 2ue+e +istri6uirse en )u-ar +e) c=+i-o o64eti0o5 con0ertirse en c=+i-o m.quina en )a
2ro2ia m.quina o64eti0o5 a2)ic.n+ose )as o2timi%aciones +e2en+ientes +e )a m.quina (en )u-ar +e
tener que )imitarse a) mnimo com?n m?)ti2)o)" #)-o 2areci+o es )o que 2ue+e !acerse con )a
com2i)aci=n J,$ +e )a 2)ataforma "7E$ +e Bicrosoft"
Generar c=+i-o interme+io tam6in faci)ita )a reusa6i)i+a+F una 0e% +esarro))emos un
com2i)a+or^o2timi%a+or 2ara c=+i-o interme+io5 2o+emos uti)i%ar)o en otros 2roectos que
-eneren c=+i-o interme+io com2ati6)e5 aumentan+o )a 2ro+ucti0i+a+"
9ara m.s informaci=n so6re e) c=+i-o interme+io5 sr0ase e) )ector )eer e) ca2tu)o 8 +e
DCom2i)a+oresF 9rinci2ios5 tcnicas !erramientasE5 +e #!o5 *et!i /))man"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -<,
AST
Cdigo
Generado
Cdigo
Intermedio
%aptulo /6 Generaci(n de c(digo 1ecci(n /.06 Generaci(n de instrucciones y e8presiones
Becci%n ..#: Generaci%n de instrucciones y ex'resiones
..#.1: /ntroducci%n
En esta secci=n 0eremos c=mo -enerar c=+i-o 2ara ca+a ti2o +e instrucci=n o e:2resi=n que
2o+amos encontrarnos" Comen%aremos con )as instrucciones +e contro) (instrucci=n con+iciona)
6uc)es) +es2us nos concentraremos en )as instruccionesAe:2resiones"
..#.2: /nstrucciones condicionales
"aso simple: un solo 7loAue condicional
E) caso +e un 6)oque con+iciona) sim2)e se tra+uce como un sa)to con+iciona) so6re una
con+ici=n" #s5 e) c=+i-o -enera+o 2ara e) si-uiente 6)oqueF
si(<condicion 1>)
{
<bloque 1>
}
*er. e) si-uienteF
<cdigo necesario para evaluar condicion1>
JNE condicion1, 1, condicionFalsa1
<cdigo del bloque 1>
condicionFalsa1: # instruccin vaca
"aso 2: varios 7loAues condicionales
En este caso ten+remos una instrucci=n con+iciona) como )a que si-ueF
si(<condicion 1>)
{ <bloque 1> }
|(<condicion 2>)
{ <bloque 2> }
...
|(<condicion n>)
{ <bloque n> }
Entonces e) c=+i-o resu)tante ser. como muc!os casos sim2)es5 co)oca+os uno +etr.s +e otro5
con )a 2articu)ari+a+ +e que !a que sa)tar a) fina) +e) 6)oque en cuanto una +e )as con+iciones se
cum2)eF
<cdigo necesario para evaluar condicion1>
JNE condicion1, 1, bloque2
<cdigo del bloque 1>
VBD =inal:ondicional
bloque2: <cdigo necesario para evaluar condicion2>
JNE condicion2, 1, bloque3
<cdigo del bloque 2>
VBD =inal:ondicional
...
bloqueN: <cdigo necesario para evaluar condicionN>
JNE condicionN, 1, finalCondicional
<cdigo del bloque N>
finalCondicional: ... ;
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -<7
%aptulo /6 Generaci(n de c(digo 1ecci(n /.06 Generaci(n de instrucciones y e8presiones
"aso 3: Instruccin condicional completa
3a instrucci=n con+iciona) en este caso fina)i%a con una c).usu)a DotrasEF
si(<condicion 1>)
{ <bloque 1> }
|(<condicion 2>)
{ <bloque 2> }
...
|(<condicion n>)
{ <bloque n> }
|otras
{ <bloque otras> }
E) c=+i-o +e) 6)oque DotrasE +e6e e4ecutarse si s=)o si nin-uno +e )os 6)oques anteriores se !a
cum2)i+o" # efectos 2r.cticos5 e) c=+i-o -enera+o ser. equi0a)ente a ste otroF
si(<condicion 1>)
{ <bloque 1> }
|(<condicion 2>)
{ <bloque 2> }
...
|(<condicion n>)
{ <bloque n> }
2(cierto)
{ <bloque otras> }
#s que 2o+emos 0er que ste caso es senci))amente una 0ersi=n +e) caso anterior con )a ?)tima
con+ici=n siem2re cierta"
Bestin de las etiAuetas
7=tese que5 so6re to+o en e) ?)timo caso5 )a instrucci=n con+iciona) 2ue+e ))e-ar a uti)i%ar un
n?mero e)e0a+o +e etiquetas"
Es mu com?n +is2oner +e un o64eto es2ecia)i%a+o5 que ))amaremos D-estor +e etiquetasE5 que
2ermita o6tener nue0as etiquetas )i6res" E) -estor 2ue+e ser a)-o tan senci))o como un o64eto con
un atri6uto entero que 0a increment.n+ose ca+a 0e%5 +e manera que +e0ue)0e Det01E5 Det0'E5
Det03E5 etc en ca+a 2etici=n +e etiquetas )i6res"
#ctua)mente ant)rau: no 2ro2orciona un -estor +e etiquetas5 2ero 2o+ra !acer)o en un futuro"
..#.3: 4ucles
Bucle mientras
Es e) m.s senci))o" $iene )a formaF
mientras (condicin)
{
bloque de instrucciones
}
E) c=+i-o 2ara -enerar)o tam6in es mu senci))oF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -</
%aptulo /6 Generaci(n de c(digo 1ecci(n /.06 Generaci(n de instrucciones y e8presiones
inicioBucle: <cdigo para condicin>
JE 0, <condicin>, finBucle # si la condicin es falsa, saltar al final
<cdigo para bloque de instrucciones>
JMP inicioBucle
finBucle: ...
Bucle 8acer<mientras
E) 6uc)e !acerAmientras tiene )a si-uiente formaF
hacer
{
bloque de instrucciones
} mientras (condicin);
E) c=+i-o necesario 2ara -enerar)o uti)i%a ?nicamente una etiquetaF
inicioBucle:
<cdigo para bloque de instrucciones>
<cdigo para condicin>
JE 1, <condicin>, inicioBucle # si la condicin es cierta, saltar al inicio
...
Bucle desde
E) 6uc)e +es+e tiene )a si-uiente formaF
desde (exp1; condicion; exp2)
{
bloque de instrucciones
}
J e) c=+i-o 2ara -enerar)o ser. e) si-uienteF
<cdigo para exp1, que normalmente es una asignacin>
inicioBucle: <cdigo para condicin>
JE 0, <condicin>, finBucle # salta al final si condicin es falsa
<cdigo para bloque de instrucciones>
<cdigo para exp2, que normalmente es un post-incremento>
JMP inicioBucle
finBucle: ...
..#.": /nstruccionesSex'resiones
+-presiones aritm2tico<lgicas: registros 3 valores temporales
En una m.quina sin re-istros5 tra+ucir una e:2resi=n a c=+i-o es mu sim2)eF so)amente !a que
!acer uso +e )a 2i)a5 a2i)an+o +esa2i)an+o 0a)ores" Cuan+o se intro+ucen )os re-istros5 sin
em6ar-o5 to+o se com2)ica"
$ra6a4ar con re-istros es muc!o m.s r.2i+o que tra6a4ar +irecciones +e memoria 2ura +ura" #)
mismo tiem2o5 e) n?mero +e re-istros +e una m.quina c).sica es )imita+o@ con muc!a frecuencia
a)-unos 0a)ores sim2)emente no 2ue+en ser asi-na+os a re-istros5 2orque Dno que+an re-istros
)i6resE" 3os 0a)ores que +e6en ser mane4a+os no 2ue+en ser conteni+os en un re-istro se
-uar+ar.n en )a 2i)a5 en una %ona +e 0a)ores tem2ora)es"
9ara un mto+o o funci=n +a+o5 es 2osi6)e 2reca)cu)ar en tiem2o +e com2i)aci=n e) n?mero +e
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota -<<
%aptulo /6 Generaci(n de c(digo 1ecci(n /.06 Generaci(n de instrucciones y e8presiones
6tes que se necesitar.n 2ara -uar+ar 0a)ores tem2ora)es5 as que con frecuencia se a)o4a e)
es2acio 2ara )os 0a)ores tem2ora)es na+a m.s iniciar e) c=+i-o +e +ic!o mto+o"
E) 2ro6)ema +e e)e-ir qu +atos -uar+ar en re-istros cua)es -uar+ar en )a %ona +e +atos
tem2ora)es es 79Acom2)eto5 as que no que+a m.s reme+io que recurrir a )as !eursticas"
3o m.s usua) es +is2oner +e un D-estor +e re-istrosE +urante )a -eneraci=n +e c=+i-o" Este
o64eto se encar-a +e -estionar )os re-istros@ tiene en cuenta cu.)es est.n ocu2a+os )i6res5
2ro2orciona a) -enera+or +e c=+i-o Di+entifica+ores +e re-istroE5 que son o64etos que enca2su)an
a un re-istro )i6re5 si )o !a5 o a una %ona +e +atos tem2ora)es"
3a forma +e tra6a4ar con un -estor +e re-istros esF
X E) -enera+or +e c=+i-o 2recisa +e un re-istro 2ara a)macenar un 0a)or5 as que 2i+e a) -estor
+e re-istros un re-istro )i6re"
X E) -estor +e re-istros com2rue6a si !a a)-?n re-istro )i6re con )as caractersticas +esea+as" *i
es as5 +e0ue)0e su i+entifica+or +e re-istro5 )o marca como ocu2a+o" En caso contrario5
+e0ue)0e un i+entifica+or +e re-istro que a2unta a una %ona +e memoria"
X Cuan+o e) 0a)or +e) re-istro a no es necesario5 es res2onsa6i)i+a+ +e) -enera+or +e c=+i-o
comunic.rse)o a) -estor +e re-istros5 2ara que ste 2ue+a 0o)0er a uti)i%ar)o m.s a+e)ante"
X En )a im2)ementaci=n +e) -estor +e re-istros +e6en tenerse en cuenta factores que )i6eran o
reser0an re-istros autom.ticamente5 como )as in0ocaciones a mto+os" 3o usua) es que se cree
un -estor +e re-istros 2ara ca+a mto+o"
/n -estor +e re-istros 2ue+e ser ?ti) inc)uso en m.quinas sin re-istros (2orque se 2ue+e encar-ar
+e reser0ar )i6erar es2acios tem2ora)es en )a 2i)a)" #unque en )a actua)i+a+ ant)rau: no
2ro2orciona nin-?n -estor +e re-istros5 es 2osi6)e que inc)ua uno en e) futuro"
/na 0e% o6teni+o e) i+entifica+or +e re-istro +e )os o2eran+os5 -enerar )as e:2resiones
aritmticoA)=-icas es tri0ia)F !a que uti)i%ar #11 2ara )as sumas5 */G 2ara )as restas5 etc"
Asignaciones
3as asi-naciones sue)en 2o+er transformarse en una or+en B;R (si no tenemos en cuenta
2osi6)es o2timi%aciones)" #s5 2ara )a instrucci=n +e asi-naci=n exp1 = exp25
so6reenten+ien+o que exp1 tiene 3A0a)ue exp2 tiene 8A0a)ue5 )os ti2os son com2ati6)es
res2ecto a )a asi-naci=n5 e) c=+i-o -enera+o ser.F
<cdigo para obtener el identificador de registros de la direccin exp1>
<cdigo para obtener el identificador de registros del valor de exp2>
MOV <valor-exp2>, <direccin-exp1>
Accesos a atri7utos H&4 a m2todosI
1ecir Dacceso a atri6utoE es )o mismo que +ecir D+irecci=n +e memoriaE" #) fina)5 ca+a acceso a
un atri6uto se con0ierte en una +irecci=n +e memoria acce+i+a en e) c=+i-o"
7orma)mente un acceso ten+r. )a si-uiente formaF
raiz.atributo1.atributo2. ... .atributoN
3o que +e6eremos !acer es comen%ar 2or )a i%quier+a5 )a ra%5 )ue-o ir ca)cu)an+o )a +irecci=n
fina) 6as.n+onos en )os conocimientos que a tenemos so6re )a +is2osici=n +e )as instancias +e
c)ases en )a memoria"
7orma)mente )a +irecci=n +e )a ra% )a !a6remos 2reca)cu)a+o -uar+a+o en su +ec)araci=n (en )a
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )
%aptulo /6 Generaci(n de c(digo 1ecci(n /.06 Generaci(n de instrucciones y e8presiones
instancia +e 1ec)aration que mo+e)a )a +ec)araci=n +e Dra%E)" E) o64eto atri6uto1 comen%ar.5
+i-amos ( 6te m.s tar+e (tras e) i+entifica+or +e ti2o +e ra%)5 e) si-uiente 3 6tes m.s tar+e
que e) inicio +e atri6uto'""" tanto D(E como D3E son )os o&&sets que tam6in +e6eremos +e !a6er
ca)cu)a+o"
Como 2ue+e 0erse5 ca)cu)ar )as +irecciones +e un acceso a un atri6uto es tan senci))o como
comen%ar con una +irecci=n en )a ra% )ue-o ir suman+o o&&sets"
Accesos a m2todos HinvocacionesI
En )a secci=n 8"3 (Gesti=n +e )a memoria) !emos 0isto c=mo !a que 2re2arar )a 2i)a a) in0ocar
un mto+o" G.sicamente +e6emosF
X a2i)ar G*95 )ue-o !acer G*9U*9
X a2i)ar 9C a) menos )os re-istros usa+os en e) mto+o en )a 2i)a5"
X a2i)ar tam6in )a +irecci=n +on+e comien%a e) o64eto Din0oca+orE +e) mto+o
X a2i)ar )os 2ar.metros
Es +ecir5 e) c=+i-o a -enerar esF
<cdigo necesario para obtener la direccin del objeto invocador>
<cdigo necesario para obtener la direccin donde comienza el nuevo mtodo>
<cdigo necesario para obtener la direccin de memoria del primer parmetro>
<cdigo necesario para obtener la direccin de memoria del segundo parmetro>
...
PUSH <direccin del objeto invocador>
PUSH <direccin del primer parm
etro>
PUSH <direccin del segundo parmetro>
...
PUSH ... # registros utilizados por el mtodo
CALL <direccin del nuevo mtodo>
SUB ESP, <tamao de los parmetros>
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )1
%aptulo /6 Generaci(n de c(digo 1ecci(n /.,6 Aptimi:aci(n de c(digo
Becci%n ..+: O'timi8aci%n de c%digo
..+.1: /ntroducci%n
*i se i-noran )as cuestiones re)ati0as a )a o2timi%aci=n5 )a -eneraci=n +e c=+i-o +e6era ser un
2roceso mu senci))oF 6asta con recorrer e) #*$ +e entra+a Dtra+ucirE ca+a 2arte +e) c=+i-o@ se
esta6)ece una ?nica manera +e tra+ucir ca+a ti2o +e instrucci=n5 e:2resi=n +ec)araci=n +e)
)en-ua4e5 se a2)ica a ca+a no+o +e) #*$ (cons?)tese )a secci=n 2ara m.s informaci=n so6re )os
6)oques 6.sicos)"
*in em6ar-o un 2roceso tan sim2)e -enerar. un c=+i-o 2oco eficiente5 D+e 2oca ca)i+a+E" En )a
actua)i+a+ es 2oco frecuente que esto se to)ereF se necesitan 2ro-ramas +e D6uena ca)i+a+E5 que
funcionen 6ien r.2i+o"
7=tese que uti)i%amos e) trmino D+e 6uena ca)i+a+E no D=2timoEF E) 2ro6)ema +e )a
o2timi%aci=n +e c=+i-o es 79Acom2)eto
84
5 as que encontrar e) 2ro-rama =2timo 2ara sue)e ser
im2osi6)e" 7o o6stante se es2era que e) com2i)a+or rea)ice a) menos rea)ice una serie +e
o2timi%aciones 6.sicas"
3as o2timi%aciones son transformaciones que se rea)i%an so6re un c=+i-o 2ara aumentar su
ra2i+e% +e e4ecuci=n +isminuir su ocu2aci=n +e memoria sin a)terar )os resu)ta+os que se
o6tienen con )"
Ia +os -ran+es -ru2os +e o2timi%acionesF )as que +e2en+en +e )a m.quina o64eti0o )as que
no" 3as 2rimeras se 6asan en a2ro0ec!ar )as caractersticas +e) !ar+<are so6re e) que se 0a a
e4ecutar e) c=+i-o5 mientras que )as se-un+as se 6asan en !eursticas a2)ica+as a) 2ro2io c=+i-o"
Em2e%aremos con estas ?)timas"
$n-ase 2resente que so)amente !aremos una intro+ucci=n a )as o2timi%aciones en
este ca2tu)o@ !acer un estu+io e:!austi0o +e to+as )as tcnicas +e o2timi%aci=n
que+a fuera +e) .m6ito +e este )i6ro@ 2o+ra escri6irse un )i6ro com2)eto so)amente
so6re ese asunto"
..+.2: O'timi8aciones inde'endientes de la m(quina objetivo
3as o2timi%aciones in+e2en+ientes +e )a m.quina o64eti0o sonF
X E)iminaci=n +e su6e:2resiones comunes
X E)iminaci=n +e c=+i-o inacti0o
X $ransformaciones a)-e6raicas
X ;2timi%aciones re)aciona+as con constantes e in0ariantes
X ;2timi%aciones +e reor+enamiento +e c.)cu)os
+liminacin de su7e-presiones comunes
Esta transformaci=n ana)i%a e) c=+i-o e:istente 6uscan+o su6e:2resiones que ca)cu)en e) mismo
0a)or" 9or e4em2)o5 en )a ecuaci=n y = (x+1)*(x+1) no tiene senti+o ca)cu)ar :+1 +os 0eces"
84 79 Com2)eto U 1e -ran com2)e4i+a+ com2utaciona) (m.s que 2o)in=mica)" #unque no est. forma)mente +emostra+o5 se
sos2ec!a que )os 2ro6)emas 79Acom2)etos son com2utaciona)mente irreso)u6)es inc)uso 2ara muestras 2equeCas"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )2
%aptulo /6 Generaci(n de c(digo 1ecci(n /.,6 Aptimi:aci(n de c(digo
+liminacin de cdigo inactivo
*u2on-ase que )a 0aria6)e DyE +e) e4em2)o anterior no 0ue)0e a uti)i%arse en e) resto +e) c=+i-o"
Entonces no es necesario ca)cu)ar su 0a)or@ 2ue+e i-norarse )a e:2resi=n 2or com2)eto"
9recisamente esto es )o que !ace este ti2o +e transformaci=nF e)imina )os c.)cu)os innecesarios"
'rans)ormaciones alge7raicas
3as transformaciones a)-e6raicas m.s ?ti)es son aque))as que intercam6ian e:2resiones o su6
e:2resiones DcarasE 2or otras equi0a)entes 2ero m.s D6aratasE" #)-unos e4em2)os +e estas
transformaciones sonF
X cam6iar x*1 2or x
X cam6iar x+0 2or x
X cam6iar 1+2*3 2or 7
X cam6iar 1>2 2or falso
X cam6iar Hola +mundo! 2or Hola mundo!
X etc"
Esta o2timi%aci=n 2ue+e im2)ementarse sim2)emente sustituen+o una e:2resi=n 2or
su EA0a)ue5 si ste es no nu)o"
4ptimi%aciones relacionadas con constantes e invariantes
Estas o2timi%aciones se 2arecen muc!o a )as a)-e6raicas" *on o2timi%aciones que se 6asan en )a
in0aria6i)i+a+ +e una cierta e:2resi=n o un cierto c.)cu)o5 a sea en to+o e) 2ro-rama o en una
2arte +e )"
9or e4em2)o e:iste )a optimi-acin de las invariantes de un "ucle" Esta o2timi%aci=n se a2)ica
so6re e) cuer2o +e un 6uc)e5 se 6asa en 6uscar e:2resiones que se reca)cu)en en ca+a iteraci=n
+e) 6uc)e5 2ero cuo 0a)or no cam6ie" Cuan+o una e:2resi=n no cam6ia +e 0a)or +entro +e un
6uc)e se ))ama invariante del "ucle" 3a o2timi%aci=n consiste 2or cam6iar e) c.)cu)o +e )a
in0ariante 2or e) 0a)or que mantiene +entro +e) 6uc)e" 7=tese que esta o2timi%aci=n so)amente
afecta a )as instrucciones +e) cuer2o +e) 6uc)e@ una instrucci=n e:terna a ste no sufrira
a)teraci=n a)-una"
4ptimi%aciones de reordenamiento de clculo
E:isten ocasiones en )as que un +etermina+o c.)cu)o 2ue+e rea)i%arse m.s r.2i+amente
+e2en+ien+o +e) or+en +e e0a)uaci=n +e )as su6e:2resiones" /n e4em2)o mu conoci+o +e este
caso es e) 2ro6)ema +e )a mu)ti2)icaci=n +e matrices"
*u2=n-ase un )en-ua4e +e mani2u)aci=n matem.tica que contem2)e en sus e:2resiones )a
2osi6i)i+a+ +e mu)ti2)icar matrices +e n?meros +e +iferentes +imensiones" Es +ecir5 que e)
)en-ua4e a+mite =r+enes como )a si-uienteF
M = A * B * C ;
*ien+o B5 #5 G C matrices +e n?meros +e +iferentes +imensiones (# es +e m:n5 G es +e n:2
C es +e 2:q5 con )o que B es +e m:q)"
9ues 6ien5 +e2en+ien+o +e )os 0a)ores +e m5n52 q5 resu)tar. m.s eficiente ca)cu)ar )a e:2resi=n
como (#YG)YC o como #Y(GYC)5 2ues e) n?mero +e o2eraciones ser. menor" #s que siem2re
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )-
%aptulo /6 Generaci(n de c(digo 1ecci(n /.,6 Aptimi:aci(n de c(digo
que )os n+ices m5n52 q sean fi4os conoci+os en tiem2o +e com2i)aci=n5 ser. 2osi6)e o2timi%ar
e) c.)cu)o +e )a matri% B 2ara que se rea)i%e e) menor n?mero +e o2eraciones 2osi6)e"
..+.3: O'timi8aciones de'endientes de la m(quina objetivo
E) !ar+<are actua) est. en constante e0o)uci=n@ ca+a inno0aci=n en ca+a 2rocesa+or !ace 2osi6)e
una nue0a o2timi%aci=n +e) c=+i-o -enera+o 2ara +ic!o 2rocesa+or" #s5 es im2osi6)e enumerar
to+as )as 2osi6)es me4oras que 2ue+en rea)i%arse 2ara ca+a 2rocesa+or K ca+a 2ie%a +e !ar+<are
ofrece un sinfn +e 2osi6)es o2timi%aciones" En esta secci=n so)amente enumeraremos a)-unas
o2timi%aciones 2ero no to+as"
X #si-naci=n +e re-istros
X $ransformaciones +e reor+enamiento
X 1esenro))a+o +e 6uc)es
X /so +e !ar+<are es2ecfico
Asignacin de registros
3os re-istros +e una m.quina sue)en ser una 6uena !erramienta +e o2timi%aci=n +e c=+i-o5 +a+o
que son muc!o m.s r.2i+os que )a memoria"
3o i+ea) sera que to+os )os 0a)ores +e un 2ro-rama 2u+ieran ser mane4a+os con re-istros5
nunca con accesos a memoria5 2ero esto no es 2osi6)e 2orque e) n?mero +e re-istros +e una
m.quina sue)e ser mu )imita+o K a)-unos 0a)ores +e6er.n ser -uar+a+os en memoria"
3a o2timi%aci=n +e asi-naci=n +e re-istros consiste en 6uscar en ca+a momento qu +atos
-uar+ar en )os re-istros qu +atos -uar+ar en memoria" E) o64eti0o +e esta o2timi%aci=n es
minimi%ar e) n?mero +e accesos a )a memoria +istri6uen+o sa6iamente )os re-istros"
'rans)ormaciones de reordenamiento
En )as m.quinas 2rimiti0as to+as )as =r+enes se e4ecuta6an en un cic)o +e re)o4 +e )a m.quina5 +e
forma secuencia) (2rimero )a 2rimera5 )ue-o )a se-un+a5 etc)" En )os 2rocesa+ores actua)es5 sin
em6ar-o5 es frecuente que 0arias =r+enes se e4ecuten en 2ara)e)o K )as =r+enes se +i0i+en en
DfasesE5 a) i-ua) que )a arquitectura +e) 2rocesa+or5 +e ta) forma que si !a n fases entonces
2ue+e !a6er n =r+enes e4ecut.n+ose simu)t.neamente en e) ana)i%a+or (estan+o ca+a una en una
fase)" E) 2roceso +e e4ecuci=n se 2arece en este caso a una Dca+ena +e monta4eE en )a que 0an
entran+o )as instrucciones"
/no +e )os 2rinci2a)es 2ro6)emas +e esta arquitectura son )os 6)oqueos@ ciertas instrucciones
2ue+en tar+ar m.s que otras en rea)i%ar una fase5 +e manera que D6)oquean )a ca+ena +e
monta4eE" 3as transformaciones +e reor+enamiento cam6ian e) or+en +e )as =r+enes +e )os
2ro-ramas 2ara minimi%ar )os cic)os +e 6)oqueo"
;tro 2ro6)ema son )as cance)aciones" En ciertas ocasiones una instrucci=n (t2icamente un sa)to
con+iciona)) Dcance)aE e) resto +e )as instrucciones +e )a ca+ena +e monta4e5 )o que 2ue+e
2ro0ocar )a 2r+i+a +e muc!os cic)os +e 2rocesamiento" Este 2ro6)ema sue)e reso)0erse con
!ar+<are a+iciona) (reso)uci=n tem2rana +e )as com2araciones5 cac!eo +e )as +os ramas +e)
sa)to5 etc") aunque e) reor+enamiento tam6in 2ue+e a)i0iar )a situaci=n"
3os 2rocesa+ores actua)es son ca2aces +e reor+enar autom.ticamente )as instrucciones en tiem2o
+e e4ecuci=n5 as que esta o2timi%aci=n !a ca+o un 2oco en +esuso"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota ))
%aptulo /6 Generaci(n de c(digo 1ecci(n /.,6 Aptimi:aci(n de c(digo
:esenrollado de 7ucles
3a tcnica +e +esenro))a+o +e 6uc)es es mu 2o2u)ar en )as o2timi%aciones" $a) como su
nom6re in+ica5 )a tcnica +e +esenro))a+o +e 6uc)es consiste en Dre2etirE e) cuer2o +e un 6uc)e
m.s +e una 0e%5 cam6ian+o )os 0a)ores a mo+ificar"
E) +esenro))a+o +e 6uc)es consta +e +os fases" En )a 2rimera se Dre2)icanE n 0eces )as )neas +e)
cuer2o +e) 6uc)e5 mo+ifican+o )os accesos que se rea)i%an" DnE es e) ni0e) +e +esenro))a+o +e)
6uc)e"
3a se-un+a fase es )a +e reor+enamientoF )as nue0as )neas se reor+enan 2ara minimi%ar )os cic)os
+e 6)oqueo"
En )a si-uiente fi-ura se muestra un e4em2)o +e +esenro))a+o tri2)e +e un 6uc)eF
Zona inicial
Zona final
1
2
3
4
Zona inicial
(modificada)
Zona final (modificada)
1a
2a
3a
4a
1b
2b
3b
4b
1c
2c
3c
4c
Zona inicial
(modificada)
Zona final (modificada)
1a
2a
3a
4a
1b
2b
3b
4b
1c
2c
3c
4c
Bucle inicial Desenrollado de nivel 3 Reordenamiento
Ilustracin 9.17 Desenrollado de un "ucle
En )a fi-ura se muestra e) con4unto +e 6)oques 6.sicos +e un 6uc)e (i%quier+a)5 un +esenro))a+o
+e ni0e) tres +e) cuer2o +e) 6uc)e (centro) un reor+enamiento +e )as instrucciones +e) cuer2o"
E) +esenro))a+o +e 6uc)es no es una ciencia e:acta" E) ni0e) +e +esenro))a+o )as 2osi6)es
reor+enaciones que 2ue+en rea)i%arse +e2en+en enormemente +e) cuer2o +e) 6uc)e"
Eso de 8ardDare espec)ico
En ciertas ocasiones )os fa6ricantes +e !ar+<are inc)uen com2onentes con una funci=n mu
es2ecfica5 en o2osici=n a )a natura)e%a D-enricaE +e) sistema c).sico (/#3+memoria+re-istros)"
Ia mu)titu+ +e e4em2)osF
X Com2onentes +e tratamiento 0ectoria)5 como e) con4unto +e re-istros BBX +e )a arquitectura
:86
X 3a tecno)o-a 317o<N +e #B1
X 3os co2rocesa+ores matem.ticos
X 3as tar4etas -r.ficas
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )0
%aptulo /6 Generaci(n de c(digo 1ecci(n /.,6 Aptimi:aci(n de c(digo
#+em.s5 )os 2rocesa+ores actua)es tien+en a a)e4arse ca+a 0e% m.s +e) 2ara+i-ma 8,*C (que
tiene un 4ue-o +e =r+enes mu re+uci+o) 2ara ir aCa+ien+o nue0as =r+enes en ca+a -eneraci=n +e
2rocesa+ores" #s5 anti-uamente )a ?nica manera +e -enerar c=+i-o 2araF
x = x+1;
era -enerar (su2onien+o que : est en )a +irecci=n '10 +e memoria)
MOV A, [210]
ADD A, 1
MOV [210], A
*in em6ar-o con )a a2arici=n +e )a instrucci=n ,7C es 2osi6)e rea)i%arF
INC [210]
#!orr.n+ose cic)os +e e4ecuci=n e) uso +e un re-istro"
Es 2osi6)e incrementar enormemente )a eficiencia +e ciertos 2ro-ramas uti)i%an+o com2onentes
+e !ar+<are es2ecficos o instrucciones como ,7C"
9or ?)timo5 e) 2ro2io sistema o2erati0o tam6in 2ue+e ofrecer ser0icios que aumentan )a
eficiencia5 como )i6reras est.n+ar"
..+.": @ortabilidad vs. e!iciencia
Bientras que )as o2timi%aciones in+e2en+ientes +e )a m.quina siem2re son +esea6)es5 )as
+e2en+ientes +e )a m.quina no siem2re 2ue+en a2)icarse"
En muc!as ocasiones no se conoce +e antemano )a m.quina en )a que se 0a a e4ecutar e) c=+i-o"
9or e4em2)o5 en )a actua)i+a+ muc!as a2)icaciones comercia)es +e6en 2o+er e4ecutarse en e)
6inomio D\inte)E5 esto es5 una m.quina con un 2rocesa+or D,nte)E un sistema o2erati0o
D\in+o<sE"
#!ora 6ien5 e:isten 0arios 2rocesa+ores ,nte)5 e:isten 0arios sistemas o2erati0os \in+o<s" Es
in0ia6)e +istri6uir una a2)icaci=n com2i)a+a 2ara ca+a 2are4a f2rocesa+or5 sistema o2erati0og5 as
que )o que !acen )os fa6ricantes +e soft<are es senci))oF +istri6uen soft<are con )as
o2timi%aciones que funcionen en todas )as com6inaciones 2osi6)es@ se uti)i%a e) Dmnimo com?n
m?)ti2)oE +e )as o2timi%aciones"
/n 2ro-rama com2i)a+o con e) mnimo com?n m?)ti2)o +e )as o2timi%aciones ser. 2ro6a6)emente
m.s ineficiente que e) mismo 2ro-rama com2i)a+o es2ecficamente 2ara una m.quina"
$res so)uciones se 2ro2onen 2ara so)ucionar esto"
"digo a7ierto
3a 2rimera +e e))as es 2ro2orcionar e) c=+i-o fuente +e )a a2)icaci=n 4unto con )os 6inarios
e4ecuta6)es" *i un c)iente +esea o2timi%ar )a a2)icaci=n5 no tiene m.s que recom2i)ar)a acti0an+o
)as o2timi%aciones es2ecficas +e su m.quina"
*in em6ar-o )a estrate-ia +e) c=+i-o a6ierto no es siem2re 2osi6)e +e im2)ementarF muc!as
em2resas son reacias a 2ro2orcionar e) c=+i-o fuente +e sus a2)icaciones"
$i7reras del sistema
;tra forma +e aumentar )a eficiencia consiste en uti)i%ar )i6reras e:ternas a) 2ro-rama en s5 que
)o Dais)enE +e )a m.quina o64eti0o" #) actua)i%arse estas )i6reras me4orar. )a eficiencia +e)
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota ),
%aptulo /6 Generaci(n de c(digo 1ecci(n /.,6 Aptimi:aci(n de c(digo
2ro-rama autom.ticamente"
#)-unos e4em2)os +e estas )i6reras sonF
X 3os +ri0ers +e )os +iferentes com2onentes !ar+<are"
X 3a )i6rera -r.fica ;2enG3"
X 3a )i6rera +e +esarro))o +e 0i+eo4uetos 1irectX5 +e Bicrosoft"
"ompilacin FI'
3a estrate-ia +e )a com2i)aci=n J,$ tam6in se 6asa en uti)i%ar un 2aso interme+io5 aunque en
este caso e) 2ro2io c=+i-o -enera+o sea e) 2aso interme+io" 9or e4em2)o5 e) com2i)a+or +e )a
2)ataforma "7E$ +e Bicrosoft no -enera fic!eros 6inarios que se e4ecuten +irectamente so6re
<in+o<s (en c=+i-o m.quina 2ara <in+o<s) sino que -enera un c=+i-o interme+io ))ama+o C38
(2ommon Language ?untime)" Este c=+i-o 2ue+e ser inter2reta+o 2or una m.quina 0irtua)5 +e
forma simi)ar a )o que se !ace con 4a0a"
*in em6ar-o5 )a 2)ataforma "7E$ tam6in 2ro2orciona un com2i)a+or J,$ (Sust In 1ime) que
Dcom2i)aE e) C38 2ara -enerar c=+i-o m.quina +e <in+o<s5 a+a2ta+o a )a 0ersi=n +e) sistema
o2erati0o +e) 2rocesa+or que e) usuario est uti)i%an+o" J as )os 2ro-ramas son siem2re
eficientes (2ues a2ro0ec!an to+as )as o2timi%aciones +e2en+ientes +e )a m.quina) 2orta6)es"
3a 2)ataforma "7E$ sera )a 2erfecta forma +e crear 2ro-ramas eficientes 2orta6)es si no fuera
2orque )a 2orta6i)i+a+ que ofrece es )imita+aF so)amente se contem2)an a)-unos sistemas
o2erati0os +e Bicrosoft" /na 0er+a+era 2ena que )imita muc!o e) uso +e )a 2)ataforma"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )7
%aptulo /6 Generaci(n de c(digo 1ecci(n /.76 Ciscelnea
Becci%n ..-: Fiscel(nea
..-.1: /ntroducci%n
En esta secci=n o6ser0aremos c=mo tratar +i0ersas situaciones +i0ersas que 2ue+en +arse a )a
!ora +e -enerar c=+i-o 2ara una +etermina+a m.quina o64eti0o5 que no enca4an en nin-una otra
secci=n +e) ca2tu)o"
7os centraremos en +os .reasF e) ma2ea+o +e ti2os )a im2)ementaci=n +e )i6reras ti2os
2re+efini+os +e) sistema"
..-.2: Fa'eado de ti'os
Genera)mente )os )en-ua4es que com2i)aremos ser.n muc!o m.s ricos que )as m.quinas 2ara )as
que -eneraremos c=+i-o@ )as +iferencias entre )a m.quina e) )en-ua4e 2ue+en ser muc!as"
9or )o -enera) )a +iferencia m.s im2ortante es )a ausencia +e so2orte nati0o en )a m.quina 2ara
to+os )os ti2os +e) )en-ua4e" Buc!as m.quinas c).sicas tenan un ?nico ti2o +e +atos5 un entero5
con e) que +e6an Demu)arseE e) resto +e )os ti2os +e) )en-ua4e"
E) 2roceso +e Demu)arE )os ti2os +e )os que una m.quina o64eti0o carece se +enomina mapeado
de tipos5 a +ic!o 2roceso estar. +e+ica+o este a2arta+o"
/apeado de )lotantes so7re enteros
En este su6 a2arta+o 0eremos c=mo tra6a4ar con f)otantes so6re una m.quina que en 2rinci2io no
est. 2re2ara+a 2ara tra6a4ar con e))os" E) formato +e n?meros f)otantes que 0amos a uti)i%ar es e)
est.n+ar +e 3' 6its +e) ,EEEF
Ilustracin 9.19 El &ormato de nTmero &lotante de (2 "its del IEEE
E) e:2onente es a)macena+o como un n?mero 2ositi0o Dre+uci+oE5 +e manera que 2ara o6tener
e) 0er+a+ero e:2onente es necesario restar)e '(" 3a mantisa se -uar+a +e forma norma)i%a+a5 con
un D1E im2)cito +e)ante +e )a fracci=n +e '3 6its" #s se ma:imi%a )a 2recisi=n"
3a si-uiente f=rmu)a 2ermite ca)cu)ar e) 0a)or Drea)E +e un n?mero -uar+a+o en formato f)otanteF
n=s1" m'
e1'(
#)-unos 0a)ores Des2ecia)esE son re2resenta+os uti)i%an+o e) e:2onente" Cuan+o e U '&&5 m
co+ifica con+iciones es2ecia)es como 7a7 (Aot a Aum"er5 Dno un n?meroE)5 que es e) resu)ta+o
+e +i0i+ir cua)quier f)otante 2or 0" E) e:2onente e U 0 se uti)i%a en n?meros no norma)i%a+os K
n?meros tan 2equeCos que e) ran-o +e) e:2onente su2era )os 8 6its"
Ia un formato +e 64 6its que uti)i%a e) mismo formato 6.sico5 2ero con 11 6its 2ara e)
e:2onente &' 2ara )a mantisa"
OPu !acer cuan+o una m.quina no so2orta 2or +efecto este ti2oQ Es +ecir5 cuan+o no inc)ue un
4ue-o +e =r+enes 2ara mane4ar f)otantes" 3o usua) es que5 a) menos5 so2orte enteros +e 3' 6its5
o2eraciones +e mane4o +e 6its" En +ic!as con+iciones nosotros mismos +e6eremos co+ificar
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )/
m s
31
e e e e e e e e m m m m m m m m m m m m m m m m m m m m m m
30 23 22 0
s = signo
e = exponente
m = mantisa
%aptulo /6 Generaci(n de c(digo 1ecci(n /.76 Ciscelnea
funciones en e) )en-ua4e ensam6)a+or +e )a m.quina 2ara Dcon0ertirE +e entero a f)otante +e
f)otante a entero5 as como 2ara sumar5 restar5 mu)ti2)icar +i0i+ir f)otantes5 e in0ocar +ic!as
funciones (uti)i%an+o )a 2i)a5 a2i)an+o +esa2i)an+o )os 2ar.metros +e )a forma !a6itua))"
9or moti0os +e es2acio no 2o+emos +eta))ar e:tensamente c=mo im2)ementar estas funciones@
2ara a)-uien que !a 2ro-rama+o un com2i)a+or !asta e) 2unto +e -enerar c=+i-o no +e6era ser
mu +ifci)"
/apeado de caracteres 3 7ooleanos
En e) caso +e que )a m.quina o64eti0o no ofre%ca =r+enes 2ara e) mane4o +irecto +e caracteres o
6oo)eanos5 )a so)uci=n es inme+iataF ma2ear)os so6re e) ti2o entero m.s 2equeCo que 2ue+a
mane4ar )a m.quina (muc!as m.quinas 2ue+en mane4ar enteros +e 0arios tamaCos)"
*i e) ma2ea+o se !ace cui+a+osamente5 no ser. necesario im2)ementar nin-una funci=n De:traE5
como ocurra con )os f)otantes"
8ecur+ese tam6in que en a)-unos casos )os caracteres que se necesitan son unico+e5 2or )o
tanto ocu2an 16 6its5 en )u-ar +e )os 8 usua)es"
/apeado de cadenas de caracteres 3 ta7las
9or )o -enera) )as ca+enas ta6)as 2ue+en mane4arse +e manera simi)ar" J !a muc!as maneras
+e !acer)o@ )a m.s conoci+a K aunque no 2or e))o )a m.s a+ecua+a en to+os )os casos K es )a +e)
)en-ua4e C"
En C no !a +iferencia a)-una entre una ca+ena una ta6)a +e caracteres" *on sim2)emente una
serie +e caracteres consecuti0os en memoria5 cuo inicio est. a2unta+o 2or un 2untero" # efectos
2r.cticos5 )a ?nica +iferencia entre una ta6)a una ca+ena +e caracteres es que esta ?)tima tiene
que terminar o6)i-atoriamente con e) car.cter +e terminaci=n5 [i0["
E) car.cter +e terminaci=n es una +e )as formas +e +eterminar e) tamaCo +e una ca+ena@ aunque
no es es2ecia)mente r.2i+o5 es econ=mico" 9resenta +os 2ro6)emasF )entitu+ (!a que recorrer
to+a )a ca+ena 2ara a0eri-uar su )on-itu+)"
;tra o2ci=n consiste en uti)i%ar )os 2rimeros 6tes +e )a ca+ena (usua)mente )os 4 2rimeros) 2ara
co+ificar e) tamaCo +e +ic!a ca+ena5 as no +e2en+er +e) car.cter +e terminaci=n"
En cuanto a )a %ona +e a)macenamiento5 !a +os o2cionesF )a 2i)a o e) montcu)o" 3a 2i)a 2ue+e
uti)i%arse satisfactoriamente 2ara a)macenar ca+enas o ta6)as +e tamaCo m.:imo conoci+o (que
no 2ue+an e:ce+er un tamaCo +etermina+o5 +e acuer+o a una c).usu)a en su creaci=n)" Buc!os
)en-ua4es so)amente a+miten ca+enas ta6)as +e tamaCo m.:imo conoci+o5 +ec)aran+o +ic!o
tamaCo a) +ec)arar)asF
Nombre: Cadena [20]; // Nombre tiene un tamao mximo de 20
Usuarios: Tabla [20..65] de Usuarios ; // Usuarios tiene 45 usuarios,
// numerados del 20 al 65
3a 2i)a5 sin em6ar-o5 resu)ta mu +ifci) +e uti)i%ar si )as ca+enas o ta6)as tienen un tamaCo
+in.mico5 como 0iene ocurrien+o +es+e !ace a)-?n tiem2o en )a maora +e )os )en-ua4es +e
2ro-ramaci=n" En +ic!os casos es me4or uti)i%ar e) montcu)o 2ara a)macenar )os +atos" Es mu
?ti) a)macenar un 2untero a) comien%o +e +ic!os +atos en )a 2i)a"
/apeado de tipos de)inidos por el usuario
#?n !o es 2oco fecuente que )as m.quinas o64eti0o ofre%can =r+enes +e mane4o +e ti2os
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )<
%aptulo /6 Generaci(n de c(digo 1ecci(n /.76 Ciscelnea
+efini+os 2or e) usuario
8&
"
3os ti2os que un usuario +efine siem2re 2ue+en re2resentarse como Dcon4untos +e +atosE (o
Dre-istros +e +atosE)5 +e manera que )os +atos que re2resentan 2ue+en +is2onerse
consecuti0amente en )a memoria" En e) caso +e )os ti2os Dc)aseE estos con4untos +e +atos son )os
atri6utos" #s5 e) ti2o Persona 2ue+e re2resentarse como +os ca+enas (nom6re a2e))i+os) un
entero (e+a+) +is2uestos consecuti0amente en memoria"
E) ma2ea+o +e ti2os +efini+os 2or e) usuario es m.s senci))o +e im2)ementar5 2or e4em2)o5 que e)
ma2ea+o +e f)otantes"
..-.3: LibrerAas y ti'os b(sicos del sistema
3os ti2os +efini+os 2or e) usuario 2ue+en +efinirse en 6ase a otros ti2os +efini+os 2or e) usuario5
2ero en ?)tima instancia estos ti2os estar.n +efini+os en torno a ti2os 6.sicos +e) )en-ua4eF
enteros5 ca+enas5 rea)es5 etc" 3as )i6reras que e) usuario 2ue+a crear5 a) fina)5 se 6asar.n tam6in
en +ic!os ti2os 6.sicos5 en otras )i6reras 6.sicas ofreci+as 2or e) com2i)a+or"
3os ti2os 6.sicos )i6reras +e) sistema sue)en ser Des2ecia)esE en ciertos as2ectos@ a+miten m.s
o2eraciones +e )as que a+miten )os ti2os -enera+os 2or e) usuario" Estas ca2aci+a+es es2ecia)es
tienen que 0er con )a forma en que su c=+i-o se -enera"
$omemos 2or e4em2)o )a c)ase Sistema +e) )en-ua4e 3e3i" 1ic!a c)ase 2ossee 0arios mto+os
que5 a) ser in0oca+os con )os 2ar.metros a+ecua+os5 im2rimir.n mensa4es en )a 2anta))a" OC=mo
conse-uiremos stoQ
Est. c)aro que 2ara !acer)o !emos +e conse-uir que )os mto+os +e im2resi=n +e )a c)ase
Sistema se tra+u%can a c=+i-o ensam6)a+or +e una manera es2ecia)@ una que im2)ica )a
in0ocaci=n +e =r+enes es2ecia)es +e im2resi=n +e caracteres en )a 2anta))a" En otras 2a)a6ras5 e)
cuer2o -enera+o +e )os mto+os +e )a c)ase Sistema +e6e contener =r+enes Des2ecia)esE5 que
2ermitan a )a m.quina o64eti0o im2rimir mensa4es 2or 2anta))a"
Ia tres maneras +e )o-rar stoF
X Em6e6ien+o c=+i-o -enera+o +entro +e) c=+i-o fuente +e +ic!as c)ases"
X Iacien+o que e) com2i)a+or contro)e +e una forma es2ecia) +ic!as c)ases +urante )a -eneraci=n
+e c=+i-o"
X *o2ortan+o nati0amente +ic!a c)ase en )a m.quina o64eti0o"
4pcin 1: "digo em7e7ido
csta a2ro:imaci=n consiste en +otar a) )en-ua4e +e) com2i)a+or con ca2aci+a+ 2ara inc)uir c=+i-o
+e )a m.quina o64eti0o +irectamente en sus mto+os" E) mecanismo se 2arecera muc!o a) 6)oque
__asm que uti)i%a e) )en-ua4e C 2ara inc)uir c=+i-o ensam6)a+or
86
F
8& E:ce2ci=n !ec!a +e )a JRB +e )a 2)ataforma "7E$"
86 3os 6)oques _asm son una e:tensi=n +e C++ no est.n+ar+ +e Bicrosoft"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )1
%aptulo /6 Generaci(n de c(digo 1ecci(n /.76 Ciscelnea
void main (void)
{
int a = 0;
__asm{
add a, 1
}
}
9o+ramos !acer )o mismo@ aCa+ien+o un ti2o +e instrucci=n es2ecia) 2ara insertar c=+i-o +e )a
m.quina o64eto +irectamente +entro +e nuestro c=+i-o fuente"
Este mecanismo tiene e) incon0eniente +e )a +e2en+encia@ si )a m.quina o64eti0o cam6ia5 e)
c=+i-o 2ue+e que+ar inser0i6)e"
#+em.s5 e) c=+i-o em6e6i+o no es o2timi%a6)e 2or e) com2i)a+or"
4pcin 2: "ondiciones especiales controladas
;tra o2ci=n consiste en que e) -enera+or +e c=+i-o est D0i-i)an+oE )os mto+os que +ec)aran en
e) c=+i-o fuente" #) -enerar e) c=+i-o 2ara )os mto+os es2ecia)es5 como Sistema.imprime e)
-enera+or cance)a )a forma usua) +e -enerar)os@ i-nora )as instrucciones +e) cuer2o +e) mto+o
-enera e) c=+i-o que sea necesario" 1e )a misma forma e) -enera+or est. D2en+ienteE +e )as
in0ocaciones a mto+os es2ecia)es5 inter0inien+o cuan+o es necesario 2ara -enerar )as
in0ocaciones a+ecua+amente"
Esta so)uci=n a+o)ece +e) mismo 2ro6)ema que )a anteriorF +e2en+encia +e )a m.quina o64eti0o"
En este caso es e) 2ro2io c=+i-o +e) -enera+or e) que es +e2en+iente +e )a m.quina o64eti0o5
que ser. inser0i6)e si se cam6ia"
4pcin 3: Soporte nativo
9or ?)timo tenemos )a 2osi6i)i+a+ +e que )a 2ro2ia m.quina o64eti0o se encar-ue +e mane4ar
a+ecua+amente )as c)ases con mto+os es2ecia)es" Esta so)uci=n so)amente es a2)ica6)e en
m.quinas o64eti0o que estn 2rofun+amente re)aciona+as con e) )en-ua4e5 a) esti)o +e )a JRB o +e
)a m.quina 0irtua) +e )a 2)ataforma "7E$"
3a JRB5 2or e4em2)o5 es ca2a% +e tratar )a ref)e:i=n +e) )en-ua4e 4a0a
8(
casi autom.ticamente"
8( 3a ref)e:i=n es e) mecanismo que 4a0a ofrece 2ara mane4ar metac)ases
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )11
%aptulo /6 Generaci(n de c(digo 1ecci(n /./6 %onclusi(n
Becci%n ...: &onclusi%n
Como a se mencion= en )a intro+ucci=n5 )a -eneraci=n +e c=+i-o no i)ustra nin-una +e )as
caracterscas que a !emos 2resenta+o en e) ca2tu)o anterior (recorri+o +e #*$s)5 2or )o que
!emos +eci+i+o no ma)-astar es2acio5 ener-a tiem2o en im2)ementar esta eta2a +e)
com2i)a+or"
9or otra 2arte5 un +ocumento so6re com2i)a+ores no 2ue+e estar com2)eto sin una secci=n so6re
-eneraci=n +e c=+i-o5 2or )o que fina)mente me !e +eci+i+o 2or un tono intro+uctorio5 sin ))e-ar
a 2resentar una im2)ementaci=n 2ara e) )en-ua4e 3e3i" Como a !e +ic!o otros factores (fa)ta +e
tiem2o +e una m.quina o64eti0o satisfactoria) tam6in !an inf)ui+o en mi +ecisi=n"
1ic!o esto5 re0isemos )o qu es )o que !emos estu+ia+o en este ca2tu)o"
Comen%amos con un estu+io +e )as 2osi6)es m.quinas o64eti0os +e )a -esti=n +e memoria"
1es2us !emos intro+uci+o e) conce2to +e c=+i-o interme+io"
En )a si-uiente secci=n !emos estu+ia+o (no mu 2rofun+amente) c=mo -enerar c=+i-o 2ara )as
e:2resiones +ec)araciones +e un )en-ua4e5 +es2us !emos 2resenta+o a)-unas estrate-ias +e
o2timi%aci=n"
>ina)memte en )a ?)tima secci=n5 Dmisce).neaE5 0eamos as2ectos 0arios +e )a -eneraci=n +e
c=+i-o"
,nnumera6)es son )os temas que no !emos cu6ierto" 3a o2timi%aci=n +e c=+i-o5 2or s so)a5 6asta
2ara escri6ir un )i6ro5 nosotros )a !emos +es2ac!a+o en cinco 2.-inas" $am2oco !emos
im2)ementa+o e) ni0e) +e -eneraci=n +e c=+i-o +e nuestro com2i)a+or5 que se !a que+a+o
inaca6a+o"
Este ca2tu)o !a si+o menos 2r.ctico +e )o que +e6era5 en mi o2ini=n" Bis +iscu)2as a )os
)ectores que se !aan a6urri+o" Es mu +ifci) 2o+er 2resentar )as 2artes m.s D4u-osasE +e un
tema a) mismo tiem2o mantener un tono intro+uctorio"
E) si-uiente ca2tu)o5 DConc)usionesE es e) ?)timo +e este +ocumento" En ) +e4aremos +e )a+o e)
)en-ua4e 3e3i5 que !a si+o e) !i)o centra) +e )os ?)timos cuatro ca2tu)os5 nos centraremos en
#7$38" 9resentaremos )as conc)usiones a )as que !emos ))e-a+o con res2ecto a )a !erramienta"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )12
Captulo 9:
Conclusiones
"altar r#pidamente a conclusiones rara ve$ conduce a felices aterri$ajes.
*" *i2orin
Captulo 9:
Conclusiones......................................................................................413
Seccin 1.1: Introduccin......................................................................................................!1!
Seccin 1.2: A&'$( 3 el anlisis l2-ico............................................................................... !1
1.2.1: La 'rimera im'resi%n............................................................................................................... "1#
1.2.2: ,sabilidad................................................................................................................................ "1#
1.2.3: !iciencia................................................................................................................................. "1#
1.2.": @restaciones............................................................................................................................ "1+
1.2.#: &arencias................................................................................................................................ "1+
1.2.+: &onclusi%n............................................................................................................................... "1-
Seccin 1.3: A&'$( 3 el anlisis sintctico........................................................................ !1#
1.3.1: La 'rimera im'resi%n............................................................................................................... "1.
1.3.2: ,sabilidad................................................................................................................................ "1.
1.3.3: !iciencia................................................................................................................................. "1.
1.3.": @restaciones............................................................................................................................ "1.
1.3.#: &arencias................................................................................................................................ "11
1.3.+: &onclusi%n............................................................................................................................... "11
Seccin 1.!: A&'$( 3 el anlisis semntico....................................................................... !2.
1.".1: La 'rimera im'resi%n............................................................................................................... "2C
1.".2: ,sabilidad................................................................................................................................ "2C
1.".3: !iciencia................................................................................................................................. "2C
1.".": @restaciones............................................................................................................................ "2C
1.".#: &arencias................................................................................................................................ "21
1.".+: &onclusi%n............................................................................................................................... "22
Seccin 1.: "onclusiones )inales....................................................................................... !23
1.#.1: Bobre A$>LR.......................................................................................................................... "23
1.#.2: Bobre el manejo de los AB>s.................................................................................................. "23
1.#.3: Bobre la e!iciencia................................................................................................................... "23
1.#.": Bobre el !uturo de A$>LR....................................................................................................... "2#
1.#.#: <Ferece la 'ena A$>LR?....................................................................................................... "2#
1.#.+: 5inal......................................................................................................................................... "2+
Gua prctica de ANTLR 2.7.2 v 1. )1-
%aptulo <6 %onclusiones 1ecci(n <.16 &ntroducci(n
Becci%n 1.1: /ntroducci%n
En )os ?)timos & ca2tu)os nos !emos +e+ica+o a comentar )os +eta))es +e im2)ementaci=n +e)
com2i)a+or +e 3e3i5 a mo+o +e e4em2)o +e uso +e #7$38"
En este ca2tu)o a6an+onaremos +efiniti0amente e) )en-ua4e 3e3i nos +e+icaremos a enunciar
)as conc)usiones a )as que !emos ))e-a+o5 en )o referente a #7$38"
Ie estructura+o este ca2tu)o se-?n )a estructura 6.sica +e un com2i)a+or o intr2rete"
Comen%aremos ana)i%an+o c=mo se com2orta #7$38 en e) ni0e) ):ico5 se-uiremos con )os
ni0e)es sint.ctico sem.ntico" 9or ?)timo !a6r. una serie +e conc)usiones fina)es"
LGueno5 comencemosN
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )1)
%aptulo <6 %onclusiones 1ecci(n <.26 ANTLR y el anlisis l$8ico
Becci%n 1.2: A$>LR y el an(lisis l0xico
1.2.1: La 'rimera im'resi%n
Es ma)a"
Como a !emos 0isto5 #7$38 uti)i%a e) a)-oritmo 2re+A*33(H) !asta sus ?)timas consecuencias5
inc)uento en e) an.)isis ):ico" Esto !ace que !aa que tener en cuenta )os Dcaracteres +e
)ooHa!ea+E si se 2)antean 2ro6)emas +e am6i-ae+a+"
3a 2rimera im2resi=n es ma)a 2orque +es+e siem2re !emos uti)i%a+o e:2resiones re-u)ares 2ara
rea)i%ar e) an.)isis ):ico"
1.2.2: ,sabilidad
E) asunto se !ace 2atente si intentamos reconocer enteros rea)es a )a 0e%" *im2)emente no
2o+remos uti)i%ar re-)as in+e2en+ientes@ +e6eremos uti)i%ar )a misma re-)a5 +iferenciar ca+a
ti2o +e n?mero con un 2re+ica+o sint.ctico5 ta) como 0eamos en e) an.)isis sint.ctico +e 3e3i"
E) a)-oritmo 33(H) fa0orece ()e0emente) que a2are%can a)-unas am6i-ae+a+es" En e) caso +e
3e3i a2areci= una"
3a 2rimera 0e% que uno se enfrenta a estas +ificu)ta+es es un tanto +eses2erante (DOL2or qu no
se !a6r.n )imita+o a usar e:2resiones re-u)ares se !a6r.n +e4a+o +e tonterasNQE)" 9ero )as
+ificu)ta+es sue)en so)0entarse mu r.2i+o en )a maor 2arte +e )os casos"
1.2.3: !iciencia
Ciertamente e) c=+i-o no es tan eficiente como +e6era" *im2)emente !a +emasia+as ))ama+as a
mto+os" 9or e4em2)o5 !a +emasia+as in0ocaciones +e) mto+o 3#(1)5 que 2o+ran o2timi%arse
uti)i%an+o una 0aria6)e tem2ora)" Ca+a 0e% que un car.cter es consumi+o5 se in0oca e) mto+o
match(caracter)5 as que ste se in0oca en muc!as ocasiones"
#7$38 +e6era +e 2ro2orcionar a)-?n mecanismo 2ara !acer )as su6 re-)as inline5 +e manera
que se a!orren a)-unas in0ocaciones +e mto+os"
;tra 2osi6)e o2timi%aci=n es )a e)iminaci=n +e com2ro6aciones re2etiti0as" 9or e4em2)o5 a)
reconocer )a re-)a IDENT5 se -enera un 6)oque switch mu -ran+e antes +e reconocer ca+a )etraF
switch ( LA(1)) {
case 'A': case 'B': case 'C': case 'D':
case 'E': etc, etc..
{
mLETRA(false);
break;
}
Estas com2ro6aciones 0ue)0en a re2etirse a) reconocer ca+a )etraF
switch ( LA(1)) {
case 'a': case 'b': case 'c': case 'd':
... etc
{
matchRange('a','z');
break;
}
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )10
%aptulo <6 %onclusiones 1ecci(n <.26 ANTLR y el anlisis l$8ico
Estas com2ro6aciones De:traE +e6eran 2o+er e0itarse5 se-uramente con e) mto+o +e
inlineacin que comentamos m.s arri6a"
3a im2)ementaci=n +e )os 2re+ica+os sint.cticos tam6in 2o+ra me4orarseF en ocasiones 2ue+en
!asta +o6)ar e) tiem2o +e e4ecuci=n +e una re-)a"
1.2.": @restaciones
# 2esar +e )os 2equeCos 2ro6)emas +e usa6i)i+a+ )a merma +e eficiencia5 e) mto+o +e
-eneraci=n +e ana)i%a+ores ):icos +e #7$38 ofrece im2ortantes 0enta4asF
X 9ue+en inc)uirse acciones en cua)quier 2arte +e cua)quier re-)a +e una forma mu senci))a" Con
e:2resiones re-u)ares no sera tan senci))o"
X 3a !erencia +e -ram.ticas se 2ue+e uti)i%ar tam6in con )os ana)i%a+ores ):icos
X E) c=+i-o -enera+o se entien+e 2erfectamente"
X 9ara sim2)ificar e) reconocimiento es 2osi6)e aumentar H5 sin que se 2ier+a )a eficiencia"
X Ia un recu2era+or +e errores 2or +efecto que 2ue+e ser mo+ifica+o si se +esea"
X 3as re-)as 2ermiten e) 2aso +e 2ar.metros )a +e0o)uci=n +e 0a)ores"
Buc!as +e estas 2restaciones son 2osi6)es -racias a que ca+a re-)a +e) ana)i%a+or ):ico est.
im2)ementa+a en un mto+o in+e2en+iente +e) ana)i%a+or" 9or )o tanto )a o2timi%aci=n +e
Din)ineaci=nE +e )a que !a6).6amos antes so)amente 2o+ra uti)i%arse en re-)as en )as que no se
a2ro0ec!asen to+as estas ca2aci+a+es"
E:isten a)-unas 2restaciones es2ecficas 2ara )os ana)i%a+ores ):icosF
X #7$38 ofrece a+em.s ser0icios a+iciona)es 2ara mane4ar 2a)a6ras reser0a+as5 con )o que se
a)i0ia muc!o e) reconocimiento +e i+entifica+ores"
X #7$38 2ermite intercam6iar ana)i%a+ores ):icos con au+a +e) o64eto
LexerSharedInputState"
X 3a sensi6i)i+a+ a ma?scu)as 2ue+e +esacti0arse mu f.ci)mente con una o2ci=n +e) ana)i%a+or"
9ara tratamientos m.s finos (2or e4em2)o5 2ermitir ma?scu)as min?scu)as so)amente en
a)-unos toHens) 6asta con reescri6ir e) mto+o CharScanner::testLiteralsTable
(String, int)"
T La clausura positiva y el cierre de Qleene permiten escri+ir la mayora de las reglas
como si 4ueran e8presiones regulares
X #+em.s5 en )as re-)as ):icas 2ue+en es2ecificarse ran-os +e caracteres"
X *i 2or a)-?n moti0o no nos -usta )a im2)ementaci=n +e #7$385 2o+emos suministrar nuestro
2ro2io TokenStream 2ara )eer )os toHens"
X Com2ati6i)i+a+ con /nico+e"
1.2.#: &arencias
3a 2rinci2a) carencia que +etectamos en )os ana)i%a+ores ):icos es e) funcionamiento +e )a
o2ci=n paraphraseF so)amente 2ue+e es2ecificarse 2ara toHens +efini+os en re-)as ):icas ( no
en )os toHens ima-inarios +efini+os en )a %ona +e [toHens[ +e) ana)i%a+or)" Ja !emos 0isto que
esta situaci=n 2ue+e reme+iarse uti)i%an+o re-)as DficticiasE en e) ana)i%a+or5 2ero no +e4a +e ser
un DtrucoE@ +e6era +e !a6er una forma m.s estan+ari%a+a +e !acer)o"
$am6in me4orarse e) tratamiento +e ma?scu)as^min?scu)as" 1e6era 2o+er acti0arse
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )1,
%aptulo <6 %onclusiones 1ecci(n <.26 ANTLR y el anlisis l$8ico
+esacti0arse )a sensi6i)i+a+ a ma?scu)as en ca+a re-)a o su6 re-)a (esto 2ue+e !acerse
so6reescri6ien+o CharScanner::testLiteralsTable(String, iny)5 2ero +e6era 2o+er
rea)i%arse autom.ticamente)"
9or ?)timo5 resa)tar que 4am.s se in0oca e) mto+o Token::setFilename +urante e) an.)isis
):ico5 +e manera que 2ara conse-uir toHens con nom6res +e fic!ero no 6asta con im2)ementar
una 0ersi=n 2ro2ia +e Token@ tam6in !a que so6reescri6ir e) mto+o
ChasScanner::makeToken en nuestro ana)i%a+or ):ico"
Con to+o estas carencias son 2oco im2ortantes" #+em.s5 to+as 2ue+en so)ucionarse +e a)-una
forma"
1.2.+: &onclusi%n
E) instinto me in+ica6a que +on+e m.s 2untos 2er+era e) sistema sera en )a usa6i)i+a+" 9ero
fina)mente no resu)t= mu traum.tico" #+em.s5 im2)ementar e) an.)isis ):ico au+a a
com2ren+er e) 2ara+i-ma 2re+A33(H)"
#s que fina)mente es en )a eficiencia +on+e se 2ier+en m.s 2untos"
En )as 2restaciones +e) sistema no tiene ri0a)" ;frece m.s +e )o que 2o+ra ofrecer una
im2)ementaci=n 6asa+a en e:2resiones re-u)ares (a costa +e 2er+er eficiencia)"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )17
%aptulo <6 %onclusiones 1ecci(n <.-6 ANTLR y el anlisis sintctico
Becci%n 1.3: A$>LR y el an(lisis sint(ctico
1.3.1: La 'rimera im'resi%n
Es mu 6uena"
E) uso +e )a c)ausura 2ositi0a e) cierre +e M)eene 2ermiten es2ecificar mu f.ci)mente )as )istas
+e e)ementos" Com2ren+er )os entresi4os +e 2re+A33(H) es m.s senci))o que com2ren+er )os
conf)ictos s!iftAre+uce +e )os ana)i%a+ores 38 (como Gison)" #Ca+ir 2re+ica+os sint.cticos es
f.ci)5 una 0e% que se conocen un 2ar +e re-)as" #+em.s5 no !a que !acer)o casi nunca (& re-)as
en )a -ram.tica +e 3e3i)"
/no tiene que acostum6rarse a que en 33 Dso)amente se reconoce una re-)a ca+a 0e%5 no 0arias
simu)t.neamenteE como ocurre en 38" *i no se cum2)e una +etermina+a re-)a5 entonces !a un
error"
3a recu2eraci=n +e errores es un 2oco m.s com2)ica+a5 2orque 2ara im2)ementar)a efica%mente
es necesario conocer e:actamente c=mo se -enera e) c=+i-o +e #7$38"
# 2rimera 0ista )a construcci=n +e #*$s es senci))aF )os o2era+ores h N faci)itan )a tarea"
1.3.2: ,sabilidad
Como a !emos +ic!o5 es 6astante c=mo+o uti)i%ar K una 0e% que se !a com2ren+i+o e)
2ara+i-ma 2re+A33(H)5 con e) que e) 2ro-rama+or toma contacto +es+e e) an.)isis ):ico"
Cuan+o comen%amos a construir #*$s un 2oco m.s com2)ica+os5 sin em6ar-o5 comen%aremos a
tener +ificu)ta+es" Construir #*$s !etero-neos es una tarea )a6oriosa que 2ue+e +ar )u-ar a
muc!os errores antes +e ser rea)i%a+a correctamente" #+em.s est. 2oco +ocumenta+a"
1.3.3: !iciencia
3os ana)i%a+ores sint.cticos a+o)ecen +e 2ro6)emas +e eficiencia simi)ares a )os ):icosF
+emasia+as in0ocaciones a mto+os"
1e nue0o sera aconse4a6)e 2o+er !acer inline a)-unos mto+os +e) ana)i%a+or5 2ara aumentar )a
0e)oci+a+"
3a im2)ementaci=n +e )os 2re+ica+os sint.cticos tam6in 2o+ra me4orarse"
1.3.": @restaciones
9ara e) ni0e) sint.ctico #7$38 ofrece )as mismas 2restaciones que 2ara e) ni0e) ):ico
(e:ce2tuan+o )as 2restaciones reser0a+as a) ni0e) ):ico)F
X 9ue+en inc)uirse acciones en cua)quier 2arte +e cua)quier re-)a +e una forma mu senci))a"
X 3a !erencia +e -ram.ticas se 2ue+e uti)i%ar tam6in con )os ana)i%a+ores sint.cticos
X E) c=+i-o -enera+o se entien+e 2erfectamente"
X 9ara sim2)ificar e) reconocimiento es 2osi6)e aumentar H5 sin que se 2ier+a )a eficiencia"
X Ia un recu2era+or +e errores 2or +efecto que 2ue+e ser mo+ifica+o si se +esea"
X 3as re-)as 2ermiten e) 2aso +e 2ar.metros )a +e0o)uci=n +e 0a)ores"
X E) #*$ 2ue+e mostrarse -r.ficamente en una 0entana *\,7G"
3a recu2eraci=n +e errores merece una menci=n es2ecia)5 2orque es 6astante f.ci) +e
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )1/
%aptulo <6 %onclusiones 1ecci(n <.-6 ANTLR y el anlisis sintctico
im2)ementar"
1.3.#: &arencias
#+em.s +e )os incon0enientes menciona+os en e) a2arta+o DeficienciaE5 e) mo+o +e mane4o +e )os
#*$s que uti)i%a #7$38 es 2oco 2r.ctico"
9ara em2e%ar5 se ec!an en fa)ta m.s mto+os 2ara crear .r6o)es en )as acciones" 9or e4em2)o5 no
!a una forma c)ara estan+ari%a+a +e rea)i%ar una +u2)icaci=n +e un #*$ (!a que recurrir a
in0ocar +irectamente un mto+o +e )a f.6rica +e #*$s que contiene e) ana)i%a+or)"
# 2esar +e que me4or= con res2ecto a )a 0ersi=n anterior5 e) tra6a4o con #*$s !etero-neos
si-ue sien+o com2)ica+o5 2or 0arios moti0osF
X Ca+a nue0a c)ase +e #*$ +e6e ser im2)ementa+a 2or e) 2ro-rama+or" #7$38 2o+ra
automati%ar )a tarea +e crear )as nue0as c)ases"
X Ia muc!a +iscusi=n so6re si es acerta+o que )as instrucciones +e mo+ificaci=n creaci=n +e
#*$s se inc)uan en )as acciones" Buc!a -ente o2ina que +e6eran estar m.s se2ara+as@ a)-o
as como tener Dacciones +e mo+ificaci=n +e) #*$E Dacciones norma)esE5 se2ara+as" 3as
acciones +e mo+ificaci=n +e) #*$ ten+ran un )en-ua4e tota)mente in+e2en+iente +e) )en-ua4e
+e -eneraci=n +e) ana)i%a+or (4a0a5 C++5 Ce)"
X 3a Des2ecia)E +is2osici=n en memoria +e )os #*$s (en )a que ca+a no+o tiene +os D2unterosE a
su D!i4oAa6a4oE a su D!ermanoA+erec!aE) !acen que +e 0e% en cuan+o se 2ro+u%can
resu)ta+os insos2ec!a+os a) tra6a4ar con #*$s (2or e4em2)o5 2o+emos o)0i+arnos +e e)iminar
)os !ermanos +e un no+o a) aCa+ir)o como !i4o a otro)
En +efiniti0a5 )as 2rinci2a)es carencias que encontramos se +an en e) mane4o +e )os #*$s"
*o)amente not una carencia en e) recorri+o +e #*$sF )a 0ersi=n '"("' +e #7$38 no 2ermite
nom6rar su6 re-)as" Es +ecir5 no 2ermite !acer a)-o asF
persona : IDENT apellidos/(IDENT IDENT) ;
3a 2rinci2a) a2)icaci=n +e )as su6 re-)as con nom6re es )a recu2eraci=n +e errores" En e)
momento en e) que 2o+emos nom6rar una su6 re-)a 2o+emos es2ecificar un mane4a+or +e
e:ce2ciones 2ara +ic!a re-)aF
persona : IDENT apellidos:(IDENT IDENT) ;
exception [apellidos] catch [RecognitionException re]
{ ... /* tratar el error */ }
En e) esta+o actua) no que+a m.s reme+io que +i0i+ir )a re-)a en +osF
persona : IDENT apellidos;
apellidos : IDENT IDENT ;
exception catch [RecognitionException re]
{ ... /* tratar el error */ }
En ocasiones +i0i+ir )as re-)as no es +esea6)e (se 2ier+e eficiencia5 tra6a4ar con e) ana)i%a+or se
0ue)0e m.s com2)ica+o a) aumentar e) n?mero +e re-)as)"
1.3.+: &onclusi%n
En -enera) im2)ementar ana)i%a+ores sint.cticos con #7$38 es un 2)acer" *in em6ar-o5 si
necesitamos mane4ar #*$s Dcom2)e4osE (!etero-neos)5 nos +e4ar. un re-usto amar-o
(es2ecia)mente si -eneramos c=+i-o C++)"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )1<
%aptulo <6 %onclusiones 1ecci(n <.)6 ANTLR y el anlisis semntico
Becci%n 1.": A$>LR y el an(lisis sem(ntico
1.".1: La 'rimera im'resi%n
Es un 2oco +esconcertante"
#costum6ra+os a tratar f)u4os +e caracteres o +e toHens5 +e re2ente estamos ana)i%an+o
estructuras ar6=reas" J a?n en ese caso se-uimos uti)i%an+o un ana)i%a+or 2re+A33(H)"
E) as2ecto +e) 2atr=n .r6o) es e:traCo K no 2arece tan senci))o +e tratar como )os f)u4os +e
toHens"
J sin em6ar-o5 a) 2oco tiem2o +e estar usan+o e) 2atr=n .r6o) comen%amos a estar mu
c=mo+os" ,nc)uso escri6ir enuncia+os sint.cticos resu)ta senci))o"
1.".2: ,sabilidad
8ecorrer )os #*$s es 6astante senci))o@ un itera+or sin acciones 2ue+e im2)ementarse
r.2i+amente" 3o m.s usua) es que ca+a ti2o +e #*$ ten-a un no+o caracterstico como ra%5 as
que )a -ram.tica ser. 33(1)5 no !ar.n fa)ta 2re+ica+os sint.cticos"
*in em6ar-o5 e) an.)isis sem.ntico no consiste sim2)emente en recorrer #*$s" $am6in !a que
transformar)os5 enriquecer)os" J aunque #7$38 sea 6astante usa6)e recorrien+o #*$s5 no )o es
tanto mo+ific.n+o)os"
En )a secci=n anterior mencion.6amos que )a forma +e contro)ar )a construcci=n +e )os #*$s es
m.s com2)ica+a +e )o necesario" 9ues 6ien5 estas com2)icaciones se a-ra0an en )a fase +e an.)isis
sem.ntico" Rase e) a2arta+o +e DcarenciasE 2ara un informe m.s +eta))a+o so6re esta cuesti=n"
1.".3: !iciencia
1e nue0o encontramos )os mismos 2ro6)emas +e eficiencia que en e) resto +e )os ni0e)esF
sim2)emente +emasia+os mto+os son in0oca+os5 en ciertas ocasiones )as Dcom2ro6aciones +e
caracteresE se suce+en" #unque +e nue0o -racias a esta 2equeCa 2r+i+a +e eficiencia 2o+emos
+isfrutar +e mu 6uenas 2restaciones"
# )os 2ro6)emas +e eficiencia a menciona+os !a que aCa+ir)es que #7$38 anima a)
2ro-rama+or a crear un nue0o #*$ en ca+a an.)isis sem.ntico5 no a mo+ificar e) a e:istente"
3a creaci=n +e ca+a nue0o #*$ requiere 6astante tiem2o"
1.".": @restaciones
1e nue0o )a estrate-ia 2re+A33(H) 2ro2orciona a #7$38 m?)ti2)es ca2aci+a+es 2ara e) an.)isisF
X 9ue+en inc)uirse acciones en cua)quier 2arte +e cua)quier re-)a +e una forma mu senci))a"
X 3a !erencia +e -ram.ticas se 2ue+e uti)i%ar tam6in con )os ana)i%a+ores sem.nticos
X E) c=+i-o -enera+o se entien+e 6ien (aunque se 0ue)0e 6orroso si se acti0a )a -eneraci=n
autom.tica +e) #*$)
X 9ara sim2)ificar e) reconocimiento es 2osi6)e aumentar H5 sin que se 2ier+a )a eficiencia"
X Ia un recu2era+or +e errores 2or +efecto que 2ue+e ser mo+ifica+o si se +esea"
X 3as re-)as 2ermiten e) 2aso +e 2ar.metros )a +e0o)uci=n +e 0a)ores"
X 9ue+e mostrarse -r.ficamente e) #*$ en una 0entana *\,7G"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )2
%aptulo <6 %onclusiones 1ecci(n <.)6 ANTLR y el anlisis semntico
1.".#: &arencias
Ia muc!o que me4orar en e) mane4o +e )os #*$s"
#) tra6a4ar )os #*$s5 si-ue !a6ien+o Defectos co)atera)esEF si un #*$ D#E se !ace !i4o +e otro
#*$ DGE5 entonces autom.ticamente to+os )os !ermanos +e # tam6in 2asar.n a ser !i4os +e G"
Este com2ortamiento 2ue+e ser +esconcertante"
E) D2seu+oA)en-ua4eE +e transformaci=n mane4o +e #*$s en )as acciones es insuficienteF
X >a)tan =r+enes5 2or e4em2)o 2ara +u2)icar o 6uscar #*$s"
X 7o se contem2)a )a creaci=n automati%a+a +e #*$s !etero-neos
X *i en una re-)a se est. crean+o un #*$5 es com2)ica+o cam6iar )a ca6e%a +e +ic!o #*$
88
"
9ero sin +u+a )o que m.s im2acta en )a usa6i)i+a+ es )a im2osi6i)i+a+ +e acce+er a un !i4o
concreto +e) #*$5 +e manera que !a que DiterarE 2or )os !i4os !asta ))e-ar a) no+o +esea+o" 9or
e4em2)o5 su2on-amos )a si-uiente re-)a +e un ana)i%a+or sem.nticoF
arbol: #(ARBOL IDENT (TRATAMIENTO IDENT)? IDENT )
*u2on-amos que +e6emos tratar en una accin un #*$ que satisfa-a )a re-)a ar6o)"
7orma)mente 2o+remos reconocer e) #*$ con )a 2ro2ia re-)a acce+er a )os no+os uti)i%an+o
etiquetasF
arbol: #(ARBOL nombre:IDENT (TRATAMIENTO tratamiento:IDENT)? apellido:IDENT )
{
String trat;
if(tratamiento==null) trat = ;
else trat = tratamiento.getText()+ ;
System.out.println ( trat + nombre.getText() + apellido.getText() );
}
#!ora 6ien5 su2on-amos que queremos tra6a4ar con e) #*$ &uera del anali-ador5 es +ecir5 en
una c)ase +e 4a0a norma) corriente"
Entonces )a cosa se com2)ica@ +e6emos Diterar manua)mente 2or )os !i4osE 2ara o6tener )os
+iferentes +atos que necesitamosF
public void trataArbol(AST ast)
{
AST nombre = ast.getFirstChild();
AST hermano = nombre.getNextSibling();
String trat=;
AST apellido = hermano;
if(hermano.getType()==TRATAMIENTO)
{
trat = hermano.getText() + ;
apellido = hermano.getNextSibling();
}
System.out.println ( trat + nombre.getText() + apellido.getText() );
}
3a estrate-ia +e Dcrear un nue0o #*$E en )u-ar +e Dmo+ificar e) #*$ e:istenteE no me 2arece
acerta+a@ +e6era !a6er m.s ser0icios +e mo+ificaci=n +e) #*$ actua)5 2rimar stos 2or encima
+e )os +e creaci=n +e uno nue0o"
88 9orque se +esconoce e) 2a+re +e) #*$@ es necesario 2asar)o como 2ar.metro o -uar+ar)o como atri6uto en e) ana)i%a+or"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )21
%aptulo <6 %onclusiones 1ecci(n <.)6 ANTLR y el anlisis semntico
$am2oco se au+a muc!o a) 2ro-rama+or en )o referente a #*$s !etero-neos@ su creaci=n
+e6era automati%arse"
1.".+: &onclusi%n
$o+os )os 2ro6)emas encontra+os en e) ni0e) sint.ctico +e #7$38 (+ificu)ta+ +e mane4o5 fa)ta +e
eficiencia) 2ro0ienen +e) mismo sitioF )a 2ecu)iar arquitectura +e )os #*$s" 3a estructura Dun
no+o U un 2rimer !i4o un !ermanoE5 es5 en mi o2ini=n D+emasia+o f)e:i6)eE"
En )a si-uiente secci=n ana)i%aremos c=mo 2o+ran so)ucionarse"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )22
%aptulo <6 %onclusiones 1ecci(n <.06 %onclusiones 4inales
Becci%n 1.#: &onclusiones !inales
1.#.1: Bobre A$>LR
#) comen%ar a tra6a4ar con #7$38 2ensa6a que )as 2rinci2a)es +ificu)ta+es que ten+ra seran
+eri0a+as +e im2)ementar un ana)i%a+or ):ico con un aut=mata recursi0o +escen+ente" B.s
tar+e constat que )a maora +e )as +ificu)ta+es que 2ue+en 2resentarse +urante e) an.)isis ):ico
se reso)0an 6astante 6ien con )as Dau+asE que #7$38 2ro2orciona en e) an.)isis ):icoF re-)as
EG7>5 tratamiento +e )itera)es5 tratamiento +e ma?scu)as min?scu)as5 ran-os +e caracteres"""
,nc)uso su2era6a a f)e: en a)-unos as2ectos5 como )a com2ati6i)i+a+ con /nico+e )a 2osi6i)i+a+
+e -enerar c=+i-o 2ara 0arios )en-ua4es"
E) an.)isis sint.ctico5 2or su 2arte5 resu)t= mu c=mo+oF !a6ien+o com2ren+i+o e) fun+amento +e
2re+A33(H) +urante e) an.)isis ):ico5 resu)t= mu senci))o a+a2tarse a )os f)u4os +e toHens"
3a recu2eraci=n +e errores5 2or su 2arte5 fue un 2oco m.s com2)ica+a +e com2ren+er" Cuan+o
uno !a tra6a4a+o con Gison5 a+a2tarse a que Dso)amente se 2ue+e reconocer una re-)a ca+a 0e%E
es com2)ica+o" >ina)mente +omin )a recu2eraci=n +e errores con un enfoque 2r.cticoF
o6ser0an+o )os cam6ios que se 2ro+ucan en e) c=+i-o -enera+o5 a )a sa%=n 6astante inte)i-i6)e"
#2ren+er a crear e) #*$ fue a2ro:ima+amente tan com2)ica+o como im2)ementar )a
recu2eraci=n +e errores@ +es2us !u6o que implementar )a creaci=n +e) #*$5 con )o que
2o+emos conc)uir que )a maor 2arte +e) tiem2o +e +esarro))o con #7$38 se em2)ea en )a
creaci=n mane4o +e) #*$"
1.#.2: Bobre el manejo de los AB>s
E) mane4o +e )os #*$s es sin +u+a )a tarea 2en+iente 2ara $erence 9arr comaCa" 1a )a
im2resi=n +e que en un 2rimer momento no 0a)orar= suficientemente )a necesi+a+ +e Dcrear
transformarE )os #*$s5 en o2osici=n a Drecorrer)osE" #s5 2ara im2)ementar e) ni0e) sem.ntico5
#7$38 se 6asa en iteradores de #r"oles (su6c)ases +e TreeParser) 2ero se ec!an en fa)ta
creadores de #r"oles (OTreeCreatorQ) modi&icadores de #r"oles (OTreeModifierQ)"
3as ?nicas au+as que #7$38 2ro2orciona a) 2ro-rama+or son )os D2atrones +e creaci=n
mo+ificaci=nE (eST5 ee5 etc) que resu)tan insuficientes" #+em.s5 a) estar me%c)a+os con )as
acciones5 tien+en a +isminuir )a 2orta6i)i+a+ +e )os ana)i%a+ores (2orque sue)en a2arecer
me%c)a+os con instrucciones +e c=+i-o nati0o)"
9or ?)timo5 2o+er acce+er autom.ticamente a )os !i4os +e ca+a #*$ uti)i%an+o su nom6re es una
necesi+a+ 6.sica que #7$38 no cum2)e" 3a estructura (no+oA!i4oA!ermano)5 aunque mu
f)e:i6)e5 no )a 2ermite"
1.#.3: Bobre la e!iciencia
/na 0e% esta6)eci+o que e) 2rinci2a) 2ro6)ema +e #7$38 es e) 2o6re mane4o +e )os #*$s5
ana)icemos e) se-un+o 2ro6)emaF )a eficiencia"
/no +e )os 2rinci2a)es ar-umentos en contra +e )os ana)i%a+ores recursi0os +escen+entes es que
Dso)amente son ?ti)es 2orque son mu f.ci)es +e im2)ementar5 e) c=+i-o es m.s inte)i-i6)eE" *u
eficiencia5 com2ara+a con )os ana)i%a+ores 6asa+os en ta6)as5 es como muc!o me+iocre"
3os ana)i%a+ores recursi0os +escen+entes no son )a ?nica o2ci=n a )a !ora +e im2)ementar )a
estrate-ia 33 +e an.)isis" E:isten otras so)uciones 6asa+as en ta6)as5 en )as que no !a que 2a-ar
e) Dso6re2esoE +e )as in0ocaciones +e mto+os"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )2-
%aptulo <6 %onclusiones 1ecci(n <.06 %onclusiones 4inales
O9or qu5 entonces5 se !an uti)i%a+o )os ana)i%a+ores recursi0os +escententesQ O*im2)emente
2orque son m.s f.ci)es +e im2)ementarQ O9orque e) c=+i-o es m.s inte)i-i6)eQ
8otun+amente no"
#7$38 uti)i%a ana)i%a+ores recursi0os +escen+entes 2ara tratar +e una forma estan+ari%a+a )os
errores"
En )os )en-ua4es a0an%a+os5 como 4a0a o Ce ( en menor me+i+a C++) cuan+o !a un error e)
com2ortamiento estan+ari%a+o es )an%ar una e:ce2ci=n" 9ara mane4ar )a e:ce2ci=n se uti)i%an
c).usu)as trAcatc!" *i no )as !a5 se sa)e +e) mto+o en e) que se 2ro+uce )a e:ce2ci=n"
*e 2resenta6an 0arias o2ciones 2ara mane4ar )os errores en #7$38F
X 7o uti)i%ar e:ce2ciones" /ti)i%ar un mto+o +e mane4o +e errores D2ro2ioE5 como !ace 6ison"
X /ti)i%ar )as e:ce2ciones5 2ero no uti)i%ar aut=matas recursi0os +escen+entes"
X /sar )a com6inaci=n aut=mata recursi0o +escen+ente+e:ce2ciones (sta fue )a o2ci=n e)e-i+a)
3a 2rimera o2ci=n (no uti)i%ar e:ce2ciones) 2ue+e re+un+ar en un ana)i%a+or m.s r.2i+o" *in
em6ar-o se 2ier+e muc!a 2otencia" Con )as e:ce2ciones5 e) usuario 2ue+e contro)ar con muc!a
e:actitu+ c=mo cu.n+o -estionar )os errores" #+em.s5 e) usuario +e #7$38 2ue+e inc)uir
nue0os errores (!acien+o su6c)ases +e )as e:ce2ciones +e #7$38) )an%ar)as +es+e cua)quier
c)ase@ )os ana)i%a+ores +e #7$38 2o+r.n tra6a4ar con estos nue0os errores f.ci)mente"
7o uti)i%ar aut=matas recursi0os +escen+entes 2)antea )a si-uiente 2re-untaF O+=n+e co)ocar )as
c).usu)a try/catch 2ara recu2erar )as e:ce2cionesQ /na o2ci=n sera co)ocar una c).usu)a trA
catc! en ca+a e)emento +e una re-)a (a) !acer un matc% +e ca+a car.cter5 toHen o no+o #*$)"
*in em6ar-o esto sera tremen+amente ineficiente5 2o+ra no ser )o m.s a+ecua+o en to+os )os
casos (se intentara recu2erar )a entra+a +emasia+o 2ronto)" $am6in 2o+ra 2onerse un ?nico
6)oque tr^catc! a)re+e+or +e to+o e) ana)i%a+or@ 2ero entonces con to+a se-uri+a+ )a
recu2eraci=n sera infructuosa"
Es m.s a+ecua+o tener un 6)oque tr^catc! 2or re-)a" Esto ofrece una -ranu)ari+a+ D6uenaE5 que
no ca2tura )os errores D+emasia+o 2ronto ni +emasia+o tar+eE5 con una eficiencia a+ecua+a"
9ero ))e-a+os a este 2unto es tan eficiente tener Dto+as )as re-)as en un so)o mto+o5 con un
tr^catc! 2or re-)aE como tener Duna re-)a en ca+a mto+o5 con un tr^catc! 2or mto+oEA
mane4ar )os 6)oques tr^catc! se !ara tan com2)ica+o que com2ensa uti)i%ar mto+os se2ara+os"
#+em.s5 con )a so)uci=n actua) es mu senci))o eficiente 2asar 2ar.metros a una re-)a
recu2erar 0a)ores que )a re-)a arro4e"
1ic!o esto5 !a6r. ocasiones en )as que e) usuario no 2recise +e un 2rofun+o contro) +e )as
e:ce2ciones5 no +esee 2asar o recu2erar 0a)ores +e una re-)a" En estos casos e) usuario +e6era
2o+er es2ecificar que no +esea un mto+o 2ara +ic!as re-)as"
9or e4em2)o5 en e) ana)i%a+or ):ico +e 3e3i )as re-)as LETRA DIGITO son re-)as au:i)iares5
escritas sim2)emente 2ara me4orar )a )e-i6i)i+a+ +e) ana)i%a+or" 1e cara a )a im2)ementaci=n5 sin
em6ar-o5 no a2ortan na+a@ sera +esea6)e que #7$38 +is2usiera +e una 2a)a6ra reser0a+a como
inline que !iciera que e) si-uiente c=+i-oF
inline LETRA: (A..Z)|(a..z);
inline DIGITO: (0..9);
IDENT: (LETRA|DIGITO|'_')(LETRA|DIGITO|'_')* ;
*e transformase en ste otro antes +e -enerar e) ana)i%a+orF
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )2)
%aptulo <6 %onclusiones 1ecci(n <.06 %onclusiones 4inales
IDENT: (((A..Z)|(a..z))|(0..9)|'_')(((A..Z)|(a..z))|(0..9)|'_')* ;
Pue es m.s eficiente equi0a)ente en trminos +e entra+as reconoci+as errores recu2era6)es"
1.#.": Bobre el !uturo de A$>LR
En )a 2.-ina <e6 +e ant)r (2ttp6IIDDD.antlr.org)5 recientemente remo+e)a+a5 !a 0arios
artcu)os so6re )as +iscusiones +e) equi2o +esarro))a+or +e #7$38 so6re e) futuro +e )a
!erramienta"
/no +e e))os es e) resu)ta+o +e una +iscusi=n so6re e) futuro +e #7$38 que tu0o )u-ar entre
3orin- Craimer5 Bont WuHo<sHi $erence 9arr entre )os +as 1' 14 +e Ju)io +e '003 (e)
en)ace es 2ttp6IIDDD.antlr.orgIDor7s2opIca+alK2-)" En esta +iscusi=n se +eci+ieron a)-unas
ca2aci+a+e que )a nue0a 0ersi=n +e #7$38 (3"0) ten+r."
9ara em2e%ar5 unas acciones es2ecia)es ser0ir.n 2ara mo+ificar e) #*$" 1ic!as acciones ir.n
+entro +e )os sm6o)os efg en )u-ar +e en )as acciones (que 0an +e)imita+as con ))a0es5 fg)"
Este cdigo est# copiado de las notas o&recidas como resultado del $or+s%op de 4ulio 2::( Dver enlace m#s arri"aE
#{ accin de rbol }
#{ #(a b c) } // Construccin del rbol
#[...] // Construccin de un nodo
#{ {pred1}? #(a b c) // aplicar solamente si pred1 es cierto
| {pred2}? #(b a c)
| #(c b a)
}
*****
9ara m.s +eta))es cons?)tese e) en)ace mostra+o m.s arri6a"
,nc)uen+o estas nue0as acciones en )os ana)i%a+ores sint.cticos sem.nticos se refuer%a e)
as2ecto D+e creaci=n mo+ificaci=nE +e )os #*$s"
9arece que )os #*$s se-uir.n sin 2o+er referenciar a )os !i4os +e un no+o con su nom6re fuera
+e )os ana)i%a+ores"
En cuanto a )a eficiencia5 en e) +ocumento a2arecen 0arias referencias a 2o+er !acer re-)as
inline"
E) +esarro))o +e #7$38 sue)e ser 6astante )ento@ es 2ro6a6)e que )a 0ersi=n 3"0 a2are%ca en )os
2r=:imos +os aCos"
1.#.#: <Ferece la 'ena A$>LR?
L*N
# 2esar +e )as carencias5 e) 6a)ance tota) es mu 2ositi0o" E) c=+i-o que -enera5 aunque no es e)
m.s r.2i+o5 es mu ro6usto com2rensi6)e" Es una so)uci=n m.s a0an%a+a que e) 6inomio
6ison+f)e: (2ermite crear recorrer #*$s)"
Pui%.s que+a un 2oco atr.s en e) a2arta+o +e )a eficiencia" Conforme aumente )a 0e)oci+a+ +e )os
2rocesa+ores esta +iferencia se ir. !acien+o ca+a 0e% m.s 2equeCa5 2ero en a)-unos casos en )os
que se necesite 2rocesar r.2i+amente una canti+a+ a)ta +e +atos 2o+ra resu)tar insuficiente"
En e) .m6ito aca+mico5 sin +u+a #7$38 es mu a+ecua+oF su senci))e% faci)ita e) a2ren+i%a4e"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )20
%aptulo <6 %onclusiones 1ecci(n <.06 %onclusiones 4inales
1.#.+: 5inal
J con esto !emos ))e-a+o a) fina) +e) +ocumento" Es2ero que e) )ector encuentre tanto 2)acer
)en+o)o como )o !i%o e) autor escri6in+o)o" *i au+a a) menos a una 2ersona a com2ren+er
me4or )os com2i)a+ores me +ar 2or satisfec!o"
L#!N #7$38 si-nifica /Aot%er 1ool &or Language ?ecognition (;tra Ierramienta 2ara e)
8econocimiento +e 3en-ua4es)"
Gracias 2or su atenci=n"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )2,
Ap$ndice A6 Re4erencias
Apndice A: Referencias
So7re A&'$(
X En )a 2.-ina oficia) +e #7$385 2ttp6IIDDD.antlr.org5 !a a6un+ante +ocumentaci=n"
X 9ara una informaci=n m.s +irecta5 se 2ue+e uti)i%ar )a )ista +e correo +e #7$38" Es un
ser0icio ofreci+o 2or Ja!oo -rou2sF 2ttp6IIDDD.ya2oogroups.comIgroupsIantlrKinterest"
X #+em.s !a un >#P +e #7$38F 2ttp6IIDDD.5guru.comI4a"IANTLR
X J un foroF 2ttp6IIDDD.5guru.comI4orumsI2ome.5spRtopicSANTLR
So7re A&'$(AEU
X 3a 2.-ina oficia) +e ant)rau:F 2ttp6IIantlrau8.source4orge.net
X E0entua)mente 2ue+e !a6er informaci=n a+iciona) en mi 2.-ina 2ersona)F
2ttp6IIimaginatica.us.esIJenri"ue
So7re compiladores
X DE) )i6ro +e) +ra-=nE" %ompiladores. 3rincipiosT T$cnicas y Gerramientas" #"R" #!o5 8"
*et!i5 J"1" /))man"
X E) -ru2o +e noticias comp.compilersF 2ttp6IIcompilers.iecc.com
X C"7" >isc!er5 8"J" 3e6)anc" %ra4ting a %ompiler Dit2 %5 Gen4amin^Cummin-s 9u6)is!in-
Com2an5 ,nc" 8e+<oo+ Cit5 Ca)ifornia5 1991"
X #"," Io)u65 %ompiler ?esign in %5 9renticeAIa))5 ,nc" En-)e<oo+ C)iffs5 7e< Jerse5 1990"
X G"\" Merni-!an5 9"J" 9)au-er5 1o4tDare Tools in 3ascal5 #++isonA\es)e 9u6)is!in-
Com2an5 8ea+in-5 Bassac!usetts5 1981"
X G" Beer5 ,ntro+uction to t!e T2eory o4 3rogramming Languages5 9renticeAIa))
,nternationa) *eries in Com2uter
X 8" *et!i5 Lengua5es de programaci(n. %onceptos y constructores5 #++isonA\es)e
,6eroamericana5 \i)min-ton5 1e)a<are5 199'"
X J"9" $rem6)a5 9"G" *orenson5 T2e T2eory and 3ractice o4 %ompiler Eriting5 BcGra<AIi))
,nternationa) E+itions5 198&"
X 1"#" \att5 3rogramming Language 3rocessors5 9renticeAIa)) ,nternationa) *eries in
Com2uter *cience5 1993"
4tros
X 3a 2.-ina oficia) +e 4a0aF 2ttp6II5ava.sun.com
X 3a 2)ataforma ec)i2se +e +esarro))o 4a0aF 2ttp6IIDDD.eclipse.org
X E) mo+o #7$38 2ara )a 2)ataforma ec)i2seF 2ttp6IIantlreclipse.source4orge.net
X E) e+itor EmacsF 2ttp6IIDDD.gnu.orgIso4tDareIemacsIemacs.2tml"
X E) e+itor XemacsF 2ttp6IIDDD.8emacs.org"
X E) mo+o #7$38 2ara Emacs XemacsF 2ttp6IIantlrKmode.source4orge.net"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )27
Ap$ndice >6 Glosario
Apndice B: Glosario
A.
X A?TT 1istemaF 0istema Hm"ito=Declaracin=1ipo" Es un con4unto +e conce2tos re-)as 2ara
mo+e)ar e) com2ortamiento conte:tua) +e )os )en-ua4es +e 2ro-ramaci=n"
X AlgoritmoF una )ista +e instrucciones +on+e se es2ecifica una sucesi=n +e o2eraciones
necesarias 2ara reso)0er cua)quier 2ro6)ema +e un ti2o +a+o"
X @m+itoF Es una a6stracci=n que sir0e 2ara re2resentar or-ani%ar )a 4erarqua +e
+ec)araciones +e un )en-ua4e +e 2ro-ramaci=n" 7orma)mente )os .m6itos se or-ani%an
Dani+a+amenteE (un .m6ito est. +entro +e otro5 as sucesi0amente !asta ))e-ar a) .m6ito
ra%)" 3os .m6itos 2ermiten -estionar ciertos as2ectos sem.nticos +e )os )en-ua4es +e
2ro-ramaci=n5 como )a 0i+a +e )as 0aria6)es o e) enmascaramiento +e nom6res"
X Anlisis l$8icoF 9roceso +e an.)isis se-?n e) cua) un con4unto (f)u4o) +e caracteres5
-enera)mente suministra+os 2or me+io +e un fic!ero +e te:to5 se transforma en un f)u4o +e
toHens" 3a !erramienta que rea)i%a un an.)isis ):ico es e) ana)i%a+or ):ico" 9or e4em2)o5
cuan+o un ana)i%a+or encuentra una serie +e caracteres como staF
int 2;
funcin foo() {}
E) ana)i%a+or )a transforma en a)-o como )o si-uienteF
RES_INT NUMERO PUNTO_COMA
RES_FUNCION IDENT PARENT_IZQ PARENT_CER LLAVE_AB LLAVE_CER
1on+e ca+a una +e )as 2a)a6ras en ma?scu)as escritas es un toHen" 7=tese que un ana)i%a+or
):ico es ca2a% +e D0erE )os sa)tos +e )nea )os es2acios5 2ero 2or )o -enera) stos se Di-noranE"
X Anlisis sintcticoF 9roceso +e an.)isis se-?n e) cua) un con4unto (f)u4o) +e toHens se a-ru2a
si-uien+o una serie +e re-)as -ramatica)es" 7orma)mente e) f)u4o +e toHens ana)i%a+os 2ro0iene
+e un an.)isis ):ico 2re0io" 3as funciones +e) an.)isis sint.ctico son 'F encontrar errores en e)
f)u4o suministra+o 5 si no )os !a5 -enerar un Zr6o) +e *inta:is #6stracta (#*$)" 3a
!erramienta que rea)i%a e) an.)isis sint.ctico es e) ana)i%a+or sint.ctico" /na ana)o-a usua) que
se !ace con e) )en-ua4e natura) es que e) an.)isis ):ico Dtransforma )as 2a)a6ras en frasesE"
X Anlisis semnticoF 9roceso +e an.)isis se-?n e) cua) un Zr6o) +e *inta:is #6stracta se
transforma en otra cosa5 2u+ien+o ser esta ?)tima otro Zr6o) +e *inta:is #6stracta"
X Anali:ador recursivo descendenteF )os ana)i%a+ores recursi0os +escen+entes son un con4unto
+e mto+os mutuamente recursi0os (que se ))aman unos a otros) que norma)mente uti)i%an un
so)o sm6o)o +e loo+a%ead (una so)a 0aria6)e) 2ara tomar )as +ecisiones +e an.)isis"
X Anali:erF $rmino in-)s uti)i%a+o 2ara refererirse a )os ana)i%a+ores sint.cticos"
X @r+ol de 1inta8is A+stractaF Es una forma +e re2resentaci=n +e )a informaci=n conteni+a en
un fic!ero +e c=+i-o" Genera)mente es e) 2ro+ucto +e un an.)isis sint.ctico o sem.ntico"
X A1%&&F Con4unto +e '&6 caracteres a) que se )imita6an )os 2rimeros )en-ua4es +e
2ro-ramaci=n" ,nc)ue 2rinci2a)mente )os caracteres uti)i%a+os 2or )a )en-ua in-)esa a)-unos
sm6o)os es2ecia)es"
X A1TF /"stract 0!ntax 1ree5 Zr6o) +e *inta:is #6stracta"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )2/
Ap$ndice >6 Glosario
X A1T 2eterog$neoF #*$ cuos no+os no son to+os +e )a misma c)ase"
X A1T 2omog$neoF #*$ con to+os )os no+os +e )a misma c)ase"
X A1T degeneradoF Es un #*$ que no tiene un so)o no+o como ra%" 9ue+e consi+erarse que
no tiene ra%5 o que tiene 0arias (e:ce2to cuan+o es un #*$ 0aco)"
X A1T vacoF #*$ sin no+os"
X Atri+utoF 3as c)ases son ti2os com2uestos5 es +ecir5 contienen 0arios D+atosE" Estas D+atosE
son )os atri6utos +e )as c)ases"
B.
T >asuraF Es un se-mento ocu2a+o +e) montcu)o que no es referencia+o 2or nin-?n o64eto +e
)a memoria@ e) se-mento +e6e ser )i6era+o"
".
X %ierre de QleeneF /no +e )os mo+ifica+ores +e) )en-ua4e EG7>" 8e2resenta Dcero o m.s
e)ementosE se re2resenta con e) asterisco (DYE)"
X %laseF Es )a uni+a+ 6.sica +e informaci=n en un )en-ua4e orienta+o a o64etos" /na c)ase consta
+e mto+os atri6utos" 3as c)ases son +efiniciones +e ti2os +e +atos5 como ta)es 2ue+en ser
instancia+as en 0aria6)es"
T %LA113ATGF Raria6)e +e) sistema que in+ica a )a JRB +=n+e 6uscar )os fic!eros Y"c)ass
necesarios 2ara )a e4ecuci=n +e 2ro-ramas 4a0a"
X %lausura 3ositivaF Es uno +e )os mo+ifica+ores +e) )en-ua4e EG7>5 que sir0e 2ara
re2resentar Duno o m.s e)ementosE" *e re2resenta con e) si-no D+E"
X %(digo m"uinaF C=+i-o com2rensi6)e 2or una m.quina en formato 6inario (forma+os 2or
ceros unos)" E) c=+i-o m.quina es incom2rensi6)e 2ara )as 2ersonas (e:ce2to 2ara unas
cuantas raras e:ce2ciones)" 3os com2i)a+ores se encar-an +e transformar fic!eros en un
)en-ua4e +e 2ro-ramaci=n5 com2rensi6)e 2or )os !umanos5 en c=+i-o m.quina5 com2rensi6)e
2or )as m.quinas" 3os fic!eros en c=+i-o m.quina 2ue+en ser +e tres ti2osF fic!eros e4ecuta6)es
()os m.s usua)es)5 como son )os arc!i0os Y"EXE +e \in+o<s5 )i6reras (fic!eros en c=+i-o
m.quina que contienen funciones que )os fic!eros e4ecuta6)es uti)i%an) fic!eros 2ara
m.quinas 0irtua)es"
T %(digo intermedioF Es una forma +e re2resentaci=n interme+ia entre e) an.)isis sem.ntico )a
-eneraci=n +e c=+i-o" >aci)ita )as o2timi%aciones su reuti)i%aci=n +e un com2i)a+or a otro"
$am6in !ace a) com2i)a+or in+e2en+iente +e )a m.quina o64eti0o"
X %ompilaci(n cru:adaF Es un ti2o +e com2i)aci=n se-?n )a cua) una m.quina X com2i)a un
c=+i-o fuente 2ro+ucien+o un c=+i-o m.quina 2ara otra m.quina +iferente J" # J se )e ))ama
Dm.quina o64eti0oE"
X %ompiladorF 9ro-rama ca2a% +e -enerar fic!eros en c=+i-o m.quina )i6reras a 2artir +e
fic!eros +e te:to escritos en un )en-ua4e +e 2ro-ramaci=n com2i)a+o"
X %onstructorF Bto+o es2ecia) +e una c)ase que sir0e 2ara iniciar )os atri6utos +e sus
instancias antes +e 2o+er usar)as"
:.
X ?eclaraci(nF /na +ec)araci=n es5 6.sicamente5 una asociaci=n entre un nom6re un ti2o" 3as
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )2<
Ap$ndice >6 Glosario
+ec)araciones se or-ani%an en .m6itos" #s5 cuan+o +ec)aramos )a 0aria6)e +e ti2o Entero
))ama+a DBano)oE en e) mto+o DBE5 estamos insertan+o en e) .m6ito +e) mto+o DBE una
+ec)araci=n que re)aciona e) nom6re DBano)oE e) ti2o DEnteroE"
X ?eclarationF Rase +ec)araci=n"
T ?espla:amientoF 1istancia entre e) comien%o +e un +ato en memoria su DreferenciaE"
X ?.AF Deterministic )inite /ut%omata5 o #ut=mata >inito 1eterminista" Es e) a)-oritmo que se
uti)i%a 2ara rea)i%a e) an.)isis ):ico en muc!as !erramientas5 como f)e:" Est. 6asa+o en un
aut=mata forma+o 2or esta+os transiciones5 ?nicamente"
+.
X !>N.F En%anced BA). Es una 0ersi=n e:ten+i+a +e G7>5 que 2ermite uti)i%ar cierres +e
M)eene c)ausuras 2ositi0as5 entre otras"
X !nla:adorF Es un soft<are encar-a+o +e com6inar 0arios fic!eros 6inarios (usua)mente
)i6reras) 2ara -enerar otro fic!ero 6inario5 a sea una )i6rera o un e4ecuta6)e"
T !K'alueF #tri6uto que -uar+a e) 0a)or +e una e:2resi=n" En ciertas ocasiones se uti)i%a 2ara
2reAca)cu)ar e) 0a)or +e ciertas e:2resiones en tiem2o +e com2i)aci=n5 aunque esto no es
siem2re 2osi6)e" 3as e:2resiones sin EARa)ue tienen e) atri6uto EARa)ue a nu))" 3as que s )o
tienen 2ue+en tener una ca+ena5 entero5 etc" 9or e4em2)o5 e) EARa)ue +e )a e:2resi=n 1+'+3 es
e) entero D6E5 mientras que )a e:2resi=n a+6 no 2ue+e ser ca)cu)a+a en tiem2o +e com2i)aci=n5
2or )o que tiene un EARa)ue +e nu))"
,.
T .&LAF )irst InB Last 3ut" Cate-ora +e o64eto Dcontene+orE (que sir0e 2ara -uar+ar otros
o64etos) en )a que e) 2rimer o64eto que se inserta ser. e) ?)timo en sa)ir" /n e4em2)o +e o64eto
>,3; es )a 9i)a (no confun+ir con )a %ona +e memoria)"
T .&.AF )irst InB )irst 3ut" Cate-ora +e o64eto Dcontene+orE (que sir0e 2ara -uar+ar otros
o64etos) en )a que e) 2rimer o64eto que se inserta ser. e) 2rimero en sa)ir" /n e4em2)o +e o64eto
>,>; es )a Co)a"
B.
X GN*F NA is Aot /ni:" Es un acr=nimo recursi0o" Esta a-ru2aci=n +e 2ersonas es una +e )as
2rinci2a)es im2u)soras +e) soft<are )i6re D&ree so&t$areE" 9ara m.s informaci=n 0isite
2ttp6IIDDD.gnu.org"
X GramticaF Con4unto +e re-)as que +efinen un )en-ua4e"
=.
T Gerencia de gramticasF Es un mecanismo +e #7$38 que 2ermite a2ro0ec!ar )as re-)as +e
una -ram.tica en otra5 sin tener que 0o)0er a escri6ir)as" Be4ora )a enca2su)aci=n"
T Gola mundoF Es e) 2rimer 2ro-rama que sue)e escri6irse cuan+o se est. a2ren+ien+o a
2ro-ramar en un nue0o )en-ua4e" *e )imita a im2rimir en )a 2anta))a +e) or+ena+or un mensa4e
cua)quiera5 que sue)e ser DIo)a mun+oE"
I.
X &?!F Integrated Developping Environment" Es una !erramienta que 2ermite actuar con una
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )-
Ap$ndice >6 Glosario
!erramienta +e +esarro))o (2or )o -enera)5 un intr2rete) +e manera D-r.ficaE5 es +ecir5 con
men?s +es2)e-a6)es5 6otones5 etc" 3as ,1Es e0itan a )os 2ro-rama+ores e) tener que uti)i%ar
+iferentes 2ro-ramas 2ara +esarro))ar soft<are5 as como e) uso +e conso)as +e coman+os"
X &nter4a: 95ava;F Es una +e )as 2restaciones +e) )en-ua4e 4a0a5 que consiste en un con4unto +e
atri6utos mto+os" 3a +iferencia entre un o64eto una interfa% es que )os mto+os +e esta
?)tima no tienen cuer2o5 como nin-?n o64eto 2ue+e tener ste ti2o +e mto+os )as interfaces
no son instancia6)es" 9ara que )o sean es necesario que un o64eto )as implemente"
X &nt$rpreteF Es una !erramienta que 2ermite tratar una informaci=n co+ifica+a en un
+etermina+o )en-ua4e5 Dcom2ren+in+o)aE5 2ara o6tener un resu)ta+o" /n e4em2)o +e intr2rete
es un com2i)a+or"
X &nstanciaci(n de un tipoF Becanismo me+iante e) cua) se crea una 0aria6)e +e +ic!o ti2o"
X &nstrucci(nF /ni+a+ mnima +e es2ecificaci=n +e 2rocesos en un )en-ua4e +e 2ro-ramaci=n
orienta+o a o64etos" 3as instrucciones forman 2arte +e) cuer2o +e )os mto+os" 3os ti2os +e
instrucciones +iferentes son )as asi-naciones )as instrucciones +e contro)" 3as instrucciones
+e contro) cam6ian e) or+en +e e4ecuci=n +e) resto +e )as instrucciones5 que norma)mente es
secuencia)"
F.
X #avaF E) trmino 4a0a se usa 2ara +escri6ir )a 2)ataforma +e +esarro))o em6)em.tica +e *un
Bicrosstems5 consistente en una m.quina 0irtua) un con4unto +e )i6reras5 2ara +enominar
e) )en-ua4e +e 2ro-ramaci=n que se usa en +ic!a 2)ataforma"
X #'CF Sava Mirtual @ac%ine" 3a m.quina 0irtua) +e 4a0a"
V.
X HF Es )a )etra que se uti)i%a 2ara +enominar e) loo+a%ead en un com2i)a+or"
$.
X Lengua5eF Es un con4unto +e sm6o)os re-)as que sir0e 2ara re2resentar informaci=n" 3os
)en-ua4es que tratamos en este +ocumento son )en-ua4es +e 2ro-ramaci=n5 es +ecir5 )en-ua4es
que sir0en 2ara +efinir a)-oritmos"
X Lengua5e compiladoF Es un )en-ua4e +e 2ro-ramaci=n cuo fin es ser com2i)a+o 2or un
com2i)a+or 2ara o6tener uno o 0arios fic!eros en c=+i-o m.quina"
X Le8erF #6re0iatura +e Lexical /nali-er5 o ana)i%a+or ):ico"
X Lin7erF Rase en)a%a+or"
X Loo7a2eadF 1a+o un a)-oritmo +e an.)isis a2)ica+o so6re un f)u4o +e sm6o)os5 e) )ooHa!ea+
+e +ic!o a)-oritmo es e) n?mero +e sm6o)os +e) f)u4o que +ic!o a)-oritmo Dtiene en cuentaE
antes +e a2)icar una re-)a a) f)u4o" /na i+ea intuiti0a +e) )ooHa!ea+ sera )a D)on-itu+ +e 0isi=nE
+e) a)-oritmoF mientras m.s sm6o)os D0eE5 m.s )ooHa!ea+ tiene"
X LR97;F Es un a)-oritmo +e an.)isis +e +atos D+e a6a4o a arri6aE5 con un )ooHa!ea+ H" B.s
informaci=n en e) 2rimer ca2tu)o"
X LL97;F Es un a)-oritmo +e an.)isis +e +atos D+e arri6a a a6a4oE5 con )ooHa!ea+ H" B.s
informaci=n en e) 2rimer ca2tu)o"
X LKvalueF #tri6uto 6oo)eano +e cua)quier e:2resi=n +e un )en-ua4e" /na e:2resi=n con 3A0a)ue
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )-1
Ap$ndice >6 Glosario
2ue+e ser uti)i%a+a en )a 2arte i%quier+a +e una asi-naci=n (2ue+e asi-n.rse)e un nue0o 0a)or)"
/n e4em2)o +e e:2resi=n con 3A0a)ue sera un acceso sim2)e a una 0aria6)e no constanteF a=2;
una e:2resi=n sin 3A0a)ue sera un acceso a un )itera)F Hola=Adis@ no es 0.)i+o en )a
maora +e )os )en-ua4es"
/.
X C"uinaF 9ara nosotros5 una m.quina es cua)quier mecanismo que 2ermita e4ecutar )as
acciones co+ifica+as en e) c=+i-o -enera+o 2or un com2i)a+or"
X C"uina clsicaF B.quina forma+a 2or memoria5 2rocesa+or5 6uses (mu frecuentemente)
re-istros"
X C"uina o+5etivoF Es )a m.quina 2ara )a cua) se com2i)a un c=+i-o fuente" En )a com2i)aci=n
cru%a+a5 una m.quina com2i)a un c=+i-o 2ara que sea e4ecuta+o 2or una tercera m.quina5 que
se +enomina Do64eti0oE"
X C"uina virtualF Es un 2ro-rama que funciona en otra m.quina (que a su 0e% 2ue+e ser
0irtua)) Dsimu)an+oE una m.quina +istinta" Es un Demu)a+orE5 tam6in es )a es2ecificaci=n +e
)a m.quina emu)a+a 2or ese emu)a+or" /n e4em2)o +e m.quina 0irtua) es )a JRB"
X C$todoF 3os mto+os son )as 2artes +e )as c)ases en )as que est.n co+ifica+as )as acciones que
stas 2ue+en rea)i%ar" /n mto+o consta +e una ca6ecera5 en )a que se +efinen sus 2ar.metros
)os 0a)ores que 2ue+e +e0o)0er5 un cuer2o5 en e) que )as acciones a rea)i%ar est.n
co+ifica+as en forma +e instrucciones"
X C$todo no vacoF Es aque) mto+o que +e0ue)0e un 0a)or"
X C$todo vacoF 7o +e0ue)0e nin-?n 0a)or"
T CetaclaseF 3as metac)ases son una forma +e re2resentar mani2u)ar )os ti2os +e un )en-ua4e
+entro +e) 2ro2io c=+i-o +e) )en-ua4e" 1e2en+ien+o +e )as 2restaciones +e) )en-ua4e5 me+iante
e) uso +e metac)ases se 2ue+e +eterminar si una instancia satisface un interfa% +etermina+o5 o si
es una su6c)ase +e otra c)ase +a+a"
X ContculoF E) montcu)o es una %ona +e )a memoria +e )a m.quina o64eti0o +e+ica+a a
contener )as 0aria6)es que no 2ue+en ser -estiona+as 2or )a 2i)a5 es +ecir5 )as 0aria6)es que
+e6en Dso6re0i0irE a )as funciones^mto+os en )as que fueron +ec)ara+as" E) montcu)o se 0a
+i0i+ien+o en Dse-mentosE conforme nue0as 2eticiones +e reser0a +e memoria 0an ))e-an+o"
4.
X A+5etoF E) conce2to +e Do64etoE es e) 2i)ar 6.sico +e un 2ara+i-ma +e )a 2ro-ramaci=n5 )a
D2ro-ramaci=n orienta+a a o64etosE" G.sicamente un o64eto es un con4unto +e informaciones
(atri6utos) que 2resenta a) e:terior unos ser0icios en forma +e interfa% (mto+os)" Esta manera
+e or-ani%ar )a informaci=n en -ru2os con funciona)i+a+es asocia+as incrementa )a
encapsulacin con res2ecto a otros 2ara+i-mas como )a 2ro-ramaci=n funciona)" 3os mto+os
+e )os o64etos 2ue+en com2artirse com6inarse !acien+o uso +e )a %erencia e)
polimor&ismo"
T A44setF Rase +es2)a%amiento"
;.
X 3arserF $rmino in-)s uti)i%a+o 2ara referirse a )os ana)i%a+ores sint.cticos"
X 3ATGF Raria6)e +e) sistema que in+ica en qu +irectorios 2ue+en 6uscarse )os 2ro-ramas
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )-2
Ap$ndice >6 Glosario
accesi6)es +irectamente con su nom6re (2or e4em2)o +ir o format)"
T 3ilaF ,m2ortante %ona +e memoria +e )a m.quina o64eti0o encar-a+a +e +i0ersos menesteres5
ta)es como e) a)o4amiento +e 0aria6)es )oca)es 2ar.metros 2ara funciones^mto+os" $am6in
sir0e 2ara -uar+ar restaurar e) esta+o +e )os re-istros antes +es2us +e ca+a in0ocaci=n +e
una funci=n o mto+o"
X 3redKLL97;F Es e) a)-oritmo +e an.)isis que uti)i%a #7$385 aunque sien+o 2urista !a6ra que
))amar)o 2re+A*33(H)" Enriquece e) a)-oritmo *33(H) con 2re+ica+os sint.cticos sem.nticos"
X 3redicado semnticoF 9re+ica+o que +eci+e )a 0a)i+e% +e una re-)a +e una -ram.tica +e
acuer+o a informaciones +e car.cter sem.ntico"
X 3redicado sintcticoF 9re+ica+o que 2ermite reso)0er inco!erencias entre 0arias a)ternati0as
+e una re-)a +e una -ram.tica entre )as que !a conf)ictos 2or fa)ta +e )ooHa!ea+" 9ermite
incrementar e) )ooHa!ea+ 0irtua)mente !asta e) infinito (2ermite inc)uso reconocer -ram.ticas
noA33(H) 2ara nin-?n H)
X DNIB@N8(re%la)F *ea B e) con4unto +e to+as muestras que satisfacen regla" En ta) caso5 se
+efine PRIMERO(regla) como e) con4unto +e to+os )os sm6o)os inicia)es +e B"
(.
T Recuperaci(n de erroresF 1cese +e )os mecanismos a)-oritmos que a2)ica un com2i)a+or
2ara continuar ana)i%an+o una entra+a tras encontrar un error en +ic!a entra+a"
T Recolector de +asuraF Es un 2roceso o !i)o que se encar-a +e re0isar 2eri=+icamente e)
montcu)o re0isan+o )a 6asura que encuentre (0ase Gasura)"
X RKvalueF #tri6uto 6oo)eano que tienen to+as )as e:2resiones" /na e:2resi=n con 8A0a)ue
2ue+e ser uti)i%a+a en )a 2arte +erec!a +e una asi-naci=n (2orque +e0ue)0e un 0a)or)" /n
e4em2)o +e e:2resi=n con 8A0a)ue es un )itera)F a=I; /na e:2resi=n sin 8A0a)ue es m.s +ifici)
+e encontrar5 2ero !a a)-unas" 9or e4em2)o5 en 3e3i5 )as ))ama+as a mto+os 0acos (que no
+e0ue)0en un 0a)or) no tienen 8A0a)ueF a=Sistema.imprime(Hola)@
S.
X 1cannerF #na)i%a+or ):ico (a6re0iatura +e) in-)s)"
X 1copeF Rase .m6ito"
X 1emntica estticaF Es e) con4unto +e restricciones re-)as sem.nticas que 2ue+en
com2ro6arse +urante )a eta2a +e com2i)aci=n"
X 1LL97;F 0trong LLD+E" Es un a)-oritmo +escrito 2or 2rimera 0e% 2or $erence 9arr en su tesis"
*33(H) es una 0ariante +e) a)-oritmo +e an.)isis 33(H)" *u 2rinci2a) inters ra+ica en que )os
ana)i%a+ores *33(H) no crecen e:2onencia)mente en tiem2o es2acio a) crecer H ()o !acen
)inea)mente)" 3a D2e-aE es que *33(H) es )i-eramente menos 2otente que 33(H)"
X 1o4tDare de c(digo a+iertoF *oft<are cuo c=+i-o fuente +e6e ser +istri6ui+o 4unto a )os
2ro-ramas e4ecuta6)es" 7o confun+ir con soft<are )i6reF mientras que e) soft<are )i6re se 6asa
en un 2)anteamiento fi)os=fico (cua fina)i+a+ es que e) soft<are sea accesi6)e 2ara to+o e)
mun+o5 )i6re +e car-os o 2atentes) e) soft<are +e c=+i-o a6ierto se 6asa en un 2)anteamiento
tcnico (si 2ro2orcionamos e) c=+i-o fuente con )os 6inarios5 e) +esarro))o +e) 2ro+ucto ser.
m.s senci))o eficiente)"
X 1o4tDare li+reF Bo0imiento fi)os=fico que +efien+e e) +erec!o +e )a !umani+a+ a acce+er a)
soft<are +e forma tota) )i6re +e car-os" Este D+erec!o tota) +e accesoE inc)ue )a 2osi6i)i+a+
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )--
Ap$ndice >6 Glosario
+e )eer mo+ificar e) c=+i-o fuente +e )os 2ro-ramas" E) ?nico +erec!o que no tienen )os
usuarios es !acer Dno )i6reE e) soft<are )i6re" 3a or-ani%aci=n mun+ia) m.s im2ortante en e)
terreno +e) soft<are )i6re es )a )ree 0o&t$are )oundation (>*>)"
X 1o4tDare propietarioF #) contrario que en e) soft<are )i6re5 en e) soft<are 2ro2ietario )os
usuarios so)amente +is2onen +e )os fic!eros en c=+i-o m.quina (tam6in ))ama+os Dfic!eros
6inariosE) +e )os 2ro-ramas" /sua)mente e) usuario no tiene nin-?n +erec!o so6re e) soft<are5
sa)0o e) +e e4ecuci=n" En )a actua)i+a+ )a maora +e )as em2resas +e inform.tica 2ro+ucen
uti)i%an soft<are 2ro2ietario5 aunque esta situaci=n cam6ia -ra+ua)mente" 3a com2aCa
+esarro))a+ora +e soft<are 2ro2ietario m.s conoci+a es Bicrosoft"
'.
X TipoF /n ti2o es una Dcate-oraE o una Dc)aseE +e D+atoE +e un )en-ua4e +e 2ro-ramaci=n" 3os
+atos +e un )en-ua4e +e 2ro-ramaci=n son )as +ec)araciones )as e:2resiones" 3os ti2os son e)
2i)ar 6.sico +e) an.)isis sem.ntico5 2orque muc!as +e )as re-)as +e )a sem.ntica +e un )en-ua4e
sue)en !acer referencia a e))os" 1urante )a fase +e an.)isis sem.ntico e) com2i)a+or +e6e
com2ro6ar que )a entra+a suministra+a satisface )as re-)as sem.nticas +e ti2os +e) )en-ua4e"
X To7enF *m6o)o" Es )a 2artcu)a m.s 2equeCa +e informaci=n que mane4a un ana)i%a+or
sint.ctico" *on )os equi0a)entes +e )as D2a)a6rasE +e) )en-ua4e natura)" 3a cua)i+a+ esencia) +e
un toHen es su ti2o (que en #7$38 se re2resenta con un entero)
X To7en imaginarioF $oHen que 4am.s a2arecer. en )as muestras5 2ero se intro+uce en )a
-ram.tica 2or como+i+a+"
X To7en de sincronismoF $oHen que a) ser encontra+o en una entra+a -aranti%a que e)
ana)i%a+or est. en un esta+o reconoci6)e +e) an.)isis" #s5 es 2osi6)e rea)i%ar una recu2eraci=n
+e errores (situ.n+ose e) ana)i%a+or en un esta+o 0.)i+o +e) an.)isis) si +urante )a fase +e
recu2eraci=n se encuentra un toHen +e sincronismo en )a entra+a"
X To7enKtrampaF $oHen que 2ue+e ser sustitui+o 2or una tram2a 2ara e:ce2ciones"
X Trampa para e8cepcionesF Es una re-)a es2ecia)mente +iseCa+a 2ara Dso2ortarE )a omisi=n +e
un toHen que se es2era6a en una re-)a5 anuncian+o e) error 2ero recu2er.n+ose +e )"
T TypeF Rase ti2o"
E.
X *nicodeF E) est.n+ar unico+e +efine un 4ue-o +e caracteres ()etras5 sm6o)os) uni0ersa) 2ara
to+os )os )en-ua4es actua)es escritos +e) !om6re5 en o2osici=n a) 0etusto #*C,,5 que inc)ue un
2equeCo su6con4unto"
J.
X 'aria+leF 3a uni+a+ mnima +e informaci=n en un )en-ua4e +e 2ro-ramaci=n cua)quiera" En
)os )en-ua4es ))ama+os fuertemente ti2a+os5 una 0aria6)e tiene a+em.s un ti2o fi4o" 3as
acciones que se 2ue+en rea)i%ar con una 0aria6)e +e2en+en +e su ti2o5 sea ste fi4o o 0aria6)e"
X 'aria+le de m$todoF Es )a 0aria6)e que se crea 2or +efecto 2ara -uar+ar e) 0a)or que -uar+a
+ic!o mto+o"
X 'oca+ularioF Con4unto +e sm6o)os termina)es que +efinen un )en-ua4e"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )-)
Ap$ndice %6 %uestiones t$cnicas
Apndice C: Cuestiones tcnicas
Apndice C: Cuestiones tcnicas....................................................435
Seccin ".1: Instalacin de A&'$( so7re CindoDs........................................................... !36
Seccin ".2: Internacionali%acin......................................................................................... !3#
&.2.1: l 'roblema.............................................................................................................................. "3.
&.2.2: 6e!ensa de la internacionali8aci%n.......................................................................................... "3.
&.2.3: ditando los !ic*eros................................................................................................................ "3.
&.2.": Recom'ilando.......................................................................................................................... "31
Seccin ".3: Interaccin de A&'$( con otros programas................................................. !!1
&.3.1: G$, macsSVemacs............................................................................................................... ""1
&.3.2: La 'lata!orma cli'se.............................................................................................................. ""2
&.3.3: Otros 'rogramas...................................................................................................................... ""3
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )-0
Ap$ndice %6 %uestiones t$cnicas 1ecci(n %.16 &nstalaci(n de ANTLR so+re EindoDs
Becci%n &.1: /nstalaci%n de A$>LR sobre Zindo)s
En )a 2.-ina oficia) +e #7$38 (2ttp6IIDDD.antlr.org) !a un manua) +e instrucciones 6astante
intuiti0o5 que in+ica 2aso a 2aso qu es )o que !a que !acer 2ara insta)ar #7$38" 7o o6stante
0o a 2resentar un resumen en caste))ano"
9ara insta)ar #7$38 so6re \in+o<sF
1" *i no )o !a !ec!o a5 insta)e a)-?n com2i)a+or +e 4a0a5 2or e4em2)o 4s+H" 8ecomien+o situar)o
en un +irectorio +e f.ci) escritura5 como c:\jsdk" Lo verdaderamente importante es Fue no
%a!a espacios en el nom"re"
'" *i no )o !a !ec!o a5 e+ite e) fic!ero cFiautoe:ec"6at (o e4ecute )a a2)icaci=n msconfi- uti)ice
)a 2estaCa +e autoe:ec"6at) com2rue6e que )a 0aria6)e PATH contiene e) +irectorio actua) (["[)
e) +irectorio c:\jsdk\bin (si c:\jsdk fue e) +irectorio e)e-i+o 2ara insta)ar 4s+H)"
Confi-ure a+ecua+amente )a 0aria6)e CLASSPATH" Esto )e 2ermitir. com2i)ar f.ci)mente +es+e
)a )nea +e coman+os" E) c=+i-o +e su fic!ero AUTOEXEC.BAT +e6era +e 2arecerse a )o
si-uienteF
mode con codepage prepare=((850) C:\WINDOWS\COMMAND\ega.cpi)
mode con codepage select=850
keyb sp,,C:\WINDOWS\COMMAND\keyboard.sys
SET PATH="c:\jsdk\bin;."
SET CLASSPATH=".";
SET CLASSPATH=%CLASSPATH%;"C:\jsdk\jre\lib\rt.jar"
SET CLASSPATH=%CLASSPATH%;"C:\jsdk\lib\dt.jar"
SET CLASSPATH=%CLASSPATH%;"C:\jsdk\lib\tools.jar"
SET CLASSPATH=%CLASSPATH%;"C:\jsdk\jre\lib\ext\dnsns.jar"
SET CLASSPATH=%CLASSPATH%;"C:\jsdk\jre\lib\ext\ldapsec.jar"
SET CLASSPATH=%CLASSPATH%;"C:\jsdk\jre\lib\ext\localedata.jar"
SET CLASSPATH=%CLASSPATH%;"C:\jsdk\jre\lib\ext\sunjce_provider.jar"
3" 1escar-ar )a 0ersi=n que se +esee (recomien+o )a m.s reciente) +e #7$38 +es+e
2ttp6IIDDD.antlr.org
4" #7$38 0en+r. com2rimi+o en un fic!ero %i2 o 4ar" 1escom2rima +ic!o fic!ero ()os fic!eros
4ar son fic!eros %i25 2ue+e cam6iar)es )a terminaci=n tranqui)amente) en a)-?n +irectorio
f.ci)mente escri6i6)e5 como c:\antlr272
89
"
&" #Ca+a e) +irectorio +e ant)r a )a 0aria6)e C3#**9#$I" 9or e4em2)o5 en e) fic!ero
autoe:ec"6at e:2uesto un 2oco m.s arri6a5 +e6era aCa+ir a)-o como estoF
SET CLASSPATH=%CLASSPATH%;C:\antlr272
6" 8einicie e) sistema"
$ras e4ecutar to+os estos 2asos5 2ara com2i)ar un fic!ero +e +efinici=n +e -ram.tica +es+e )a
)nea +e coman+os (2on-amos5 2or e4em2)o5 grammar.g) so)amente ten+r. que escri6ir )o
si-uienteF
89 Jo en rea)i+a+ uti)i%o cFi2ro-ramsi4s+H cFi!omeiant)r" 3os +irectorios que in+ico no son m.s que e4em2)os"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )-,
Ap$ndice %6 %uestiones t$cnicas 1ecci(n %.16 &nstalaci(n de ANTLR so+re EindoDs
c:\>Mis Documentos\java antlr.Tool grammar.g
#) +escom2rimir e) fic!ero com2rimi+o en e) +irectorio ant)r'('5 0eremos que +entro
+e) fic!ero %i2 o 4ar !a un +irectorio ))ama+o ant)r" 7o +e6emos inc)uir)o en e)
c)ass2at!"
E0entua)mente es 2osi6)e que a) +escom2rimir tam6in encontremos un fic!ero 4ar5 ))ama+o 2or
e4em2)o antlr.jar" Este fic!ero es un 4ar 2equeCo (a)re+e+e+or +e 80 MG) que 2ermite e4ecutar
un com2i)a+or 4a0a +esarro))a+o con ant)r5 2ero no compilarlo" 9ara m.s +eta))es so6re )a
com2i)aci=n +e #7$385 cons?)tese )a si-uiente secci=n"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )-7
Ap$ndice %6 %uestiones t$cnicas 1ecci(n %.26 &nternacionali:aci(n
Becci%n &.2: /nternacionali8aci%n
&.2.1: l 'roblema
E) 2ro6)ema +e )a internaciona)i%aci=n +es2areci= en )a 0ersi=n '"("' +e #7$38 (e)
4ue-o +e caracteres 0.)i+os se e:ten+i= !asta e) 3(()" 7o o6stante estas in+icaciones
si-uen sien+o 0.)i+as 2ara 0ersiones anteriores ('"("'rc' 2re0ias)
/no +e )os 2rimeros 2ro6)emas ( m.s f.ci)mente reso)u6)es) que encontr con #7$38 es )a
incom2ati6i)i+a+ que #7$38 tiene 2or +efecto con )os caracteres no an-)osa4ones (no #*C,,)"
E) 2ro6)ema a2areci= cuan+o trat +e com2i)ar un fic!ero +e 2rue6a como e) si-uienteF
header {
/* un anlisis lxico muy estpido */
}
class MyLexer extends Lexer;
IDENT : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*;
#) com2i)ar)o con #7$38 o6tu0e e) si-uiente mensa4e +e errorF
C:\>java antlr.Tool foo.g
ANTLR Parser Generator Version 2.7.2rc2 (20021130-1)1989-2002 jGuru.com
error: Token stream error reading grammar(s):
foo.g:2:8: expecting '*', found 'n'
TokenStreamException: expecting '*', found 'n'
Be + cuenta +e que a #7$38 no )e -ustan )os acentos ()a )nea que +a error es )a '5 es +ecir5 e)
comentario5 que tiene tres )etras acentua+as)" #) e)iminar +ic!as )etras )a -ram.tica funciona6a
2erfectamente"
&.2.2: 6e!ensa de la internacionali8aci%n
9o+ra +iscutirse su uti)i+a+F for%an+o e) uso +e un con4unto +e caracteres tan )imita+o se est.
casi o6)i-an+o a escri6ir )as -ram.ticas (L )os comentarios asocia+osN) en in-)s" 1e esta forma
ser. m.s 2ro6a6)e que a)-uien +e Es2aCa com2ren+a una -ram.tica escrita 2or a)-uien +e Morea
+e) 7orte (siem2re cuan+o )os +os !a6)en in-)s)" En teora"
J +i-o en teora 2orque a+em.s +e sto 2ue+e ocurrir +os casos m.sF
1" Pue e) escritor +e )a -ram.tica no ten-a un ni0e) +e in-)s suficiente5 sien+o su nomenc)atura
comentarios am6i-uos"
'" Pue e) escritor escri6a )a -ram.tica )os comentarios en su )en-ua materna5 sin escri6ir )os
caracteres conf)icti0os" csta es sin +u+a )a a)ternati0a m.s 2ro6a6)e"
#+em.s5 2ue+e +arse e) caso +e que5 como o5 a)-uien necesite uti)i%ar 2a)a6ras que conten-an
caracteres no #*C,, (mto+o5 2ar.metro)"
En fin5 a) -rano" Ramos a recom2i)ar #7$38 2ara !acer)o com2ati6)e con e) caste))ano"
&.2.3: ditando los !ic*eros
E) ran-o +e caracteres 0.)i+os que se uti)i%a en #7$38 es e) #*C,, 2uro5 esto es5 +es+e a)
car.cter unico+e n?mero 3 !asta e) 1(6" Ramos a cam6iar ste ran-o 2ara ))e0ar)o +es+e e) 3
!asta e) 3(("
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )-/
Ap$ndice %6 %uestiones t$cnicas 1ecci(n %.26 &nternacionali:aci(n
#7$38 es 2arcia)mente auto -enera+o5 esto es5 a)-unas c)ases !an si+o -enera+as uti)i%an+o uno
o 0arios fic!eros Y"- con )a 0ersi=n anterior +e #7$38" En )a +istri6uci=n '"("'rc' !a 6
fic!eros que +e6en ser mo+ifica+osF
X c:\antlr272RC2\antlr\preprocessor\preproc.g
X c:\antlr272RC2\antlr\actions\cpp\action.g
X c:\antlr272RC2\antlr\actions\java\action.g
X c:\antlr272RC2\antlr\actions\csharp\action.g
X c:\antlr272RC2\antlr\antlr.g
X c:\antlr272RC2\antlr\tokdef.g
#)-unas +e )as 0ersiones +e ant)r que se encuentran en e) sitio <<<"ant)r"or- son
incompletasF fa)tan mu)titu+ +e fic!eros5 entre e))os ant)r"-" *i no encuentra a)-?n
fic!ero en su +istri6uci=n5 +escar-ue una +iferente"
3o que tenemos que !acer es sim2)eF 6uscar )a ca+ena [i3[ en )os fic!eros Y"- +e) +irectorio
c:\antlr272RC2\antlr sus su6+irectorios5 cam6ian+o e) 0a)or +e )a o2ci=n" Es +ecir5 cuan+o
en uno +e +ic!os fic!eros encontremos una )nea as (preproc.g )os tres action.g)F
charVocabulary = '\3'..'\176';
1e6eremos e+itar)a cam6iar)a 2or a)-o asF
charVocabulary = '\3'..'\377';
J en )os fic!eros en )os que nos encontremos a)-o como sto (antlr.g tokdef.g)F
protected
VOCAB
: '\3'..'\176'
;
Ramos cam6iar e) ran-o +e )a si-uiente maneraF
protected
VOCAB
: '\3'..'\377'
;
3a re-)a +e oroF Lsiem2re !a-a co2ias +e se-uri+a+ antes +e recom2i)arN
&.2.": Recom'ilando A$>LR
7ota es2ecia)F )a forma +e recom2i)ar #7$38 se !a mo+ifica+o entre )as 0ersiones
'"("'rc' )a '"("'" En esta ?)tima #7$38 incor2ora una !erramienta +e autoA
com2i)aci=n (2aquete ant)r"6ui)+)" 1e to+as maneras )a forma +e recom2i)ar e:2)ica+a
en este a2arta+o si-ue sien+o 0.)i+a 2ara 0ersiones anteriores"
/na 0e% mo+ifica+os )os fic!eros +e -eneraci=n5 es necesario Dcom2i)ar)osE con ant)r 2ara que )as
nue0as c)ases 4a0a se -eneren"
Esto su2onien+o que !a insta)a+o a+ecua+amente 4a0a #7$38 2ara 2o+er
e4ecutar)os f.ci)mente +es+e )a )nea +e coman+os" 8e0ise e) 2rinci2io +e este
a2n+ice +on+e in+ico c)aramente c=mo !acer)o"
9ara e))o5 sit?ese en e) +irectorio +e ca+a fic!ero mo+ifica+o D2.se)eE ant)r" 9or e4em2)o5 2ara
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )-<
Ap$ndice %6 %uestiones t$cnicas 1ecci(n %.26 &nternacionali:aci(n
!acer)o con e) 2rimer fic!ero escri6a )o si-uiente en )a conso)aF
c:\antlr272RC2\antlr\preprocessor\> java antlr.Tool preproc.g
,-nore )os mensa4es +e a+0ertencia (en )as acciones son muc!os)" 1e6e re2etir e) mismo
2roce+imiento 2ara ca+a fic!ero Y"- que !aa mo+ifica+o" 3o m.s senci))o es uti)i%ar e) si-uiente
fic!ero +e e4ecuci=n 2or )otes (+e6e e4ecutarse +es+e e) +irectorio cFiant)r'('8C'i )F
cd antlr
java antlr.Tool antlr.g
java antlr.Tool tokdef.g
cd preprocessor
java antlr.Tool preproc.g
cd ..\actions\cpp
java antlr.Tool action.g
cd ..\csharp
java antlr.Tool action.g
cd ..\java
java antlr.Tool action.g
cd ..\..\..
#tenci=nF este fic!ero no 0a inc)ui+o en )a +istri6uci=n +e ant)r@ +e6e ser co+ifica+o a
mano -uar+a+o en e) +irectorio +e insta)aci=n +e ant)r (cFiant)r'('8C')
/na 0e% com2i)a+os )os fic!eros Y"- !a6r. que com2i)ar )os fic!eros Y"4a0a -enera+os"
1e2en+ien+o +e qu 0ersi=n +e #7$38 estemos uti)i%an+o5 sto +e6er. rea)i%arse +e +iferentes
manerasF
En 0ersiones anti-uas +e #7$38 ('"("'rc' anteriores) se suministran 0arios fic!eros +e
2rocesamiento 2or )otes (fic!eros Y"6at) 2ara com2i)ar 6a4o B*A1;*" build.bat es e) arc!i0o
que 2ermite recom2i)ar to+a )a
c:\antlr272RC2\> build.bat
1e2en+ien+o +e )a m.quina que uti)ice5 e) 2roceso 2ue+e +urar m.s o menos tiem2o" 9or )a
2anta))a a2arecer.n mensa4es informati0os"
#) fina) se o6ten+r. un mensa4e +e error5 2or no estar 2resente e) +irectorio D2arse0ie<E"
9arse0ie< era un com2)emento +e )a anti-ua im2)ementaci=n +e #7$38 que 2ermita !acer un
+e6u- 0isua) +e) reconocimiento +e )os te:tos" #ctua)mente su +esarro))o se !a +eteni+o a no
es com2ati6)e con #7$385 2or )o que no se +istri6ue con )" 9or )o tanto5 si e) mensa4e +e error
nos inquieta 2o+emos )a ?)tima )nea +e 6ui)+"6at5 es +ecir5 staF
javac -deprecation -verbose -classpath ..\ parseview\*.javad
/na 0e% mo+ifica+o e) fic!ero build.bat )an%a+o ( si to+o !a i+o 6ien) o6ten+remos una
0ersi=n internaciona) +e #7$38"
9ero eso ocurre en 0ersiones anti-uas +e #7$38" En )as nue0as ('"("' su2eriores) se !a
im2)ementa+o un 2aquete +e DautoAcom2i)aci=nE ))ama+o antlr.build" #s5 2ara recom2i)ar
#7$38 !a6r. que escri6ir )o si-uienteF
c:\> java antlr.build.Tool build
*i to+o !a i+o 6ien5 )a com2i)aci=n +e6era rea)i%arse sin contratiem2os"
9ara m.s informaci=n so6re recom2i)aci=n +e #7$385 cons?)tese )a +ocumentaci=n que
acom2aCa a su +istri6uci=n +e #7$38"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota ))
Ap$ndice %6 %uestiones t$cnicas 1ecci(n %.-6 &nteracci(n de ANTLR con otros programas
Becci%n &.3: /nteracci%n de A$>LR con otros 'rogramas
#)-unos 2ro-rama+ores encontramos en-orroso tra6a4ar con a2)icaciones en mo+o conso)a +e
te:to en )os sistemas o2erati0os +e Bicrosoft
90
" 9or )o tanto 6uscamos otras o2ciones5 como
inte-rar +ic!as !erramientas con ,1Es e+itores +e te:to" En ste su6a2n+ice 0o a mostrar
c=mo !acer a #7$38 interactuar con a)-unos +e +ic!os 2ro-ramas"
&.3.1: G$, macsSVemacs
;resentacin
G7/ Emacs es un e+itor +e fic!eros +e te:to mu conoci+o en e) entorno 3inu:" Es un
2ro-rama +esarro))a+o en 3is2 +istri6ui+o )i6remente 2or )a 2)ataforma G7/5 +e manera que
2ue+e +escar-arse -ratuitamente +es+e su 2.-ina oficia)
(2ttp6IIDDD.gnu.orgIso4tDareIemacsIemacs.2tml)"
3os +etractores +e G7/ Emacs )e ec!an en cara su )entitu+ (2or estar 2ro-rama+o en 3is2) su
2oca inno0aci=n (2ues su as2ecto funciona)i+a+ a2enas !an cam6ia+o +es+e su creaci=n)" 3a
D)entitu+E se !a so)uciona+o aumentan+o )a 0e)oci+a+ +e )os 2rocesa+ores actua)es@ )a inno0aci=n
se so)ucion= con )a 0ersi=n Den 0entanasE5 ))ama+a Xemacs (2ttp6IIDDD.8emacs.org)" Xemacs
inc)ue una or-ani%aci=n +e men?s m.s intuiti0a un entorno rea)mente -r.fico5 en o2osici=n a
G7/ Emacs5 que contin?a estan+o en mo+o te:to"
$anto G7/ Emacs como Xemacs tienen una forma +e 2ersona)i%aci=n simi)ar5 2or )o que en
a+e)ante uti)i%ar e) trmino DEmacsE 2ara referirme a cua)quiera +e )os +os5 +iferencian+o entre
e))os cuan+o sea necesario"
Buc!a -ente +esconoce que aunque Emacs sea un e+itor usa+o so6re to+o so6re
3inu:5 e:isten 0ersiones 2ara <in+o<s"
,uncionalidades a6adidas
Como a !e +ic!o5 Emacs es un 2ro-rama +esarro))a+o en 3is2" E) mto+o 2ara am2)iar)o es
sim2)eF se uti)i%an fic!eros escritos en )en-ua4e 3is25 que se sit?an en cierto +irectorio5 se
com2i)an a 2artir +e +ic!o momento )as funciona)i+a+es +e +ic!o fic!ero (siem2re que no !aa
!a6i+o errores +e com2i)aci=n) estar.n +is2oni6)es"
E) fic!ero que nos ser0ir. 2ara uti)i%ar Emacs en con4unci=n con #7$38 se ))ama ant)rAmo+e"e)5
2ue+e encontrarse en 2ttp6IIantlrKmode.source4orge.net
91
" Este fic!ero forma 2arte +e )a
+istri6uci=n est.n+ar+ +e Emacs en )as ?)timas 0ersiones +e) e+itor (a 2artir +e )a '1"1 con G7/
Emacs con cua)quier 0ersi=n +e Xemacs)"
E) mo+o ant)r aCa+e )as si-uientes funciones a) mo+o norma) +e funcionamiento +e EmacsF
X ,+entaci=n autom.tica" Emacs rea)i%ar. autom.ticamente )a inserci=n +e caracteres +e
ta6u)aci=n es2acios +e acuer+o con e) esti)o +e co+ificaci=n +e #7$38F so)amente !a que
2resionar ta". 3a i+entaci=n se rea)i%a autom.ticamente si se inserta cua)quier sm6o)o +e
sinta:is +e #7$38 (es +ecir5 a)-uno +e stos F"@]()fg)" /se e) men? 2ara i+entar to+as )as
)neas +e )a re-i=n seCa)a+a"
X 0!ntax Pig%lig%ting" Cuan+o se acti0a5 este mo+o resa)ta )os sm6o)os +e -ram.tica e)
90 9ro6a6)emente 2orque )a conso)a +e te:to ofreci+a 2or esta com2aCa su forma +e confi-uraci=n (e+itan+o autoe:ec"6at) son
)as 2eores +e) merca+o@ !an 2ermaneci+o 0irtua)mente intactas +es+e e) B*A1;*"
91 # 2artir +e )a 0ersi=n '"("' +e #7$38 2ue+e encontrarse en e) +irectorio De:trasE +e )a +istri6uci=n"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota ))1
Ap$ndice %6 %uestiones t$cnicas 1ecci(n %.-6 &nteracci(n de ANTLR con otros programas
c=+i-o +e )as acciones"
X 7a0e-aci=n 2or e) c=+i-o" Encuentre )a +efinici=n +e una re-)a5 toHen o c)ase +e -ram.tica
sim2)emente uti)i%an+o e) men? ,n+e:5 un coman+o +e tec)a+o o e)i-ien+o una entra+a en e)
&rame s2ee+6ar"
X 7a0e-aci=n r.2i+a" Bu0ase a )a re-)a si-uiente o anterior o a) 2rinci2io o fina) +e )a +efinici=n
+e )a re-)a actua) 2u)san+o un 2ar +e tec)as"
X Risi6i)i+a+ +e acciones" Contro)e )a 0isi6i)i+a+ +e )as acciones menos im2ortantes"
X #u+a 2ara )as o2ciones" ,nserte o cam6ie una +e )as o2ciones +e #7$38 uti)i%an+o e) men? o
un coman+o +e tec)a+o" Este mo+o conoce )as o2ciones so2orta+as 2or #7$385 sus 0a)ores
2ermiti+os )a 2osici=n correcta +on+e insertar )a o2ci=n ( aCa+e o2tionsfg si es necesario)"
X ,n0ocaci=n +e )a !erramienta" Es 2osi6)e in0ocar +irectamente #7$38 +es+e Emacs
encontrar )a 2osici=n +e) error e)i-ien+o e) error con e) rat=n o un coman+o +e tec)a+o"
X Generaci=n +e maHefi)e" EnseCar )as +e2en+encias +e maHefi)e 2ara to+as )as -ram.ticas
fic!eros -enera+os en e) +irectorio actua)"
Instalacin de antlr<mode
En caso +e no tener 2or +efecto insta)a+o e) fic!ero ant)rAmo+e5 o +e que se quiera insta)ar una
nue0a 0ersi=n +e +ic!o fic!ero5 es 2osi6)e insta)ar)o manua)mente" #unque en )a 2.-ina oficia) +e
ant)rAmo+e se e:2one c)aramente c=mo !acer)o5 0o a transcri6ir e) 2roceso +e insta)aci=n en
caste))anoF
1" Co2iar e) fic!ero ant)rAmo+e"e) +entro +e) load pat% +e Emacs
9'
"
'" Com2i)e +ic!o fic!ero (2ara e))o use e) men? >uildKU>yteKcompile t2is 4ile)"
3" ,nsertar )as si-uientes )neas en e) c=+i-o en e) fic!ero +e confi-uraci=n +e EmacsF
(autoload 'antlr-mode "antlr-mode" nil t)
(setq auto-mode-alist (cons '("\\.g\\'" . antlr-mode) auto-mode-alist))
(add-hook 'speedbar-load-hook ; would be too late in antlr-mode.el
(lambda () (speedbar-add-supported-extension ".g")))
4" 9ara 2ersona)i%ar Emacs5 uti)ice e) su6men? Ca5or CodeKUANTLRKU%ustomi:e Antlr"
&.3.2: La 'lata!orma cli'se
;resentacin
3a 2)ataforma Ec)i2se (sitio oficia)F 2ttp6IIDDD.eclipse.org) es )a res2uesta que *un
Bicrosistems !a +a+o a Bicrosoft Risua) *tu+io" #unque am6os entornos son 0isua)mente
2areci+os5 son com2)etamente +iferentes tanto a ni0e) 2ro-ram.tico como a+ministrati0o"
Ec)i2se es o2en source5 as que 2ue+e +escar-arse -ratuitamente +es+e su 2.-ina oficia)"
Ec)i2se es un 2ro-rama 6asa+o en 0entantas 2ro-rama+o en 4a0a" Jo 2ens sera
into)era6)emente )ento tra6a4ar con )5 2ero me equi0oqu com2)etamente@ Ec)i2se !a
+esarro))a+o un con4unto +e )i6reras -r.ficas (+iferentes +e *\,7G #\$) mu r.2i+as" LJa
era !oraN
3a 2)ataforma Ec)i2se est. +is2oni6)e 2ara 0arios sistemas o2erati0os5 entre e))os Bicrosoft
\in+o<s"
9' 7orma)mente e) )oa+A2at! +e Emacs es a)-o 2areci+o a cFi1irectorioA+eAinsta)aci=nA+eAEmacsisiteA)is2
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota ))2
Ap$ndice %6 %uestiones t$cnicas 1ecci(n %.-6 &nteracci(n de ANTLR con otros programas
,uncionalidades a6adidas
Ec)i2se es una 2)ataforma a)tamente 2ersona)i%a6)e5 me+iante 2aquetes 4a0a que se +enominan
plugins" Estos 2aquetes se co2ian +irectamente en e) su6+irectorio 2)u-ins +e) +irectorio +e
insta)aci=n"
Esta 2o)tica +e 2)u-ins !a 2ro2orciona+o a ec)i2se una f)e:i6i)i+a+ enorme (muc!simo maor
que )a +e Risua) *tu+io5 que no se !i%o con )a 2ersona)i%aci=n en mente)" #unque inicia)mente
Ec)i2se estu0iera enfoca+a a) +esarro))o en Ja0a (e) mo+o 4a0a es un 2)u-in m.s)5 !aan a2areci+o
2)u-ins 2ara +esarro))o en otros )en-ua4es5 como C^C++"
/no +e estos nue0os 2)u-ins es e) 2)u-in 2ara ant)r5 que 2ue+e encontrarse en
2ttp6IIantlreclipse.source4orge.netI" Es un 2ro+ucto a?n 4o0en5 con muc!os as2ectos 2or
+esarro))ar (!e encontra+o a)-unos 6u-s)" 3a 0e)oci+a+ +e actua)i%aci=n no es tan r.2i+a como
sera +esea6)e"
E) 2)u-in aCa+e )as si-uientes funciona)i+a+es a Ec)i2seF
X 7ue0o ti2o +e 2roectoF +esarro))o #7$38"
X Barca+ores 2ara errores en )os fic!eros +e -ram.ticas"
0!ntax %ig%lig%ting.
X Rista en esquema (outline) +e) fic!ero +e -ram.tica"
X 1istinci=n entre fic!eros -enera+os autom.ticamente 2or #7$38 fic!eros 4a0a escritos 2or
otros mto+os"
X Encontrar +efiniciones +e re-)as (2ue+e !acerse 2u)san+o >3)"
Instalacin
3a insta)aci=n +e) 2aquete es senci))aF tras +escar-ar e) plugin (en rea)i+a+ son tres 2aquetes
+iferentes) +e internet5 !an +e +escom2rimirse en e) +irectorio plugins +e )a 2)ataforma ec)i2se" #
2artir +e entonces5 cuan+o se reinicie Ec)i2se e) plugin estar. acti0o"
/na 0e% acti0a+o e) plugin5 ser. necesario confi-urar manua)mente cierta 2ro2ie+a+ que tiene e)
com2i)a+or 2ara e0itar que )os fic!eros +e -ram.ticas se co2ien en e) +irectorio +e sa)i+a +e )os
fic!eros com2i)a+os" 9ara e))o5 en )a 0entana +e 9referencias5 aCa+ir )a ca+ena DY"-E en
Ja0a^Com2i)er^9estaCa ;t!er^Ca4a >i)tere+ resources"
/n 2ro6)ema im2ortante +e) plugin +e ant)r 2ara Ec)i2se es que inc)ue su 2ro2ia
0ersi=n +e #7$38 en uno +e sus 2aquetes" *i se +esea uti)i%ar una 0ersi=n +iferente
+e #7$38 (o internaciona)i%ar)o) ser. necesario im2ortar e) 2)u-in or-"ant)r en
forma +e 2roecto Ec)i2se mo+ificar )os fic!eros que sea necesario5 recom2i)an+o5
etc"
&.3.3: Otros
Es 2osi6)e !acer que casi cua)quier otro e+itor o ,1E con ca2aci+a+ 2ara com2i)ar fic!eros se
inte-re con #7$385 +e )a misma forma que se !ara con 6ison c++" 3a tcnica m.s e0i+ente
consiste en confi-urar )os fic!eros +e +efinici=n +e -ram.tica 2ara ser com2i)a+os +e una forma
D2ersona)i%a+aE ())aman+o a )a )nea +e coman+os@ esto ocurre inc)uso con Risua) *tu+io5 2or eso
es incom2rensi6)e que si-an usan+o )a !orrorosa conso)a +e B* 1;*)"
En e) caso +e que no se 2ue+an crear +e2en+encias entre fic!eros5 2ue+en !acerse +os 2roectos
+iferentes5 uno 2ara -enerar )os fic!eros a 2artir +e )as -ram.ticas5 otro 2ara com2i)ar en 4a0a5
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota ))-
Ap$ndice %6 %uestiones t$cnicas 1ecci(n %.-6 &nteracci(n de ANTLR con otros programas
fina)mente com2i)ar en "atc% 2rimero uno )ue-o e) otro" Esto es )o que esto !acien+o o con
e) e+itor que uti)i%o actua)mente5 4creator"
Buc!os e+itores (entre e))os 4creator) 2ermiten es2ecificar en fic!eros +e te:to mu f.ci)es +e
enten+er c=mo se co)orea )a -ram.tica +e )os )en-ua4es que so2ortan" 1e esta forma !e
conse-ui+o que 4creator co)oree a+ecua+amente mis fic!eros +e -ram.ticas"
En cuanto a) resto +e 2restaciones (na0e-aci=n5 0isi6i)i+a+) no creo que !aa nin-una manera +e
simu)ar)as con 2ro-ramas que no estn +es+e e) 2rinci2io 2ensa+os 2ara e))o5 o que no 2ue+an
e:ten+erse con 2)u-ins" 1e to+as formas stas son )as 2restaciones que menos ?ti)es me 2arecen"
3a 0ersi=n '"("' +e #7$38 incor2ora e) m=+u)o +e interacci=n con e) e+itor 4e+it
con G7/ Emacs^Xemacs" *e encuentran en e) +irectorio De:trasE"
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota )))
Ap$ndice ?6 %ontenido del %?KRAC
Apndice D:
Contenido del CD-ROM
:irectorio Nso)tDareO
X E) 2ro-rama +e insta)aci=n +e )a plata4orma #1?Q 1.).1 2ara \in+o<s"
X 3a documentaci(n de la A3& de #1?Q 1.).1 com2rimi+a en formato W,9"
X 3a ?)tima 0ersi=n +is2oni6)e +e )a plata4orma !clipse 2ara \in+o<s"
X 3a ?)tima 0ersi=n +is2oni6)e +e Vemacs 2ara \in+o<s"
X 3a ?)tima 0ersi=n +is2oni6)e +e ApenA44ice.org 2ara \in+o<s"
X 3a ?)tima 0ersi=n +is2oni6)e +e Ado+e Acro+at Reader 2ara \in+o<s"
X 3a ?)tima 0ersi=n +is2oni6)e +e EinRAR"
:irectorio NantlrO
X 3a 0ersi=n +e ANTLR que se !a uti)i%a+o en este +ocumento ('"("')
X 3a ?)tima 0ersi=n +e) modo antlr para !clipse +is2oni6)e en
2ttp6IIantlreclipse.source4orge.net
X 3a ?)tima 0ersi=n +e) modo antlr para !macsIVemacs +is2oni6)e en 2ttp6IIantlrK
mode.source4orge.net
:irectorio Nantlrau-O
X 3a ?)tima 0ersi=n +e )a li+rera antlrau8 (6inarios + c=+i-o fuente)"
X 1ocumentaci=n en formato 5avadoc +e +ic!a )i6rera"
:irectorio NleliO
X E) c=+i-o fuente (fic!eros Y"4a0a Y"-) que !emos crea+o 2ara inter2retar e) )en-ua4e 3e3i"
X 3os e4ecuta6)es (fic!eros Y"c)ass) +e) intr2rete"
X E) fic!ero tiposBasicos.leli
X #)-unos fic!eros Y")e)i +e e4em2)o
:irectorio NdocO:
X Este +ocumento en formato ;2en;ffice"or- 1"1 \riter (Y"s:<)
X Este +ocumento en formato 91> (Y"2+f)
Gua prctica de ANTLR 2.7.2 v1. !nri"ue #os$ Garca %ota ))0

También podría gustarte