Ver este pdf http://computacion.cs.cinvestav.mx/~mru http://computacion.cs.cinvestav .mx/~mruiz/publicaciones/tesis/tes iz/publicaciones/tesis/tesisIngMich isIngMich elRuizTeeida.pdf
herramientas para desarrollar una analizador sintáctico
!"#$I%I% %I"T#&TI&' $a siguiente fase de compilaci(n es el analizador sint)ctico *parser+, en donde se analiza la estructura gramatical del lenguae fuente, estas reglas son representadas por las gram)ticas libres del contexto - su escaneo con los )rboles sint)cticos.
Her r ami ent aspar al ac ons t r uc c i óndec ompi l ador es o y Her r ami mi ent as par a l a const r ucci ón de comp mpi l ador es .El us p er f ec c i on ami e nt o de l os c ompi l ad or e sh at r aí d oc ons i go e ld es ar r ol l o de h er r a mi mi e nt a sq ue a po r t a n al ar e al i z a c i ó nd el o smi s mo mo s ,e s t a ss eh an i d o es pec i al i z andoenl asdi f er ent esf as esdelpr oc es odec ompi l ac i ón,br i ndándol e al o sd es a r r o l l a do r e su na s e r i ed ef a c i l i d ad es a l ah or ad ed i s e ñ are i mp l e me me nt a ru nc o mp mp i l a do r .En e lmu nd oe x i s t e nd i v e r s a sh er r a mi mi e nt a sd e apoy odees t et i po,des ar r ol l adasendi f er ent esl enguaj esdepr ogr amac i ón,l as c ual esr es pondenal osi nt er es esdel osmúl t i pl ess i s t emasoper at i v os .Ent r el as h er r ami e nt asmá s ut i l i z ad as s ep ued en e nc o nt r a relFl e x ,Y ac c ,L ex ,Bi s on ent r eot r as . Her r ami ent a
Descr i pci ón
Bi s on
Gener adordeAnal i zad or esSi nt ác t i co sAsc endent est i poYACC
COC OCO/ O/ R
Ge ne r a do rde An al i z a d or e sL éx i c o s y Si n t á c t i c o s De s c e nd en t e s Rec ur s i v o s
Fl e x
Gen er ad ordeAna l i z ad or esLé x i c ost i poL ex
Lex
Gener adordeAnal i z ador esLéx i c os
SDGLL 1
Si s t emaDet ec t ordeGr amát i c asLL ( 1)
TS2006
Ti poabst r act odedat osTabl adeSí mbol osdeusosenci l l o( bet a0. 4)
TS
Ti poabs t r ac t od edat osT abl adeSí mbol os
TSOO
Ti poa bs t r ac t oded at osT ab l adeSí mbo l os
YACC
Gene r ado rdeAna l i z ado r esSi nt ác t i c osAs c end ent esL R( 1)
Bi s on Esungener adordeanal i z ador ess i nt ác t i c osdepr opós i t ogener al quec onv i er t e unades c r i pc i óngr amat i c alpar aunagr amát i c ai ndependi ent edelc ont e xt oen u np r o gr a mae nC q uea na l i c ee s ag r a má t i c a .Esut i l i z a doe nu na mp l i or a ng o d ea nal i z ad or e sdel e ng ua j es ,d es deaqu el l osus ado sens i mpl esc al c ul a dor as dees c r i t or i ohas t ac ompl ej osl enguaj esdepr ogr amac i ón.
Lex Esungener adordeanal i z adorl éx i c o,ques i r v epar agener arl ost ok enpar al a s i gui ent ef as e.Lapr i nc i palc ar ac t er í s t i c adeLexesquev aaper mi t i ras oc i ar ac c i onesdes c r i t asenC,al al oc al i z ac i óndel asEx pr es i onesRegul ar esques e h a y a nd efi n i d o.Pa r ael l oL e xs ea po y ae nu na p l a nt i l l aq ue r e c i b ec o mo p ar á me t r o ,yqu es ed eb ed i s e ña rc o nc u i d ad o.I n t e r n ame nt eL exv aaa c t u ar como un aut ómat a que l ocal i zar ál as expr esi ones r egul ar es que se l e d es c r i b an,yun av e zr ec ono ci d al ac ade nar e pr e se nt adap ordi c hae x pr e s i ón r egul ar ,ej ec ut ar áel c ódi goas oc i adoaes ar egl a.
Yacc Esu np r og r amap ar ag en er aran al i z a dor e ss i nt á ct i c os .L ass i gl asd eln ombr e s i g ni fi c a nY etAn ot h er Co mp i l e r Co mp i l e r ,es d ec i r ," Ot r og en er a do rd e c ompi l ador esmás " .Gener aunanal i z adors i nt ác t i c o( l apar t edeunc ompi l ador
quec ompr uebaquel aes t r uc t ur adel c ódi gof uent es eaj us t aal aes pec i fi c ac i ón s i nt ác t i c ad ell en gu aj e)b as ad o en una gr amát i c aa na l í t i c a. Yac cg ener ae l c ódi gopar ael anal i z adors i nt ác t i c oenel Lenguaj edepr ogr amac i ónC.
Fl ex Es una her r ami ent a par a gener ar escáner es: pr ogr amas que r econocen p at r o nes l é xi c os e n un t e x t o.Fl e xl e el os fi c her o sd ee nt r a da da dos ,o l a e nt r a da e s t á nd ars in os el eh ai n di c a d on i n gú nn omb r ed efi c h e r o ,c o nl a d es c r i p c i ó nd eu ne s c án erag en er a r .Es t a sh er r a mi e nt a sd ea po y oh ans i d o r ees c r i t aspar aot r osl enguaj es ,i nc l uy endoRat f or ,EFL,ML, Ada,J av a,Py t hon, yLi mb o.Dee s t af o r mas eh al o gr a dou nama y o ru t i l i z a c i ó nd el a smi s ma se n di f er ent esc ompi l ador es des ar r ol l adoss obr et ec nol ogí as l i br es .T eni endo en c u en t al a sc a r a c t e r í s t i c a sd el a sa pl i c a c i o ne sa nt e s me nc i o na da s ,s eh a es c ogi dop ar al ar ea l i z ac i ó n de lc ompi l a do rl ash er r a mi en t asYac cyLe x .En muc h osdel osc ompi l ad or e sde sa r r o l l ad ose ne lmund os ue l e ns eru t i l i z a dos j unt os.Yac cut i l i z aunagr amát i c af or mal par aanal i z arunfl uj odeent r adas ,al go queLe xn opu edeh ac erc one x pr e si o ne sr egu l ar ess i mpl es( L exs el i mi t aal o s a ut ó ma t a sd ee s t a do sfi n i t o ss i mp l e s ) .Si ne mb ar g o,Ya c cn op ue del e ere nu n fl uj od ee nt r ada ss i mpl e,r eq ui er e un as er i e de s í mbo l os .L ex s eu t i l i z aa me nu dopa r apr o po r c i o na raYa c ces t o ss í mb ol o s .
ava&& Características de JavaCC
JavaCC (Java Compiler Compiler) es una herramienta de generación automática de analizadores gramaticales basada en Java. La herramienta es propiedad de Oracle, la compaña propietaria del lengua!e Java, por lo "ue se ha convertido en el metacompilador más usado por los programadores en Java. #l $uncionamiento de la herramienta consiste en analizar un $ichero de entrada, "ue contiene la descripción de una gramática, % generar un con!unto de $icheros de salida, escritos en Java, "ue contienen la especi$icación de un analizador l&'ico % de un analizador sintáctico para la gramática especi$icada. Las caractersticas más importantes de esta herramienta son las siguientes •
•
•
•
•
•
•
•
•
#s la herramienta más utilizada en Java. Los propietarios estiman en cientos de miles el nmero de descargas de la herramienta % los $oros de discusión congregan a miles de usuarios interesados en JavaCC. *e basa en una análisis sintáctico descendente recursivo. +or de$ecto JavaCC analiza gramáticas de tipo LL(), pero permite $i!ar un Lookahead ma%or (para analizar gramáticas LL(-)) e incluso utilizar un Lookahead adaptativo. Las especi$icaciones l&'ica % sintáctica de la gramática a analizar se inclu%en en un mismo $ichero. La especi$icación l&'ica se basa en e'presiones regulares % la especi$icación sintáctica utiliza el $ormato #/0. Junto a la herramienta principal se inclu%en dos utilidades JJ1ree, para crear automáticamente un generador de árboles sintácticos, % JJ2oc, para generar automáticamente la documentación de la gramática en $ormato 314L. La distribución inclu%e numerosos e!emplos de gramáticas % e'isten repositorios en internet con la especi$icación de muchsimas gramáticas en el $ormato de JavaCC. La gestión de errores l&'icos % sintácticos está basada en e'cepciones % contiene in$ormación mu% valiosa respecto al origen del error % su posición. #'iste un plugin para #clipse "ue $acilita la edición % e!ecución de la
herramienta dentro del desarrollo de cual"uier aplicación en Java.
Sintaxis de JavaCC
JavaCC utiliza la e'tensión 5.!!5 para identi$icar los archivos de entrada "ue contienen la especi$icación de la gramática a analizar. La estructura de estos archivos se divide en cuatro partes. . La primera permite seleccionar una serie de opciones, como el valor del Loo-ahead, si se van a generar m&todos estáticos o no, si se va a distinguir entre ma%sculas % minsculas, etc&tera. 6. La segunda parte permite de$inir el nombre del analizador e incluir el código Java "ue se va a añadir directamente a este analizador, como el nombre del pa"uete en el "ue se inclu%e, las clasulas import, la cabecera de la de$inición de la clase, los constructores de la clase, las variables de instancia o los m&todos "ue pueden ser utilizados en la de$inición de la semántica de la gramática. 7. La tercera sección contiene la especi$icación l&'ica de la gramática. 8. La ltima parte del archivo la ocupa la descripción de las reglas sintácticas de la gramática. 9 continuación se muestra un e!emplo del contenido de un $ichero de especi$icación gramatical :; opciones generales ;: options < =>/O?#@C9*# A trueB *191=C A $alseB ... +9?*#?@#>=/(4i>ramatica) :; de$inición del nombre del analizador ;: :; codigo Java utilizado en la descripción del analizador ;: import !ava.io.;B public class 4i>ramatica < ...
+9?*#?@#/2(4i>ramatica) :; especi$icación l&'ica de la gramática ;: 1OD#/ :; =denti$icadores ;: < E =2 ( EL#11#?F )G ( 5@5 H 5I5 H 55 H E2=>=1F H EL#11#?F ); F H E L#11#? K5955M5, 5a55z5N F H E 2=>=1 K555P5N F *D=+ < 55 H 5Qn5 H 5Qr5 H 5Qt5 :; especi$icación sintáctica de la gramática ;: void Create1able() < 1o-en to-enB < EC?#91#F E19L#F to-en A E=2F < *%stem.out.println(51able 5 G to-en.image)B 5(5 ColumnList() 5)5 ...
http://.uaeh.edu.mx/scige/boletin/hueutla/n0/m1.html
NTRODUCCIÓN La totalidad del software que se ejecuta en las computadoras ha sido escrito en algún lenguaje de programación. Antes de que un programa sea ejecutado en determinada arquitectura hardware, primero es necesario hacer la traducción de este a un programa ejecutable, por lo cual es necesario un compilador. Al día de hoy, son ya distintos los lenguajes de programación utilizados para el desarrollo de software o programas, con la
eolución de estos lenguajes ha sido necesaria la implementación de diersos compiladores. !ara las diersas fases del proceso de compilación es necesaria una herramienta para lograr la creación del programa objeto o ejecutable. "n el presente trabajo se presentan algunas de las herramientas alternatias para el desarrollo de compiladores. !osterior a esta sección se presenta un bree resumen, a continuación se fija el objetio particular de este trabajo, posteriormente se hace una definición del compilador, y para finalizar se presentan algunas herramientas para el desarrollo de compiladores de acuerdo a las fases de este.
OBJETIVO #onocer herramientas utilizadas para la construcción de compiladores.
DEFINICIÓN DE COMPILADOR $n compilador, es un programa que recibe como entrada un programa o archio fuente, lo traduce y obtiene como salida un programa objeto, dentro del proceso de compilación se le dan a conocer al usuario los errores del programa fuente si la sinta%is del mismo no es la correcta de acuerdo al lenguaje de programación.
Figura 1. Proceso de co!i"aci#$.
% ERRAMIENTA&
PARA EL DE&ARROLLO DE COMPILADORE&
"n la actualidad e%isten diersas herramientas para el desarrollo de compiladores, en el presente trabajo se mencionan sólo algunos de los e%istentes. &entro de estas herramientas
se
encuentran
Las herramientas tradicionales'
las
tradicionales
y
las
de
nuea
generación.
•
(oldparser
•
)acc
•
#up
Las herramientas de nuea generación' •
•
A*+L -AA##
A continuación se mencionan herramientas definiendo algunas de sus características y mencionando en que fase se utiliza. •
(/L&!A0".1 0u funcionamiento es realizar el an2lisis l3%ico emplea autómatas finitos determinísticos y anticipado analizador, estos algoritmos son m2quinas de estado que emplean tablas para determinar acciones. "sta herramienta est2 compuesta de tres componentes lógicos' o
#onstructor' #omponente primario y el principal de la aplicación, se emplea para analizar la sinta%is de un lenguaje y la construcción de tablas.
o
4otor' "sta escrito para un lenguaje de programación especifico.
o
#uadro compilado gram2tica' Almacena datos de la tabla creada en el constructor.
•
)A##.1 herramienta de software libre que genera un analizador sint2ctico en cual se basa en una gram2tica analítica cuya escritura se parece a una gram2tica libre. "st2 compuesta de tres secciones' o
&efiniciones' 0u función principal es declarar símbolos terminales de la gram2tica.
o
eglas' #ontiene a la gram2tica en sí, esta sección es la única obligatoria y no puede estar acía.
o
•
utas' "sta se encarga de definir funciones.
#$!.1 herramienta para la construcción de analizador sint2ctico el cual recibe un archio de entrada y la salida genera parsers escritos en jaa, los parsers que se obtienen utilizan el m3todo de an2lisis descendente LAL. La estructura del archio de entrada es la siguiente' o
"specificaciones de importación y empaquetamiento.
•
o
#ódigo de usuario.
o
Lista de símbolos.
o
&eclaraciones de precedencia.
o
(ram2tica.
A*+L.1 genera 2rboles sint2cticos descendientes, escrito en jaa y genera código en jaa o c55. o
entajas. 6uena integración de los analizadores l3%icos y sint2cticos.
o
&esentaja. (enera analizadores menos eficientes que los generadores )A##.
•
-AA##.1 inicialmente se llamó -A#7 es similar al A*+L y genera 2rboles ascendentes. o
entaja. 6uena integración en los analizadores l3%icos y sint2cticos. (enera analizadores sint2cticos y por lo siguiente 2rboles sint2cticos.
o
&esentaja. Analizadores menos eficientes.
C ONCLU&IÓN "n este trabajo se conocieron breemente algunas de las diferentes herramientas que e%isten para desarrollar compiladores, así como algunas de sus características, entajas y desentajas
de
las
mismas.
"n un trabajo futuro se profundizar2 sobre la herramienta 'acc , sus características y la aplicación de esta herramienta en el desarrollo de un compilador b2sico
https://lingua2it.com/es/analizador3sintactico https://es.i2ipedia.org/i2i/!nalizador4sint5&65!7ctico
Ejemplo sencillo con JavaCC de un analizador léxico y sintáctico
Hay ocasiones en que necesitamos procesar una determinada expresión, por ejemplo para hacer una búsqueda por una serie de criterios obtenidos de la misma. La forma habitual es hacerlo creando un algoritmo específico más o menos complejo según lo sea la expresión con arios splits, expresiones regulares, condiciones, bucles, etc..., que normalmente resulta en código ofuscado difícil de desarrollar, mantener, entender lo que hace y poco flexible ante cambios. !sta es la primera opción que se nos ocurre pero no es la mejor forma de hacerlo como eremos en esta entrada. "uando nos enfrentamos a un problema de procesar una expresión debemos tener en cuenta primeramente dos cosas# cual es su l$xico %las palabras que lo forman& y su sintaxis %las reglas que definen el orden del l$xico&. 'ás tarde por otra parte para procesar la expresión necesitaremos de acciones l$xicas y sintácticas que es código que se ejecutará para reali(ar las tareas que necesitemos al procesar la expresión. )ara facilitar la tarea existen los compiladores como resultado de la inención de los primeros lenguajes y aunque parecen algo complejo de hacer no lo son tanto como desarrollar un algoritmo específico. *aa"" es una herramienta que nos permite definir el l$xico de una expresión o lenguaje, la sintaxis del mismo y las acciones l$xicas y sintácticas generando posteriormente con la definción de estas cosas una serie de archios .jaa con el código fuente de un anali(ador l$xico, sintáctico y otra serie de archios .jaa de utilidad para los mismos. +upongamos que tenemos una aplicación en la que el usuario tiene una caja de búsqueda en la que puede introducir una serie de palabras separadas por espacios, en la que tambi$n puede agrupar arias palabas rodeándolas con y tambi$n puede introducir fechas en arios formatos y con distintos
separadores para el día, mes y a-o pudiendo especificar día, mes y a-o, solo mes y a-o, solo el mes o solo el a-o, por ejemplo dd.'''.yyyy, dd''''yyyy, ''''/dd/yyyy, '''.yyyy, ''', yyyy, ... )ara complicarlo aún más los meses pueden estar en diferentes idiomas. 0n ejemplo de expresión podría ser# 1real madrid enero.2342 febrero.2342 fútbol5 en la que intenta buscar elementos relacionados con el real madrid y fútbol y en los meses de enero o febrero de 2342. 6eamos el código fuente de nuestro peque-o compilador cuya misión sera interpretar la expresión de la mejor de las formas y deoler un objetoorg.hibernate.criterion."riterion con el que podremos hacer una búsqueda en Hibernate según los criterios de la expresión. !l compilador está diidido en arias partes# )78+!89:!;<= y )78+!9!=># define el nombre de nuestro anali(ador e incluye m$todos de utilidad %en perfecto código *aa& que será incluidos en el anali(ador sintático sin modificar y que podremos usar desde las acciones sintácticas. Los m$todos importantes de esta primera parte son los constructores %*aa"" inserta unos pero como emos podemos definir más&, el m$todo main, build"riterion?ermino y build"riterion@echa que construirán un "riterion cuando el anali(ador sintáctico detecte un t$rmino o fecha respectiamente, la misión principal de nuestro compilador. !stos m$todos no tienen mayor complicación son puro código *aa. (en azul). +A<) y ?BA!=# esta parte es la que define el anali(ador l$xico con las palabras de nuestra expresión o lenguaje. 7hí están la forma de las fechas, los t$rminos, el día, mes y a-o, los separadores. :ásicamente son una forma de expresiones regulares para definir cada uno de ellos (en morado). procesarCuery, procesar, termino, fecha# +on propiamente los m$todos del anali(ador sintáctico y an a definir la sintáxis de nuestro lenguaje. procesar contiene una de las partes más importantes ya que es el punto de partida, a cogiendo los toDens proporcionados por el anali(ador l$xico %que genera *aa""& y determina si es una fecha, t$rmino o algo desconocido. +egún lo detectado se ejecuta el bloque de código posterior que a entre EF y que constituye una acción sintáctica. "omo se e la acción sintáctica es perfecto código *aa y puede usar las ariables definidas en el bloque procesar como ct, ft y r. >espu$s de procesar todos los t$rminos de la expresión se ejecuta otra acción sintáctica que agrupa todos los "riterion recogidos en ct, cf en uno solo y que será lo que deuele el anali(ador (en verde).
!n la acción sintáctica de termino tenemos que tener en cuenta que el t$rmino puede ser un mes %enero, ...& por lo que se intenta procesar como una fecha con build"riterion@echa y si deuele algo es que se trataba de un mes sino se procesará como un termino con build"riterion?ermino. G)or qu$ se trata un elemento >!+"B=B"<>B )orque sino el anali(ador sintáctico daría un excepción al no saber lo que es, teminaría y no deolería nada. >e esta forma conseguimos que si una expresión que no se entiende se ignore y se deuelan al menos el resto de expresiones en el "riterion. !ste será el caso de un t$rmino fecha mal expresado como 134.enero23425 donde me(cla diferentes separadores en la misma fecha. ?al como están definidos los toDens, el anali(ador l$xico no sabría que es. I eso es lo principal de nuestro compilador. =o es tan complicado hacer uno como podría parecer a priori, sin duda mucho más fácil que hacer un algoritmo específico para ello incluso para una expresión tan simple como la tratada, ahora imagínate una que pueda ser como 1%JexprK or %JexprKand %JexprKor JexprK& or JexprK&&5. !sta es una de esas herramientas muy útilies y con la cual sabiendo usarla o al menos tener conocimiento de ella nos puede ahorrar mucho tiempo y conseguir hacer las cosas mejor. 7demás y dado que lo que genera como resultado son una serie de archios .jaa podremos utili(arlos en cualquier entorno, como en alguna administración pública cuyo nombre no citar$ aquí y en la que no esta permitido usar librerías no homologadas por ellos, dado que se trata de código fuente y que no tiene dependencias sobre otras librerías no tendremos ningún problema en usar *aa"" en casos como este. )ara compilar el compilador podemos hacerlo con ant con la siguiente tarea %tambi$n podemos utili(ar los propios comandos de *aa""