Você está na página 1de 4

ANLISIS LXICO UNIDAD III 3.1.

- INTRODUCCIN A LOS AUTMATAS FINITOS Y EXPRESIONES REGULARES INTRODUCCIN Al iniciarse el proceso de compilacin, el cdigo fuente de un programa no es ms que un flujo de caracteres, as que la tarea del anlisis lxico es reconocer smbolos en este flujo de caracteres y presentarlos en una representacin ms til para el anlisis sintctico. Este proceso se ilustra en la siguiente figura. Si stas conforman el lexema mnimo, la expresin regular puede ser {/} {*} {*} {/}. Ahora bien, entre Ay B puede venir o no C. La representacin de C es:

El anlisis lxico es efectuado por una parte del compilador llamada analizador lxico. Entre las funciones principales que realiza un analizador lxico se pueden mencionar las siguientes: Eliminar espacios en blanco Eliminar comentarios Reconocer identificadores Reconocer palabras clave Reconocer constantes y numerales Generar un listado para el compilador. EXPRESIONES ARITMTICAS Y EXPRESIONES REGULARES Una expresin aritmtica se representa con un conjunto de secuencias de smbolos vlidos que se construyen en base al alfabeto de un lenguaje. Generalmente estos conjuntos se representan como: ; { } Una expresin aritmtica tambin es una expresin regular que denota el conjunto vaco (el conjunto no contiene secuencias de smbolos). Una expresin regular que denota al conjunto que contiene la secuencia vaca, es decir, una cadena que no contiene smbolos, pero que se debe representar dentro de un alfabeto y al mismo tiempo tambin debe de estar representada dentro de una expresin aritmtica dentro de cualquier lenguaje de programacin es representada de la siguiente manera: S Una secuencia de smbolos S es una expresin regular que denota a un conjunto de smbolos que contiene a S, estos smbolos deben estar contemplados dentro del alfabeto. Operaciones sobre Lenguajes Construir una expresin regular es realizar operaciones sobre el alfabeto de un lenguaje. Podemos decir que el lenguaje, en su aspecto de lxico, est conformado por las operaciones que realizamos sobre su alfabeto para definir cada unidad de lxico. Las operaciones posibles son: Unin de L y M LUM = { S | S est en L S est en M} Concatenacin de L y M. LM= { st | s est en L y t est en M} Cerradura Kleene. i=0 ( L se repite de 0 a infinito) Cerradura positiva.

Si incluimos esto en lo anterior, la expresin resultante ser: {/}{*}{no*}+{*}{*}{/}. En B, el estado 4 tiene dos opciones: la parte representada por D y la parte representada por E. Cada una de ellas tiene representaciones como expresiones regulares.

Ambas expresiones tienen en comn que terminan con asterisco, que es la situacin con la cual se llega al estado 4 (de hecho el estado 4 est cubierto por E). Si unimos las dos opciones tendremos: {*}* | {no*/}{no*}*{*}, que puede simplificarse como: ({*} | {no*/}{no*}*{*})* Ya que la eleccin puede realizarse cero o ms veces. Al incluir las expresiones regulares anteriores a sta ltima, se obtiene: {/}{*}({no*} + {*} | {*}) ({*} | {no*/}{no*}*{*}) * {/} que puede ser una representacin vlida para el patrn del comentario. Una expresin regular es un mtodo formal para describir un patrn y puede ser empleada para construir un analizador de lxico que lo reconozca en una computadora. El proceso que se sigue es el inverso al planteado en el apartado anterior donde se parta de un diagrama de transicin para llegar a la expresin regular: la expresin se convierte a un diagrama de transicin y ste se puede representar como una tabla que conduzca el anlisis de lxico. De hecho, la expresin sufre una serie de transformaciones para llegar a ser explotada como tabla:

i=1 ( L se repite de 1 a infinito) Como se ve, las expresiones regulares son operaciones que se realizan sobre conjuntos de smbolos que pertenecen al alfabeto de un lenguaje. Estos conjuntos de smbolos se describen colocando a los smbolos que pertenecen a ellos entre llaves. Por ejemplo, los caracteres que ubicamos como letras podran conformar el conjunto {ABCDEFGHIJKLMNOPQRSTUVWXYZ, abcdefghijklmnopqrstuvwxyz} Si los elementos del conjunto tienen un orden conocido o asociado al cdigo ASCII se puede describir colocando el primer smbolo y el ltimo separados por un guin (-) como por ejemplo: {A-Z, a-z} ; {0-9; 2,4,6,8} Para hacer ms simple la construccin de una expresin regular, se designa bajo un nombre al conjunto con el cual se trabajar, as que el conjunto letra se puede describir como: L = {A-Za-z} D= {0, 1, 2, 3, , 9} Cuando a un conjunto o a una expresin regular se le da nombre, sta recibe el nombre de definicin regular. As, la expresin regular par aun identificador ser: ID= L ( L | D | G ) * Si las definiciones sobre las cuales est construida son: L = {A-Z, a-z} D = {0123456789} G = {_} Por ejemplo, en Ada los identificadores estn formados por letras, dgitos o guiones, pero el guin no puede ser el ltimo carcter. La expresin regular con la cual se puede conformar el patrn para esta unidad de lxico puede ser: ID_ada = L (L | D ) * (G (L | D ) + ) * Transicin del Diagrama a la Expresin Regular Lo que se ha presentado es la notacin que permite una expresin regular pero Cmo pasamos de un diagrama de transicin a una expresin regular? Dentro de un diagrama de transicin podemos reconocer ciertas situaciones: Secuencias de caracteres (concatenacin). Elegir entre dos o ms caminos (seleccin). Repeticiones de elementos (cero o una vez, cerradura Kleene, cerradura positiva). Generalmente el reconocimiento de tales situaciones pueden ayudarnos en la construccin de la expresin regular equivalente. Por ejemplo: consideremos el patrn de los comentarios en C, donde se espera encontrar cualquier secuencia de caracteres (incluso vaca) entre el par /* */. Su diagrama

AUTMATAS FINITOS Un autmata finito es un conjunto de nodos y aristas que representan trayectorias para generar una expresin bajo alfabeto. Un diagrama de transicin es un autmata finito. Los autmatas finitos se clasifican en: Autmatas Finitos No Determinsticos. NFA Autmatas Finitos Determinsticos. DFA.

Autmata Finito No Determinstico Un NFA es un modelo matemtico que consiste de: 1.- Un conjunto de estados. 2.-Un conjunto de smbolos de entrada. 3.- Una funcin de transicin que corresponde pares de estado-smbolo a conjuntos de estados. 4.- Un estado So que denota como el estado inicial. 5.- Un conjunto de estados F que denotan los estados de aceptacin o finales. Un NFA no tiene restricciones para que exista ms de una transicin con el mismo nombre a diferentes estados, por lo que en una representacin tabular no es posible determinar de manera nica el estado destino para un smbolo determinado. Por ejemplo, el siguiente diagrama representa la expresin (a | b)* a b b

No podemos determinar a qu estado se avanza del estado 0 con el smbolo a; puede ser al propio 0 o al 1 pero bajo qu condicin? No est determinado incluso si podran existir transiciones sin ninguna restriccin, que se denominan transiciones porque no requieren que un smbolo determinado ocurra para realizarse. Nuevamente, esto se vuelve indeterminado en una representacin tabular. Autmata Finito Determinstico Un DFA es un caso especial de NFA en l que ningn estado tiene transiciones para diversos estados bajo el mismo smbolo y no se permiten transiciones epsilon. Los diagramas de transicin son autmatas determinsticos. Por ejemplo, el DFA de (a | b)* a b b puede ser:

de transicin es el siguiente: La premisa que se tiene es que el diagrama representa la interpretacin del patrn que queremos reconocer por medio de una expresin regular. Consideramos que el diagrama se pueda particionar como se muestra a continuacin:

Que podra ser muy aproximado al diagrama de transiciones que construiramos para la expresin mostrada anteriormente. Para llegar de la expresin regular al autmata determinstico se emplea el mtodo de Thompson que permite hacer la transicin y preparar la construccin del analizador lxico. Posteriormente el analizador lxico formado pasar al analizador sintctico para que ste haga su anlisis y forme la representacin intermedia con las expresiones regulares. 3.2.- ANALIZADOR LXICO La funcin del analizador lxico es leer caracteres de entrada del cdigo fuente y produce secuencias de smbolos y valores de smbolos que son analizados sintcticamente por el analizador sintctico. Por consiguiente, el proceso de anlisis lxico de reconocimiento puede entenderse como la transformacin de un flujo de caracteres en un flujo de smbolos reducido. En este caso, el trmino reducido significa que la entrada es filtrada para eliminar aquellos elementos del texto del programa fuente que slo sirven para hacer legible el programa.

El comentario ms corto est formado por A y B, cuyo lexema ser /* */. Tanto C, D y E son partes opcionales que pueden aparecer o no dentro de la expresin regular. Consideremos cada parte:

Salto de Separadores Los espacios, tabuladores, comentarios y saltos de lnea, se denominan separadores, y pueden ser muy numerosos en un cdigo fuente, esto depender de que complejo sea el programa fuente. En general, el salto de separadores es una tarea trivial, excepto cuando hay comentarios anidados, en cuyo caso se trata de un proceso recursivo. Esto se muestra en el sig. Ejemplo: Salto de Separadores

La informacin almacenada en la tabla ser completada durante las fases de anlisis y luego se emplear en la generacin de cdigo. En general, una tabla de smbolos consta de nombres y atributos. La informacin almacenada en la tabla de smbolos vara de un compilador a otro; es decir, la informacin que se incluir en una tabla de smbolos depende del lenguaje y del diseador del compilador. Se harn unos comentarios generales sobre el contenido de una tabla de smbolos. Por supuesto, el campo nombres contiene los nombres (identificadores), mientras que los atributos pueden ser los siguientes: Tipo o valor de un nombre. La dimensin o el nmero de parmetros de un procedimiento. Un apuntador al lugar donde se declara y referencia un nombre. Algn tipo de direccin. Informacin del alcance en caso de un lenguaje orientado a procedimientos. Hay muchas formas de manejar nombres de longitud variable. Si el lenguaje de programacin que se considera slo permite nombres con mximo de caracteres, es fcil el manejo de los nombres: pueden almacenarse en un campo de nombres de longitud mxima de tamao fijo. Sin embrago, si los nombres pueden ser de longitud arbitraria o si la longitud mxima es relativamente grande (32 caracteres), este mtodo de captura o de almacenamiento directo no es aplicable o puede ser muy ineficiente.

Reconocimiento de Operadores y Nombres Para el compilador es fcil reconocer operadores cuando stos son nicos en el programa, es decir cuando se encuentran solos, por ejemplo: +, -, *, /, <, > Porque cada uno de ellos consta de un solo carcter que no aparece al comienzo de ningn otro smbolo. Sin embargo, smbolos como : <, <= y >, >= Comienzan con el mismo carcter. En estos casos, el analizador lxico tiene que examinar o analizar un carcter por anticipado ( a esto se le llama preanlisis) para determinar el smbolo en forma correcta. Aqu debemos tener en mente que probablemente ya se haya ledo el primer carcter del smbolo siguiente. Esto tambin sucede cuando se analiza un numeral o un smbolo de palabra. El reconocimiento de identificadores o de palabras clave (o reservadas) en un flujo de caracteres es una tarea trivial, basada en un autmata finito. La tarea no trivial que tiene que efectuar el analizador lxico en este caso es distinguir entre identificadores y palabras clave, lo cual puede hacerse con tablas de smbolos o con una estructura de datos adicional que contenga todas las palabras reservadas. 3.3.- MANEJO DE LOCALIDADES TEMPORALES DE MEMORIA (BUFFERS) Especificaciones De Componentes Lxicos

Las especificaciones del componente lxico son: *El alfabeto; son representados por el conjunto finitos de smbolos. *Cadena sobre un alfabeto, que es la secuencia finita de los smbolos de este alfabeto. *Cadena vaca (representada por un ). *Operacionales con cadenas; concatenacin y exponenciacin. * Lenguaje; representado por el conjunto de cadenas sobre un alfabeto. *Operaciones de lenguaje; la unin, concatenacin, cerradura de Kleene (cierre*) y cerradura positiva (Cierre +). Reconocimiento de los Componentes Lxicos

Todas las expresiones se consideran posibles tokens. El token manager consume el nmero mximo de caracteres de la cadena de entrada que coincida con alguna de las expresiones regulares. Esto es, el token manager prefiere la cadena mas larga que sea posible. Si existieran mltiples cadenas (de la misma longitud), se elige la expresin regular que ocurre antes en el archivo de la gramtica. Luego de reconocer una expresin regular, se ejecuta la accin lxica asociada, si es que la hay. Todas las variables y mtodos declarados en el token manager estn disponibles para ser usadas, adems de otras variables y mtodos adicionales. Inmediatamente ejecutadas las acciones, el token manager cambia su estado al estado de la necesidades del usuario. Manejo de buffer de entrada

Utiliza 2 buffer de entrada resultara til cuando es necesario un pre-anlisis en la entrada para identificar los componentes lxicos, despus se introducen algunas tcnicas bsicas para encontrar la velocidad del analizador lxico, como es el uso de centinelas que sirven para marcar el final de buffer, hay tres mtodos generales de implantar un lxico: Utilizar un generador de analizadores lxicos, como el compilador LEX. Escribir el analizador lxico en un lenguaje convencional de programacin. Escribir lxico en lenguaje ensamblador y manejarlo explcitamente lectura de entrada. Funcionamiento El analizador lxico es la primera fase de un compilador, su funcionamiento consiste en llevar los primeros caracteres de entrada y elaborar como salida una secuencia de caracteres lxicos que utilizan un analizador sintctico pasar hacer el anlisis.

Una estrategia muy popular para manejar tales nombres en una tabla de smbolos consiste en dividir el campo de nombres en dos subcampos, uno que contiene un apuntador a una tabla aparte de cadenas y otro que contiene la longitud del nombre. El apuntador especifica la posicin del primer carcter del nombre en la tabla de cadenas, esta posicin se ilustra en la anterior. ANLISIS SINTCTICO UNIDAD IV 4.1.- INTRODUCCIN A LAS GRAMTICAS LIBRES DE CONTEXTO Y RBOLES DE DERIVACIN. GRAMTICA DE UN LENGUAJE Las gramticas se utilizan para describir a los lenguajes. Los lenguajes naturales como el espaol o el ingls son descritos por una gramtica que agrupa a las palabras en categoras sintcticas como: las expresiones, los sujetos, los verbos y otras frases preposicionales. Expresado en forma matemtica una gramtica es un dispositivo formal para especificar un lenguaje potencialmente infinito en una manera finita, debido a que es imposible enumerar todas las cadenas de caracteres en un lenguaje ya sea en espaol o en ingls. Al mismo tiempo una gramtica impone una estructura a las sentencias en el lenguaje. Es decir, una gramtica G define a un lenguaje L(G) mediante la definicin de una manera para derivar todas las cadenas de dicho lenguaje. ESCRITURA DE UNA GRAMTICA Las gramticas son capaces de describir las sintaxis de los lenguajes. En un lenguaje de programacin un analizador lxico efecta una cantidad limitada de anlisis sintctico conforme produce la secuencia de componentes lxicos a partir de los caracteres de entrada. Algunas limitaciones como el requisito de que los identificadores se declaren antes de ser utilizados no pueden describirse mediante una gramtica dependiente del contexto. Por lo tanto las secuencias de componentes lxicos aceptadas por un analizador sintctico forman un superconjunto de un lenguaje de programacin, las fases posteriores deben analizar la salida del analizador sintctico para garantizar la obediencia a las reglas que el analizador sintctico no prueba. VENTAJAS EN LA UTILIZACIN DE GRAMTICAS La utilizacin de una gramtica diseada adecuadamente ofrece ventajas significativas a los diseadores de lenguajes y de sus compiladores y entre ellas se pueden mencionar las siguientes: 1.- Una gramtica ofrece una especificacin sintctica precisa y fcil de entender un lenguaje de programacin. A partir de un lenguaje de programacin se puede construir automticamente un analizador sintctico eficiente que determine si un programa fuente est sintcticamente bien formado. 2.- Otra ventaja es que el proceso de construccin del analizador sintctico puede revelar ambigedades sintcticas y otras construcciones difciles de analizar, que de otro modo podran pasar sin ser detectados en la fase inicial de diseo de un lenguaje y de su compilador. 3.- Una gramtica diseada adecuadamente impone una estructura a un lenguaje de programacin, til para la construccin de programas fuente a un cdigo objeto correcto, tambin son utilizadas para la deteccin de errores dentro de un programa fuente. Los lenguajes evolucionan con el tiempo adquiriendo nuevas construcciones y realizando tareas adicionales que al inicio del diseo de un compilador no estaban contempladas. Estas nuevas construcciones se pueden aadir con ms facilidad a un lenguaje cuando existe una aplicacin basada en una descripcin gramatical del lenguaje. 4.2 Diagramas de sintaxis Un mtodo alternativo para desplegar las producciones de ciertas gramticas de tipo 2 es el diagrama de sintaxis. sta es una imagen de las producciones que permite al usuario ver las sustituciones en forma dinmica, es decir, verlas como un movimiento a travs del diagrama. En la siguiente figura se ilustrarn los diagramas que resultan de la traduccin de conjuntos de producciones tpicos, que son, por lo general, todas las producciones que aparecen en el lado derecho de algn enunciado BNF.

Existen 4 funciones principales para un analizador lxico grfico que va hallando cada token en forma consecutiva, estas pueden ser: a) Utilidades de caracteres y manejo de lneas. b) Prueba de predicado. c) Acciones (Lo que hace cada palabra). d) Errores lxicos. 3.4.- CREACIN DE TABLAS DE SMBOLOS Una tabla de smbolos es una estructura de informacin para manejar los nombres (identificadores, y palabras reservadas) del cdigo fuente. Se utiliza durante la comprobacin semntica o dependiente del contexto, adems del proceso de generacin de cdigo.

4.3.- PRECEDENCIA DE OPERADORES. En esta seccin se estudiar la mayor clase de gramticas para las que se pueden construir con xito analizadores sintcticos por desplazamiento y reduccin (gramticas LR) sin en embargo, para una pequea e importante clase de gramticas se pueden construir con facilidad, a mano, eficientes analizadores sintcticos por desplazamiento y reduccin. Estas gramticas tienen la propiedad, de que ningn lado derecho de la produccin es y no tiene dos no terminales adyacentes. Una gramtica con esta ltima propiedad se denomina gramtica de operadores. Considrese la expresin 9+5*2. Existen dos interpretaciones posibles para estas expresiones: (9+5) * 2 o 9+(5 * 2). La asociatividad de + y * no resuelve esta ambigedad. Por esta razn se necesita conocer la precedencia relativa de los operadores cuando est pendiente ms de una clase de operadores. Se dice que * tiene mayor precedencia que +, si * considera sus operandos antes de que lo haga +. En aritmtica elemental, la multiplicacin y divisin tienen mayor precedencia que la adicin y sustraccin. Por tanto, 5 es considerado por * en 9+5*2 y en 9*5+2; es decir, las expresiones son equivalentes a 9+(5*2) y (9*5)+2, respectivamente. Sintaxis de expresiones.- utilizando una tabla que muestre la asociatividad y precedencia de operadores se puede construir una gramtica para expresiones aritmticas. Se empieza con los cuatro operadores aritmticos bsicos y una tabla de precedencias, mostrando los operadores en orden de precedencia creciente, con los operadores de la misma precedencia en la misma lnea: Asociativos por la izquierda + Asociativos por la derecha x / Se crean dos no terminales expr y trmino para los dos niveles de precedencia, y un No Terminal adicional factor para generar unidades bsicas en las expresiones. Las unidades bsicas de las expresiones son de momento dgitos y expresiones entre parntesis. factor dgito ( exp. ) Ahora considrese los operadores binarios, * y /, que tienen mayor precedencia. Como estos operadores asocian por la izquierda, las producciones son similares a las de las listas que asocian por la izquierda. trmino trmino * factor trmino / factor factor. Se crean dos no terminales expr y trmino para los dos niveles de precedencia, y un No Terminal adicional factor para generar unidades bsicas en las expresiones. Las unidades bsicas de las expresiones son de momento dgitos y expresiones entre parntesis. factor dgito ( exp. ) Ahora considrese los operadores binarios, * y /, que tienen mayor precedencia. Como estos operadores asocian por la izquierda, las producciones son similares a las de las listas que asocian por la izquierda. trmino trmino * factor trmino / factor factor. De manera similar, exp, genera listas de trminos separados por los operadores aditivos. expr expr + termino exp. - trmino trmino Por lo tanto la gramtica resultante es: expr expr + termino expr - termino termino termino termino * factor termino / factor factor factor digito (expr) Esta gramtica considera una expresin como una lista de trminos separados por los signos + o -, y un trmino, como una lista de factores separados por los signos x o / , se debe considerar que cualquier expresin entre parntesis es un factor, de manera que con los parntesis se pueden desarrollar expresiones que tengan anidamiento de profundidad arbitraria y rboles de profundidad arbitraria. Sintaxis de proposiciones.- Las palabras claves permiten reconocer proposiciones en la mayora de los lenguajes. Todas las proposiciones del Lenguaje Pascal, comienzan con una palabra clave, excepto las asignaciones y las llamadas a procedimientos Algunas proposiciones del Lenguaje Pascal se definen por medio de la siguiente gramtica ambigua, en la que el componente lxico id representa un identificador. prop id := exp. if expr then prop if expr then prop else prop while expr do prop begin props_opc end El No Terminal props_opc genera una lista de proposiciones posiblemente vaca, separada por los smbolos de punto y coma utilizando las producciones. bloque begin props_opc end props_opc lista_props lista_props lista_props ; prop prop ANLISIS SINTCTICO POR PRECEDENCIA DE OPERADORES La siguiente gramtica para expresiones no es una gramtica de operadores, porque el lado derecho EAE tiene dos no terminales consecutivos. E EAE( E )- E id A + - * / Sin embargo, si se sustituye cada una de sus alternativas por A, se obtiene la siguiente gramtica de operadores. E E + E E E E * E E / E E E ( E ) - E id A continuacin se describe una tcnica de anlisis sintctico fcil de implantar llamada anlisis sintctico por precedencia de operadores. Histricamente, la tcnica se describi primero como una manipulacin de componentes lxicos sin hacer referencia a ninguna gramtica subyacente. De hecho, cuando se termina de construir un analizador sintctico por precedencia de operadores a partir de una gramtica, se puede prescindir de la gramtica, utilizando los no terminales de la pila solo como identificadores de los atributos asociados a los no terminales. Como tcnica general de anlisis sintctico, el anlisis por precedencia de operadores tiene varios inconvenientes. Por ejemplo, es difcil manejar componentes lxicos, como el signo menos, que tiene dos precedencias distintas (dependiendo de si es unario o binario). Sin embargo, dada su sencillez, se han construido con xito muchos compiladores que utilizan las tcnicas de anlisis sintctico por precedencia de operadores para expresiones. Con frecuencia, estos analizadores utilizan el descenso recursivo. En el anlisis por precedencia de operadores, se definen tres relaciones de precedencia disjuntas, <, = , y > , entre algunos pares de terminales. 4.4.- ANALIZADOR SINTCTICO. El analizador sintctico se encarga realizar la segunda fase de la compilacin de un programa fuente de un lenguaje de alto nivel. En el siguiente modelo de compilador, el analizador sintctico obtiene una cadena de componentes lxicos y comprueba si la cadena puede ser generada por la gramtica del lenguaje fuente. Se supone que el analizador sintctico informar de cualquier error de sintaxis que ocurra durante la compilacin del programa de alto nivel. Tambin debera de recuperarse de los errores que ocurren frecuentemente para poder continuar procesando el resto de su entrada.

Existen tres tipos generales de analizadores sintcticos para gramticas. Los mritos universales de anlisis sintctico, como el algoritmo de Cocke-Younger-Kasami y el Ealey, pueden analizar cualquier gramtica. Los mtodos mencionados, son demasiados ineficientes para usarlos en la produccin de compiladores. Los mtodos empleados generalmente en los compiladores se clasifican como descendente o ascendente. Como sus nombres indican, los analizadores sintcticos descendentes construyen rboles de anlisis sintctico desde arriba (la raz) hasta abajo (las hojas), mientras que los analizadores sintcticos ascendentes comienzan en las hojas y suben hacia la raz. En ambos casos, se examina la entrada al analizador sintctico de izquierda a derecha, un smbolo a la vez. Los mtodos descendentes y ascendentes ms eficientes trabajan slo con subclases de gramticas, pero varias de estas subclases, como las gramticas LL y LR, son lo suficiente expresivas para describir la mayora de las construcciones sintcticas de los lenguajes de programacin. Los analizadores sintcticos implantados a mano a menudo trabajan con gramticas LL1; por ejemplo, el mtodo de la seccin 2.4 construye analizadores sintcticos para gramticas LL1. Los analizadores sintcticos para la clase ms grande de gramticas LR se construyen normalmente con herramientas automatizadas. 4.4.1.- ANALIZADOR DESCENDENTE (LL) El anlisis descendente se basa en gramticas LL que permiten analizar una cadena de entrada sin que existan bloqueos mutuos. Se puede considerar el anlisis sintctico descendente como un intento de encontrar una derivacin por la izquierda para una cadena de entrada. Tambin se puede considerar como un intento de construir un rbol de anlisis sintctico para la entrada iniciando desde la raz y creando los nodos del rbol en orden previo. En este mtodo se considera una forma general de anlisis sintctico descendente, denominado por descenso recursivo que puede incluir retrocesos, es decir, realizar varios exmenes de la entrada de la cadena de caracteres. Sin embargo no hay muchos analizadores sintcticos con retroceso. Esto es en gran parte, porque casi nunca se necesita el retroceso para analizar sintcticamente las construcciones de los lenguajes de programacin. En casos como el anlisis sintctico del lenguaje natural, el retroceso no es muy eficiente. 4.4.2.- ANALIZADOR ASCENDENTE (LR, LALR) Al anlisis sintctico ascendente tambin es conocido como anlisis sintctico por desplazamiento y reduccin, este anlisis intenta construir un rbol de anlisis sintctico para una cadena de entrada que comienza por las hojas (el fondo) y avanza hacia la raz (la cima). Se puede considerar este proceso como de reducir una cadena w al smbolo inicial de la gramtica. En cada caso de reduccin se sustituye una subcadena determinada que concuerde con el lado derecho de una produccin por el smbolo del lado izquierdo de dicha produccin y si en cada paso se elige correctamente la subcadena, se traza una derivacin por la derecha en sentido inverso. Ejemplo 4.21. Considrese la gramtica S aABe A Abc | b B d La frase (0 cadena) abbcde se puede reducir a S por los siguientes pasos: Abbcde aBcde aAde aABe S Se examina la cadena abbcde mostrada, buscando en las producciones una subcadena que concuerde con el lado derecho de alguna de ellas. Las subcadenas b y d sirven. Eljase la b situada ms a la izquierda y sustityase por A, el lado izquierdo de la produccin A b; as se obtiene la cadena aAbcde. A continuacin, las subcadenas Abc, b y d concuerdan con el lado derecho de alguna produccin. Aunque b es la subcadena situada ms a la izquierda que concuerda con el lado derecho de una produccin, se elige sustituir la subcadena Abc por A, que es el lado derecho de la produccin A Abc. Se obtiene ahora aAde. Sustituyendo despus d por B, que es el lado izquierdo de la produccin B d, se obtiene aABe. La cadena aABe se puede sustituir directamente por S, de acuerdo a las producciones mostradas. De esta forma la abbcde se reduce a S utilizando las producciones mostradas. Ahora se puede sustituir toda esta por S. Por tanto, mediante una secuencia de cuatro producciones se puede reducir a abbcde a S. De hecho, estas reducciones trazan la siguiente derivacin por la derecha en orden inverso:

ANALIZADORES SINTCTICOS LR A continuacin se analiza una tcnica de anlisis sintctico ascendente que se puede utilizar para analizar una clase mas amplia de gramticas independientes del contexto. La tcnica se denomina anlisis sintctico LR(k); la L es por el examen de la entrada de izquierda a derecha, y al R por construir una derivacin por la derecha en orden inverso, y la k por el nmero smbolos de entrada de examen por anticipado utilizados para tomar las decisiones del anlisis sintctico. Cuando se omite se asume que k, es 1. El anlisis sintctico es atractivo por varias razones: Se pueden construir analizadores sintcticos LR para reconocer prcticamente todas las construcciones de los lenguajes de programacin para los que se pueden escribir gramticas independientes del contexto. El mtodo de anlisis sintctico LR es el mtodo de anlisis sintctico por desplazamiento y reduccin sin retroceso ms general que se conoce, y sin embargo, se puede aplicar tan eficientemente como los otros mtodos de desplazamiento y reduccin. La clase de gramticas que pueden analizarse con los mtodos LR es un super conjunto de la clase de gramticas que se pueden analizar con los analizadores sintcticos predictivos. Un analizador sintctico LR puede detectar un error sintctico tan pronto como sea posible hacerlo en un examen de izquierda a derecha de la entrada. El principal inconveniente del mtodo es que supone demasiado trabajo construir un analizador sintctico LR a mano para una gramtica de un lenguaje de programacin tpico. Se necesita una herramienta especializada, en este caso un generador sintctico LR. El analizador sintctico YACC es una herramienta adecuada como generador de analizador sintctico. Con este mtodo se puede escribir una gramtica independiente del contexto y el generador produce automticamente al analizador sintctico para dicha gramtica. Si la gramtica contiene ambigedades u otras construcciones difciles de analizar en un

examen de izquierda a derecha de la entrada, el generador puede localizar dichas construcciones e informar al diseador del compilador de su presencia. Despus de estudiar la operacin de un analizador sintctico LR, a continuacin se introducen tres tcnicas para construir una tabla de anlisis sintctico LR para una gramtica. El primer mtodo, llamado LR sencillo (en ingls SLR), es el ms fcil de implantar, pero el menos poderoso de los tres. Puede que no consiga producir una tabla de anlisis sintctico para algunas gramticas que otros mtodos s consiguen. El segundo mtodo llamado LR Cannico, es el ms poderoso y costoso. El tercer mtodo, llamado LR con examen por anticipado (LALR, en ingls) est entre los otros dos en cuanto a poder y costo. El mtodo LALR funciona con las gramticas de la mayora de los lenguajes de programacin y, con un poco de esfuerzo, se puede implantar en forma eficiente. GRAMTICAS LR Una gramtica para la que se puede construir una tabla de anlisis sintctico se denomina gramtica LR. Existen gramticas independientes del contexto que no son LR, pero en general se pueden evitar en las construcciones tpicas de los lenguajes de programacin. Para que una gramticas sea LR basta con que un analizador sintctico con desplazamiento y reduccin que opere de izquierda a derecha pueda reconocer los mangos cuando aparezcan en la cima de la pila. Un analizador LR no tiene que examinar la pila completa para saber cuando aparecen los mangos en la cima. Por el contrario, el smbolo del estado en la cima de la pila contiene toda la informacin necesaria. Es un hecho curioso que, si se puede reconocer un mango conociendo solo los smbolos gramaticales de la pila, entonces existe un autmata finto que puede, leyendo los smbolos gramaticales de la pila de arriba abajo, determinar el mango, si existe, que est en el tope de la pila. La funcin ir_a de una tabla de anlisis sintctico LR es esencialmente dicho autmata finito. Sin embargo, el autmata no necesita leer la pila para cada movimiento. El smbolo estado almacenado en la cima de la pila, es el estado en que estara el autmata finito reconocedor de los mangos si hubiera ledo los smbolos gramaticales de la pila desde abajo hasta la cima. Por tanto, el analizador sintctico LR puede determinar a partir del estado de la cima de la pila, todo lo que se necesita saber sobre lo que hay en ella. Otra fuente de informacin que puede utilizar un analizador sintctico LR como ayuda para tomar las decisiones de desplazamiento y reduccin son los k smbolos siguientes de entrada. Los casos en que k = 0 o k = 1, tienen inters prctico, y aqu slo se considerarn los analizadores sintcticos con k <= 1. Una gramtica que se puede analizar mediante un analizador sintctico LR que examina hasta k smbolos de entrada en cada movimiento, se denomina gramtica LR(k). Existe una diferencia significativa entre las gramticas LL y las gramticas LR. Para que una gramtica sea LR(k) , tiene que ser capaz de reconocer la presencia del lado derecho de una produccin, habiendo visto todo lo que se deriva de dicho lado derecho con k smbolos de examen por anticipado, este requisito es mucho menos riguroso que el de las gramticas LL(K), donde tienen que ser capaz de reconocer el uso de una produccin viendo solo los primeros k smbolos de los que se deriva su lado derecho. Por consiguiente, las gramticas LR pueden describir ms lenguajes que las gramticas LL. 4.5.- ADMINISTRADOR DE LA TABLA DE SMBOLOS La funcin esencial de un compilador es registrar los identificadores utilizados en el programa fuente y reunir informacin sobre los distintos atributos de cada identificador. Estos atributos pueden proporcionar informacin sobre la memoria asignada a un identificador, su tipo, su mbito (la parte del programa donde tiene validez) y, en el caso de nombres de procedimientos, cosas como el nmero de parmetros y tipo de argumentos, el mtodo de pasar cada argumento (por ejemplo, por valor o referencia) y el tipo que devuelve, si ste existe. Una tabla de smbolos es una estructura de datos que contiene un registro por cada identificador con los campos apropiados para los atributos del identificador. La estructura de datos permite encontrar rpidamente el registro de cada identificador y almacenar o consultar rpidamente datos de ese registro. Cuando el analizador lxico detecta un identificador en el programa fuente, este identificador se introduce en la tabla de smbolos. Sin embargo, normalmente los atributos de cada identificador no se pueden determinar durante la fase de anlisis lxico. Por ejemplo, en una declaracin de un lenguaje de programacin como la siguiente: float balance, promedio, cadena; El tipo de datos (float) de los valores no se conoce, cuando el analizador lxico encuentra las variables durante la traduccin de un programa. Las fases restantes introducen informacin sobre los identificadores en la tabla de smbolos y despus la utilizan de varias formas. Por ejemplo, cuando se est realizando el anlisis semntico y la generacin de cdigo intermedio, se necesita saber cuales son los tipos de identificadores, que se estn utilizando, para poder comprobar que el programa fuente los utiliza de una forma vlida y as poder generar las operaciones apropiadas con ellos. El generador de cdigo, por lo general, introduce y utiliza informacin detallada sobre la memoria asignada a los identificadores. 4.6.- MANEJO DE ERRORES SINTCTICOS Y SU RECUPERACIN Si un compilador tuviera que procesar slo programas correctos, su diseo e implantacin se simplificaran mucho. Pero los programadores con frecuencia escriben programas incorrectos, y un buen compilador debera ayudar al programador a identificar y localizar errores. Es sorprendente que aunque los errores sean tan frecuentes, pocos lenguajes han sido diseados teniendo en cuenta el manejo de errores. Esta civilizacin sera completamente distinta si los lenguajes hablados exigieran tanta exactitud sintctica como los lenguajes de programacin. La mayora de las especificaciones de los lenguajes de programacin no describen como debe responder un compilador a los errores que encuentra en un programa al momento de ser compilado, la respuesta se deja al diseador del compilador. Considerar desde el principio el manejo de errores puede simplificar la estructura de un compilador y mejorar su respuesta a dichos errores. Los programas fuente de un lenguaje de programacin de alto nivel puede contener errores de diversos tipos y entre ellos se pueden mencionar los siguientes: Lxicos.- Por ejemplo, escribir mal un identificador, una palabra clave o un operador. Sintcticos.- Por ejemplo, escribir una expresin aritmtica con parntesis no equilibrados o alterar la secuencia de caracteres en una palabra clave. Semnticos.- Por ejemplo, efectuar una operacin aritmtica con identificadores de diferentes tipos. Lgicos.- Por ejemplo, una llamada recursiva infinitamente o no equilibrar las palabras claves de inicio y fin en un procedimiento Durante el diseo de un compilador, gran parte de la deteccin de errores en un compilador se centra en la fase de anlisis sintctico. Una razn es que muchos errores son de naturaleza sintctica o se manifiestan cuando la cadena de componentes lxicos que proviene del analizador sintctico desobedece las reglas gramaticales que definen al lenguaje de programacin. Otra razn es la precisin de los mtodos modernos de anlisis sintcticos, que pueden detectar la presencia de errores dentro de los programas de una forma muy eficiente. El manejador de errores en un analizador sintctico tiene objetivos fciles de establecer, a continuacin se mencionan algunos de ellos: Debe informar de la presencia de errores con claridad y exactitud. Si ocurre un error, se debe recuperar de ese error con la suficiente rapidez como para detectar los errores posteriores. El manejador de errores, No debe retrasar de manera significativa el procesamiento de programas correctos.

La realizacin efectiva de estos objetivos plantea desafos importantes. Afortunadamente los errores ms comunes son simples y con frecuencia basta con un mecanismo sencillo de manejo de errores. Sin embargo, en algunos casos un error pudo haber ocurrido mucho antes de la posicin en que se detect su presencia, y puede ser muy difcil deducir la naturaleza precisa del error. En los casos ms difciles, el manejador de errores quizs tenga que adivinar qu tena en mente el programador cuando escribi el programa. Varios mtodos de anlisis sintctico, como los mtodos LL y LR, detectan un error lo antes posible. Es decir, tienen la propiedad del prefijo viable, lo cual quiere decir que detectan la presencia de un error, nada ms con ver un prefijo de la entrada que no es prefijo de ninguna cadena del lenguaje. 4.6.1.- RECUPERACIN DE ERRORES Existen muchas estrategias generales distintas que puede emplear un analizador sintctico para recuperarse de un error sintctico. Aunque ninguna de ellas ha demostrado ser de aceptacin universal, algunos mtodos tienen una amplia aplicacin. A continuacin se mencionan algunas estrategias de recuperacin de errores. Recuperacin en modo de pnico. Recuperacin a nivel de frase. Recuperacin de producciones de error. Recuperacin de correccin global. Recuperacin en modo de pnico.- Este es el mtodo ms sencillo de implantar y pueden utilizarlo la mayora de los mtodos de anlisis sintctico. Al descubrir un error, el analizador sintctico desecha smbolos de entrada, de uno en uno, hasta que encuentra uno perteneciente a un conjunto designado de componentes lxicos de sincronizacin. Estos componentes lxicos de sincronizacin son generalmente delimitadores, como el punto y coma o la palabra clave end, cuyo papel en el programa fuente est claro. Es evidente que quien disea el compilador debe seleccionar los componentes lxicos de sincronizacin adecuados para el lenguaje fuente. Aunque la correccin en modo de pnico con frecuencia omite una cantidad considerable de entrada sin comprobar la presencia de errores adicionales, tiene la ventaja de la sencillez y est garantizada contra lazos infinitos. En situaciones en donde son raros los errores mltiples en la misma posicin, este mtodo puede ser muy adecuado. Recuperacin a nivel de frase.- Al descubrir un error, el analizador sintctico puede realizar una correccin local de la entrada restante, es decir, puede sustituir un prefijo de la entrada restante por alguna cadena que permita continuar al analizador sintctico. Una correccin local tpica seria sustituir una coma por un punto y coma, suprimir un punto y coma sobrante o insertar un punto y coma que falta. La eleccin de la correccin local, corresponde al diseador del compilador. Por supuesto se debe tener cuidado de elegir sustituciones que no conduzcan a lazos infinitos, como sera el caso, por ejemplo, si siempre se insertara en la entrada por delante del smbolo de entrada en curso. Este tipo de sustitucin puede corregir cualquier cadena de entrada y ha sido empleado en varios compiladores que corrigen los errores. El mtodo se utilizo por primera vez en el anlisis sintctico descendente. Su principal desventaja es su dificultad para afrontar situaciones en que el error real se produjo antes del punto de deteccin. Recuperacin de producciones de error. Si tiene una buena idea de los errores comunes que puedan encontrarse, puede aumentar la gramtica del lenguaje con producciones que generen las construcciones errneas. Entonces se usa esta gramtica aumentada con las producciones de error para construir el analizador sintctico. Si el analizador sintctico usa una produccin de error, se pueden generar diagnsticos de error apropiados para indicar la construccin errnea conocida o reconocida en la entrada. Recuperacin de correccin global. Idealmente, sera deseable que un compilador hiciera el mnimo de cambios posibles al procesar una cadena de entrada incorrecta. Existen algoritmos para elegir una secuencia mnima de cambios para obtener una correccin global de menor costo de una cadena de entrada incorrecta x y la gramtica G, estos algoritmos encontrarn un rbol de anlisis sintctico para cada cadena relacionada y, tal que el nmero de inserciones superiores y modificaciones de componentes lxicos necesarios para transformar x en y sea el mnimo posible. Por desgracia, la implementacin de estos mtodos es en general demasiado costosa en trminos de tiempo y espacio, as que estas tcnicas en la actualidad solo son de inters terico. 4.7.-Generadores de Cdigo para Analizadores Sintcticos: Yacc, Bison. YACC (YET ANOTHER COMPILERCOMPILER): provee una herramienta general para describir la entrada de un programa de computacin. El usuario de YACC especifica las estructuras de su entrada, junto con el cdigo que ser invocado en la medida en que cada una de esas estructuras es reconocida. YACC convierte esa especificacin en una subrutina que maneja el proceso de entrada. La subrutina de entrada producida por YACC llama a la rutina provista por el usuario para devolver el prximo tem bsico de la entrada. GNU Bison es un generador de parsers de propsito general que convierte una descripcin gramatical desde una gramtica libre de contexto LALR en un programa en C para hacer el parser. Es utilizado para crear parsers para muchos lenguajes, desde simples calculadoras hasta lenguajes complejos. GNU Bison tiene compatibilidad con Yacc: todas las gramticas bien escritas para Yacc, funcionan en Bison sin necesidad de ser modificadas. Cualquier persona que est familiarizada con Yacc podra utilizar Bison sin problemas. Es necesaria tener experiencia con lenguaje C para utilizar Bison.

Você também pode gostar