Instituto Tecnológico de Cancún INGENIERÍA EN SISTEMAS COMPUTACIONALES LENGUAJES Y AUTÓMATA AUTÓMATAS 1 UNIDAD V VI ENSAYO ANÁLISIS LÉXICO Y ANALISIS SINTACTICO. PRESENTA: Canche Taa! A"#$n An%&n$& In'. E()$n L*+e, A"#a-e, SEXTO SEMESTRE
In%-&(cc$*n/ En este tema se hablara antes que todo acerca del compilador ya que a base de este elemento surgen los analizadores Se conocerán los tipos de análisis léxicos y sintácticos tales como las funcionalidades que tienen cada uno de ellos, sus errores tanto léxicos y sintácticos se hablaran la importancia que se tiene uno con otro ya que va derivado, uno necesita del otro para poder tomar el correcto funcionamiento del programa Se hablara de los componentes que tienen y los lenguajes de programacin! "s# como por ejemplo El lenguaje c$$, java c%! En los &eneradores Existen varios para cada análisis léxico conocido como scanner y el sintáctico 'parse( ya que surge el ahorro de esfuerzo para los generadores "utomáticos ya que estos! &eneradores solo necesitan conocer la especificacin de to)ens a reconocer!
*n lenguaje de programacin, alguna expresin, comando o sentencia es el medio por el cual el hombre interact+a con una computadora! ero el lenguaje de programacin no entra directamente a ser ejecutado, es decir, necesita de otro componente importante para completar éste tipo de entrada que se le a propiciado, y es en este punto donde surge el tema de los analizadores! -os analizadores son parte importante dentro de un compilador: Un compilador es un programa que lee un código escrito en un lenguaje (alto nivel, código fuente) y lo traduce a un programa equivalente en otro lenguaje (lenguaje objeto)”
.omo parte importante de este proceso de traduccin, el compilador informa as# al usuario de la presencia de errores en el programa fuente! rograma fuente Compilador
-enguaje /bjeto
0ensaje Error 1ando a resaltar que en 2345 se desarroll el primer lenguaje de alto nivel que permit#a escribir frmulas matemáticas de manera traducible en el ordenador6 a la cual le llamaron 7/898" -a traduccin de éste cdigo fuente al programa ejecutable es un proceso muy complejo, cuando se ejecuta el cdigo máquina generado tiene que ser rápido y consumir poca memoria 8efiriéndonos a '/ptimizar 8ecursos( ara ello utiliza analizadores que le permiten separar y analizar independientemente y con reglas diferentes las distintas partes del cdigo! En un compilador, el análisis lineal se le llama análisis léxico o exploracin,El analizador léxico entonces es el primero paso de un compilador, éste se encarga de dividir todo el cdigo en palabras o mejor conocidas como to)ens6 -os to)ens son palabras reservadas de un lenguaje, secuencia de caracteres que representa una unidad de informacin en el programa fuente! Es importante mencionar que el analizador léxico y el compilador siempre van a depender del tipo de lenguaje de programacin que se usa, puesto que son diferentes las sentencias utilizadas en 0a#a e en c2 & en +a3ca", pero los pasos de su compilador son los mismos todos los lenguajes necesitan de analizadores! *n to)en finalmente es un componente léxico al cuál se le deberán de aplicar ciertas reglas, cada una de éstas reglas son en base al siguiente analizador
después de léxico que es el sintáctico! -os analizadores como se puede leer, trabajan en equipo y uno no puede ser sin el otro ya que cada uno de éstos realiza una funcin espec#fica! 9omando en cuenta lenguajes de programacin es importante mencionar que un analizador léxico es más amplio en cuánto a la relacin de to)ens, es por eso que ocupa de un analizador sintáctico para acortar las posibilidades y corregir cualquier m#nimo error que un programador introduzca en un cierto lenguaje de programacin! *n analizador léxico se caracteriza entonces por el uso de to)ens, trabajando con varios tipos de éstos como son: espec#ficos y no espec#ficos! -os to)ens espec#ficos son las palabras reservadas dentro del lenguaje de programacin y los que definen el tipo de lenguaje, 9abla de lenguajes de programacin con palabras reservadas! ;ava s
.$$ thread class private return ne<
.% byte case char else 1efault
-os to)ens no espec#ficos son identificadores, variables o etiquetas que tal vez puedan tener un parecido con otros lenguajes de programacin! /peradores: =, >, =, ?=, $, @, A , B! C S#mbolos especiales: 6, D ,' (, F G, H C .onstantes numéricas: -iterales que representan valores enteros y flotantes! 3IJ, 5x7KLI, AIM!JE$J,!!! C .onstantes de carácter: literales que representan cadenas de caracteres! .adenas de caracteres, Nhola mundoO,!!! C .omentarios: B@@ abcde @@B 9odo esto lo supervisa el analizador léxico para enviárselo al analizador sintáctico, realizando en resumen las siguientes actividades en conjunto: 2! .on ayuda de los patrones, reglas y normas analiza los caracteres y reconoce lexemas J! Env#a al analizador sintáctico los componentes 'ahora léxicos( analizados 1ando a resaltar que *na de las funciones Secundarias que tiene el analizador léxico tiende a Eliminar comentarios, espacios en blanco, tabuladores y saltos de l#nea 'caracteres no válidos para formar un to)ens(
El análisis léxico tiende inicialmente a leer los lexemas y le asigna un significado propio! -os componentes léxicos que se utilizan en los compiladores son: @ alabras clave o reservadas, /peradores aritméticos, /peradores relacionales, /peradores lgicos, /perador de asignacin, Pdentificadores, .onstantes, .adenas, -iterales, signos de puntuacin, -ibrer#as! 9ambién existe un atrn donde genera básicamente reglas que genera la secuencia de caracteres que puede presentar un determinado componente léxico! El -exema es una cadena de caracteres que concuerda con un patrn que describe un componente léxico en 'valor de cadena(!.omo se mencion anteriormente .uando se empiece a traducir el cdigo fuente el compilador empieza a reconocer e informa al usuario de un posible error de cdigo fuente Es all#, donde surgen los errores léxicos, -os errores léxicos se detectan cuando el analizador léxico intenta reconocer componentes léxicos y la cadena de caracteres de la entrada no encaja con ning+n patrn! Son situaciones en las que usa un carácter invalido 'Q,R,O,,!!!(, que no pertenece al vocabulario del lenguaje de programacin, al escribir mal un identificador, palabra reservada u operador! Errores léxicos t#picos son: 2! nombre ilegales de identificadores: un nombre contiene caracteres inválidos! J! n+meros incorrectos: un numero contiene caracteres inválidos o no está formado correctamente, por ejemplo M,2T en vez de M!2T o 5!M!2T! M! errores de ortograf#a en palabras reservadas: caracteres omitidos, adicionales o cambiados de sitio, por ejemplo la palabra h
9odos los analizadores léxicos realizan la misma funcin 'se implementan de igual forma( excepto en los to)ens que reconocen, las expresiones regulares que los definen! Es una forma de ahorrar esfuerzo, utilizar generadores automáticos de analizadores léxicos! Estos generadores solo necesitan conocer la especificacin de to)ens a reconocer! El generador -ex es el principal programa para generar analizadores léxicos, se utiliza com+nmente con el programa yacc que se utiliza para generar análisis sintácticos -ex genera cdigo fuente en c, a partir de una serie de especificaciones escritas en lenguaje lex! El cdigo . generado tiene una funcin -lamada yylex'(, que localiza cadenas en la entrada 'lexemas( que se ajusten a uno de los patrones léxicos especificados en el cdigo fuente lex! or otro lado tenemos al analizador sintáctico, también llamado parser, recibe como entrada los to)ens que le pasa el "nalizador -éxico 'el analizador sintáctico no maneja directamente caracteres( y comprueba si esos to)ens van llegando en el orden correcto 'orden permitido por el lenguaje(! -a salida WtericaW de la fase de análisis sintáctico ser#a .adena 1e to)ens
Analizad or
Xrbol Sintáctico
En el diseVo del analizador sintáctico, este no ha de preocuparse de leer el archivo de entrada, ni de saltar blancos, ni comentarios, ni de recibir caracteres inesperados, puesto que todo ello ha sido filtrado previamente por el analizador lexicográfico! El análisis sintáctico utiliza los primeros componentes de los to)ens producidos por el analizador léxico para crear una representacin intermedia en forma de árbol que describa la estructura gramatical del flujo de to)ens *na representacin t#pica es el árbol sintáctico, en el cuál cada nodo interior representa una operacin y los hijos del nodo representan los argumentos de la operacin! Si en todo caso de no existir este árbol sintáctico, la cadena no pertenecerá al lenguaje y el analizador sintáctico debe emitir el correspondiente mensaje de error! Existen dos formas de analizar sintactimente una cadena "nálisis descendente, parte del axioma inicial de la gramática se va descendiendo utilizando las derivaciones izquierdas hasta llegar a construir la cadena analizada
or otro lado el análisis ascendente se va construyendo el árbol desde sus nodos terminales, es decir se va construyendo desde los s#mbolos de la cadena hasta llegar al axioma dela gramática! Si hacemos una breve "nálisis de comparacin de los analizadores léxicos y sintácticos! os damos cuenta que en el léxico .uenta con cada secuencia de carácter para que su salida sea la secuencia de to)ens, de lo contrario en el sintáctico se basa en el inicio de secuencia de to)ens para sacar un árbol sintáctico -exer aser
Secuencia de Secuencia de to)ens caracteres Secuencia de to)ens Xrbol Sintetico
-o que realiza el analizador sintáctico es que: o todas las secuencias de to)ens son programas, El "nalizador sintáctico debe distinguir entre secuencias de to)ens válidos y no válidos, ecesitamos *n lenguaje para describir secuencias de to)ens válidas!, *n método para distinguir entre secuencias de to)ens válidas y no válidas Entrada: Secuencia de to)ens de un analizador léxico Salida: El árbol sintáctico de un programa ara entender más acerca de este analizador se tocara el tema de los &-. o también -as gramáticas libres de contexto permiten describir la mayor#a de los lenguajes de programacin, de hecho, la sintaxis de la mayor#a de lenguajes de programacin está definida mediante gramáticas libres de contexto *na gramática libre de contexto consiste de: C *n conjunto de no terminales C *n conjunto de terminales 9 C *n s#mbolo inicial S 'no terminal( C *n conjunto de producciones de la forma *n árbol de análisis sintáctico se puede considerar como una representacin gráfica de una derivacin! *n árbol de derivacin tiene las siguientes propiedades: El nodo ra#z está rotulado con el s#mbolo distinguido 'inicial( de la &ramática! .ada nodo corresponde a un s#mbolo terminal o un s#mbolo noAterminal! .ada nodo corresponde a un s#mbolo noAterminal! *n árbol de derivacin muestra gráficamente las derivaciones 'substituciones de s#mbolos no terminales( que hay que llevar a cabo para llegar a una 7orma Sentencial a partir del s#mbolo inicial! *n recorrido de izquierda a derecha de las hojas da como resultado la entrada original
1ebemos tener en cuenta que si existe una derivacin más ala izquierda también tendremos un equivalente llamada derivacin más a la derecha! En el analizador también 0aneja errores de tal forma que los programas no son siempre concretos para el analizador sintáctico un error de sintaxis se detecta a partir de la espera de un s#mbolo que no corresponde al que acaba de leer,1e tal forma que los analizadores ascendente y descendente tienen la ventaja de que puedan detectar error sintáctico lo más pronto posible, es decir se genera un mensaje de error cuando el s#mbolo analizado no sigues la secuencia del s#mbolo analizados hasta ese momento! -as herramientas sirven para disminuir el n+mero de errores sintácticos *na de las formas más precisas tanto el programador poder usar alg+n editor basado en sintaxis 'colores( permite mostrar el error presentado sin ning+n problema or lo tanto el manejador de errores de un analizador sintáctico debe tener como objetivos: Pndicar los errores de forma clara y precisa! "clarar el tipo de error y su localizacin! oder 8ecuperarse del error, para poder seguir examinando la entrada! *n buen compilador debe hacerse siempre teniendo también en mente los errores que se pueden producir6 con ello se consigue: Simplificar la estructura del compilador y 0ejorar la respuesta ante los errores! 9enemos varias estrategias para corregir errores, una vez detectados: Pgnorar el problema .onsiste en ignorar el resto de la entrada hasta llegar a una condicin de seguridad! *na condicin tal se produce cuando nos encontramos un to)en especial 'por ejemplo un Y6Z o un YE1Z(! " partir de este punto se sigue analizando normalmente! Esta es la más com+n usada tanto la 8ecuperacin a nivel de frase Pntenta recuperar el error una vez descubierto! En el caso anterior, por ejemplo, podr#a haber sido lo suficientemente inteligente como para insertar el to)en Y6Z! [ay que tener cuidado con este método, pues puede dar lugar a recuperaciones infinitas! 8eglas de produccin adicionales para el control de errores -a gramática se puede aumentar con las reglas que reconocen los errores más comunes! En el caso anterior, se podr#a haber puesto algo como: sent\errne a ] sent\sin\acabar sentencia\acabada Z6Z sentencia\acabada ] sentencia Y6Z sent\sin\acabar ] sentencia -o cual nos da mayor control en ciertas circunstancias a 9eniendo en cuenta el lenguaje de programacin que se utiliza! 1ada una secuencia completa de to)ens a ser reconocida, si hay alg+n error por el que no se puede reconocer, consiste en encontrar la secuencia completa más parecida que s# se pueda reconocer! Es decir, el analizador sintáctico le pide toda la secuencia de to)ens al léxico, y lo que hace es devolver lo más parecido a la cadena de entrada pero sin errores, as# como el árbol que lo reconoce!
-os generadores del análisis sintáctico de acuerdo al tipo de analizador descendente o ascendente '-- / -8("lgunos de ellos se utilizan com+nmente en la programacin esto hace más fácil y ahorra esfuerzo para generar análisis sintáctico Existe diferentes generadores en la cual es muy dif#cil escoger uno, ya que ahora tienen a ser mucho más Sencillo y ahorro de tiempo veremos cuáles hay estos son un poco de todos los generadores que tiene el analizador sintactico ^acc,bison, grammatical, Sid, ^ayacc, gold cooBr9 lexByacc, "flexBayacc ;avacc,Sablecc ,.up,Spirit,arsevie<,Ueaver Este generador es más compacto utiliza un analizador ascendente y un multilenguaje de programacion e incluye en el análisis léxico Se le conoce como &/-1 Es el 9ipo de analizador ascendente -8 con .digo generado .on 0ultilenguaje 'java,c% ansi c,dephi, python _U,_U!E9,_.$ $,``P&ES9S todos los lenjuages !net y -o que lo .aracteriza es que Pncluye análisis léxico!
C&nc"3$*n/ 7inalmente es importante saber que aunque el analizador léxico es la primera etapa del proceso de compilacin, no es quien lo inicia! El proceso o la compilacin empiezan con el analizador gramatical quien solicita un to)en6 es cuando el analizador de léxico re+ne éstos s#mbolos contenidos en el to)en, lo analiza y posteriormente lo env#a al sintáctico para esperar del gramatical otro to)en! ara finalizar es importante conocer como programador los procedimientos, pasos y formas en que se ejecuta y compila el cdigo de programacin que utiliza diariamente, puesto que gracias a esto es posible desde el mensaje de errores hasta el mismo lenguaje de programacin, si éste tipo de analizadores no existieran, cada programador tendr#a la tarea de verificar, analizar y ejecutar correctamente su cdigo sin ayuda de ninguna herramienta! "demás de que se debe de conocer cmo es que trabajan estos analizadores, es decir, que es la léxica, sintáctica, y también la semánticaHpara poder saber aplicarlos correctamente! *na ventaja más acerca de conocer un compilador es que se reconoce e identifica más fácilmente un tipo de lenguaje de programacin, esto gracias a su sintáctica, léxico y semántica!
Ane4&3/ En esta hoja se mostrara la ejecucin de un programa en java eetbeans donde podremos ver los la deteccin de las palabras reservadas las variables y operadores y funciones del análisis léxicos a partir de los to)ens
Ejemplo: JM : 2J : 4I [oras = D55 JM 0inutos = D55 K5 Segundos = D55 K5 Separador = : "nálisis lexico 9/E [oras Separador 0inutos Separador Segundos
-EE0 " JM : 2J : 4I
"nálisis sintáctico & = F_n, _t, 8, SG _n = Fexp, [oras, minutos, segundos, separador G _t = FD55 JMD55 43 :G 8eglas Exp = horas separador minutos separador segundos horas: val2 val 2= D55 JM val J= D55 43 minutos: valJ segundos: valJ separador: :
"8U/- SP9".9P./ E [oras
Segundos Separador 0inutos
Separador
_ar2 : @
: _alJ
@
_alJ
JM 2J 4I
Uibliograf#as: "ho, Sethi, *llman, .ompiladores rincipios, técnicas y herramientas, Ed! "ddison `esley 0artin ;ohn, -enguajes formales y teor#a de la computacin, Ed! 0c &ra< [ill! [opcroft ;ohn E!, Pntroduccin a la 9eor#a de "utmatas, -enguajes y .omputacin, Jda ed, Ed! "ddison `esley, J55T! http:BB<<