You are on page 1of 15

Anlisis Lexicogrfico El analizador lxico se encarga de obtener y analizar las palabras que componen un texto fuente, distinguiendo si pertenecen

o no a un determinado conjunto, dependiendo de su definicin lgica. La entrada del analizador lxico se puede definir como una secuencia de caracteres sobre un alfabeto: ASCII, Unicode. El analizador divide la secuencia de caracteres obtenidos (lexemas) donde la entrada es un conjunto de palabras con un significado propio (descripcin) que pueden formar parte del lenguaje (conjunto de lexemas) se llama componente lxico, categora lxica (tokens). Ejemplo simple de analizador lxico:

Cada categora lxica se ajusta a un patrn que describe el conjunto de lexemas que componen dicha categora. Tabla que representa las descripciones de las categoras mexicas, para los lexemas del ejemplo anterior:

Una vez que se ha recorrido el conjunto de carcter (lexemas) que forman el componente lxico, por medio del patrn descrito por un mecanismo regula, es entregado al analizador sintctico. El analizador lxico que es la primera fase de un procesador de lenguaje tiene que asociar unos atributos a esos componentes lxico.

Los atributos son propiedades adicionales que se precisan para la caracterizacin (documentacin) de la pieza sintctica, as los identificadores necesitan de los lexemas y de los literales de valores. Los atributos se guardan en una memoria para su utilizacin en las siguientes fases del traductor. Existen piezas sintcticas que no necesitan de atributos, as el smbolo de asignacin, los parntesis, los operadores. Lo nico que puede decirse es que se trata de piezas, pero que no llevan propiedades adicionales aadidas.

Un patrn es una regla que describe el conjunto de lexemas de un componente lxico. Para describir los patrones se utiliza la notacin de expresiones regulares un lenguaje

regular puede ser especificado por medio de un mecanismo regula, autmata finito (o regular) o por gramtica de tipo 3

Categoras Lxicas Ms Usuales En Los Lenguajes De Programacin y Identificadores; cualquier lenguaje de programacin necesita de una identificacin de los objetos que en l se utilizan: nombres de variables, clases, mtodos, tipos definidos por el usuario. Deben ajustarse a la misma descripcin que tiene un nombre representativo llamados token (TK_identificador). Que define el conjunto de lexemas que se pueden utilizar para denominar los identificadores (variables, funciones,..) por lo general el conjunto de lexemas que define el TK_identificador es finito. Literales; es la especificacin del valor concreto de un tipo de dato, que se puedan emplea en el lenguaje: constantes, enteros, reales, cadenas y caracteres; son tipos de literales que se pueden utilizar en la mayora de los lenguajes. Se ajustan a una descripcin con el nombre representativo del token (TK_cte_entera, TK_cte_eal, TK_cadena, TK_caracter) respectivamente, que definen el conjunto de lexemas que se pueden utilizar. El conjunto de lexemas es finito para todos, excepto el de carcter. Operadores; operadores aritmticos como: (+, -, *, /, %), operadores lgicos como: (or, and, not) y relacionales: (<, >, <=, >=,.). Los lexemas representativos de los operadores, forman un conjunto finito y cada uno de ellos corresponde a un componente lxico: + (TK_suma), - (TK_resta), >= (TK_may_igu), entre otros. Separadores De Construccin; smbolos utilizados como separadores de las diferentes construcciones de un lenguaje de programacin. {; - , - . - { - } - [ - ] - ( - ) ..} Los lexemas representativos de los separadores forman un conjunto finito. Cada uno de ellos corresponde a un componente lxico

; (TK_pun_com), ,(TK_coma), ( (par_abre), ) (par_cierra), y Categoras Lxicas Especiales; a) Comentarios: es la informacin que se incluye en el texto del programa fuente para mejorar su legibilidad. El analizador lxico no los tiene en cuenta, los salta y no los manda al analizador sintctico, no necesitan de una representacin sintctica (token). b) Separadores De Piezas Lxicas: en los lenguajes con formatos libre (java, pascal), los espacios en blancos, tabuladores y saltos de lnea solo sirven para separar componentes lxicos. En la mayora de los lenguajes el analizador los suprime. c) Fin De Entrada: trata de una categora lxica ficticia emitida por el analizador lxico para indicarle al analizado sintctico que es el ultimo componente de la entrada. Funcionalidad De Un Anlisis Lxico

Acciones Principales.  Leer carcter a carcter (siguiente_cararter ()) de la entrada, bajo peticin del token del analizador sintctico.  Analizar y acumular el carcter (guardar_caracter ()) si no se ha determinado aun un token (una categora lxica).  Entrega al analizador sintctico la unidad sintctica (anal_lex (token)), llamada componente lxico (token) junto con la informacin adicional relevante para las siguientes fases del traductor (atributo).  En ocasiones solo se puede determinar un token cuando se ha recibido un carcter que pertenece al siguiente token. Se debe reinsertar dicho carcter a la entrada para realizar el anlisis lxico de la siguiente peticin del analizador (reinsertar ()). Esta reinsercin suele hacerse en el buffer de la entada donde estn almacenados los lexemas correspondientes a una lnea de entrada.

 Rechazar aquellos caracteres o conjuntos de estos que no pertenezcan al lenguaje, indicndolo mediante mensajes de error al usuario (mensaje_error ()).  Mensaje al fichero fuente (abrir, leer, cerrar)

Acciones Secundarias.

 Ignorar del programa fuente los comentarios, los espacios en blancos, los tabuladores, retorno de carro, etc. Y en general todo aquello que carezca de significado segn la sintaxis del lenguaje.  Contar los saltos de lnea y asociar los mensajes de error con el nmero de la lnea del programa fuente donde se producen.  Guardar la informacin relacionada con los componentes lxicos: identificadores y constantes en la tabla de smbolos.  Si el formato de la lnea no es libre, informar del final de la lnea. .

Estructura Funcional De Un Analizador Lxico. Esta instruccin suele aplicarse convirtiendo al analizador lxico en una subrutina o corutina del analizador sintctico, recibe la orden dame el siguiente componente lxico del analizador sintctico. El resto de las funciones dependen del traductor y del propio lenguaje a procesar y se puede clasificar segn el interfaz con el que entra en contacto el analizador lxico.

Interfaz Con El Analizador Sintctico. El analizador lxico es una funcin llamada por analizador sintctico. El (anal_lex (token)) devuelve una estructura que contenga token y atributo, o solo el token, almacenando previamente al atributo en una variable global. Los token son definidos mediante constantes enteras o tipos enumerados para mejorar su representacin y operatividad interna. Interfaz Con El Fichero Que Contiene El Programa Fuente. Realiza las siguientes tareas con el programa fuente: Detecta el siguiente componente lxico, solicitado por el analizador sintctico, por medio de un buffer (u otra forma) de lectura de entrada despus de:

 Controla la marca del fin del fichero del programa fuente.  Tratamiento de espacios en blancos, tabuladores y caracteres de fin de lneas. Estos delimitadores son ignorados excepto el del salto de lnea que se incrementa con un contador para poder usarlos en el mensaje de error.  Eliminacin de comentarios.  Comunica el componente (la pieza sintctica) al analizador sintctico por medio de variables globales: variable para almacenar el lexema as como la longitud del mismo.  Avanza el texto fuente para la siguiente comunicacin. En caso de no detectar el componente lxico, llamar al gestor de errores.

Interfaz Con Tabla De Smbolo (TS). El (anal_lex (token)) guarda los lexemas de los identificadores y el valor de las constantes en la tabla de smbolos (TS). Las fases posteriores del computador pueden aadir ms informacin a la tabla. La ms comn que pueden almacenarse en la TS son, adems de lexemas, su tipo, su uso (etiqueta, funcin, variable) y su posicin en memoria. Las operaciones que realiza el (anal_lex (token)) sobre la TS son:  Insercin de identificadores o constantes  Bsqueda de identificadores o constantes

Interfaz Con El Tratamiento De Errores. Cuando el (anal_lex (token)) lee un carcter que no es del lenguaje o no encuentra ningn lexema que concuerde con uno de los patrones, debe emitir un mensaje de error indicado en la lnea del programa fuente donde se producen.

Especiacin Lxica De Un Lenguaje De Programacin Se destacan tres modalidades a la hora de la especificacin del lxico de un lenguaje: 1. No formalizada: describiendo los componentes lxicos por medio de un lenguaje ordinario, sin aplicar reglas para su definicin. 2. Formalizada: describiendo los componentes lxicos por medio de mecanismos regulares. A la hora de la especificacin lexicogrfica de un lenguaje habr que crear la relacin de todas las piezas sintcticas (categoras lxicas), con sus definiciones lxicas. Especificar un token de manera formalizada, consiste en dar una expresin regular (o patrn) que describa, al conjunto lexemas asociados a dicho patrn, a la vez

que permite simplificar, simular y aplicar los algoritmos necesarios para calcular e implementarlos. 3. rafica: mediante la utilizacin de algn mtodo grafico, como los diagramas sintcticos. Diagramas que tambin se utilizan para especificar las caractersticas sintcticas.

Descripcin De Las Categoras Lxicas De Un Lenguaje De Programacin Como Java: Identificadores clases, interface, mtodos, nombres de atributos, , Descripcin - smbolo alfabtico, $ o _, seguido de una secuencia de smbolos numricos alfabticos, & o _. Identificadores: Cuenta, uno1, una_variable, $dolar, 1111, Uno_1 Literales - enteros (int, float), reales (double, float) , cadena y carcter - Constante entera Descripcin - uno o ms dgitos, que pueden estar precedidos por los smbolos 0, 0X dependiendo si se trata de una constante octal o hexadecimal respectivamente. Enteras: 100 int, 100l Long, 011 octal 0x111 hexadecimal - Constante reales Descripcin dos partes separadas por el smbolo . ambas partes estn formadas por uno o ms dgitos. La segunda parte puede finalizar por el smbolo f o d segn se trate de una contante real flota o double respectivamente. Reales 123.45 double 12,34f float, 12,34d double - Constante cadena Descripcin cero o ms smbolos delimitados por los smbolos , . Cadena: es una cadena , cadena vaca - Constante carcter Descripcin un smbolo delimitado por los smbolos , . Carcter c Operadores - Aritmticos: +, -, *, /, %, ++, +=

- Lgicos: &, |, ^, - Relacionales: ==, !=, <,<= - Cada una de ellos se corresponde a un componente lxico Delimitadores - {; , , , . , { , } , [ , ], ( , ) } Cada uno de ellos corresponde a un componente lxico Palabras reservadas {case, for, if, class , void, .} Cada una de ellas se corresponde a un componente lxico. 10 Categora lxicas especiales Comentarios- java, dispone de tres tipos de comentarios: - //comentario de una lnea Descripcin - los smbolos // seguidos de una secuencia de smbolos hasta final de lnea - /* comentario de mltiples lneas */ Descripcin - cualquier secuencia de smbolos delimitados por los smbolos /* y */ , pueden abarcar ms de una lnea - /** comentario de documentacin */ Descripcin -cualquier secuencia de smbolos delimitados por los smbolos /** y */ , pueden abarcar ms de una lnea Java dispone de una herramienta javadoc que permite analizar los comentarios de documentacin Separadores- { \t, \ n, } En los lenguajes con formato libre (java, pascal), los espacios en blanco, tabuladores y saltos de lnea slo sirven para separar componentes lxicos. En la mayora de los lenguajes el analizador lxicos los suprime. El conjunto de lexemas que define una estructura correspondiente a un componente lxico es un lenguaje regular, que puede ser definido por medio de un mecanismo regular. - Mecanismos regulares que definen las categoras lxicas

A continuacin se pone un ejemplo de componente lxico, descrito por una expresin regular a travs de la cual se obtiene un AFD equivalente. Categora lxica Identificador de java: Descripcin por medio de una expresin regular Identificador Letra Dgito [a-z] [0-9] ( letra | $ | _) ( letra | digito | $ | _)*

Autmata finito determinista representado por un diagrama de transicin que reconoce el lenguaje denotado por la expresin regular anterior.

Anlisis Sintctico. En este modelo de compilador, el analizador sintctico obtiene una cadena de componentes lxicos del analizador lxico, como se muestra en la figura y comprueba si la cadena pueda ser generada por la gramtica del lenguaje fuente. Se supone que el analizador sintctico informar de cualquier error de sintaxis de manera inteligible. Tambin debera recuperarse de los errores que ocurren frecuentemente para poder continuar procesando el resto de su entrada.

Los mtodos empleados generalmente en los compiladores se clasifican como descendentes o ascendentes. 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 suficientemente 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; y Manejo De Errores.

Si un compilador tuviera que procesar solo programa correcto, su diseo e implantacin se simplificaran mucho. Pero los programadores a menudo escriben programas incorrectos y un buen compilador debera ayudar al programador a identificar y localizar errores Se sabe que los programas pueden contener errores de muy diverso tipo. Por ejemplo, los errores pueden ser:

   

Lxicos, como escribir mal un identificador, palabra clave u operador. Sintcticos, como una expresin aritmtica con parntesis no equilibrados. Semnticos, como un operador aplicando a un operando incompatible. Lgicos, como una llamada infinitamente recursiva.

A menudo, gran parte de la deteccin y recuperacin 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 de un analizador lxico desobedece las reglas gramaticales que definen al lenguaje de programacin. El manejador de errores en un analizador sintctico tiene objetivos fciles de establecer:  Debe informar de la presencia de errores con claridad y exactitud.  Se debe recuperar de cada error con la suficiente rapidez como para detectar errores posteriores.  No debe retrasar de manera significativa el procesamiento de programas correctos. 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 ver un prefijo de la entrada que no es prefijo de ninguna cadena del lenguaje.

Tipos Generales De Analizador Sintctico Atendiendo la forman en que procesan las cadenas de entrada se clasifican en:  Mtodos direccionales: procesan las cadenas smbolo a smbolo de izquierda a derecha.

 Mtodo no-direccional: acceden a cualquier lugar de la cadena de entrada para construir el rbol. Necesitan tener toda la cadena de componentes lxicos en memoria para que el anlisis pueda comenzar. Atendiendo el nmero de alternativas posibles en una derivacin se clasifican en:  Mtodo determinista: dado un smbolo de cadena de entrada se puede decidir en cada paso cual es la alternativa/derivacin adecua a aplicar, solo hay una posible. No se produce retroceso y el coste es lineal.  Mtodo no-determinista: en cada paso de la construccin del rbol se deben probar diferentes alternativas/derivaciones para ver cul es la adecuada. Con el correspondiente aumento de costo. Existen tres tipos generales de analizadores sintcticos:  Analizadores universales: los algoritmos ms referenciados para reconocer las gramticas libres de contextos son los algoritmos CYK introducido en 1963 por Cockc, Younguer y Kasami [you 67], y el algoritmo de Early [ear 70]. El primero solamente opera con gramticas libre de contextos en forma normal de Chomsky mientras que el segundo trata las gramticas libres de contextos en general. Ambos algoritmos no se consideran demasiados para ser utilizados de forma generalizada y que su coste es exponencial (depende de la longitud de la cadena de entrada). Analizadores Descendentes (top Down): construye el rbol sintctico de la sentencia a reconocer desde el smbolo inicial (raz), hasta llegar a los smbolos terminales (hojas) que forman la sentencia usando derivaciones ms a la izquierda. Los principales problemas que se plantean son dos: el retroceso (back traking) y la recursividad a la izquierda. Para solucionar este inconveniente, se opera con gramticas LL (k), que pueden realizar un anlisis sin retroceso en forma descendente. Analizadores ascendentes (bottom-up): construyen un rbol sintctico de la sentencias a reconocer desde las hojas hasta llegar a la raz. Son analizadores de tipo reduccin-desplazamiento (shift reduce), p1|arten de los distintos tokens de la sentencia a analizar y por medio de reducciones llegan al smbolo inicial de la gramtica. El principal problema que se plantea en el anlisis ascendente es el retroceso. Para solventar este inconveniente, se definieron distintos tipos de gramticas entre los cuales las ms utilizadas son: LR (k) ya que realizaran eficientemente el anlisis ascendente si retroceso.

Anlisis Sintctico Descendente Con Retroceso El anlisis sintctico descendente (ASD) intenta encontrar entre las producciones de la gramtica la derivacin por la izquierda del smbolo inicial para una cadena de entrada.

Algoritmo de anlisis sintctico descendente con retroceso. 1. Se colocan las reglas de la gramtica segn orden preestablecido para cada uno de los no terminales de la que est compuesta. 2. Se comienza la construccin del rbol sintctico a partir del smbolo inicial, y aplicando las siguientes reglas en forma recursiva. Al nodo en proceso de expansin en un determinado momento se le llamara nodo activo.

3. Cada nodo activo escoge la primera de sus alternativas posibles, por ejemplo, para no terminal A con la regla AX1 X2 Xn crea n descendientes directos, y el nodo activo en ese momento pasa a ser el primer descendiente por la izquierda. Cuando se deriven todos los descendiente pasara hacer nodo activo el ms inmediato derecho de A susceptible de ser derivados. En el caso de que la reglas fuesen: A X1 |X2|| Xn se elegir en un principio la alternativa de mas a la izquierda. 4. Si el nodo es un terminal deber entonces compararse el smbolo actual de la cadena a analizar con dicho nodo. Si son iguales se avanza un token de entrada y el nuevo smbolo actual ser el situado ms a la derecha del terminal analizado. Si no son iguales se retrocede hasta un nodo no terminal y se reintenta eligiendo la siguiente alternativa. Si aun as no existe ninguna alternativa posible se retrocede al no terminal anterior, y as sucesivamente. Si se llega al smbolo inicial la cadena no pertenece al lenguaje.  Anlisis descendente sin retroceso Para eliminar el retroceso en el anlisis descendente, se ha de elegir correctamente la produccin correspondiente a cada no terminal q se expande.es decir que el anlisis descendiente debe ser determinista, y solo debe de dejar tomar una opcin en la expansin del cada no terminal.  Gramtica Las gramticas LL (k) son un subconjunto de las gramticas libre de contexto. Permite un anlisis descendente determinista entre(o sin retroceso), por medio del reconocimiento de la cadena de entrada de izquierda a derecha (left to right ) y que va tomando las derivaciones ms hacia la izquierda (leftmost) con solo mirar los k tokens situado a continuacin de donde se halla. Si k=1 se habla de gramticas LL (1).

La gramtica LL (1) permite construir un analizador determinista descendente con tan solo examinar en cada momento el smbolo actual de la cadena de entrada (smbolo de pre anlisis) para saber qu produccin aplicar. Antes de definir completamente las gramticas LL(1), se definirn otros tipos de gramticas ms sencillas q son LL(1). A introduccin de esta gramticas permitir una aproximacin paso a paso hacia la definicin completa de las gramticas LL(1). y Gramticas y analizadores LR(k)

Una gramtica q puede ser analizada por un analizador LR mirando hasta k smbolos de entrada por adelante (lookaheads) en cada movimiento, se dice que es una gramtica LR(k) Los analizadores LR(k) realizan eficientemente el anlisis ascendente sin retroceso y pueden ser generados para la mayora de las gramticas libres de contexto. La L de su nombre indica que se lee a entrada de izquierda a derecha (left-to-right); la R, que el anlisis se realizara aplicando derivaciones mas a la derecha en sentido inverso (Rightmost) y k es el numero de smbolos de entrada por delante (lookaheads) que mira el analizador para tomar decisiones. Si no se especifica k se asume q k=1. Los analizadores que utilizan la tcnica LR pueden analizar un nmero mayor de gramticas que los analizadores descendentes y adems pueden detectar un error sintctico tan pronto como es posible hacerlo cuando se evala la entrada de izquierda a derecha. Su principal desventaja es que cuesta demasiado trabajo construirlos. Se necesitan herramientas especializadas, generadores de analizadores LR como yacc, que a partir de la descripcin de una gramtica libre de contexto, produzcan automticamente el analizador para el lenguaje descrito por esa gramtica.

y y

Las tres tcnicas ms comunes para construir tablas de anlisis LR son: SLR (LR simple): es el ms fcil de implementar, pero la menos potente de las tres. Puede no ser capaz de producir la tabla para algunas gramticas que los otros mtodos si pueden tratar.

y y

LR cannico: Es la ms potente y la ms cara de las tres. LALR (lookahead LR): Tiene un costo y una potencia intermedia entre los dos anteriores. 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.

Anlisis semntico

La fase de anlisis semntico utiliza la estructura sintctica determinada por la fase de anlisis sintctico para identificar los operadores y operados de expresiones y proposiciones. En el caso de un intrprete de consultas se debe validar que los nombres de atributos y de relaciones sean vlidos y tengan sentido desde el punto de vista semntico. Un componente importante del anlisis semntico es la verificacin de tipos. Aqu, el interprete verifica si cada operador tiene operados permitidos por la especificacin del lenguaje fuente y verifica la compatibilidad de los tipos cuando estos estn involucrados, por ejemplo, en una condicin1. Se ocupa de analizar si la sentencia tiene algn significado. Se pueden encontrar sentencias que son sintcticamente correctas pero que no se pueden ejecutar porque carecen de sentido. En general, el anlisis semntico se hace a la par que el anlisis sintctico introduciendo en ste unas rutinas semnticas. Ejemplo: En la sentencia que se ha analizado existe una variable entera. Sin embargo, las operaciones se realizan entre identificadores reales, por lo que hay dos alternativas: o emitir un mensaje de error "Discordancia de tipos", o realizar una conversin automtica al tipo superior, mediante una funcin auxiliar inttoreal2.

<id1> <:=> <EXPRESION> / | \ <id2> <+> <EXPRESION> / | \ <id3> <*> <EXPRESION> | <real> | <inttoreal> | <int>

REPBLICA BOLIVARIANA DE VENEZUELA MINISTERIO DEL PODER POPULAR PARA LA EDUCACIN SUPERIOR UNIVERSIDAD NACIONAL EXPERIMENTAL RMULO GALLEGOS REA DE SISTEMAS; ING. EN INFORMTICA CTEDRA: TRADUCTORES INTRPRETE

INTEGRANTES: DANIELA BLANCO CI 20091447

SAN JUAN DE LOS MORROS 18/02//12

You might also like