You are on page 1of 22

5/2/2014

www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html

JLex: UngeneradordeanalizadorlxicoparaJava(TM)
ElliotBerk DepartamentodeCienciasdelaComputacindelaUniversidaddePrinceton Versin1.2,05demayo1997 Revisindelmanual29deoctubre1997 ltimaactualizacin06deseptiembre2000paraJLex1.2.5 (ltimaversinsepuedeobtenerdehttp://www.cs.princeton.edu/~appel/moderna/java/JLex/)

Contenido
1.Introduccin 2.JLexEspecificaciones 2.1CdigodeUsuario 2.2DirectivasJLex 2.2.1ReglamentoInternodeAnalizadorLxicoClase 2.2.2CdigodeinicializacinparaAnalizadorLxicoClase 2.2.3CdigodefindearchivoparaelAnalizadorLxicoClase 2.2.4Definicionesdemacros 2.2.5DeclaracionesdelosEstados 2.2.6Recuentodecaracteres 2.2.7Lneadeconteo 2.2.8JavaCOPACompatibilidad 2.2.9TtulosAnalizadorLxicocomponentes 2.2.10defectoTokenTipo 2.2.11defectoTokenTipoII:EnvueltoEntero 2.2.12YYEOFelfinaldesuarchivo 2.2.13Newlinesycompatibilidaddelsistemaoperativo 2.2.14Juegosdecaracteres 2.2.15Formatodecaracteresaydesdearchivos 2.2.16Excepcionesgeneradasporaccioneslxicas 2.2.17EspecificacindelvalordevueltoenFindearchivo 2.2.18Laespecificacindeuninterfazaimplementar 2.2.19HacerlaClasepblicagenerada
http://www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html 1/22

5/2/2014

www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html

2.3ReglasdeExpresionesRegulares 2.3.1lxicoUnidos 2.3.2ExpresionesRegulares 2.3.3AccionesAsociadas 2.3.3.1Accionesyrecursividad: 2.3.3.2Transicionesdeestado: 2.3.3.3Valoresdisponibleslxicas: 3.Analizadoreslxicosgenerados 4.Rendimiento 5.CuestionesdeAplicacin 5.1Caractersticasnoimplementadas 5.2UnicodevsAscii 5.3Lascomasenlistasestatales 5.4Listadecaractersticasnoimplementadas 6.Crditosyderechosdeautor 6.1Crditos 6.2Derechosdeautor

1.Introduccin
Unanalizadorlxicorompeunflujodeentradadecaracteresentokens.Escribiranalizadoreslxicosamano puedeserunprocesotedioso,porloquelasherramientasdesoftwaresehandesarrolladoparafacilitaresta tarea. TalvezelejemplomsconocidoeslautilidaddeLex.Lexesungeneradordeanalizadoressintcticosparael sistemaoperativoUNIX,orientadoallenguajedeprogramacinC.Lextomaunarchivodeespecificacinde formatoespecialquecontienelosdetallesdeunanalizadorlxico.EstaherramientacreaunarchivofuenteC paraelanalizadorlxicotablaimpulsadaasociado. LautilidadJLexsebasaenelmodelodegeneradordeanalizadorlxicoLex.JLextomaunarchivode especificacinsimilaralaceptadoporLex,acontinuacin,creaunarchivofuentedeJavaparaelanalizador lxicocorrespondiente.

2.JLexEspecificaciones
http://www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html 2/22

5/2/2014

www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html

UnarchivodeentradaJLexestorganizadoentressecciones,separadaspordirectivasdedosporciento (``%%'').UnaespecificacinadecuadaJLextieneelsiguienteformato.cdigodeusuario%%directivasJLex %%expresionesregularesgobiernaLasdirectivas``%%''distinguenlasseccionesdelarchivodeentradayse debencolocaralprincipiodesulnea.Elrestodelalneaquecontienelasdirectivas``%%''puedeser desechadoynodebeserutilizadoparaalbergaradeclaracionesocdigoadicionales.

Laseccindecdigodeusuariolaprimeraseccindelarchivodeespecificacinsecopiadirectamenteenel archivodesalidaresultante.Estareadelaespecificacinofreceunespacioparalaimplementacindeclasesde utilidadotiposderetorno. LaseccindedirectivasJLexeslasegundapartedelarchivodeentrada.Aqu,lasdefinicionesdemacrosse danylosnombresdeestadosedeclaran. Laterceraseccincontienelasreglasdeanlisislxico,cadaunodeloscualesconstadetrespartes:unalista opcionaldeestado,unaexpresinregular,yunaaccin.

2.1CdigodeUsuario
Elcdigodeusuarioprecedealaprimeradirectivadedobleciento(``%%').Estecdigosecopialiteralmente enelarchivodeorigenanalizadorlxicoqueJLexsalidas,enlapartesuperiordelarchivo.Porlotanto,siel archivodeorigenlexernecesitacomenzarconunadeclaracindelpaqueteoconlaimportacindeunaclase externa,laseccindecdigodeusuariodebecomenzarconladeclaracincorrespondiente.Estadeclaracinse copiarenlapartesuperiordelarchivodecdigofuentegenerado.

2.2DirectivasJLex
LaseccindedirectivaJLexcomienzadespusdelaprimera``%%''ycontinahastaelsegundo%% delimitador``''.CadadirectivaJLexdebeestarcontenidoenunasolalneaydebecomenzaresalnea.

http://www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html

3/22

5/2/2014

www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html

2.2.1ReglamentoInternodeAnalizadorLxicoClase
El%{...%}DirectivapermitealusuarioescribircdigoJavaparasercopiadoenlaclasedeanlisislxico.Esta directivaseusadelasiguientemanera.%{<code>%}Paraserreconocidocorrectamente,el%{y%}deben Estarsituadosenelcomienzodeunalnea.ElcdigoJavaespecificadoen<code>secopiaentoncesenla clasedeanlisislxicocreadoporJLex.claseyylex{...<code>...}Estopermiteladeclaracindevariablesy funcionesinternasdelaclaseanalizadorlxicogenerado.Losnombresdevariablescomienzanconyysedebe evitar,yaqueestosestnreservadosparasuusoporlaclasedeanlisislxicogenerado.

2.2.2CdigodeinicializacinparaAnalizadorLxicoClase
El%init{...%Init}DirectivapermitealusuarioescribircdigoJavaparasercopiadoenelconstructordela clasedeanlisislxico.%init{<code>%init}El%init{y}%init directivasdebensituarsealprincipiode unalnea.ElcdigoJavaespecificadoen<code>secopiaentoncesenellxicoconstructordelaclasedel analizador.claseyylex{yylex(){...<code>...}}Estadirectivapermitelainicializacindeunasolavezdela clasedeanlisislxicodesdeelinteriordesuconstructor.Losnombresdevariablescomienzanconyysedebe evitar,yaqueestosestnreservadosparasuusoporlaclasedeanlisislxicogenerado.

Elcdigoquefiguraenel%init{...%Init}Directivapotencialmentepuedeproducirunaexcepcino propagarladesdeotrafuncin.Declararestaexcepcin,utiliceel%initthrow{...%Initthrow}Directiva.% initthrow{<exception[1]>[,<exception[2]>,...]%initthrow}ElcdigoJavaseespecificaaquse copiarenladeclaracindelconstructoranalizadorlxico.yylex()lanza<exception[1]>[,


http://www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html 4/22

5/2/2014

www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html

<exception[2]>,...]{...<code>...}SielcdigoJavadadaenel%init{...%Init}Directivaproduceuna excepcinquenoestdeclarada,elarchivodeorigenanalizadorlxicoresultantenopuedecompilar correctamente.

2.2.3CdigodefindearchivoparaelAnalizadorLxicoClase
El%eof{...%Eof}DirectivapermitealusuarioescribircdigoJavaparasercopiadoenlaclasedeanlisis lxicoparasuejecucindespusdequeelarchivofinaldequesealcance.%eof{<code>%eof}El%eof{ y}%eof directivasdeberanestarsituadoalprincipiodeunalnea.ElcdigoJavaespecificadoen<code>se ejecutaralosumounavez,einmediatamentedespusdequesealcanceelfinaldearchivoparaelarchivode entradadelaclasedeanlisislxicoestprocesando.

Elcdigoquefiguraenel%eof{...%Eof}directivapuedepotencialmentegenerarunaexcepcinopropagarla desdeotrafuncin.Declararestaexcepcin,utiliceel%eofthrow{...%Eofthrow}Directiva.%eofthrow{ <exception[1]>[,<exception[2]>,...]%eofthrow}ElcdigoJavaseespecificaaqusecopiarenla declaracindelafuncindeanalizadorlxicollamadoparalimpiarhastaalllegaralfinaldesuarchivo.void yy_do_eofprivado()throws<exception[1]>[,<exception[2]>,...]{...<code>...}ElcdigoJavaen <code>quecomponeelcuerpodeestafuncin,enparte,vienenconelcdigoquefiguraenel%eof{...% Eof}Directiva.Siestecdigoproduceunaexcepcinquenoestdeclaradautilizandoel%eofthrow{...% Eofthrow}Directiva,elanalizadorlxicoresultantenopuedecompilarcorrectamente.

http://www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html

5/22

5/2/2014

www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html

2.2.4Definicionesdemacros
LasdefinicionesdemacrossedanenlaseccindedirectivasJLexdelaespecificacin.Cadadefinicinde macroestcontenidoenunasolalneaysecomponedeunnombredemacroseguidodeunsignoigual(=),y luegoporsudefinicinasociada.Portanto,elformatosepuederesumirdelasiguientemanera.<nombre>= <definition>espacioenblancoparanosaltodelnea,porejemplo,espaciosenblancoytabuladores,es opcionalentreelnombredelamacroyelsignoigualyentreelsignoigualyladefinicindelamacro.Cada definicindemacrodebeestarcontenidoenunasolalnea. Losnombresdemacrodebenseridentificadoresvlidos,porejemplo,secuenciasdeletras,dgitosyguiones bajoscomienceporunaletraounguinbajo. Lasdefinicionesdemacrosdebenserexpresionesregularesvlidas,losdetallesdeloscualessedescribenen otraseccinacontinuacin. Lasdefinicionesdemacrospuedencontenerotrasexpansionesdemacros,enlanorma{}<nombre>formato paramacrosdentrodelasexpresionesregulares.Sinembargo,elusuariodebetenerencuentaqueestas expresionessonmacrosnofuncionesonoterminalesasconstruccionesmutuamenterecursivasutilizando macrossonilegales.Porlotanto,losciclosenlasdefinicionesdemacrostendrnresultadosimpredecibles.

2.2.5DeclaracionesdelosEstados
Estadoslxicosseutilizanparacontrolarcundociertasexpresionesregularescoinciden.stossedeclaranen lasdirectivasJLexdelasiguientemanera.%declaraestado[0][,estatales[1],elestado[2],...]Cada declaracindeunaseriedeestadoslxicosdebeestarcontenidoenunasolalnea.Variasdeclaracionesse puedenincluirenlamismaespecificacinJLex,porloqueladeclaracindemuchosestadossepuededividiren muchasdeclaracionesenvariaslneas. Nombresestatalesdebenseridentificadoresvlidos,porejemplo,secuenciasdeletras,dgitosyguionesbajos comienceporunaletraounguinbajo. UnsoloestadolxicasedeclaraimplcitamenteporJLex.EsteestadosellamaYYINITIAL,yelanalizador lxicogeneradoquecomienceelanlisislxicoenesteestado. Reglasdeanlisislxicocomienzanconunalistadelestadoopcional.Sisedaunalistadelestado,lareglalxica
http://www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html 6/22

5/2/2014

www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html

sloescomparablecuandoelanalizadorlxicoseencuentraenunodelosestadosespecificados.Sinoseda unalistadelestado,lareglalxicasecorrespondecuandoelanalizadorlxicoesencualquierestado. SiunaespecificacinJLexnohaceusodelosestados,pornilosestadosquedeclaranniprecedentereglas lxicasconlistasestatales,elanalizadorlxicoresultantepermanecerenestadoYYINITIALlargodela ejecucin.Puestoquelasreglaslxicasnovanprecedidosdelistasestatales,estasreglassecorrespondenen todoslosestadosexistentes,incluyendoelestadodeclaradoimplcitamenteYYINITIAL.Porlotanto,todo funcionacomoseesperasilosestadosnoseutilizanenabsoluto. Unidossondeclaradoscomoenterosconstantesdentrodelaclasedeanlisislxicogenerado.Laconstante enteradeclaradoparaunestadodeclaradotieneelmismonombrequeeseestado.Elusuariodebetener cuidadoparaevitarconflictosdenombresentrelosnombresdeestadoyvariablesdeclaradasenlapartedela accindelasreglasoenotrolugardentrodelaclasedeanlisislxico.Unaconvencinconvenientesera declararlosnombresdeestadoentodaslascapitales,comounrecordatoriodequeestosidentificadoresse conviertenefectivamenteconstantes.

2.2.6Recuentodecaracteres
Conteodecaracteresestdesactivadopordefecto,perosepuedeactivarconelcarbn%directiva.%CharEl ndicebasadoencerodelprimercarcterdelareginacompaadodeltextosecolocaenlavariableentera yychar.

2.2.7Lneadeconteo
ConteoLineestdesactivadapordefecto,perosepuedeactivarconlalnea%directiva.lnea%Elndicede lneadebaseceroeneliniciodelareginacompaadodeltextosecolocaenlavariableenterayyline.

2.2.8JavaCOPACompatibilidad
JavaCUPesungeneradordeanalizadoressintcticosparaJavaescritooriginalmenteporScottHudsondela UniversidadGeorgiaTech,ymantenidoyampliadoporFrankFlannery,DanWang,yC.ScottAnanian.Los
http://www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html 7/22

5/2/2014

www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html

detallesdeestaherramientadesoftwareestnenlaWorldWideWebenhttp://www.cs.princeton.edu/~appel/ moderna/java/CUP/.compatibilidadJavaCOPAestdesactivadopordefecto,perosepuedeactivarconel siguienteDirectivaJLex.%tazaCuandoselesda,estadirectivahacequeelanalizadorgeneradoseajustaala j a v a _ c u p . r u n t i m e . S c a n n e r interfaz.Tieneelmismoefectoquelastresdirectivassiguientes:%implementa java_cup.runtime.Scannerfuncin%next_tokenescriba%java_cup.runtime.SymbolConsultelasiguiente seccinparamsdetallessobreestastresdirectivas,yelmanualdeCOPAparamsdetallessobreeluso COPAyJLexjuntos.

2.2.9TtulosAnalizadorLxicocomponentes
Lassiguientesdirectivassepuedenutilizarparacambiarelnombredelaclasegeneradalxicoanalizador,la funcintokenizing,yeltipoderetornosimblico.Paracambiarelnombredelaclasedeanlisislxicodeyylex ,utilicelaclase%directiva.%<nombre>claseParacambiarelnombredelafuncintokenizingdeyylex , utilicelafuncin%directiva.%Funcin<nombre>Paracambiarelnombredeeltipoderetornodelafuncin tokenizingdeYytoken,utiliceeltipo%directiva.escriba%<nombre>Silosnombrespordefectonoestn alterandoelusodeestasdirectivas,lafuncintokenizingseenvokedconunallamadaaYylex.yylex(),que devuelveelYtokentipo.

Paraevitarconflictosdedeterminacindelalcance,nombresquecomienzanconyynormalmentesereservan parafuncionesinternasdeanlisislxicoyvariables.

2.2.10defectoTokenTipo
Parahacerqueelprimitivotipoenterode32bitsint ,eltipoderetornodelafuncintokenizing(yporlotanto
http://www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html 8/22

5/2/2014

www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html

eltipodetoken),useelnmeroentero%directiva.%enteroSegnlosajustespredeterminados,Yytokenesel tipoderetornodelafuncintokenizingYylex.yylex(),comoenelsiguientefragmentodecdigo.claseyylex {...pblicoyylexYytoken(){...}Elnmeroentero%Directivasustituyeelcdigoanteriorconuna declaracinrevisada,enlaqueeltipodetokensehacambiadoaint .claseyylex{...publicintyylex(){...} Estadeclaracinpermiteaccioneslxicasparavolvercdigosenteros,comoenelsiguientefragmentodecdigo deunaaccinlxicahipottico.{...devolucinde7...}

Lasfuerzasdetipoderetornoenterocambiaelcomportamientoalfinaldelarchivo.Bajolaconfiguracin predeterminada,losobjetossubclasesdelaclasejava.lang.ObjectsondevueltosporYylex.yylex(). Durantelaejecucindelanalizadorlxicogeneradoyylex ,unobjetodevalorespecialdebeserreservadopara alfinaldesuarchivo.Porlotanto,cuandosealcanzaelfinaldelarchivoparaelarchivodeentradaprocesado(y deahenadelante),Yylex.yylex()devuelvenulo. Cuandoint eseltipoderetornodeYylex.yylex(),nulayanosepuededevolver.Encambio,Yylex.yylex() devuelveelvalor1,quecorrespondealaconstanteenteraYylex.YYEOF.Elnmeroentero%directiva implica%yyeof ,vasemsadelante.

2.2.11defectoTokenTipoII:EnvueltoEntero
Parahacerjava.lang.Integereltipoderetornodelafuncintokenizing(yporlotantoeltipodetoken),utiliceel intwrap%directiva.%intwrapSegnlosajustespredeterminados,Yytokeneseltipoderetornodelafuncin tokenizingYylex.yylex(),comoenelsiguientefragmentodecdigo.claseyylex{...pblicoyylexYytoken(){ ...}Elintwrap%Directivasustituyeelcdigoanteriorconunadeclaracinrevisada,enlaqueeltipodetoken sehacambiadoajava.lang.Integer.claseyylex{...java.lang.Integerpblicayylex(){...}Estadeclaracin permiteaccioneslxicasparavolvercdigosenterosenvueltos,comoenelsiguientefragmentodecdigodeuna accinlxicahipottico.{...returnnewjava.lang.Integer(0)...}

http://www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html

9/22

5/2/2014

www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html

Tengaencuentaqueelefectode%intwrapdirectivasepuedelogrardeformaequivalentemedianteeltipo% directiva,delasiguientemanera.escriba%java.lang.IntegerEstocambiamanualmenteelnombredeltipode retornodeYylex.yylex()parajava.lang.Integer.

2.2.12YYEOFelfinaldesuarchivo
Elyyeof%directivahacequelaconstanteenteraYylex.YYEOFseadeclarado.Sielnmeroentero%directiva estpresente,Yylex.YYEOFsevuelvesobrelafinaldearchivo.%yyeof EstadirectivahaceYylex.YYEOFque sedeclaracomosigue:intpublicfinalYYEOF=1Elnmeroentero%directivaimplica%yyeof .

2.2.13Newlinesycompatibilidaddelsistemaoperativo
EnlossistemasoperativosUNIX,lasecuenciadecdigodecaracteresquerepresentaunsaltodelneaesel nicocarcter``\n''.Porelcontrario,enlossistemasoperativosbasados enDOS,lanuevalneaesla secuenciadedoscaracteres``\r\n''queconsisteenelretornodecarroseguidodelanuevalnea.Los% notunix resultadosdirectivanienelretornodecarrooelsaltodelneasiendoreconocidoscomounanueva lnea.%notunix Estacuestindelreconocimientodelasecuenciacorrectadecaracterescomouncarcterde nuevalneaesimportanteparagarantizarlaindependenciadelaplataformaJava.
http://www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html 10/22

5/2/2014

www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html

2.2.14Juegosdecaracteres
Laconfiguracinpredeterminadaapoyanunalfabetodecdigosdecaracteresentre0y127,ambosinclusive. Sielanalizadorlxicogeneradorecibeuncdigodecarcterdeentradaqueseencuentrafueradeestoslmites, elanalizadorlxicopuedefallar. Elpleno%directivasepuedeutilizarparaextenderestealfabetoparaincluirtodoslosvaloresde8bits.% completoSieltotal%sedaDirectiva,JLexgenerarunanalizadorlxicoquesoportaunalfabetodecdigos decaracteresentre0y255,ambosinclusive. Elunicode%.puedeutilizarseparaextenderelalfabetoparaincluirelplenode16bitsalfabetoUnicode% unicodeSielunicode%sedaDirectiva,JLexgenerarunanalizadorlxicoquesoportaunalfabetodecdigos decaracteresentre0y2^161,ambosinclusive. Elignorecase%directivasepuededarparagenerarlexersmaysculasyminsculas.%ignorecaseSiel ignorecase%sedaDirectiva,COPAampliaratodaslasclasesdepersonajesdeunamaneraunicode amigableparaquecoincidaconlasdoscartassuperiores,inferiores,yelttulodeloscasos.

2.2.15Formatodecaracteresaydesdearchivos
Bajoelstatusquo,JLexyelanalizadorlxicoquegeneraleeryescribirenarchivosdetextoASCII,con caracteresdetamaobyte.Sinembargo,paraapoyarnuevasprrrogasenlaherramientaJLex,todoel procesamientointernodelospersonajesserealizautilizandoeltipodecarcterdeJavade16bits,aunquenose admitetodalagamadevaloresde16bits.

2.2.16Excepcionesgeneradasporaccioneslxicas
Elcdigoquefiguraenlapartedeaccindelasreglasdeexpresionesregulares,enlaseccinterceradela
http://www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html 11/22

5/2/2014

www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html

especificacinJLex,potencialmentepuedeproducirunaexcepcinopropagarladesdeotrafuncin.Para declararestasexcepciones,utiliceel%yylexthrow{...%Yylexthrow}Directiva.%yylexthrow{ <exception[1]>[,<exception[2]>,...]%yylexthrow}ElcdigoJavaseespecificaaqusecopiarenla declaracindelafuncintokenizinganalizadorlxicoYylex.yylex(),comosigue.yylexYytokenpblica() lanza<exception[1]>[,<exception[2]>,...]{...}Sielcdigodadoenlapartedeaccindelasreglasde expresionesregulareslanzaunaexcepcinquenoestdeclaradautilizandoel%yylexthrow{...%Yylexthrow} Directiva,elanalizadorlxicoresultantenopuedecompilarcorrectamente.

2.2.17EspecificacindelvalordevueltoenFindearchivo
El%eofval{...%Eofval}directivaespecificaelvalorderetornodelafindefichero.Estadirectivapermiteal usuarioescribircdigoJavaparapasarlaalafuncintokenizinganalizadorlxicoYylex.yylex()parasu ejecucincuandosealcanzaelfinaldelarchivo.Estecdigodebedevolverunvalorcompatibleconeltipodela funcintokenizingYylex.yylex().%eofval{<code>%eofval}ElcdigoJavaespecificadoen<code> determinaelvalorderetornodeYylex.yylex()cuandoelextremodeficheroquesealcanceparaelarchivode entradadelaclasedeanlisislxicoestprocesando.EstetambinserelvalordevueltoporYylex.yylex() cadavezadicionalestafuncinsellamadespusdequesealcanzaunprincipiodefindearchivo,porlo <code>puedaejecutarsemsdeunavez.Porltimo,el%eofval{y}%eofvaldirectivasdebensituarseal principiodeunalnea.

Unejemplodeusoeslasiguiente.Supongamosqueelvalorderetornodeseadoenfindeficheroes(nuevo token(sym.EOF))enlugardelvalorpredeterminadonulo.Elusuarioagregalasiguientedeclaracinenel archivodeespecificacin.%eofval{return(nuevotoken(sym.EOF))%eofval}Elcdigosecopiaen Yylex.yylex().enellugarapropiadopblicayylexYytoken(){...retorno(nuevotoken(sym.EOF))...}El valordevueltoporYylex.yylex()alfinaldesuarchivoydesdeesepuntoenadelanteesahora(nuevotoken (sym.EOF)).

http://www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html

12/22

5/2/2014

www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html

2.2.18Laespecificacindeuninterfazaimplementar
Textooriginal JLexpermitealusuarioespecificarunainterfazqueel yylex claseimplementar.Mediantelaadicindela siguientedeclaracinenelarchivodeentrada: %implementos<classname>elusuarioespecificaqueyylex [...]Squarebacketsdenoteaclassofcharactersandmatchanyone implementarnombredeclase.Ladeclaracindelaclaseanalizadorgeneradoseveras: characterenclosedinthebackets. c l a s ey y l e x i m p l e m e n t ac l a s s n a m e{ . . .
Sugiereunatraduccinmejor

2.2.19HacerlaClasepblicagenerada
Elpblico%directivahacelaclasedeanlisislxicogeneradoporJLexseaunaclasepblica.%pblicaEl comportamientopredeterminadonoagreganingnespecificadordeaccesoalaclasegenerada,loqueresultaen laclasequeesvisibleslodesdeelpaqueteactual.

2.3ReglasdeExpresionesRegulares
LatercerapartedelaespecificacinJLexconsisteenunaseriedereglaspararomperelflujodeentradaen tokens.Estasreglasespecificanlasexpresionesregulares,acontinuacin,asociarestasexpresionesconlas accionesqueconsistenenelcdigofuentedeJava. Lasreglastienentrespartesbiendiferenciadas:lalistaopcionaldeestado,laexpresinregular,ylaaccin asociada.Esteformatoserepresentadelasiguientemanera. [<estados>]<expresin>{<accin>} Cadapartedelareglasediscuteenunaseccindeabajo. Simsdeunareglacoincideconcuerdasdesuentrada,elanalizadorlxicogeneradoresuelvelosconflictos
http://www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html 13/22

5/2/2014

www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html

entrenormaseligiendoavidezlareglaquecoincideconlacadenamslarga.Simsdeunareglacoincideconlas cadenasdelamismalongitud,elanalizadorlxicoelegirlareglaquesedaporprimeravezenlaespecificacin JLex.Porlotanto,sedanreglasqueaparecenanteriormenteenlamemoriaunaprioridadmsaltaporel analizadorlxicogenerado. LasnormasquefiguranenunaespecificacinJLexdebencoincidircontodaslasentradasposibles.Siel analizadorlxicogeneradorecibeinformacinquenocoincideconningunadesusreglas,segenerarunerror. Porlotanto,todalaentradadebeiracompaadadealmenosunaregla.Estosepuedegarantizarmediantela colocacindelasiguientereglaenlaparteinferiordeunaespecificacinJLex:.{Java.lang.System.out.println ("entradasinigual:"+yytext())}(.)Elpunto,segnsedescribeacontinuacin,coincidirconcualquier entradaaexcepcindelanuevalnea.

2.3.1lxicoUnidos
Unalistadelestadolxicaopcionalprecedeacadaregla.Estalistadebeestarenelsiguienteformato:<estado [0][,estatales[1],elestado[2],...]>Elconjuntoexteriordecorchetes([])indicanquevariosestadosson opcionales.Elmayorque(<)ymenorque(>)smbolosrepresentanasmismosydebenrodearlalistaestatal anterioralaexpresinregular.Lalistadelestadoespecificaenquestadosinicialesdelareglapuedeser igualada. Porejemplo,siyylex()sellamaconelanalizadorlxicoenelestadoA,elanalizadorlxicointentarhacer coincidirlaentradaslocontraaquellasreglasquetienenunaensulistadeestado. Sinoseespecificaunalistadeestadoparaunadeterminadanorma,lareglaescomparadacontraentodoslos estadoslxicos.

2.3.2ExpresionesRegulares
Lasexpresionesregularesnodebencontenerningnespacioenblanco,comoelespacioenblancoseinterpreta comoelfindelaexpresinregularactual.Hayunaexcepcin:si(nodenuevalnea)caracteresdeespacioen blancoaparecendentrodelascomillasdobles,setomanestospersonajespararepresentarseasmismos.Por ejemplo,``''seinterpretacomounespacioenblanco. ElalfabetodeJLexeselconjuntodecaracteresASCII,esdecir,loscdigosdecaracteresentre0y127,
http://www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html 14/22

5/2/2014

www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html

ambosinclusive. Lossiguientescaracteressonmetacaracteres,consignificadosespecialesenlasexpresionesregularesJLex.
?*+|( )^$ .[ ]{ }" \

Delocontrario,loscaracteresindividualesrepresentanasmismos. ef expresionesregularesconsecutivosrepresentasuconcatenacin. e|f Labarravertical(|)representaunaopcinentrelasexpresionesregularesquelorodean,porloque coincideconunadelasexpresioneseof . Lassiguientessecuenciasdeescapesonreconocidosyampliados: \B Retroceso \N denuevalnea \T \F \R \ddd \Xdd \U dddd Lengeta FORMFEED Retornodecarro Elcdigodecarctercorrespondientealnmeroformadoportresdgitosoctalesddd Elcdigodecarctercorrespondientealnmeroformadopordosdgitoshexadecimalesdd ElcdigodecarcterUnicodecorrespondientealnmeroformadoporcuatrodgitoshexadecimales dddd.

\^C Elcarcterdecontrol \c Unabarrainvertidaseguidadecualquierotrocarcterccoincideconsigomismo $Elsignodedlar($)indicaelfinaldeunalnea.Sielsignodeldlarterminaconunaexpresinregular,la expresinsecorrespondesloalfinaldeunalnea. .Elpunto(.)Coincideconcualquiercarcterexceptoelcarcterdenuevalnea,porloqueestaexpresines equivalentea[^\n]. "..."Losmetacaracterespierdensusignificadodentrodecomillasdoblesyrepresentanasmismos.La secuencia\ " (querepresentaelcarcternico" )eslanicaexcepcin. {name}Lasllavesdenotanunaexpansindelamacro,conelnombreelnombredeclaradodelamacro asociada. *Laestrella(*)representaKleenecierreycoincideconceroomsrepeticionesdelaexpresinregular precedente. +Elsignoms(+)coincideconunaomsrepeticionesdelaexpresinregularprecedente,porloquee+es equivalenteaee*. ?Elsignodeinterrogacin(?)Coincideconceroounarepeticindelaexpresinregularprecedente.
http://www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html 15/22

5/2/2014

www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html

(...)Losparntesisseusanparaagrupardentrodelasexpresionesregulares. [...]Backetscuadradosdenotanunaclasedecaracteresycualquiercarcterincluidoenlosbackets.Sielprimer carcterdespusdelcorchetedeapertura([)eslaflechaarriba(^),elconjuntoesnegadoylaexpresin coincideconcualquiercarcterexceptolosqueformenpartedelasBackets.Diferentesreglasmetacaracteres mantienendentrodelosbackets,conlassiguientesexpresionestienenunsignificadoespecial: {Name} ExpansinMacro unb "..." \ RangodecdigosdecaracteresdeunaBqueseincluirnenelconjuntodecaracteres Todoslosmetacaracteresdentrodecomillasdoblespierdensusignificadoespecial.Lasecuencia\ " (querepresentaelcarcternico" )eslanicaexcepcin. Metacarctersiguientebarrainvertida(\)pierdesusignificadoespecial

Porejemplo,[az]coincideconcualquierletraminscula,[^09]coincideconcualquiercosaexceptoundgito, y[09afAF]coincideconcualquierdgitohexadecimal.Dentrodelossoportesdelaclasedecaracteres,un metadespusdeunabarrainvertidapierdesusignificadoespecial.Porlotanto,[\\\]coincideconunguino unabarrainvertida.Delamismamanera["AZ"]coincideconunodelostrespersonajesA,guinoZ.inicialesy finalesguionesenunaclasedecaracterestambinpierdensusignificadoespecial,porloque[+]y[+]hacer loqueseesperaraque(esdecir,sloelpartidode'+'y'').

2.3.3AccionesAsociadas
LaaccinasociadaaunareglalxicaconsisteencdigoJavaencerradoentrellavesenbloquedela delimitacin.{action}ElcdigoJavadeaccinsecopia,comoseindica,enelanalizadorlxicoimpulsadopor elEstadoproducidoporJLex. Todaslasllavescontenidasenlaaccinquenoformanpartedecadenasocomentariosdebenserequilibrados.

2.3.3.1Accionesyrecursividad: Sinohayningnvalorderetornosedevuelveenunaaccin,elbucledeanlisislxico,labsquedaparael prximopartidodelacorrientedeentradaydevuelveelvalorasociadoaesepartido. Elanalizadorlxicopuedehacerqueserepitadeformaexplcitaconunallamadaayylex(),comoenel siguientefragmentodecdigo.{...volveryylex()...}Estefragmentodecdigohacequeelanalizadorlxicoa repetirse,abuscarlasiguientecoincidenciaenlaentradaydevolverelvalorasociadoaesepartido.Elmismo efectosepuedetener,sinembargo,simplementenoregresardeunaaccindeterminada.Estosetraduceenla bsquedalexerparaelprximopartido,sinlacargaadicionaldelarecursividad.


http://www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html 16/22

5/2/2014

www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html

Elfragmentodecdigoanterioresunejemploderecursindecola,yaquelallamadarecursivaseproduceal finaldelaejecucindelafuncindellamada.Elfragmentodecdigosiguienteesunejemplodeunallamada recursivaquenoesrecursivacola.{...next=yylex()...}accionesrecursivasquenosondetrabajorecursiva decoladelamaneraprevista,salvoquevariablescomoyylineyyycharsepuedencambiardurantela recursividad.

2.3.3.2Transicionesdeestado: SilosestadoslxicossedeclaranenlaseccindedirectivasJLex,transicionesenestosestadossepueden declarardentrodelasaccionesdeexpresionesregulares.Lastransicionesdeestadosonhechasporlasiguiente llamadadefuncin.yybegin(estado)Lafuncinvoidyybegin()sepasaelnombredelestadodelestadoylos efectosdeunatransicinaesteestadolxico. ElestadodelEstadodebeserdeclaradodentrodelaseccindedirectivasJLexoestaconvocatoriadarlugar aunerrordelcompiladorenelarchivofuentegenerado.Lanicaexcepcinaestaobligacindedeclaracines elestadoYYINITIAL,elestadolxicaimplcitamentedeclaradaporJLex.Elanalizadorlxicogeneradoque comienceelanlisislxicoenestadoYYINITIALypermaneceenesteestadohastaqueserealiceunatransicin.

2.3.3.3Valoresdisponibleslxicas: Lossiguientesvaloresinternosalayylex clase,estndisponiblesdentrodelapartedeaccindelasreglas lxicas. Variableomtodo ActivationDirective Descripcin yytext Siempreactiva. PorcinIgualadosdelacorrientedeentradadecaracteres. java.lang.String() intyychar %Caracteres ndicebasadoencerodelprimercarcterenlapartecoincidente delasecuenciadeentrada
17/22

http://www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html

5/2/2014

www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html

intyyline

Lnea%

Nmerodelneadebasecerodeliniciodelapartecoincidentede lasecuenciadeentrada

3.Analizadoreslxicosgenerados
JLextendrunaespecificacinadecuadamenteformadoytransformarloenunarchivodecdigofuentedeJava paraelanalizadorlxicocorrespondiente. Elanalayzerlxicageneradaresideenlaclaseyylex .Haydosconstructoresaestaclase,tantoquerequierenun nicoargumento:elflujodeentradaatokenizados.Elflujodeentradapuedeserdetipo j a v a . i o . I n p u t S t r e a m oj a v a . i o . R e a d e r (comoS t r i n g R e a d e r ).Tengaencuentaquela j a v a . i o . R e a d e r constructordebeutilizarsesiestgenerandounlexeraceptarcaracteresUnicode,comoel 1.0JDKj a v a . i o . I n p u t S t r e a m clasenosiempreleerunicodecorrectamente. LafuncindeaccesoallxicoesYylex.yylex(),quedevuelveelsiguientetokendelacorrientedeentrada.El tipodevueltoesYytokenylafuncinsedeclaradelasiguientemanera.claseyylex{...pblicoyylexYytoken (){...}ElusuariodebedeclarareltipodeYytokenypuedelograrestoconvenientementeenlaprimeraseccin delaespecificacinJLex,laseccindecdigodeusuario.Porejemplo,parahacerYylex.yylex()devuelveuna envolturaalrededordelosnmerosenteros,elusuariointroduzcaelsiguientecdigoenalgnlugaranterioral primer``%%''.claseYytoken{intfieldYytoken(intf){campo=f}}Luego,enlasaccioneslxicas,enteros envueltosserandevueltos,enalgoascomoas.{...returnnewYytoken(0)...}Delmismomodo,enla seccindecdigodeusuario,unaclasepuedeserdefinidadeclararconstantesquesecorrespondenconcada unodelostiposdetokens.cdigosdetokendeclase{...cadenafinalstatic=0INTEGERpublicstatic final=1...}Acontinuacin,enlasaccioneslxicas,estoscdigossimblicospodranserdevueltos.{... returnnewYytoken(STRING)...}Estossonejemplossimplificadosenelusoreal,unoprobablementedefinir unaclasedetestigoquecontienemsinformacinqueuncdigodenmeroentero.

http://www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html

18/22

5/2/2014

www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html

Estosejemploscomienzanailustrarlastcnicasorientadasaobjetosunusuariopuedeemplearparadefinirun tipodetokenarbitrariamentecomplejasparaserdevueltoporYylex.yylex().Enparticular,laherenciapermite alusuariodevolvermsdeuntipodetoken.Sisenecesitabauntipodetokendistintoparacadenasynmeros enteros,elusuariopuederealizarlassiguientesdeclaraciones.claseYytoken{...}claseIntegerTokenextiende Yytoken{...}claseStringTokenextiendeYytoken{...}Acontinuacin,elusuariopuedevolvertanto IntegerTokenyStringTokentiposdelasaccioneslxicas.

Losnombresdelaclaselxicaanalizador,lafuncintokening,yeltipoquedevuelvecadaunopuedenalterarse usandolasdirectivasJLex.Vealaseccin2.2.9paramsdetalles.

4.Rendimiento
Serealizunexperimentodereferencia,compararelrendimientodeunanalizadorlxicogeneradoporJLexala deunanalizadorlxicoescritoamano.Lacomparacinsehizoparalosanalizadoreslxicosdeunlenguajede programacinsencillo``juguete''.Elanalizadorlxicoescritoamano,aligualqueelanalizadorlxicogenerado porJLex,fueescritoenJava. Elexperimentoconsisteenejecutarcadaanalizadorlxicoendosarchivosfuenteescritoenellenguajede juguete,acontinuacin,midiendoeltiemporequeridoparaprocesarestosarchivos.Cadaanalizadorlxicofue invocadoporunconductormaniqutambinescritoenJava. Elanalizadorlxicogeneradoresultserbastanterpido,comoindicanlossiguientesresultados. Tamaodelarchivo GeneradoJLexanalizadorlxico: LxicomanuscritasAnalyzer: deorigen Tiempodeejecucin Tiemposdeejecucin 177lneas 0,42segundos 0,53segundos 897lneas 0,98segundos 1,28segundos

ElanalizadorlxicoJLexprofundamentesuperallexermanuscrita. Unadelasmayoresquejasacercadelosanalizadoreslxicosdeterminadasporlastablasgeneradaspor programascomoJLexesqueestosanalizadoreslxicosnosedesempeantanbiencomolosescritosamano. Porlotanto,esteexperimentoesparticularmenteimportanteparademostrarlavelocidadrelativadeJLex analizadoreslxicos.


http://www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html 19/22

5/2/2014

www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html

5.CuestionesdeAplicacin

5.1Caractersticasnoimplementadas
Lasiguienteesuna(posiblementeincompleta)listadecaractersticasnoimplementadasdeJLex. 1. Eloperadorregulardebsquedaanticipadadeexpresinnosehaimplementado,ynoseincluyeenla listademetacaracteresespecialesdeexpresionesregulares. 2. Eloperadordecomienzodelnea(^)asumeelsiguientecomportamientonoestndar.Unpartidoenuna expresinregularqueutilizaesteoperadorharquelanuevalneaqueprecedealpartidoparaser desechados.

5.2UnicodevsAscii
Encontrasteconeltipodecarcterde8bits(char)dispuestoporAnsiC,Javasoportauncharde16bitsyel conjuntodecaracteresUnicode.JavaproporcionaunaclaseincorporadaStringparamanipularestoscaracteres Unicode. Desdelaversin1.2.5,JLexutilizalosJDK1.1L e c t o r yE s c r i t o r clasesparaleerenelarchivode especificacinJLexyescribirelarchivodeorigenanalizadorlxico.Estosignificaquetodosloscaracteres Unicodeselespermiteenambos.ParaqueelanalizadorgeneradoparatrabajarconcaracteresUnicode,debe utilizarelj a v a . i o . R e a d e r constructordelanalizadorgenerado,yell e c t o r queustedproporcionedebe manejaradecuadamentelatraduccindesdeelformatonativodeOSunicode.Tambindebeespecificarel unicode%directivaenlaespecificacin,vaselaseccin2.2.14.

http://www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html

20/22

5/2/2014

www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html

5.3Lascomasenlistasestatales
Lascomasentrelosnombresdelosestadosenlaslistasdedeclaracinylasreglaslxicassonopcionales.Estas listasseanalizancorrectamenteconelespacioenblancoentrelosnombresdelosestadosysinseparadoresde coma.

5.4Listadecaractersticasnoimplementadas
LassiguientescaractersticasdemenorimportanciaserabuenotenercomopartedeJLex,peronosehan aplicadodebidoasualcanceosuimpactonegativoenelrendimiento. 1. Ladeteccindelosapoyosdesequilibradasdentrodelapartedecomentariosdeaccioneslxicas. 2. Ladeteccindelosciclosenlasdefinicionesdemacros.

6.Crditosyderechosdeautor

6.1Crditos
EltratamientodelosgeneradoresdeanalizadoreslxicosdadosenAlanHolubCompilerDesigninC (PrenticeHall,1990)proporcionaunpuntodepartidaparamiaplicacin. LasdiscusionesconelprofesorAndrewAppeldelaUniversidadDepartamentodeInformticadePrinceton proporcionaronorientacineneldiseodeJLex. JavaesunamarcacomercialdeSunMicrosystemsIncorporated.

http://www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html

21/22

5/2/2014

www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html

6.2Derechosdeautor
JLexAVISODECOPYRIGHT,DELICENCIAYRENUNCIA. Derechosreservados1996porElliotJoelBerk. Elpermisoparausar,copiar,modificarydistribuirestesoftwareysudocumentacinconcualquierpropsitoy sincargopresenteseconcede,siemprequeelavisodecopyrightanterioraparezcaentodaslascopiasyque tantoelavisodecopyrightyestanotadepermisoyunrepudiodegarantaapareceendocumentacindeapoyo, yqueelnombredeElliotJoelBerknosepuedeutilizarenlapublicidadopropagandarelativaaladistribucin delsoftwaresinespecficaautorizacinpreviaporescrito. ElliotJoelBerkrenunciaacualquiergarantaconrespectoaestesoftware,incluyendotodaslasgarantas implcitasdecomerciabilidadyadecuacin.EnningncasoElliotJoelBerkserresponsableporningndao especial,indirectooconsecuenteocualquierdaoresultantedelaprdidadeuso,datosobeneficios,yaseaen accindecontrato,negligenciauotraaccinilcita,quesurjadeoenconexinconelusoorendimientodeeste software.

FrankFlannery Mi24dejulio199600:27:39EDT

http://www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html

22/22

You might also like