jep

Embed Size (px)

Citation preview

Analisisdel interpretadordeexpresionesmatematicas:Java Mathematical Expression Parser (JEP).ExtensionafuncionesdeCnenCm,yafuncionesdenidasatrozosEDWINCAMILOCUBIDESGARZONUNIVERSIDADNACIONALDECOLOMBIAFACULTADDECIENCIASDEPARTAMENTODEMATEMATICASBOGOTA,D.C.Diciembrede2003Analisisdel interpretadordeexpresionesmatematicas:Java Mathematical Expression Parser (JEP).ExtensionafuncionesdeCnenCm,yafuncionesdenidasatrozosEDWINCAMILOCUBIDESGARZONTrabajodegradoparaoptaralttulodeMatematicoDirectorALVAROMAURICIOMONTENEGRODIAZ,M.Sc.MatematicoUNIVERSIDADNACIONALDECOLOMBIAFACULTADDECIENCIASDEPARTAMENTODEMATEMATICASBOGOTA,D.C.Diciembrede2003TtuloenEspa nolAnalisisdelinterpretadordeexpresionesmatematicas: Java Mathematical ExpressionParser (JEP).ExtensionafuncionesdeCnenCm,yafuncionesdenidasatrozos.TitleinEnglishAnalysisoftheinterpreterofmathematicsexpressions:Java Mathematical ExpressionParser (JEP).ExtensiontofunctionsofCninCm,andtofunctionsdenedtochunks.ResumenEnestetrabajoserealizounanalisis del dise noylaimplementaciondel interpretadordeexpresionesmatematicasJava Mathematical Expression Parser (JEP),elcualfuedise nadopor el estudiantedeciencias delacomputaciondelauniversidaddeAlbertaenCanada, NathanFunk. ParalaimplementaciondeesteinterpretadorsehizousodellenguajedeprogramacionJava, utilizandolametodologadelaprogramacionorientadaaobjetos.Comoresultadodeestetrabajoseobtuvounnuevoordenparaelconjuntodeintervaloscompuestosporn umerosdemaquinayconbaseenesteordenserealiz ounaextension para evaluar funciones denidas a trozos, adem as se da un ejemplo de la forma decomo utilizar el paquete JEP para evaluar funciones vectoriales de variable real y compleja.AbstractInthisworkisIaccomplishedananalysisof thedesignandtheimplementationof theinterpreterofmathematicsexpressionsJava Mathematical Expression Parser (JEP),the one which was designed by the student of sciences the computation of the university ofAlberta in Canada, Nathan Funk. For the implementation of this interpreter was made useoftheprogramminglanguageJava,usingthemethodologyoftheprogrammingorientedtoobjects. Inthewakeof this workwas obtainedaneworder for theset of intervalscomposedbynumbersofmachineandbasedonthisorderwasaccomplishedaextensionto evaluate functions dened to chunks, furthermore is given an example of the form of asusingthepackageJEPtoevaluatefunctionsvectorialofrealandcomplexvariable.Palabrasclaves: JavaMathematicalExpressionParserJEPEvaluadorInter-pretadorEvaluadordeexpresionesmatematicasEvaluadordefuncionescomplejasEvaluador defunciones vectoriales Evaluador defunciones denidas atrozos OrdenparaintervalosKeywords: JavaMathematicalExpressionParserJEPEvaluatorInterpretedEvaluatorofmathematicsexpressionsEvaluatorofcomplexfunctionsEvaluatorofvectorialfunctionsEvaluatoroffunctionsdenedtochunksOrderforintervalsNotadeaceptacionJuradoHectorManuelMoraEscobarJuradoHumbertoSarriaZapataDirectorAlvaroMauricioMontenegroDazBogota,D.C.Febrero5de2004Amipadres,hermanos,sobrinos, amigos y espe-cialmente a Dennis F.Guerrero.AgradecimientosElautorexpresasusagradecimientosa:AlvaroMauricioMontenegroDaz, Matematicoydirectordel trabajo, quiensiempremeaconsejo,orientoymeapoyoenlarealizaciondeestetrabajo.RodrigodeCastroKorgi, Matematico, quienmeayudoyorientoenlaediciondeltrabajoylapreparaciondeladefensade este.Henry Barragan Gomez, Licenciado en matematicas, quien con su gusto por esta cienciameinspiroparaestudiarlaymehaapoyadodurantetodoeltranscursodemicarrera.Dennis Fabiola Guerrero Ospina, Dise nadora graca, quien siempre me ha acom-pa nado,apoyadoymehabrindadosumanoenlosbuenosymalosmomentos.El computador es increblemente r apido, exacto yest upido. El hombre es increblemente lento, inexactoybrillante.Elmatrimoniodelosdosesunafuerzam asall adecualquierc alculo.LeoCherne(economista)IndicegeneralIntroducci on V1. Compiladoresylasherramientasparasuconstrucci on 11.1. Introduccionaloscompiladores . . . . . . . . . . . . . . . . . . . . . . . . . 11.1.1. Historiadeloscompiladores. . . . . . . . . . . . . . . . . . . . . . . 11.1.2. Lenguajesencomputacion. . . . . . . . . . . . . . . . . . . . . . . . 21.1.3. Traductoresdeprogramas . . . . . . . . . . . . . . . . . . . . . . . . 41.1.4. Fasesenlaconstrucciondeuncompilador . . . . . . . . . . . . . . . 61.2. HerramientasparalaconstrucciondecompiladoresenJava . . . . . . . . . 111.2.1. UnabrevehistoriadeJava . . . . . . . . . . . . . . . . . . . . . . . 111.2.2. Herramientasparalaconstrucciondecompiladores . . . . . . . . . . 122. AnalisisdelpaqueteJEP 182.1. Descripciondelpaqueteorg.nfunk.jep.type. . . . . . . . . . . . . . . . . 192.2. Descripciondelpaqueteorg.nfunk.jep.function . . . . . . . . . . . . . . 232.3. Descripciondelpaqueteorg.nfunk.jep . . . . . . . . . . . . . . . . . . . . 283. ManejoyusodeJEP 323.1. ManejoyusodelaclaseJEP . . . . . . . . . . . . . . . . . . . . . . . . . . 323.1.1. EjemplogeneraldelusodeJEP . . . . . . . . . . . . . . . . . . . . 363.1.2. Denicioneimplementaciondenuevasfunciones . . . . . . . . . . . 373.1.3. EjemplosdelusodelosmetodosdeJEP. . . . . . . . . . . . . . . . 40iINDICEGENERAL ii3.1.4. OperadoresdenidosenJEP . . . . . . . . . . . . . . . . . . . . . . 474. Unordentotalparaintervalosden umerosdemaquina 485. ManejoyusodelasextensionesdeJEP 535.1. EjemplogeneraldeunaextensiondeJEPafuncionesdeCnenCm. . . . . 535.2. DescripciondelpaqueteIntervalo. . . . . . . . . . . . . . . . . . . . . . . 545.2.1. Analisislexicogracoenintervalos . . . . . . . . . . . . . . . . . . . 555.2.2. Analisissintacticoenintervalos . . . . . . . . . . . . . . . . . . . . . 565.2.3. Notacionposja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585.2.4. Analisissemanticoenintervalos. . . . . . . . . . . . . . . . . . . . . 595.2.5. DescripciondelasclasesdelpaqueteIntervalo . . . . . . . . . . . 595.3. DescripciondelpaqueteFuncionTrozos . . . . . . . . . . . . . . . . . . . . 615.3.1. EjemplogeneraldelusodeFuncionTrozos . . . . . . . . . . . . . . . 645.3.2. EjemplosdelusodelosmetodosdeFuncionTrozos . . . . . . . . . . 665.3.3. EjemplodeunagracautilizandolaclaseFuncionTrozos . . . . . . 68Conclusiones 71A. GlosariodelosprincipalesterminosdeJava 73B.GramaticaqueespecicalasintaxisdelaherramientaJEP 77C.Teoradelosn umerosdemaquina 79D. Instalaci ondelpaqueteJEP 81Bibliografa 82Indicedetablas3.1. Funcionesadicionadasalanalizadorsintactico. . . . . . . . . . . . . . . . . 423.2. Funcionescomplejasadicionadasalanalizadorsintactico. . . . . . . . . . . 433.3. OperadoresdenidosenJEP. . . . . . . . . . . . . . . . . . . . . . . . . . . 474.1. Condicionesparatenerlaigualdadentreintervalos.. . . . . . . . . . . . . . 494.2. Condicionesparaladesigualdadestrictamentemenorqueentreintervalos. 50A.1. LostiposdedatosprimitivosenJava . . . . . . . . . . . . . . . . . . . . . 76iiiIndicedeguras1.1. Fasesdeuncompilador. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.2. EntradaysalidadelgeneradordeanalizadoreslexicosJTLex . . . . . . . . 141.3.Arbol con el cual se puede representar la expresion u(x, y) = exsen y+eycos x 162.1. NathanFunk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183.1. Ubicaciondelosparametrosdeunafuncionenunpila. . . . . . . . . . . . . 384.1. Deniciondeloscuatrotiposdeintervalosen /.. . . . . . . . . . . . . . . 495.1. Diagramadetransicionesparaelreconocimientodelexemas. . . . . . . . . 565.2. Diagramadetransicionesparaelparsingdeexpresionesaritmeticas . . . . 575.3. Diagramadetransicionesparaelparsingdelextremoinferior . . . . . . . . 585.4. Diagramadetransicionesparaelparsingdelextremosuperior . . . . . . . . 585.5. Ejemplodeunafunciondenidaatrozos . . . . . . . . . . . . . . . . . . . . 655.6. Gracadeunafunciondenidaatrozos . . . . . . . . . . . . . . . . . . . . 70ivIntroduccionDuranteel transcursodemi carrera, hetomadovarioscursosdeprogramaci onyal-gunosotrosenlosquesehaceusode estapararesolverproblemasmatem aticosdeformanumerica.Generalmentesiempreexistaunalgoritmopararesolverestosproblemas;peroenel programaenel cual seimplantabaestealgoritmosetenasiemprelamismade-ciencia:quesqueratrabajarconfunciones,estasdebanestarincluidasenelprograma,haciendoquedichoprogramasolamentefueseutilizadoparauncaracteracademicoynodeunaformaprofesional. Debidoaloanterior, siempremeencontreinsatisfechoconeltrabajorealizadoenestos cursos ycuandole preguntabaalos profesores laformadecomoresolvereseproblemaellosmerespondan: hayquetrabajaras, apesardeteneresadeciencia. Cuandolleguever los cursos avanzados delalneadeinformaticameencontre con el mismo inconveniente, pero en este momento, ya entenda que resolver esteproblemanoeratareafacil,aunquetenialaconvicciondequeyaestabaenlacapacidaddeintentardarsolucionamiinquietud.Loanteriormemotivoparatomarladecisiondequeeltemademiproyectodegradofueseestudiaryanalizarunadelaposiblessolucionesaeseproblema. Laintencionini-cialaldesarrollarestetrabajoeraladeconstruirunsencillointerpretadordeexpresionesmatematicas; peroduranteel dise nodel interpretadormetopeconqueyaalguienhabapensado en resolver este problema y que lo haba hecho en una forma excelente, implemen-tando esta solucion en el paquete (JEP) dise nado en el lenguaje de programacion Java; porlo tanto, ya no vala la pena esforzarse en dise nar un interpretador, sabiendo que ya existaunodelibreuso;delocual,setomoladecisionderealizarunanalisisdelaconstruccion,dise no y uso de este paquete para poder dar a conocer esta herramienta de programaci on ala comunidad matematica de la universidad, que podra hallar en esta la solucion a muchosproblemas que se presentan cuando se trabaja en problemas de matem atica aplicada en lacualsedeseerealizarlaevaluaciondeexpresionesmatematicasdeformasencilla,segura,eciente, conableygratuita. Otrodelos objetivos es el derealizar unaextensiondelpaqueteJEP,implementandounejemplodetrabajoconfuncionesvectorialesyeldise nodeunpaqueteconelcualsepudiesemanipularfuncionesdenidasatrozos.vINTRODUCCION viDuranteeldise nodelpaqueteparatrabajarconfuncionesdenidasatrozos,setuvolanecesidaddeimplementarunordentotalparaintervalos,puesencomputacion,traba-jarconconjuntosdesordenadosimplicaungrancostoenel tiempodeejecuci ondelosalgoritmos.Tambienesimportantetenerencuentadequecomoestetrabajotieneuncaracterdivulgativo, entoncesunodelosprincipalesobjetivosesel deponerenlaredpreferi-blementeenlapaginaWEBdel departamentodematematicasdelaUNlosresultadosobtenidos, los programas ejemploylos paquetes que se describeneneste documento,ademasdeestetexto.Eldocumentoestacompuestoporcincocaptulosdistribuidosdelasiguientemanera:en el primero se realiza una introduccion a la teora de los compiladores y las herramientaspara construirlos en el lenguaje de programacionJava, en el segundo se realiza un analisisdel dise no y construccion del paquete JEP, en el tercero un manual para el uso del paqueteJEP, el cual se puede estudiar directamente si el interes es de solo utilizar esta herramienta,enelcuartosehaceladeniciondelordenparaintervalosy lademostraciondequeesunorden total, en el quinto se encuentra un manual para el manejo de las funciones denidasa trozos, los intervalos y un ejemplo de la extension de JEP a funciones vectoriales. Ademasdeloanterior, secuentaconcuatroapendices, entreloscualessecuentaconunglosariodeterminostecnicosusadosenJava, lagramaticaqueespecicalasintaxisdeJEP, unaintroduccionalateoradelosn umerosdemaquinaypor ultimo, laformacorrectadecomosedebeinstalarelpaqueteJEP.AldocumentoseencuentraanexounCDquecontieneelpaqueteJEP,lasextensionesrealizadas,losejemplosilustradoseneldocumento,elAPIdeJavayeldocumentoPDFenformatoelectronico.Captulo 1Introduccionaloscompiladoresyalasherramientas para su construccion en Java1.1. Introduccionaloscompiladores1.1.1. HistoriadeloscompiladoresLapalabracompiladorseatribuyeconfrecuenciaaGraceMurrayHopper, quienvi-sualizolaimplementaciondeunlenguajedealtonivel,enformabastanteprecisaparalaepoca, comounacompilaciondeunasecuenciadesubrutinasdesdeunalibrera. Losprimerosesfuerzosparaimplementarlenguajestipoinglesocastellano, fueronhechosdeestamanera.Losprimeroscompiladorestipotraductorfueronescritosanalesdelos50s. Sehaotorgado ha FORTRAN (formula translator, formula traductora) el credito de ser el primerlenguaje compilado con exito. Tomo 18 a nos-hombre desarrollar el compilador FORTRAN,debidoaqueellenguajeseestabadise nandoalmismotiempoqueseimplementaba,yyaquefueporcompletounaprimicia,elprocesodetraduccionnofuebiencomprendido.JohnBackusencabezoelequipodedise noqueinventoheimplement oFORTRAN.EsdifcilhoyendaapreciarlosignicativodelpasodadoporFORTRANysucompilador.Enaquel tiempo, habaungranescepticismoconrespectoaqueunlenguajeseme-janteal ingles pudieradise narseytraducirseenalgoquelamaquinapudieraejecutarecazmente.Elhechodequelosproblemaspudieranescribirsemejorenlenguajedealtonivelempleandososticadasestructurasdedatosyestructurasdecontrolestabanapenascomenzandoacomprenderse. El refran: Losverdaderosprogramadoresutilizanlenguajeensamblador; erarmementeaceptado(aunquenoseexpresabadeestamanera!)pormuchas personas dedicadas a la computacion en esa epoca. Es sabido que un buen progra-1CAPITULO1. COMPILADORESYLASHERRAMIENTASPARASUCONSTRUCCION 2madordelenguajeensambladorpuede,inclusoenlaactualidad,escribirmejorcodigoenalgunos casos que el producido por un compilador, pero las ventajas de resolver un progra-ma utilizando las abstracciones encontradas en lenguajes de alto nivel son muy superiores,exceptoenunaminoradeloscasos.El compiladorFORTRANfuedise nadoparaobtenerel mejorc odigoposible(esde-cir, queseejecuteenformarapida)yas superarel escepticismoconrespectoaqueunlenguajetipoinglesqueseriaineciente. FORTRANsedise noconlanecesidaddepro-barse a s mismo, de modo que muchas de las caractersticas del lenguaje reejan su dise nopara la eciencia. FORTRAN carece de las sosticadas estructuras de datos (por ejemplo:registros, conjuntos, apuntadores, tipos enumerados) delos lenguajes mas recientes co-moPascal,Ada,C,Java;ademas,larecursividadnoestaenFORTRAN(debesimularsehaciendousodeunaestructuradepila).Ahora podemos dise nar e implementar un compilador mejor y mas rapido por muchasrazones.Enprimerlugar,loslenguajessecomprendenmejor.EllenguajeFORTRANfuedise nado al mismo tiempo que su compilador. En segundo, se han desarrollado herramien-tasquefacilitanalgunasdelastareasrealizadas(enparticular, paralasprimerasfasesdeuncompilador). Entercerlugaratravesdelosa nossehandesarrolladoestructurasdedatos yalgoritmos pararealizar tareas quesoncomunes alos compiladores. Final-mente, laexperienciaconlenguajesycompiladoreshadadocomoresultadoel dise noycaractersticasdelenguaje,adecuadasparalascualesesmasfacilescribiruncompilador.1.1.2. LenguajesencomputacionLenguajesdeprogramaci onUn lenguaje de programacion permite al usuario crear programas que seran entendidosporelordenador(directaoindirectamente)conelobjetivoderealizaralgunatarea.A grandes rasgos se pueden clasicar los lenguajes de programacion en tres categoras:maquina,bajonivel(ensamblador)yaltonivel.LenguajedemaquinaLos lenguajes de maquina son aquellos cuyas instrucciones son directamente entendiblesporel ordenadorsinnecesidaddetraduccionalguna. Susinstruccionesnosonmasquesecuencias de ceros y unos (bits). Estas especican la operacion a realizar, los registros delprocesadoryceldasdememoriaimplicados,etc.Obviamente, estetipodelenguajes seranfaciles decomprender paraunordenadorperomuydifcilesparaelhombre.Estarazoneslaquellevaabuscarotrolenguajeparaqueloshombressepuedancomunicarconelordenador.CAPITULO1. COMPILADORESYLASHERRAMIENTASPARASUCONSTRUCCION 3Lenguajesdebajonivel(ensamblador)Laprogramacionenlenguajemaquinaesdifcil, porellosenecesitanlenguajesquepermitan simplicar este proceso. Los lenguajes de bajo nivel han sido dise nados para esten.Estos lenguajes son generalmente dependientes de la maquina, es decir, dependen de unconjuntodeinstruccionesespecicasdelordenador.Unejemplodeestetipodelenguajeses el ensamblador. Enel, las instrucciones seescribenencodigos alfabeticos conocidoscomomnemotecnicos(generalmente,abreviaturasdepalabrasinglesas).Laspalabrasmnemotecnicassonmuchomasfacilesderecordarquelassecuenciasdeceros y unos. Una instruccion tpica de ensamblador puede ser: ADD x,y,z; esta instruccionsignicaraquesedebensumarlosn umerosalmacenadosenlasdireccionesdememoriaxyy,yalmacenarelresultadoenladireccionz.Peroa unas,amedidaquelosprogramascrecen en tama no y complejidad, el ensamblador sigue sin ser una buena solucion. Se pasaentoncesasaloslenguajesdealtonivel.LenguajesdealtonivelLoslenguajesdealtonivel sonaquellosenlosquelasinstruccionesosentenciassonescritasconpalabrassimilaresalasdeloslenguajeshumanos(enlamayoradeloscasos,el Ingles). Estofacilitalaescrituraycomprensiondel codigoal programador. Existenmuchoslenguajesdealtonivel,porcitaralgunos: AdaSmallTalkCobolFortran Modula-2PascalCC++ VisualBasicVisualC++DelphiJavaLosprogramasescritosenlenguajedealtonivel nosonentendiblesdirectamenteporlamaquina.Necesitansertraducidosainstruccionesenlenguajemaquinaqueentiendanlosordenadores. Losprogramasquerealizanestatraduccionsellamancompiladores, ylosprogramasescritosenlenguajesdealtonivelsedenominanprogramasfuente.ProgramasfuenteyobjetoUnprogramapuedeserdenidocomounconjuntodeinstruccionesquepuedensome-tersecomounidadaunordenadoryutilizarseparadirigirelcomportamientode este.Un programa fuente es aquel que nos permite escribir un algoritmo mediante un lengua-jeformal. Poreso, al codigodesarrolladoal realizarlaprogramaci onselellamacodigofuente. Unprogramaobjetoesel resultadodetraducirunprogramafuenteparaobtenerunlenguajecomprensibleporlamaquina.CAPITULO1. COMPILADORESYLASHERRAMIENTASPARASUCONSTRUCCION 41.1.3. TraductoresdeprogramasLostraductoressonuntipodeprogramascuyafuncionesconvertirel codigodeunlenguajeenotro.Porejemplouncompilador,quetraducecodigofuenteencodigoobjeto.Existendistintostiposdetraductores,entreellosdestacan:EnsambladoresPreprocesadoresInterpretesCompiladoresEnsambladoresEsuntipodetraductorqueconvierteprogramasescritosenlenguajeensambladoraprogramasescritosencodigodemaquina.PreprocesadoresTraduce un lenguaje de alto nivel a otro, cuando el primero no puede pasar a lenguajedemaquinadirectamente.InterpretesSon programas que ejecutan instrucciones escritas en un lenguaje de alto nivel. Existenvariasformasdeejecutarunprogramayunadeellasesatravesdeuninterprete. Uninterpretetraduceinstruccionesdeunlenguajedealtonivel aunaformaintermedialacual esejecutada. Porel contrarioloscompiladorestraduceninstruccionesdealtoniveldirectamentealenguajedemaquina.Laventajadeuninterpreteesqueestenonecesitapasarportodaslasetapasdeuncompiladorparagenerarlenguajedemaquina,pero esteprocesopuedeserconsumidordetiemposielprogramaesmuygrande.Porotrolado,elinterpretepuedeejecutarinmediatamenteprogramasenlenguajesdealtonivel.CompiladoresSonprogramasquetraducencodigofuenteaprogramasescritosencodigoobjeto. Elcompiladorderivasunombredelamaneraenquetrabaja, buscandoentodoel codigofuente,recolectandoyreorganizandolasinstrucciones.Uncompiladordieredeuninter-preteenqueelinterpretetomacadalneadecodigo,laanalizayejecuta,mientrasqueelcompiladormiraelcodigoporcompleto.CAPITULO1. COMPILADORESYLASHERRAMIENTASPARASUCONSTRUCCION 5Loscompiladoresrequierendeuntiempoantesdepodergenerarunejecutable, sinembargolosprogramascreadosconcompiladoresseejecutanmuchomasrapidoqueelmismoprogramaejecutadoconuninterprete.Dadoqueloscompiladorestraducencodigofuenteacodigoobjeto, el cual es unicoparacadatipodemaquina,existenm ultiplescompiladoresparaunmismolenguaje.Porejemplo:ellenguajeCtieneuncompiladorparaPC,otroparaAppleMacintosh;ademasexisten muchas casas que desarrollan compiladores para una misma plataforma y un mismolenguaje,porejemploMicrosoftyBorlandtienencompiladorespropiosparaC.programaobjetoprogramafuentegeneradordecodigooptimizadordecodigogeneradordecodigointermedioanalizadorsemanticoanalizadorsintacticoanalizadorlexicoadministradordelatablasdesmbolosmanejadordeerroresFigura1.1:Fasesdeuncompilador.En la compilacion se pueden detectar dos grandes fases muy bien diferenciadas, la fasedelan alisis y la fase de la sntesis, ademas de estas fases,uncompilador realiza las tareasdeadministrarlatabladesmbolosyrealizarelmanejodeerrores.Duranteelanalisissedeterminan las operaciones que implica el programa fuente y se registran en una estructurajerarquicallamadaarbol. Amenudoseusaunaclaseespecial dearbol llamado arbol desintaxisabstracta(AST)(tambienseleconocecomo arbol desintaxisabstracta(AAS)),donde cada nodo representa una operacion y los hijos son los argumentos de la operacion.CAPITULO1. COMPILADORESYLASHERRAMIENTASPARASUCONSTRUCCION 6Lafasedeanalisisseencuentracompuestaportresfases:Elanalisislexico,elanalisissintacticoyelanalisissemantico.La parte de sntesis construye el programa objeto deseado a partir de la representacionintermedia; estafasetambienestacompuestaporotrastresfases: Generaciondecodigointermedio,optimizaciondelcodigoygeneraciondecodigo.MetalenguajesUn metalenguaje describe a otro lenguaje o algunos aspectos de otro lenguaje. Existendiversosmetalenguajesquesonmuyconocidos, lasexpresionesregularesparadescribirtokens, la notacion BNF (Forma de Backus-Naur) para describir la sintaxis de los lenguajesdeprogramacionolasgramaticasatribuidasparadescribirlasem anticadeloslenguajesa nadiendoatributosyfuncionessemanticasalanotacionBNF. Algunosmetalenguajespuedenusarseparadescribirseaellosmismos.Lasprincipalespropiedadesquedeberatenerunmetalenguajeson:Facildeleer,aprenderyusar.Integrado, quetenganotacionessimilaresparalasfuncionesatravesdelasdifer-entes partes del generador. Por ejemplo, el smbolo=deberaser usadocomooperadordeasignacionparalapartedelasexpresionesregulares,lasintaxisyfun-cionessemanticas.Deformaanalogaaloslenguajesdeprogramacion,nodeberaincorporarconstruc-cionesquepermitancometererroresfacilmente.1.1.4. FasesenlaconstrucciondeuncompiladorAnalisislexicogracoElanalizadorlexicogracotambienconocidocomolexicador oesc aner,eslaprimerafase de un compilador. Su principal funcion consiste en leer los caracteres de entrada, agru-parlosensecuenciasdecaracteresqueformanuncomponentelexico(lexemas),clasicarestos en categoras y elaborar como salida una secuencia de componentes lexicos (tokens),en el desarrollo de este trabajo realmente se pueden distinguir dos tareas separadas: rastreoyltrado.Enel rastreo se mueve unapuntador atraves de laentradauncaracter alavezparahallar cadenas continuas decaracteres, las cuales constituyenelementos textualesindividuales, yclasicacadaunadeacuerdoconsutipo. Enestepuntocadavezqueseencuentra un lexema, se crea un nuevo token, el cual esta compuesto por su tipo de acuerdoasuclasicacionylosatributosovaloresquerepresentenel lexemacorrespondiente;untokenpuedeserrepresentadodelasiguienteforma:Token=(Tipo,Atributos).CAPITULO1. COMPILADORESYLASHERRAMIENTASPARASUCONSTRUCCION 7En el ltradose descartan algunos de los tokens encontrados por el rastreador (espaciosen blanco, saltos de lnea, tabulaciones y comentarios), ademas se determinan cuales otrossonsmbolos reservados (palabras clave, identicadores, operadores, etc), ycoloca losdemastokensenlatabladenombres.Elanalizadorlexicogracopasaalanalizadorsintacticocadaunodelostokensencon-trados. Enocasiones, loqueespasadoesunapuntadoralatablaquecontieneel valordeltoken.Puedehabertablasseparadasparanombres,constantesnumericas,cadenasdecaracteresconstantesyoperadores,opuedehaberunatablaqueincluyatodoloanterior.Reconocimientodecomponentes lexicos: Comoel problemadel cual seencargael analizadorlexicogracoes: Dadaunacadenadecaracteres, dividirestacadenaenloscomponenteslexicosquelaconforman.Existentresformalismosomodeloscomunesparaladescripciondelostiposdetokens:1. Expresionesregulares. Lasexpresionesregularesdescribenlostokenscomoel con-juntodecadenaspermitidasenunlenguaje.2. Diagramasdetransici on.Losdiagramasdescribenlostokenscomolascadenasper-mitidasquetomenel diagramadesdeunestadoinicial hastaunestadonal odeaceptacion.3. Gram aticas regulares. Las gramaticas regulares describen los tokens como las cadenasgeneradasporunaGramaticaIndependientedelContexto(GIC).AnalisissintacticoogramaticalElanalisissintacticotambienconocidocomoparsingoparser,eselprocesodedeter-minar si una cadena de componentes lexicos puede ser generada por una gramatica. En elestudio de este problema, es util pensar en construir un arbol de sintaxis abstracta, aunque,dehecho, uncompiladornoloconstruya. Sinembargo, unanalizadordeberapodercon-struirelarbol,puesdeotromodo,nosepuedegarantizarquelatraduccionseacorrecta.La mayora de los metodos de analisis sintactico se encuentran clasicados en dos clases:losmetodosdescendentesyascendentes. Estoterminoshacenreferenciaal ordenenqueseconstruyenlosnodosdelarboldesintaxisabstracta.Enelprimero,laconstrucci onseiniciaenlarazyavanzahacialashojas, mientrasqueenel segundo, laconstruccionseiniciaenlashojasyavanzahacialaraz.Gramaticas: Lasgramaticasdescribenlenguajes, loslenguajesnaturalescomoel es-pa nol, oel ingles, sonamenudodescritos por unagramaticaque agrupapalabras encategorassintacticastalescomosujetos,predicados,frasespreposicionales,etc.CAPITULO1. COMPILADORESYLASHERRAMIENTASPARASUCONSTRUCCION 8Matematicamente, una gramatica es un dispositivo formal para especicar un lenguajepotencialmenteinnito, enunamaneranita, puestoquees imposibleenumerar todaslacadenasdecaracteresenunlenguaje, yaseaunlenguajenatural (espa nol, ingles)ounlenguajedeprogramacion(C,Pascal,Java).Almismotiempo,unagramaticaimponeuna estructura de sentencias en el lenguaje. Es decir, una gramatica G, dene un lenguajeL(G)medianteladeniciondeunamaneraparaderivartodaslas cadenasenellenguaje,esdecirconunagramaticasedeseapoderdescribirunlenguajeespecico, porlotantounagramaticaesunmetalenguaje.Enlaconstrucciondecompiladoresexisteunaclaseparticulardegram aticasdenomi-nadasgramaticasindependientesdelcontexto(GIC),con estassepuedevericarsi,dadauna cadena de componentes lexicos, entonces dicha cadena es sintacticamente correcta, deacuerdoalaconstruccionespecicadaenellenguajedeprogramacionenestudio.Analisis sintactico descendente: Como se explico anteriormente en el analisis sint acti-codescendentesepuedeconsiderarcomounintentodeconstruirunarboldesintaxisab-stractaparalaentradacomenzandodesdelarazycreandolosnodosdelarbolenordenprevio.Estetipodeanalizadoresfrecuentementeseconsiderancomoanalizadorespredic-tivos puesto que, en cualquier etapa, intentan predecir el nivel inferior siguiente del arbol.Estaprediccionsehaceexaminandoel siguientetokenenlaentradayel arbol actual,eligiendolaproduccionparaelsiguientenodohijo.Analisissintacticoascendente: Enel analisissintacticoascendentelaconstrucci ondelarbolsintaxisabstractaserealizadeabajohaciaarriba,esdecirdesdelahojashastalaraz. Enestetipodeanalisissetomalacadenadecomponenteslexicosyseleendederechaaizquierda, tomandoel tokenquesedeseaanalizar, intentandosabercual eseltokenpadredelosqueseencuentrenalaizquierdadeeste, as seformael arbol si lacadenaessintacticamentecorrecta.AnalisisSemanticoLa fase de analisis semantico revisa el programa fuente para tratar de encontrar erroressemanticosyre unelainformacionsobrelostiposparalafaseposteriordegeneraciondecodigo. Enellase utilizalaestructurajerarquicadeterminadapor lafase del analisissintacticoparaidenticarlosoperadores, operandosdeexpresionesyproposiciones. Conbaseenelarboldesintaxisabstractaconstruido,enelcuallosoperadoresaparecencomolos nodos interiores y los operandos de un operador son los hijos del nodo para ese operador.El trabajo que se realiza en el analisis semantico mediante el uso de este arbol se denomina:traducciondirigidaporlasintaxis.Uncomponenteimportantedelanalisissemanticoeslavericaciondetipos.Aqu,elcompiladorvericasicadaoperadortieneoperandospermitidosporlaespecicaciondelCAPITULO1. COMPILADORESYLASHERRAMIENTASPARASUCONSTRUCCION 9lenguajefuente.Traducci ondirigidaporlasintaxis: Paratraducirunaconstrucciondeunlenguajedeprogramacion, uncompiladorpuedenecesitartenerencuentamuchascaractersticas,ademasdelcodigogeneradoparaconstruccion.Porejemplo,puedeocurrirqueelcompi-ladornecesiteconocereltipodelaconstruccion,laposiciondelaprimerainstrucciondelcodigo objeto o el n umero de instrucciones generadas. Por tanto, los atributos pueden rep-resentarcualquiercantidad, porejemplo: untipo, unacadena, unaposiciondememoriaocualquierotracosa.El formalismollamadotraducciondirigidapor lasintaxis, sirve paraespecicar latraduccion de una construccion de un lenguaje de programacion en funcion de los atributosasociadosconsuscomponentessintacticos.Generaci ondec odigointermedioDespues del analisis sintacticoysemantico, algunos compiladores generanunarep-resentacionintermedia explcita del programa fuente. Se puede considerar esta repre-sentacionintermediacomounprograma(que yapuede ejecutarse) paraunamaquinaabstracta. Estarepresentacionintermediadebetenerdospropiedadesimportantes: debeserfacildeproduciryfacildetraduciralprogramaobjeto.Optimizaci ondec odigoLa fase de optimizacion cambia el codigo intermedio transformandolo en una forma dela que se pueda producir codigo objeto mas eciente, es decir, en la fase nal de generaciondecodigoseproduciracodigoqueseejecutemasrapidooqueocupemenosespacio(oambascosas). Lasexigenciastradicionalmenteimpuestasauncompiladorsonduras. Elcodigodesalidadebesercorrectoydegrancalidad,loquesignicaquedebeutilizardeformaecazlosrecursosdelamaquinaobjeto.Ademaselgeneradordecodigoconelquese esteconstruyendoelcompiladortambiendebeejecutarseecientemente.Matematicamente, el problemadegenerar codigooptimoes indecidible1. Enlapractica, hayqueconformarsecontecnicas heursticas quegenerancodigobuenoperonosiempreoptimo. Laelecciondelasheursticasesimportante, yaqueunalgoritmodegeneraciondecodigocuidadosamentedise nadopuedeproducirfacilmentecodigoqueseavariasvecesmasrapidoqueelproducidoporunalgoritmodise nadoprecipitadamente.1Unproblema encomputacionse dice indecidible, s no existe unalgoritmo para resolver dichoproblema.Paramasdetallesvease[JHM02].CAPITULO1. COMPILADORESYLASHERRAMIENTASPARASUCONSTRUCCION 10Generaci ondec odigoLafasenaldeuncompiladoreslageneraciondecodigoobjeto,en estasetraducelarepresentacionintermediaacodigodemaquina(generalmenteseusaunlenguajeensam-blador). Lasposicionesdememoriaseseleccionanparacadaunadelasvariablesusadaspor el programa. Despues, cadaunadelas instrucciones intermedias setraduceaunasecuencia de instrucciones de maquina que ejecuta la misma tarea. Un aspecto decisivo eslaasignaciondevariablesaregistros.Administraci ondelatabladesmbolosUnafuncionesencial esregistrarlosidenticadoresutilizadosenel programafuenteyreunirinformacionsobrelosdistintosatributosdecadaidenticador. Estosatributospueden proporcionar informacion sobre la memoria asignada a un identicador, su tipo, suambito (la parte del programa donde tiene validez) y, en caso de nombres de procedimien-tos, cosas como el n umero y tipos de sus argumentos, el metodo de pasar cada argumento(porej.porreferenciaoporvalor)yeltipoquedevuelve,silohay.Unatabladesmbolosesunaestructuradedatosquecontieneunregistroporcadaidenticador, conloscamposparalosatributosdel identicador. Laestructuradedatospermiteencontrarrapidamenteel registrodecadaidenticadoryalmacenaroconsultarrapidamentedatosdeeseregistro.ManejadordeerroresEncadafaseenquesedesarrollauncompiladorsepuedenencontrarerrores.Sinem-bargo, despues de detectar un error, cada fase debe tratar de alguna forma ese error, parapodercontinuarlacompilacion, permitiendoladetecciondemaserroresenel programafuente. Un compilador que se detiene cuando encuentra el primer error, no resulta tan utilcomodebiera.Parael manejodeerroressepuedencaracterizarcuatroprocedimientosquedebere-alizaruncompiladorparatrataresteproblema:Creaciondeerrores.Detecciondeerrores.Informedeerrores.Recuperaciondeerrores.Lamayorpartedeloscompiladoresgastanunagrancantidaddetiempoyespaciomane-jandoloserrores.LasfasesdeanalisissintacticoysemanticoporlogeneralmanejanunaCAPITULO1. COMPILADORESYLASHERRAMIENTASPARASUCONSTRUCCION 11granporciondeloserroresdetectablesporel compilador. Lafaselexicapuededetectarerroresdondeloscaracteresrestantesdelaentradanoformanning uncomponentelexi-codel lenguaje. Loserroresdondelacadenadecomponenteslexicosviolanlasreglasdeestructura(sintaxis)del lenguajesondeterminadosporlafasedeanalisissintactico. Sisedetectaunaconstruccionincorrectadelaestructurasintacticadeunprograma, enelanalisis semantico se debe detectar este error; generalmente los errores de este tipo son losdeusodevariablesnodeclaradasyunincorrectousodelasoperacionesimplcitasenelprogramafuente.1.2. HerramientasparalaconstrucciondecompiladoresenJava1.2.1. UnabrevehistoriadeJava2En1990, SunMicrosystems, Inc. nanciounproyectodeinvestigacioncorporativollamado Green, cuyo n era el de desarrollar software destinado a electronica de consumo.Para desarrollar este proyecto se conformo un equipo de investigacion al cual pertenecan:PatrickNaughton, ChrisWarth, EdFrank, MikeSheridanyJamesGosling, esteultimounveteranoeneldise noclasicodesoftwaredered,yquienestabaalacabezadelgrupo.EnuncomienzoseempezoaescribirsoftwareconC++paraincrustarloenaparatoscomotostadoras,videosyasistentespersonalesdigitalesoPDAs.Elsoftwareincrustadoseutilizoparacrearelectrodomesticosmasinteligentes, a nadiendolesdisplaysdigitalesoutilizando inteligencia articial para controlar mejor los mecanismos. Sin embargo, prontosedieroncuentadequeC++eraunaherramientainadecuadaparaestetrabajo. C++eslosucientementeexibleparacontrolarsistemascontroladores, peroessusceptibleaerroresquepuedendetenerel sistema. Enparticular, C++utilizareferenciasdirectasalosrecursosdel sistemayrequiere, porpartedel programador, seguirel rastrodecomose manejan estos recursos lo que supone una carga signicativa a los programadores. Estacargaenlagestionde los recursos del sistemaes labarreraparalaprogramaciondesoftwareableyportatil,yfueunproblemaserioparalaelectronicadeconsumo.La solucion dada a este problema fue un nuevo lenguaje llamado Oak. Oak preservo unasintaxis similar a la de C++ pero omite las caractersticas potencialmente peligrosas comoreferencias de recursos explcitas, La aritmetica de punteros y la sobrecarga de operadores.Oakincorporabagestiondememoriadentrodellenguajedeunaformadirecta,liberandoal programadordeconcentrarseentareasqueel propioprogramadeberadesempe nar.Para conseguir que fuese un lenguaje de programacion de sistemas controladores eciente,Oak necesitaba poder responder a eventos provenientes del exterior en cuestion de microse-gundos. Tambien era necesario que fuese portatil; esto es, que fuese capaz de ejecutarse en2TomadadellibroLaBibliadeJava, vease[VPH97]CAPITULO1. COMPILADORESYLASHERRAMIENTASPARASUCONSTRUCCION 12undeterminadon umerodechipsyentornosdiferentes.Estaindependenciadelhardwarepodraproporcionaralfabricantedeunatostadoracambiarelchipqueutilizaparahac-erlafuncionarsinnecesidaddecambiarelsoftware.Elfabricantepodrautilizartambienpartes del mismo codigo que utiliza la tostadora para funcionar, digamos en un horno congratinador; esto podra reducir costos, tanto de desarrollo como de hardware, aumentandotambien su abilidad. Al tiempo que Oak maduraba, la World Wide Web se encontraba ensu periodo de dramatico crecimiento y el equipo de desarrollo de Sun, se dio cuenta de queOak era perfectamente adecuado para la programacion en Internet. En 1994, completaronsutrabajoenunproductoconocidocomoWebRunner, unprimitivovisor WebescritoenOak. WebRunnerserenombroposteriormentecomoHotjavaydemostroel poderdeOak como herramienta de desarrollo en Internet. HotJava es bien conocido en la industria.Finalmente, en 1995, Oak se cambio porJava (porrazonesdemarketing) y se presento enSunWorld1995.Inclusoantesde la primera distribuciondel compiladordeJava enJuniode1996,Javaerayaconsideradocomoestandarenlaindustriaparalaprogramaci onenInternet.Enlosprimerosseismesesde1996,existanyaungrann umerodecompa naslderes,tanto de software como de hardware, con licencia de Sun de la tecnologa Java. Entre ellaspodramos incluir Adobe, Asymetrix, Borland, IBM, Macromedia, Metrowerks, Microsoft,Novell, Oracle, SpyglassySymantec. EstasyotraslicenciasdeJava, incorporanaJavaensusproductosdeescritorio,sistemasoperativosyherramientasdedesarrollo.1.2.2. HerramientasparalaconstrucciondecompiladoresPocodespuesdeescribirseelprimercompilador,aparecieronsistemasparaayudarenel procesodeescrituradecompiladores. Amenudosehacereferenciaaestos sistemascomo:compiladoresdecompiladores,generadoresdecompiladoresosistemasgeneradoresdetraductores.Engranparte,seorientanentornoaunmodeloparticulardelenguaje,ysonmasadecuadosparagenerarcompiladoresdelenguajessimilaresaldelmodelo.Porejemplo,estentadorsuponerquelosanalizadoreslexicosparatodosloslenguajessonenesenciaiguales,exceptoporlaspalabrasclaveysignosparticularmentequesere-conocen. Muchos compiladores de compiladores de hecho producen rutinas jas de analisislexicoparausarenel compiladorgenerado.Estasrutinassolodierenenlaslistasclavequereconocen,yestalistaestodoloquedebeproporcionarelusuario.Elplanteamientoes valido, pero puede no ser funcional si se requiere que reconozca componentes lexicos noestandares, como identicadores que pueden incluir ciertos caracteres distintos de letras ydgitos.Sehancreadoalgunasherramientasgeneralesparael dise noautomaticodecompo-nentes especcos de compilador. Estas herramientas utilizan lenguajes especializados paraespecicareimplantarel componente, ypuedenutilizaralgoritmosbastantecomplejos.Las herramientas mas efectivas son las que ocultan los detalles del algoritmo de generacionCAPITULO1. COMPILADORESYLASHERRAMIENTASPARASUCONSTRUCCION 13yproducencomponentesquesepuedenintegrarconfacilidadalrestodelcompilador.GeneradoresdeanalizadoreslexicosUnaformasencilladecrear unanalizador lexicoconsisteenlaconstrucciondeundiagramaqueilustrelaestructuradeloscomponenteslexicosdel lenguajefuente, yde-spues hacer latraduccionamanodel diagramaenunprogramaparaencontrar loscomponenteslexicos,deestaforma,sepuedenproduciranalizadoreslexicosecientes.Escribiranalizadoreslexicosecientesamanopuederesultarunatareatediosa; paraevitarestetrabajosehancreadoherramientasdesoftwarequegeneranautomaticamenteanalizadores lexicos.Estos generanunanalizador lexicoapartir de unaespecicacionprovistaporel usuarioapartirdeunaespecicacionbasadaenexpresionesregularesoautomatasnitos.PuedeasegurarsequelaherramientadeltipomencionadomasconocidaesLex3. Lexes ungenerador deanalizadores lexicos, originalmenteincluidodentrodel ambientededesarrollodeUNIXusandoaCcomolenguajehuespedyposteriormentemigradoacasitodas las plataformas ylenguajes. Otraherramientaque ultimamente hatenidograndifusiones JTLex, queusaaJavacomolenguajehuespedycorrespondeal compiladordecompiladores JavaCup; mientras quealgunos compiladores decompiladores actualescomoJavaCCyEli, integranlaespecicaciondel analisislexicosinbrindarunmoduloespecco.Todasestasherramientasparageneraranalizadoreslexicospermitendenirlasintaxisdelossmbolosmedianteexpresionesregulares,mientrasquesusatributosdebenser computados luegodel reconocimientodeunasubcadenaqueconstituyaunsmbolodel lenguaje, analizandola. JTLexencambiopermiteexpresarconjuntamentesintaxisysemantica al estilo de la traduccion dirigida por la sintaxis. A su vez el proceso de computode atributos es implementado por JTLex por un automata nito traductor con las ventajasdeecienciaqueestosupone.JTLexsigueelestilodeLex,conlavariantedequesebasaenexpresionesregulares. CuandoJTLexreconoceunasubcadenavagenerandoaccionesapareadas a sus caracteres, se puede por lo tanto pensar enla secuencia de accionesgeneradacomounatraduccionde lasubcadenareconocida. Latraduccionse produceteniendocomoalfabetodeentradaalconjuntodecaracteresycomoalfabetodesalidaalconjuntodeacciones.PorestemotivoaltipodeformalismosquesustentanaJTLexseloha denominado expresiones regulares traductoras (ET). Una expresion regular traductora(ET) es una expresion regular en la cual los terminos estan constituidos por pares caracter-accion. DentrodelasETpodemoscaracterizarlasexpresionesregularescontraduccion unica(ETU),aquellasalasqueacadacadenadeentradacorrespondeuna unicacadenadesalida.Enlagura1.2seilustracomoact uaungeneradordeanalizadoreslexicos,enparticular JTLex, en este el usuario realiza la especicacion del analizador lexico y luego dequeJTLexrealizasutrabajo,seobtieneelanalizadorlexico,implementandoelalgoritmo3Paradetallesdelusodeestaherramientavease[ASU90].CAPITULO1. COMPILADORESYLASHERRAMIENTASPARASUCONSTRUCCION 14generalylaestructuradedatosnecesaria.EspecicadordelAnalizadorlexicoGeneradordeAnalizadoreslexicos(JTLex)EstructuradedatosyaccionesAlgoritmogeneralAnalizadorlexicoFigura1.2:EntradaysalidadelgeneradordeanalizadoreslexicosJTLexGeneradoresdeanalizadoressintacticosEstos generadores producen analizadores sintacticos, normalmente a partir de una en-tradafundamentadaenunagramaticaindependientedelcontexto.Enlosprimeroscom-piladores, el analisissintacticoconsumanosolopartedel tiempodeejecuciondel com-pilador, sinogranesfuerzointelectualparaescribirlo.Estafaseseconsideraactualmenteunadelasmasfacilesdeaplicar. Muchosdelosgeneradoresdeanalizadoressint acticosutilizanpoderosos algoritmos deanalisis sintactico, quesondemasiadocomplejos pararealizarlosmanualmente.UnodelosanalizadoressintacticosmasutilizadosesYACC4(Yet AnotherCompiler-Compiler,a unotrocompiladordecompiladores),elcualcasillegoadominarlaescenade los generadores de compiladores de maneratal, que muchas herramientas usanunlenguaje de especicacion parecido al suyo, y otras son clones de YACC para la generacion decompiladores con otros lenguajes de programacion. Despues del surgimiento de YACC se haavanzadomuchoencuantoalenguajesdeprogramacion,sistemasoperativos,tecnologasde hardware y procesamiento de lenguajes; por tanto las razones que justicaron decisionesde dise no dependientes de la disponibilidad de recursos en alguna de estas areas en la epocadesusurgimiento,sonanacronicasenmomentosactuales.Se basa en el modelo puro de gramaticas independientes del contexto, aunque permiteelaccesoalapilasemanticadelanalizadorsintactico,queesLALR(1)conreglasdede-sambiguacion.Este toma una descripcion concisa de una gramatica y produce rutinas en Cque pueden analizar esta gramatica. La especicacion es monoltica, y siguiendo la losofade UNIX de especializacion de las herramientas, solo genera el analizador sintactico, el lex-icograco se debe generar por separado con LEX, su compa nero inseparable, o programarloporsmismo.NormalmenteYACCnoesmasrapidoqueunogeneradomanualmente,pero4EscritoporS.C.Johnsonen1974.Paradetallesdelusodeestaherramientavease[ASU90].CAPITULO1. COMPILADORESYLASHERRAMIENTASPARASUCONSTRUCCION 15esmasfacildeescribirymodicar.JavaCC5es unanuevaherramientaescritaenJavaycreadapor SunMicrosystemsquegeneraanalizadoressintacticosconlosanalizadoreslexicosincluidos.JavaCCsigueelestilodeherramientasindependientes, cuyainteraccionesporlalneadecomandos. Adiferencia deYACC no hay un solo smbolo inicial no-terminal. EnJavaCC, se puede iniciarelanalisissintacticoconrespectoacualquierno-terminalenlagramatica.LaproduccionBNF(formaBackur-Naur), es laproduccionestandar utilizadaenlaespecicaciondegramaticasenJavaCC. CadaproduccionBNFtieneunladoizquierdo,elcualeslaespecicaciondeunno-terminal;laproduccionBNFdespuesdeneesteno-terminal en terminos de expansiones BNF en el lado derecho de la producci on. EnJavaCClos no-terminales son escritos exactamente como un metodo declarado en Java. El nombredel no-terminal es el nombre del metodo, y los parametros y valores de retorno declaradossonlosmismosquepasanporarribayabajodelarboldesintaxisabstracta.JavaCC usa expresiones regulares para el analisis lexicograco; para el analisis sintacticogenera un analizadorsintacticorecursivo LL(k), utilizando gramaticas LL(k) . En losanalizadoressintacticosgeneradosporJavaCCsetomandecisionesenpuntosdeseleccionbasados enalgunaexploraciondecomponentes lexicos por adelantadoenlacadenadeentrada y entonces deciden que camino seguir, es decir, ning un retroceso es ejecutado, solouna decision es hecha. En un analizador sintactico LL(k), la krepresenta los componenteslexicos que se deben tomar por adelantado para llevar a cabo el analisis6, y en JavaCC la kpuede ser tan grande como sea necesario. Las gramaticas incluyen la operacion de clausuray la estructura opcional, pudiendose insertar las acciones semanticas en cualquier lugar dela produccion. Para el reconocimiento usa lookahead local, que puede ser combinado conlookaheadsintacticoylookaheadsemantico.Enlaimplementaci onseusaelmetodorecursivo descendente, generandose una clase de Java la cual contendra un metodo publicoporcadano-terminaldenidoenlagramatica.Las acciones semanticas pueden escribirse en Java o cualquier extension a este lenguaje,yaqueel generador solochequealos delimitadores delas acciones semanticas. Nohaynecesidaddesepararlaespecicaciondel analizadorlexicogracodel sintactico, aunquedeestarpresentesenel archivo, puedegenerarsecodigosoloparaunadeellassi as sedesea. Si se desea depurar errores en el analizador, en el momento de generarlo esto debe serespecicado.Estahacequeseimprimaunatrazadelaejecuci on,quepuedepedirseparaelanalizadorlexicogracooelsintacticodeformanoexclusiva.Enelcasodelanalizadorsintactico, puedepedirsequeseincluyanenlatrazalasaccionesdelasoperacionesdelookahead.JavaCC por defecto chequea la existencia de recursividad izquierda, ambig uedad con unlookaheadlimitado,usodeexpansionesenlacadenavaca,entreotros.Opcionalmente5Para una obtener la documentacion completa de esta herramienta visite la pagina webhttp://javacc.dev.java.net/.6Aesteprocedimientotambienseleconocecomolookahead.CAPITULO1. COMPILADORESYLASHERRAMIENTASPARASUCONSTRUCCION 16puede pedirse que se chequee laambig uedad, pasandopor altolas especicaciones delookaheaddelagramatica.JJTreedeJavaCCJJTreees unpreprocesador paraJavaCCque insertaarboles de sintaxis abstracta(AST)integrandoaccionesenvarioslugaresenlafuenteJavaCC.LasalidadeJJTreeesejecutadaatravesdeJavaCCparacrearelanalizadorsintactico.Por defectoJJTreegeneracodigoparaconstruir los nodos del ASTparacadano-terminal en el lenguaje. Este comportamiento puede ser modicado de manera que algunosno-terminalesnotengannodosgenerados.JJTreedeneunainterfaceJavallamadaNodequetodoslosnodosdel ASTdebenimplementar. La interface provee metodos para operaciones tales como: congurar el padredelnodo,agregarhijosyrecuperarlos,ademasdequeacadanodoselepuedeasociarunconjuntodeatributoscomountipo, unacadena, unaposiciondememoriaocualquierotracosa.DeestamaneraconJJTreesepuedemanipularalarbolcomosedesee,locualfacilitallevaracaboalgunastareastalescomounadenici ondirigidaporlasintaxis.Enlagura1.3semuestralarepresentaciondelarbolobtenidoalanalizarsintactica-mente la expresion matematica u(x, y) = exsen y +eycos x, el cual se recorre para realizarelanalisissemanticoylageneraciondelcodigointermedio.+*e xseny*eycosxFigura 1.3:Arbol con el cual se puede representar la expresion u(x, y) = exsen y +eycos xDispositivosdetraducci ondirigidaporlasintaxisEstos producen grupos de rutinas que recorren el arbol de sintaxis abstracta, generandocodigo intermedio. La idea basica es que se asocia una o mas traducciones con cada nodoCAPITULO1. COMPILADORESYLASHERRAMIENTASPARASUCONSTRUCCION 17del arbol de sintaxis abstracta, y cada traduccion se dene partiendo de traducciones en susnodosvecinosenelarbol.ParaelcasodeJavaCC, estegeneralaclaseParseDumpVisitorquesirvepararecorrerelarboldesintaxisabstracta.Generadoresautomaticosdec odigoTales herramientas tomanunconjuntodereglas quedenenlatraducciondecadaoperaciondel lenguajeintermedioal lenguajedemaquinaparalamaquinaobjeto. Lasreglasdebenincluirsucientedetalleparapodermanejarlosdistintosmetodosdeaccesoposiblealosdatos; porejemplo, lasvariablespuedenestarenregistros, enunaposici onja(estatica)dememoriaopuedentenerasignadaunaposicionenunapila. Latecnicafundamental es la de concordancia de plantillas. Las proposiciones de codigo intermediose reemplazan por plantillas que representan secuencias de instrucciones de maquina, demodo que las suposiciones sobre el almacenamiento de la variables concuerden de plantillaa plantilla. Como suele haber muchas opciones en relacion con la ubicacion de las variables(porej.enunoovariosregistrosoenmemoria),haymuchasformasposiblesdecubrirel codigointermedioconunconjuntodadodeplantillas, yesnecesarioseleccionarunabuena cobertura sin una explosion combinatoria en el tiempo de ejecucion del compilador.DispositivosparaanalisisdeujodedatosMucha de la informacion necesaria para hacer una buena optimizacion de codigo impli-ca hacer un analisis de ujo de datos, que consiste en la recoleccion de informacion sobrelaformaenquesetransmitenlosvaloresdeunapartedeunprogramaacadaunadelasotraspartes.Lasdistintastareasde estanaturalezasepuedenefectuaresencialmenteconlamismarutina, enlaqueel usuarioproporcionalosdetallesrelativosalarelaci onquehayentreproposicionesencodigointermedioylainformacionqueseestarecolectando.Captulo 2AnalisisdelpaqueteJEPFigura 2.1:NathanFunkJEPfuedise nadoporNathanFunk. EstudiantegraduadoenCienciasdelaComputacionenlaUniversidadAlbertaenCanada. JEPes unJavaAPI(InterfazdeprogramaciondeaplicacionesdeJava)dise nadoparalaevaluacion de expresiones matematicas. Las expresiones son pasadas comoargumentosdetipocadena(String)ypuedenserevaluadasinstantanea-mente. JEPpermiteel usodetantas variables comoseencuentrencon-tenidasenlaexpresion,ademasdeconstantesnumericasylamayoradelasfuncionesrealesycomplejas(p.ej.sin(),log(),cosh(),arctan(),im(),etc.) y las constantes matematicas mas com unmente utilizadas (p. ej. e, ).JEPhasidoutilizadoenunampliorangodeaplicacionestalescomo:simulacion,mer-cadodeacciones,aplicacionesalaingeniera,educacionmatematicaentreotras.Ademasha sido utilizado por una amplia gama de prestigiosas instituciones tales como: NASA JetPropulsionLaboratory,ObjectReservoir,ERINEngineeringandResearchInc.,NovoDy-namicsInc.,EbaseTechnologyLtda,ChemAxonLtda,entreotras.El paqueteJEPseencuentraagrupadoenlacarpetaorg.nfunk.jeplacual contienelasclasesquepermitenlavericacionyevaluaciondelasexpresionesmatematicas,ylospaquetesorg.nfunk.jep.typeyorg.nfunk.jep.functionquepermitenel manejodediversostiposnumericosyfuncionesmatematicas.JerarquadelospaquetesqueintervienenenJEPjava.lang.Object|+--org.nfunk.jep|+--org.nfunk.jep.function|+--org.nfunk.jep.type18CAPITULO2. ANALISISDELPAQUETEJEP 192.1. Descripciondel paqueteorg.nfunk.jep.typeEstepaqueteeselquecontienelasclaseseinterfacesquepermitenelmanejodelcon-juntoden umeros(reales, complejosyotrosdenidosporel usuario)conel cual puedetrabajarJEP. Estepaquetecontieneunainterfazydosclasesquesedescribenacontin-uacion:Interfacesdelpaqueteorg.nfunk.jep.typeInterfaz DescripcionpublicinterfaceNumberFactory Esta interfaz es implementada para crear una fabrica deobjetosdetiponumerico.Clasesdelpaqueteorg.nfunk.jep.typeClase DescripcionpublicclassDoubleNumberFactory Esta clase implementa la interfaz NumberFactory y per-mite, por defecto, crear objetos numericos de doble pre-cision.publicclassComplex Esta clase implementa la interfaz NumberFactory y sirvepararepresentarn umeroscomplejosdondelascompo-nentesrealeimaginariaserepresentanconn umerosdedobleprecisioneincluyelos metodos quepermitenlaevaluaciondefuncionescomplejas.LainterfazNumberFactorytieneel objetivodeactuarcomounafabricaden umeros,actuandocomounaclasedeenvolturadeuntiponumerico.Acontinuacionsedescribenlosmetodosdeclaradosenestainterfaz.MetodosdeclaradosenlainterfazNumberFactoryMetodo Descripcionpublicjava.lang.ObjectcreateNumber(doublevalue)Crea unobjeto numerico e inicializa suvalor conelparametrovalue.La clase doubleNumberFactory implementa la interfaz NumberFactory, act ua como unafabricaycomoclasedeenvolturadeltipoprimitivo double,conelndepodermanipularestetipocomounobjetodetipojava.lang.Object. Pueslasestructurasdedatosestarancompuestas por objetos, comodeObject seextiendentodas las demas clases, entoncesesta se podra convertir en cualquier otra clase en particular aquellas que contenga un tipoprimitivoountipodedatoabstractoespecico;enestecasoserauntipodouble.ConstructoresdenidosenlaclaseDoubleNumberFactoryConstructor DescripcionpublicDoubleNumberFactory() Constructorpordefecto.CAPITULO2. ANALISISDELPAQUETEJEP 20MetodosdenidosenlaclaseDoubleNumberFactoryMetodo Descripcionpublicjava.lang.ObjectcreateNumber(doublevalue)Crea un objeto Double inicializado con el parametro val-ue.La clase Complex act ua como fabrica de n umeros complejos para representar este con-junto como una pareja cuyas componentes son tipos double. Esta clase posee constructoresde distintos formatos y una gran variedad de metodos de dos tipos; los primeros para ma-nipularlascomponentesdeln umerocomplejorepresentado,ylossegundosparahacerlamanipulacionaritmeticaylaevaluaciondelasfuncionesdevariablecomplejabasicas1.Enladescripciondelosmetodosseencuentralaformulautilizadaparalaevaluaciondecadaunadelasfunciones2,ysehaceusodeunn umerocomplejogenericodenidocomoz= re + i im.ConstructoresdenidosenlaclaseComplexConstructor DescripcionpublicComplex() Constructorpordefecto,inicializatantolacomponenterealcomolaimaginariaigualesacero.publicComplex(Complexz) Inicializaunobjetocomplejoalcopiarlascomponentesreal eimaginariadel objetoz enlas correspondientescomponentesdelnuevoobjeto.publicComplex(doublerein) Inicializaunobjetocomplejoconsucomponente realigual al parametroreinysucomponente imaginariaigualacero.publicComplex(double rein, double imin)Inicializaunobjetocomplejoconsucomponente realigual al parametroreinysucomponente imaginariaigualaimin.publicComplex(java.lang.Numberrein)Inicializaunobjetocomplejoconsucomponente realigual al resultado retornado por el metodo doubleValue()del objeto rein y su componente imaginaria igual a cero.MetodosdenidosenlaclaseComplexMetodo Descripcionpublicdoublere() Retornalacomponenterealdeesteobjeto.publicdoubleim() Retornalacomponenteimaginariadeesteobjeto.publicvoidset(Complexz) Establecelascomponentesrealeimaginariadeesteob-jetocomounacopiadelas componentes correspondi-entesdelobjetoz.1El valorretornadoesel valorprincipal delafuncionaevaluar; porejemplo, al evaluarel argumentodeunn umerocomplejoelvalorretornadoesunn umeroentrey.2Paraverladeducciondeestasformulasvease[CB92], yel mododecomosepuedenimplementarlaevaluacionenunprogramavease[AJ95].CAPITULO2. ANALISISDELPAQUETEJEP 21publicvoidset(doublerein,doubleimin)Establecelascomponentesrealeimaginariadeesteob-jetoconelvalordelosparametrosreineiminrespec-tivamente.publicvoidsetRe(doublerein) Establecelacomponenterealdeesteobjetocomoigualalvalordelparametrorein.publicvoidsetIm(doubleimin) Establece la componente imaginaria de este objeto comoigualalvalordelparametroimin.publicjava.lang.StringtoString() Retorna una cadena (String) con el formato deun n umero complejo, sobre-escribiendo el metodotoString()delaclaseObject,conelformato:(re,im).Miscelaneadefuncionesyoperadorespublicbooleanequals(Complexb,doubletolerance)Establece si este objeto es lo sucientemente aproximadoal objetob, paraser considerados iguales, z=b. Latolerancia es la maxima magnitud diferencia que puedentenerlascomponentesrespectivas.publicdoubleabs() Retornael valor absolutoomagnituddeesten umerocomplejo [z[.Secalculacomo: [z[ =re2+ im2.publicdoubleabs2() Retornael cuadradodel valorabsolutodeesten umerocomplejo.Secalculacomo: [z[2= re2+ im2.publicdoublearg() Retorna el argumento principal de este n umero complejoArg(z).Se obtiene dicho valor al conocer la segunda componentedelaformapolar(r, )deesten umerocomplejo, paraencontrarelvalorsecalculatan1(imre )ysuresultadoseubicaenelintervalo(,],parare ,= 0yz ,= 0publicComplexneg() Retornaelopuestoaditivodeesten umerocomplejo.Secalculacomo: z= (re, im).publicComplexmul(doubleb) Retornauncomplejoqueeselresultadodemultiplicarelparametrobconesten umerocomplejo.Secalculacomo:b z= (b re, b im).publicComplexmul(Complexb) Retornael resultadodemultiplicarel parametrobconesten umerocomplejo.Secalculacomo:(re b.re im b.im, im b.re + re b.im).publicComplexdiv(Complexb) Retornael resultadode dividir este n umerocomplejoporelparametrob.Secalculacomo:zb=_re b.re + im b.imb.re2+ b.im2, im b.re re b.imb.re2+ b.im2_.CAPITULO2. ANALISISDELPAQUETEJEP 22publicComplexpower(doubleexponent)Retornael valorprincipal deelevaresten umerocom-plejoalparametrorealexponentza.Secalculacomo:za= [z[a (cos(a Arg(z)) + i sen(a Arg(z))).publicComplexpower(Complexexponent)Retorna el valor principal de elevar este complejo alparametrocomplejoexponentzw.Secalculacomo:zw= exp(w Log(z)).publicComplexlog() Retorna el logaritmo principal de este n umero complejoLog(z).Secalculacomo:Log(z) = log([z[) + i Arg(z).publicComplexsqrt() Retorna una de las races cuadradas de este n umerocomplejo z.Sepuedecalculardelasiguientesformas:z=_[z[ _cos_Arg(z)2_+ i sen_Arg(z)2__.z= z1/2= exp(12 Log(z)).FuncionestrigonometricaspublicComplexsin() Retornaelsenodeesten umerocomplejosen(z).Secalculacomo:sen(z) =eizeiz2i.publicComplexcos() Retornaelcosenodeesten umerocomplejocos(z).Secalculacomo:cos(z) =eiz+ eiz2.publicComplextan() Retornalatangentedeesten umerocomplejotan(z).Secalculacomo:tan(z) =sen(z)cos(z)=eizeizi (eiz+ eiz).FuncionestrigonometricasinversaspublicComplexasin() Retornael arcosenoprincipal deesten umerocomplejosen1(z).Secalculacomo:sen1(z) = i Log_iz +1 z2.publicComplexacos() Retorna el arcocoseno principal de este n umero complejocos1(z).Secalculacomo:cos1(z) = i Log_z +z21.publicComplexatan() Retornaelarcotangenteprincipaldeesten umerocom-plejotan1(z).Secalculacomo:tan1(z) = i2 Log i zi + z.FuncionestrigonometricashiperbolicaspublicComplexsinh() Retornael senohiperbolicodeesten umerocomplejo:senh(z).Secalculacomo:senh(z) =ezez2.CAPITULO2. ANALISISDELPAQUETEJEP 23publicComplexcosh() Retornaelcosenohiperbolicodeesten umerocomplejo:cosh(z).Secalculacomo:cosh(z) =ez+ ez2.publicComplextanh() Retorna la tangente hiperbolico de este n umero comple-jo:tanh(z).Secalculacomo:tanh(z) =senh(z)cosh(z)=ezezez+ ez.FuncionestrigonometricashiperbolicasinversaspublicComplexasinh() Retorna el arcoseno hiperbolico principal de este n umerocomplejosenh1(z).Secalculacomo:senh1(z) = Log_z +z2+ 1.publicComplexacosh() Retorna el arcocoseno hiperbolico principal de esten umerocomplejocosh1(z).Secalculacomo:cosh1(z) = Log_z +z21.publicComplexatanh() Retorna el arcotangente hiperbolico principal de esten umerocomplejotanh1(z).Secalculacomo:tanh1(z) =12 Log 1 + z1 z.2.2. Descripciondel paqueteorg.nfunk.jep.functionEneste paquete se denenlas clases conlas cuales se realizalaevaluacionde lasprincipalesfuncionesmatematicasqueseencuentranimplementadas.Esteseencuentracompuestoporunainterfazy31clases.EnlainterfazPostxMathCommandIsedeclarantresmetodos:getNumberOfParameters(),setCurNumberOfParameters(intn)yrun(StackaStack), esta interfaz es implementada por la clase public PostxMathCommand de la cualse extienden todas aquellas clases que tienen el n de permitir la evaluacion de funciones3yaimplementadas oaquellas quenoestanimplementadas ysedeseaimplementar porpartedelusuario,realizandoelanalisisnecesarioparapoderevaluardichafuncion.Interfacesdelpaqueteorg.nfunk.jep.functionInterfaz DescripcionpublicinterfacePostxMathCommandITodas las clases defunciones debenimplementar estainterfaz para asegurar que el metodo run() esta denido.3Paralaevaluacionsehaceusodeunaestructuradedatosconelformatodeunapila.CAPITULO2. ANALISISDELPAQUETEJEP 24Clasesdelpaqueteorg.nfunk.jep.functionClase DescripcionpublicclassPostxMathCommand Esta clase es la mas importante de este paquete e imple-menta la interfaz PostxMathCommandI, ademas todaslas clases que implementan funciones matematicas se ex-tiendendeestaclase.Estaincluyedosatributos: int numberOfParameterseint curNumberOfParameters. El primero es vericado alrealizarelparsingdelaexpresion,estedebeserinicial-izadoconel n umerodeparametrosdelafuncion, ysiel n umerodeparametrosesarbitrario, sedebeiniciarel atributocon-1, el segundoes usadoparasaber eln umerodeparametrosausarenlainvocaciondelsigu-ienterun().LasclasessiguientesseextiendendePostxMathCommandpublicclassAbs Sirveparainicializarunobjeto,elcualposeeunmeto-doquesirveparahallarel valorabsolutodeunobjetoubicado en el tope de la pila y su resultado es puesto denuevoeneltope.publicclassAdd Sirve para inicializar un objeto, el cual posee un metodoque sirve para sumar los dos objetos ubicados en el topedelapilaysuresultadoespuestodenuevoeneltope.publicclassAngle Sirveparainicializarunobjeto,elcualposeeunmeto-doqueretornael parametrodel punto(r, ) enco-ordenadas polares quecorrespondenapunto(x, y) encoordenadascartesianas.Secumpleque < .publicclassArcCosine Sirveparainicializarunobjeto,lcualposeeunmetodoquesirveparaevaluarelarcocosenodeunobjeto.publicclassArcCosineH Sirve para inicializar un objeto, el cual posee un metodoquesirveparaevaluarel arcocosenohiperbolicodeunobjeto.publicclassArcSineH Sirveparainicializarunobjeto,elcualposeeunmeto-doquesirveparaevaluarelarcosenohiperbolicodeunobjeto.publicclassArcTangent Sirve para inicializar un objeto, el cual posee un metodoquesirveparaevaluarelarcotangentedeunobjeto.publicclassArcTanH Sirve para inicializar un objeto, el cual posee un metodoque sirve para evaluar el arcotangente hiperbolico de unobjeto.publicclassComparative Sirve para inicializar un objeto, el cual posee un metodoquesirveparacompararn umerosrealesconrespectoalordenusual (p.ej. xy, x y, x y, x=y,x ,= y),compararsdosn umeroscomplejossoniguales(p.ej.x + i y= a i b)osdoscadenassoniguales.CAPITULO2. ANALISISDELPAQUETEJEP 25publicclassCosineH Sirve para inicializar un objeto, el cual posee un metodoque sirve para evaluar el coseno hiperbolico de un objeto.publicclassDivide Sirve para inicializar un objeto, el cual posee un metodoquesirveparadividirn umeros uobjetos(reales, com-plejos,vectores)entren umerosrealesocomplejos.publicclassImaginary Sirve para inicializar un objeto, el cual posee un metodoquesirveparaobtenerlacomponenteimaginariadeunobjeto(p.ej.NumberoComplex).publicclassLogarithm Sirve para inicializar un objeto, el cual posee un metodoque sirve para evaluar el logaritmo base 10 de un objeto.publicclassLogical Sirve para inicializar un objeto, el cual posee un metodoquesirveparaimplementarlalogicabooleana(p.ej 11 = 1, 10 = 0, 01 = 0, 00 = 0, 10 = 1,1 1 = 1,0 1 = 1,0 0 = 0).publicclassModulus Sirve para inicializar un objeto, el cual posee un metodoque sirve para retornar el residuo de la division entre dosentredosn umeros(p.ej.9,5 %5 = 4,5).publicclassMultiply Sirve para inicializar un objeto, el cual posee un metodoque sirve paramultiplicar n umeros uobjetos (reales,complejos,vectores)entren umerosrealesocomplejos.publicclassNaturalLogarithm Sirve para inicializar un objeto, el cual posee un metodoque sirve para evaluar el logaritmo natural de un objeto.publicclassNot Sirve para inicializar un objeto, el cual posee un metodoque sirve para evaluar si un n umero es igual a cero o no(six = 0seretorna1sinoretorna0).publicclassPower Sirveparainicializarunobjeto,elcualposeeunmeto-doquesirveparaelevarlabase(real ocompleja)aunexponente(realocomplejo).publicclassRandom Sirveparacrearunaclasedeenvolturadeunn umeroaleatorioobtenidoconelmetodoMath.random().publicclassReal Sirve para inicializar un objeto, el cual posee un metodoquesirveparaobtenerlacomponenterealdeunobjeto(p.ej.NumberoComplex).publicclassSine Sirve para inicializar un objeto, el cual posee un metodoquesirveparaevaluarelsenodeunobjeto.publicclassSineH Sirve para inicializar un objeto, el cual posee un metodoquesirveparaevaluarelsenohiperbolicodeunobjeto.publicclassSquareRoot Sirve para inicializar un objeto, el cual posee un metodoquesirveparaevaluarlarazcuadradadeunobjeto.publicclassSubtract Sirve para inicializar un objeto, el cual posee un metodoquesirveparasustraerobjetos.CAPITULO2. ANALISISDELPAQUETEJEP 26publicclassSum Sirveparacrear unobjeto, queesunejemplodeunadefuncionqueaceptacualquiern umerodepar ametros,retorna el resultado de sumar todos los nodos de una pilasuponiendoquecadanodoesunobjetodetipoDouble.publicclassTangent Sirve para inicializar un objeto, el cual posee un metodoquesirveparaevaluarlatangentedeunobjeto.publicclassTanH Sirveparainicializarunobjeto,elcualposeeunmeto-doquesirveparaevaluarlatangentehiperbolicodeunobjeto.publicclassUMinus Sirve para inicializar un objeto, el cual posee un metodoquesirvepararetornarelopuestoaditivodeunobjetodado.Las clases denidas en el paquete org.nfunk.jep.function se pueden agrupar en tresgrandesgruposdeclases:1. El primer grupo esta compuesto solo por la clase PostxMathCommand la cual act uacomolasuperclase de aquellas clases que sirvenparaimplementar las funcionesdenidasenelevaluadorylasdenidasporelusuario.2. El segundo grupo esta compuesto por las clases que implementan aquellas funcionesqueutilizanunsoloparametro.Clasesqueact uansobreunsoloparametro Abs ArcCosine ArcCosineH ArcSine ArcSineH ArcTangent ArcTanH Cosine CosineH Imaginary Logarithm NaturalLogarithm Random Real Sine Not SineH SquareRoot Tangent TanH UMinusEstasclasesseencuentranimplementadasdeunaformaestandar,acontinuacionsehaceunaexplicaciondecomoserealizodichaimplementaciondescribiendodetal-ladamente cada constructor y metodo utilizado. Para esta explicacion se tomo comoejemplolafuncionsenoimplementadacomolaclaseSine.Cada clase posee un solo constructor, el constructor por defecto Sine() en este caso.Enesteseestableceel valor delavariablenumberOfParameters delasuperclasepublicPostxMathCommandigualauno(eln umerodeparametros).public Sine(){numberOfParameters = 1;}CAPITULO2. ANALISISDELPAQUETEJEP 27Setieneademasunmetodoquesirvepararealizarlaevaluaciondelafuncionim-plementada, si el parametropasadoesunainstanciadelaclaseNumber, seutilizael metodo sin(doublearg) de la clase Math para realizar la evaluacion y se retorna elvalor obtenido, si por el contrario el parametro es una instancia de la clase Complex,se utiliza el metodo sin() de la clase Complex para realizar la evaluacion y se retornael valorobtenido, si noesningunadelasinstanciasanterioresselanzaunobjetoParseExceptionconelmensajeInvalidparametertype.public Object sin(Object param) throws ParseException {if (param instanceof Number) {return new Double(Math.sin(((Number)param).doubleValue()));} else if (param instanceof Complex) {return ((Complex)param).sin();}throw new ParseException("Invalid parameter type");}ComoelobjetivoprincipaldeextenderunaclasedelaclasePostxMathCommandesqueestaclasetenganecesariamenteincorporadoel metodorun(StackinStack),por lotantoeste metododebe ser sobrescritoencadaclase ylas funciones querealizasonlasdechequearquelapilanoestevaca,obtenerelobjetodeltopedelapilaquitandolodeellayluegorealizaunallamadaalmetodoanteriorcolocandoelresultadodenuevoeneltopedelapila.public void run(Stack inStack) throws ParseException {checkStack(inStack);// check the stackObject param = inStack.pop();inStack.push(sin(param));// push the result on the inStackreturn;}Existen5clasesquenotienenimplementadoexactamenteesteformato, lasclasesImaginary, Real, Random, UMinusyNot. Semantieneunconstructoryel metodorun(),elquecambiaeselmetodoquesirvepararealizarlaevaluacionelquepuedeonoaparecer.EnlaclaseImaginarysi el parametrodel metodoquesirvepararealizar laevaluacionesunainstanciadelaclaseNumberseretorna0, enotrocasosecomportadeformaanalogaalmetododescrito.EnlaclaseRealsielparametroesunainstanciadelaclaseNumberseretornaelvalorqueencapsuleesteobjeto,enotrocasosecomportadeformaanalogaalmetododescrito.La clase Random no tiene un metodo para la evaluacion, sino que se obtiene unn umeroaleatorioconel metodorandom()delaclaseMath, secreaunobjetodetipoDoubleysecolocadirectamenteeneltopedelapila.CAPITULO2. ANALISISDELPAQUETEJEP 28EnlaclaseUMinus si el parametroes unainstanciadelaclaseNumber seretorna menos el valor que encapsule esta clase, si por el contrario es un objetode la clase complex entonces se hace un llamado del metodo neg() de esta clase,enotrocasoselanzaunaexcepcion.Laclase Not notiene unmetodoparalaevaluacion, sinoque vericasi elparametroesunobjetodelaclaseNumberyvericasi el valorencapsuladoesiguala0,siesasentoncesretorna1encualquierotrocasoretorna0.Sielparametronoesunobjetodeestetipoentoncesselanzaunaexcepcion.3. El tercergrupoestacompuestoporlasclasesqueimplementanaquellasfuncionesqueutilizandosomasparametros.Clasesqueact uansobredosomasparametros Add Angle Comparative Divide Logical Modulus Multiply Power Subtract SumTodas estas clases exceptoaddysumsonutilizadas parasimular los operadoresbinariosmascomunes,enelconstructorseestableceelparametronumberOfParam-etersigual a2, detal maneraqueal sobreescribirel metodorun(StackinStack)seobtienenlosdosobjetosqueseencuentranenel topedelapilaydeacuerdoalaclasedelacualsoninstanciaserealizalaoperacioncorrespondiente.En los constructores de las clases add y sum se establecenumberOfParameters iguala-1,queindicaqueeln umerodeparametrosesarbitrario,enelmetodorun(StackinStack)delaclaseaddsehaceaplicael operador+, dependiendosi losobjetoscontenidos en la pila son instancias de Number, Complex o String en los dos primerossehacelasumadelosn umerosyenelultimosehacelaconcatenaciondecadenas.La clase sum es un ejemplo de como se puede implementar una clase que act ua sobrecualquiern umerodeparametrosysuobjetivoesdeldesumarlosobjetosdelapilasuponiendoquetodoslosobjetossoninstanciasdelaclaseNumber.2.3. Descripciondel paqueteorg.nfunk.jepEste es el paquete principal de JEP, enel se encuentran contenidos los paquetesorg.nfunk.jep.functionyorg.nfunk.jep.type, conloscualessehaceel manejolostiposdedatosylasfuncionesqueact uansobre estos.Enestepaqueteseencuentranlasclasesquepermitenrealizarel analisisdelexico,sintacticoysemantico. Estas clases fueronobtenidas haciendousode laherramientasJavaCC yJJTree que las genera automaticamente. En el archivoParser.jjt se especicalagramatica4conlacual el analizador lexicoes generadopor mediode JavaCCysu4EnelapendiceB,seencuentraconsignadalagramaticaconlacualseespecicalasintaxisdelinter-pretadordeexpresionesmatematicasJEP.CAPITULO2. ANALISISDELPAQUETEJEP 29componenteJJTree. Al procesarestearchivosegenerael archivoParser.jjel cual esusadoporJavaCC para generar la clases que permiten realizar el analisis recursivo LL(1).Tambieneneste paquete se encuentralaclase JEP, lacual es lamas importantedel API JEPyes laque permite laevaluacionde las expresiones matematicas. Enelcaptulo3serealizaunadescripciondetalladadeestaclase, dondeseexhibenejemplosyse explicalaformade usar los constructores ylos metodos propios de laclase, enparticular parseExpression(String), el cual permite el paso de las expresiones matematicasalevaluador,ygetValue()paraobtenerelresultadodeevaluarlaexpresionpasada.Interfacesdelpaqueteorg.nfunk.jepInterfaz DescripcionpublicinterfaceNode Generada porJJTree. Todos los nodos del arbol de sin-taxisabstractaimplementanestainterfaz. Estaproveelamaquinariabasicaparalaconstrucciondelas rela-cionesentrelosnodoshijosypadres.publicinterfaceParserConstants Es generada por JJTree y JavaCC. En esta interfazse denenlas constantes utilizadas por el analizadorsintactico.publicinterfaceParserTreeConstantsGeneradapor JJTree. Enestainterfaz se denenlasconstates utilizadas enlos nodos del arbol desintaxisabstractaAST.publicinterfaceParserVisitor GeneradaporJJTree. Enestainterfazsedeclaranlosmetodosconloscualesserealizalasvisitasalosnodos.Clasesdelpaqueteorg.nfunk.jepClase DescripcionpublicclassASTConstant GeneradaporJJTree,seextiendedeSimpleNodeeim-plementa la interfaz Node.Esta act ua como un nodo delarbol desintaxis abstracta, quesirvedeenvolturadeunaconstante.publicclassASTFunNode GeneradaporJJTree,seextiendedeSimpleNodeeim-plementa la interfaz Node.Esta act ua como un nodo delarbol de sintaxis abstracta, que sirve de envoltura de lasfunciones matematicas denida en JEPy los operadoresbinarios(+, , , /, . . .).publicclassASTStart GeneradaporJJTree,seextiendedeSimpleNodeeim-plementa la interfaz Node.Esta act ua como el nodo razdelarboldesintaxisabstracta.publicclassASTVarNode GeneradaporJJTree,seextiendedeSimpleNodeeim-plementa la interfaz Node.Esta act ua como un nodo delarbol desintaxis abstracta, quesirvedeenvolturadeunavariabledelaexpresionmatematicainterpretada.CAPITULO2. ANALISISDELPAQUETEJEP 30publicclassFunctionTable Seextiendedejava.util.Hashtable.En estaseguardalainformaciondelas funciones matematicas quepuedenserutilizadasenlaexpresionquesequiereevaluar.publicclassEvaluatorVisitor Se extiende de Object e implementa ParserVisitor. Estaclaseesusadaparalaevaluaciondelaexpresion.Estautiliza un visitador con un patron dise nado para recorrerelarbolyevaluarlaexpresionutilizandounapila.Los nodos que envuelven funciones necesitan que seeval uenprimero todos sus nodos hijos para entoncespoder aplicar lafuncionqueestos envuelven. Los no-dosqueenvuelvenvariablesycontantessonevaluadosparaponersusvaloreseneltopedelapila.publicnalclassJavaCharStream Generada porJavaCC y se extiende de java.lang.Object.Es una implementacion de la interfaz CharStream,donde el ujo se asume que contiene solo caracteresASCII (con java-like unicode para el proceso de escape).publicclassJEP Seextiendedejava.lang.Object. LaclaseJEPeslain-terfazprincipal conlacual el usuariodebeinteractu-ar.Estacontienetodos los metodos necesarioparaelanalisis sintactico y la evaluacion de las expresionesmatematicas. Losmetodosm asimportantessonparse-Expression(String), para el paso de las expresionesmatematicasalevaluador,ygetValue()paraobtenerelresultadodeevaluarlaexpresion.publicclassParser EsgeneradaporJTTreeyJavaCC,yseextiendedeja-va.lang.Object. Enestaclasees dondeseencuentraelanalizadorsintacticoprincipal.publicclassParserDumpVisitor Seextiendedejava.lang.Object eimplementalainter-fazParserVisitor.Estasirvepararecorrerel arbol desintaxis abstractaydescargarloparaimprimirloenlaconsoladeformaquesepuedaver el laconguracionpadre-hijode este.publicclassParserTokenManager Es generada por JTTree y JavaCC, se extiende dejava.lang.Object e implementa la interfaz ParserCon-stants. Esta clase act ua como ungestor de smbolosterminalesparaelanalizadorsintacticocontenidoenlaclaseParser.publicclassSimpleNode GeneradoporJJTree,seextiendedejava.lang.ObjecteimplementalainterfazNode.Estaes lasuperclasedeaquellas clases queact uancomoconstantes, variables,funcionesydelaquesirvendenodoraz.publicclassSymbolTable Seextiendedejava.util.Hashtable.Enestaseguardalainformacionde las variables ycontantes que sonuti-lizadasenlaexpresionquesequiereevaluar.CAPITULO2. ANALISISDELPAQUETEJEP 31publicclassToken Es generadapor JavaCCyseextiendedelaclaseja-va.lang.Object.Estaclaseencapsulalossmbolostermi-nales que el analizador lexico se encarga de obtener paraluegopasarlosalanalizadorsintactico.Excepcionesenelpaqueteorg.nfunk.jepExcepcion DescripcionpublicclassParseException Generada por JavaCC, se extiende de la clasejava.lang.Exception e implementa la interfaz ja-va.io.Serializable. Eslaexcepcionqueselanzacuandoelanalizadorsintacticoencuentraalg unproblema.Erroresenelpaqueteorg.nfunk.jepError DescripcionpublicclassTokenMgrError Es generada por JavaCC, se extiende de la clasejava.lang.Error e implementa la interfaz ja-va.io.Serializable. Es la excepcion que se lanzacuandosedetectanproblemasconelreconocimientodelos tokens, ademas seencargadequelos mensajes deerrorpresentensucienteinformacionalusuario.Captulo 3ManejoyusodeJEP3.1. ManejoyusodelaclaseJEPLaclaseJEPeslamasimportantedel API JEP, puesesestalaquepermiteel usode todalamaquinariadise nadaparalainterpretacionde expresiones matem aticas. Acontinuacionseexplicanlosmetodos, opcionespropiasdeJEP, semuestrael manejoyusocorrectodel interpretadormediantealgunosejemplos, tambienseexplicanysedanejemplosparalaimplementaciondenuevasfuncionesdeunaodevariasvariables.CamposenlaclaseJEPCampo DescripcionprotectedbooleanallowUndeclared Opcionquepermitenodeclararlasvariablesdelaex-presion,elinterpretadorlasidenticaautomaticamenteylasinicializancon0.Elvalorpordefectoesfalse.protectedjava.util.VectorerrorList Estructura de datos en la cual se listaran los errores queseproduzcanduranteel analisis sintacticoolaevalu-aciondelaexpresionmatematica. Encondicionesnor-malesdebeestarvaca.protectedFunctionTablefunTab Estructura de datos en la cual se cargaran las fun-ciones matematicas que se pueden incluir en la expresionmatematica.protectedbooleanimplicitMul Opcionquepermiteutilizarlamultiplicacionimplcitaentre los factores de la expresion a evaluar. El valor pordefectoesfalse.protectedSymbolTablesymTab Estructuradedatosenlacualsecargaranlasvariablesque se encuentren incluidas en la expresion matematica.Ademassecarganlaconstatesmatematicas e,.32CAPITULO3. MANEJOYUSODEJEP 33privatebooleantraverse Opcionquepermiterecorrereimprimirelarboldesin-taxis abstractaenlaconsola. El valor por defectoesfalse.privateNumberFactorynumberFactoryEs un objeto que act ua como una fabrica de tiposnumericosporejemplo: enteros, reales, complejos, etc.PordefectoutilizaDoubleNumberFactory.ConstructoresdelaclaseJEPConstructor DescripcionpublicJEP() CreaunanuevainstanciadeJEPconlaconguracionpordefecto.traverse=false;allowUndeclared=false;implicitMul =false;numberFactory=DoubleNumberFactory;publicJEP(booleantraversein,booleanallowUndeclaredin,booleanimplicitMul in,NumberFactorynumberFactoryin)CreaunanuevainstanciadeJEPconlaconguracionespecicadaporlosargumentosdeesteconstructor. SielparametronumberFactoryinesnull,entoncesseusaelvalorpordefectoDoubleNumberFactory.traverse=traversein;allowUndeclared=allowUndeclaredin;implicitMul =implicitMul in;numberFactory=numberFactoryin;MetodosdelaclaseJEPMetodos DescripcionpublicvoidinitSymTab() Crea un nuevo objeto SymbolTabley lo asigna a symTab.publicvoidinitFunTab() Crea un nuevo objeto FunctionTable y lo asigna afunTab.publicvoidaddStandardFunctions() Adiciona a la estructura funTab, las funcionesmatematicas estandar que se encuentran implementadasenel paquete org.nfunk.jep.function, tales comosin(),cos().Siseutilizaalgunadeestasfuncionesenlaexpresionmatematicaaevaluarynosehacargadoalatabladefunciones entonces seproduceunaexcepcionUnrecognized function....Lo mas adecuado en caso de utilizar funcionesmatematicas, es hacer el llamado a este metodo inmedi-atamentedespuesdeinstanciarlaclaseJEP.public void addStandardConstants() AdicionaalaestructurasymTablasconstantesye,para poderlas usar en la expresion a evaluar. Como en elmetodoanterior,estedebeserllamadoinmediatamentedespuesdeinstanciarlaclaseJEP.CAPITULO3. MANEJOYUSODEJEP 34publicvoidaddComplex() Debeserllamadaencasodequelaexpresionaevaluarinvolucren umeroscomplejos.Se especica a i como unidad imaginaria y se adiciona ala estructura que contiene la constantes symTab; ademasseagreganlasfuncionesre()eim()alaestructuradefuncionesfunTab.publicvoidaddFunction(String functionName,PostxMathCommandIfunction)Debeserllamadaencasodequeseanecesarioutilizarunafuncionmatematicaquenoesteimplementadaenorg.nfunk.jep.function. functionNameeselnombreque se le da a la nueva funcion en la expresion a evaluaryfunctioneslaclasedondesedenelanuevafuncion.Estemetododebeser llamadoantes dequeseutilicelanuevafuncion. Enlasubseccion3.1.2se explicayejemplarizalaformadedise nareimplementarnuevasfunciones.publicDoubleaddVariable(Stringname,doublevalue)Adiciona una nueva variable a la estructura que contienelas variables oactualizael valor deunavariableexis-tente. Debellamarseantesderealizarselaevaluacion,paraqueseoperesobrelosvalorescorrectos. nameesel nombredelavariablequeseutilizaenlaexpresionaevaluar, yvalueesel valorquequeremosasignarlealavariable. RetornaunobjetoDoublequeenvuelveavalue.publicComplexaddComplexVariable(String name,doublere,doubleim)Adicionaunanuevavariablecomplejaalaestructuraque contiene las variables oactualizael valor de unavariableexistente. Debellamarseantesderealizarselaevaluacion, para que se opere sobre los valores correctos.name es el nombre de la variable que se utiliza en la ex-presionaevaluar,reeimsonlaparterealeimaginariadelcomplejorespectivamente.RetornaunobjetoCom-plex con parte real e imaginaria re e im respectivamente.publicvoidaddVariableAsObject(String name,Objectobject)Adiciona un objeto como una nueva variable a la estruc-tura que contiene las variables o actualiza el valor de unavariableexistente. Debellamarseantesderealizarselaevaluacion, paraqueseoperesobrelosvalorescorrec-tos. name es el nombre de la variable que se utiliza en laexpresionaevaluar,yobjectesunobjetoqueenvuelveelvalordelavariablename.publicObjectremoveVariable(Stringname)Debe ser llamada cuando se quiera eliminar una variableexistente.Retornaelobjetoqueenvuelveelvalordelavariable,yencasodequenoexista,retornanull.publicObjectremoveFunction(Stringname)Debe ser llamada cuando se quiera eliminar una funcionexistente. Retornael objetoquesirveparaevaluar lafuncionyencasodequenoexistaretornanull.CAPITULO3. MANEJOYUSODEJEP 35publicvoidsetTraverse(booleanvalue)Si value es igual a true se activa la opcion de imprimir enlaconsolaelarboldesintaxisabstractaenelmomentoenel quesepasalaexpresional analizadorsintactico.Estemetododebellamarseantesdepasarlaexpresionalanalizadorsintactico.Laopcionpordefectoesfalse.publicvoidsetImplicitMul (booleanvalue)Si value es igual a true se activa la opcion de la multipli-cacionimplcita,esdecirunaexpresioncomo23y2pison interpretadas como 23 y 2pi respectivamente. Laopcionpordefectoesfalse.publicvoidsetAllowUndeclared(booleanvalue)Si valueesigual atrueseactivalaopcionderecono-cerlasvariablesdelaexpresiondeformaautomatica,seadicionanlasvariablesdetectadasalaestructuradevariables conel valor inicial igual a0. Laopcionpordefectoesfalse.publicvoidparseExpression(Stringexpressionin)Es el metodo al cual se le debe pasar la expresion a evalu-ar. Si la expresion esta incorrectamente escrita, entoncesseadicionalaexcepcionalalistadeerroreserrorList.publicdoublegetValue() Eval uayretornaelvalordelaexpresion.Sielvalorescomplejo, seretornalacomponentereal. Si ocurreunerrordurantelaevaluacion,entonceselvalorretornadoes0.publicComplexgetComplexValue() Eval ua y retorna el valor de la expresion como unn umerocomplejo. Si ocurre unerror durante laeval-uacion,entoncesseretornanull.publicObjectgetValueAsObject() Eval ua y retorna el valor de la expresion como un objeto.Si ocurre unerror durante laevaluacion, entonces seretornanull.publicbooleanhasError() Retornatrue, si aocurridounerrordurantelaaccionmasreciente(analisissintacticooevaluaci on).publicStringgetErrorInfo() Reportalainformacionsobreloserroresocurridosdu-rantelamasrecienteaccion(analisissintacticooevalu-acion).Seretornalalistadeloserroresocurridos,sinoocurrenerrores,entoncesseretornanull.publicNodegetTopNode() Retornalarazdelarboldesintaxisabstractaobtenidoal analizar la expresion. Con este nodo se puede evaluarlaexpresionmanualmenteyaquedesdeestesepuedellegaracualquiernododelarbol.publicSymbolTablegetSymbolTable()Retornalatablaenlaqueseencuentranalmacenadaslasconstatesyvariables.publicNumberFactorygetNumberFactory()Retorna el objeto NumberFactory que se especico en elconstructordelaclase.CAPITULO3. MANEJOYUSODEJEP 363.1.1. Ejemplogeneral del usodeJEPLaclasequesemuestraacontinuacionesunejemploclasicodelusodeJEP;estaeslaformacorrectadeutilizarJEPenlamayoradeloscasos.Esimportantenotarquelamultiplicacionesexplcita,lasvariablesdebeseradicionadasporelusuarioylarevisiondeerroressehaceencadaposiblecasoenquepuedanocurrir.import org.nfunk.jep.*;public class FuncionEjem {public FuncionEjem() {}public static void main(String[] args) {// crea una nueva instancia de JEP con la configuracion por defectoJEP funcion = new JEP();String expresion = "e^x*sin(y)+e^y*cos(x)";double value;System.out.println("Ejemplo del uso de JEP con la funcion: " + expresion);funcion.addStandardFunctions(); // adiciona las funciones matematicasfuncion.addStandardConstants(); // adiciona las constantes matematicas// adiciona las variables y sus valores inicialesfuncion.addVariable("x", 2.0);funcion.addVariable("y", -2.0);funcion.parseExpression(expresion); // paso de la expresion a evaluar// revisar si han ocurrido errores durante el analisis de la expresionif (funcion.hasError()) {System.out.println("Error durante el an alisis sintactico");System.out.println(funcion.getErrorInfo());return;}// obtener el resultado de evaluar la expresi onvalue = funcion.getValue();// revisar si han ocurrido errores durante la evaluacion de la expresionif (funcion.hasError()) {System.out.println("Error durante la evaluacion");System.out.println(funcion.getErrorInfo());return;}// imprime la expresi on evaluada y el resultado obtenido al evaluarlaSystem.out.println(expresion + " = " + value);// cambiar el valor de los paramentros para evaluar la expresionfuncion.addVariable("x", -2.0);funcion.addVariable("y", 2.0);value = funcion.getValue();CAPITULO3. MANEJOYUSODEJEP 37System.out.println(expresion + " = " + value);}}Elresultadoobtenidoalejecutaresteprogramaes:Ejemplo del uso de JEP con la funcion: e^x*sin(y)+e^y*cos(x)%e^x*sin(y)+e^y*cos(x) = -6.775169047420377 %e^x*sin(y)+e^y*cos(x) = -2.9518722958335823.1.2. DenicioneimplementaciondenuevasfuncionesJEPpermitelaadiciondenuevasfuncionesqueseandenidasporel usuario. Parapoderrealizaresto, esnecesariodeterminarel n umerodevariablesquetienelafuncion,denirunnuevaclaseextendidadePostxMathCommand, delaqueensuconstructorpor defectose especique el n umerode parametros que necesitaparalaevaluacionyademassobre-escribirelmetodorun()delasuperclase,elcualtieneporobjetivoproveerlosparametrosparaevaluarlanuevafuncionyponerel resultadodelaevaluacionenlapila, queesunaestructuradedatosauxiliarqueayudaarealizarlaevaluaciondeunaexpresionmatematicaennotacionposja.Para especicar el n umero de parametros que son necesarios para realizar la evaluacionenel constructorpordefecto, sedebeasignaral camponumberOfParametersel n umerodevariablesdelafuncionyencasodequeesten umeronoseaconstante,porejemplo,enelcasodeunasumatoria,sedebeasignaranumberOfParameterselvalor-1.Para poder sobre-escribir el metodo run(), es necesario saber como se encuentran ubica-dos los parametros con los cuales se realiza la evaluacion de la nueva funcion. Por ejemplo,si se tiene una funcion f(x1, x2, . . . , xn1, xn), entonces los parametros x1, x2, . . . , xn1, xn,seencuentranubicadosenordeninversodesdeeltopedelapila,ascomosemuestraenlagura3.1.ParaobtenerlosparametrosserevisaquelapilanoseencuentrevacaconelmetodocheckStack()yluegoseobtieneel topedelapilaconel metodopop()propiodelaclaseStack; esto se realiza por cada uno de los parametros. Luego se debe poner el resultado delaevaluaciondelafuncionenel topedelapilaconel metodopush()propiodelaclaseStack.En la pila cada nodo es un objeto y como en general para la evaluacion de la funcion sedise naunnuevometodo,entoncesparacadaobjetoobtenidodelapilaesnecesariosaberde que tipo es (p. ej. Double, Complex), para as poder realizar la evaluacion correctamente.EnJava existe el operador instanceof que permite saber de que tipo es un objeto, y tieneelformato:objetoinstanceof tipoCAPITULO3. MANEJOYUSODEJEP 38f(x1, x2, . . . , xn1, xn)..pilax1x2xn1xn......topeFigura3.1:Ubicaciondelosparametrosdeunafuncionenunpila.esteoperadorretornatrueofalseencasodequeseaonounainstanciadelaclaseespecicada(tipo). Masadelantesemostraracomosedebeutilizaresteoperadorenlaimplementacion.Acontinuacionsemuestrandosejemplosdecomosedebenimplementarnuevasfun-cionesenJEP.EjemploImplementaciondelafuncionexponencial (Exponential())devariablereal ycompleja, lacual noseencuentraimplementadaentrelasdenidasenel pa-queteorg.nfunk.jep.function.import java.util.*;import org.nfunk.jep.*;import org.nfunk.jep.type.*;import org.nfunk.jep.function.*;public class Exponential extends PostfixMathCommand {/*** Crea una nueva instancia de Exponential y establece el numero* de parametros*/public Exponential() {numberOfParameters = 1;}/*** Permite obtener el par ametro de la pila y poner el resultado de la* evaluacion de la funcion exponencial.*/CAPITULO3. MANEJOYUSODEJEP 39public void run(Stack inStack) throws ParseException {// chequear si la pila est a vac acheckStack(inStack);Object param = inStack.pop(); // obtener el tope de la pila// poner el resultado de la evaluaci on en la tope de la pilainStack.push(exp(param));}/*** Realiza la evaluaci on de la funcion exponencial dependiendo de si el* argumento es un n umero real o un n umero complejo.*/public Object exp(Object param) throws ParseException {if (param instanceof Number) {return new Double(Math.exp(((Number)param).doubleValue()));}else if (param instanceof Complex) {//e^z = e^x(cos y + i*sen y); z=(x,y)Complex z = (Complex)param;double x = z.re();double y = z.im();return new Complex(Math.exp(x)*Math.cos(y), Math.exp(x)*Math.sin(y));}throw new ParseException("Invalid parameter type");}}EjemploSeilustralaimplementacionunafuncionquetienemasdeunavariable,estafuncioneselejemploilustradoengura1.3,u(x, y) = exsen y + eycos x.import java.util.*; import org.nfunk.jep.*; importorg.nfunk.jep.type.*; import org.nfunk.jep.function.*;public class FuncionXY extends PostfixMathCommand {/** Crea una nueva instancia de FuncionXY */public FuncionXY() {numberOfParameters = 2;}/*** Permite obtener los 2 argumentos de la pila y poner el resultado* de la evaluaci on de la funcion.*/public void run(Stack inStack) throws ParseException {// arreglo de objetos con el n umero de par ametros definidosObject param[] = new Object[this.numberOfParameters];// obtener los objetos en orden inverso al de la pilafor(int i=this.numberOfParameters-1; i >= 0 ; i--){checkStack(inStack); // chequear que la pila no este vacaCAPITULO3. MANEJOYUSODEJEP 40param[i] = inStack.pop(); // obtener el tope de la pila}// poner el resultado en el tope de la pilainStack.push(funcionXY(param[0],param[1]));}/*** Realiza la evaluaci on de la funcion verificando que los parametros sean* numeros reales.*/public Object funcionXY(Object param1, Object param2) throws ParseException {if (param1 instanceof Number && param2 instanceof Number) {double x = ((Number)param1).doubleValue();double y = ((Number)param2).doubleValue();return new Double(Math.exp(x)*Math.sin(y) + Math.exp(y)*Math.cos(x));}elsethrow new ParseException("Invalid parameter type");}}3.1.3. Ejemplosdel usodelosmetodosdeJEPUsodevoidparseExpression(Stringexpressionin)Este metodo es el u