Está en la página 1de 16

2013

Lenguajes y Autmatas. Unidades V y VI


Investigaciones de los temas incluidos en las unidades 5 Anlisis lxico, Anlisis sintctico.

Fernando Alonso Del Valle Hernndez. Catedrtico: Ing. Antonio Martnez Gonzales. 30/05/2013

Contenido
UNIDAD 5 Anlisis lxico. ............................................................................................................... 2 5.1 Funciones del analizador lxico. ......................................................................................... 2 5.2 Componentes lxicos, patrones y lexemas ....................................................................... 3 5.3 Creacin de Tabla de tokens ............................................................................................... 3 5.4 Errores lxicos ........................................................................................................................ 4 5.5 Generadores de analizadores Lxicos ............................................................................... 4 5.6 Aplicaciones (Caso de estudio) ........................................................................................... 5 UNIDAD 6 Anlisis Sintctico. ........................................................................................................ 5 6.1 GLC .......................................................................................................................................... 5 Reglas para oraciones aseverativas (esbozo) .............................................................................. 5 6.2 rboles de derivacin............................................................................................................ 5 6.3 Formas normales de Chomsky. ........................................................................................... 6 6.4 Diagramas de sintaxis ........................................................................................................... 7 6.5 Eliminacin de la ambigedad. ............................................................................................ 8 TIPOS DE AMBIGEDAD .............................................................................................................. 8 6.6 Generacin de matriz predictiva (clculo first y follow) .................................................... 9 FIRST ............................................................................................................................................ 9 FOLLOW ..................................................................................................................................... 10 6.7 Tipos de analizadores sintcticos ..................................................................................... 10 Analizador Descendente: .......................................................................................................... 10 Analizador Ascendente: ............................................................................................................ 10 6.8 Manejo de errores ................................................................................................................ 11 Rutinas de Manejo de Errores ................................................................................................... 11 Tipos de errores ........................................................................................................................ 12 Modo de Pnico ........................................................................................................................ 12 A nivel de frase .......................................................................................................................... 12 Producciones de error ............................................................................................................... 13 6.9 Generadores de analizadores sintcticos ........................................................................ 13 Funcionamiento de yacc ........................................................................................................... 13 El lenguaje Yacc ......................................................................................................................... 14

Lenguajes y Autmatas.

Pgina 1

UNIDAD 5 Anlisis lxico.

La fase de rastreo (scanner), tiene las funciones de leer el programa fuente como un archivo de caracteres y dividirlo en tokens. Los tokens son las palabras reservadas de un lenguaje, secuencia de caracteres que representa una unidad de informacin en el programa fuente. En cada caso un token representa un cierto patrn de caracteres que el analizador lxico reconoce, o ajusta desde el inicio de los caracteres de entrada. De tal manera es necesario generar un mecanismo computacional que nos permita identificar el patrn de transicin entre los caracteres de entrada, generando tokens, que posteriormente sern clasificados. Este mecanismo es posible crearlo a partir de un tipo especfico de mquina de estados llamado autmata finito.[1] 5.1 Funciones del analizador lxico. Las funciones de un analizador lxico pueden ser laS siguientes: Leer los caracteres de la entrada. Generar una secuencia de componentes lxicos. (TOKENS). Eliminar comentarios, delimitadores (espacios, smbolos de puntuacin, fin de la lnea). Relacionar los mensajes de error con las lneas del programa fuente. Introducir los identificadores en la tabla de smbolos.

Este lee la secuencia de caracteres del programa fuente, carcter a carcter, y los agrupa para formar unidades con significado propio, los componentes lxicos. Estos componentes lxicos representan: Palabras reservadas if, while, do, Identificadores: asociados a variables, nombres de funciones, tipos definidos por el usuario, etiquetas, por ejemplo: posicin, velocidad, tiempo, Operadores: = * + - / == > < & = Smbolos especiales: ; () [] {} Constantes numricas: literales que representan valores enteros, en coma flotante, etc, 982, 0xf678, -83.2E+2 Constantes de caracteres: literales que representan cadenas concretas de caracteres, hola mundo,

Estas seran funciones secundarias de un analizador lxico: Manejo del fichero de entrada del programa fuente: abrirlo, leer sus caracteres, cerrarlo y gestionar posibles errores de lectura.
Pgina 2

Lenguajes y Autmatas.

Eliminar comentarios, espacios en blanco, tabuladores y saltos de lnea (caracteres no vlidos para formar un token). Inclusin de ficheros: # include La expansin de macros y funciones inline: # define Contabilizar el nmero de lneas y columnas para emitir mensajes de error. Reconocimiento y ejecucin de las directivas de compilacin (por ejemplo, para depurar u optimizar el cdigo fuente). Ventajas de separar el anlisis lxico y el anlisis sintctico: Facilita transportabilidad del traductor (por ejemplo, si decidimos en un momento dado cambiar las palabras reservadas begin y end de inicio y fin de bloque, por f y g, solo hay que cambiar este mdulo. Se simplifica el diseo: el analizador es un objeto con el que se interacta mediante ciertos mtodos. Se localiza en un nico modulo la lectura fsica de los caracteres, por lo que facilita tratamientos especializados de E/S.[1]

5.2 Componentes lxicos, patrones y lexemas Componente lxico es la secuencia lgica y de caracteres relativo a una categora: identificador, palabra reservada (cadena/numrica), operador o carcter de puntuacin, el componente lxico puede tener uno o varios lexemas. Patrn: regla que genera la secuencia de caracteres que puede representar a un determinado componente lxico. Lexema es una cadena de caracteres que concuerda con un patrn que describe un componente lxico.

El analizador lxico recoge informacin sobre componentes lxicos. Los tokens influyen en el anlisis sintctico, los atributos en la traduccin de tokens. En prctica lxico suele tener solo un atributo. Para efectos de diagnstico, puede considerarse tanto el lexema para un identificador como el nmero de lnea en el que se encontr por primera vez. 5.3 Creacin de Tabla de tokens Una tabla de smbolos puede conceptualizarse como una serie de renglones, cada uno de los cuales contiene una lista de valores de atributos que son asociados con una variable en particular. Las clases de los atributos que aparecen en una tabla de smbolos dependen en algn grado de la naturaleza del lenguaje de programacin para el cual se escribe el compilador. La organizacin de la tabla variar dependiendo de las limitaciones de memoria y tiempo de acceso. Una tabla de smbolo provee la siguiente informacin:

Da un identificador. Que informacin es asociada con un nombre.


Pgina 3

Lenguajes y Autmatas.

Como se asocia esa informacin con un nombre. Como acceder esta informacin.

Pero las dos funciones importantes que realizan las tablas de smbolos (tambin llamadas tablas de identificadores y tablas de nombres), en el proceso de traduccin son:

verificar que la semntica sea correcta ayudar en la generacin apropiada de cdigo.

Cuando Construir La Tabla De Simbolos Y Cuando Interactuar Ella Con El punto del procesador de traduccin en el cual son invocadas las rutinas de manejo de la tabla de smbolos depende primeramente del nmero y la naturaleza de los pasos del compilador. En un compilador multipasos, la tabla de smbolos es creada durante el paso de anlisis lxico. Por medio de un ndice se entra a la tabla de smbolos para ubicar la variable, a partir del token generado por el scanner. 5.4 Errores lxicos Son pocos los errores simplemente en el nivel lxico ya que tiene una visin muy restringida de un programa fuente. El analizador lxico debe devolver el componente lxico de un identificador y dejar a otra fase se ocupe de los errores. Suponiendo que una situacin en la cual el analizador lxico no puede continuar por que ninguno de los patrones concuerda con un prefijo de la entrada. Tal vez la estrategia de recuperacin ms sencilla sea recuperacin EN MODO PANICO (este mtodo de recuperacin es donde se borra caracteres sucesivos de la entrada hasta que el analizador lxico pueda encontrar un componente lxico bien formado). Los programas no siempre son correctos! El compilador tiene que realizar lo siguiente: 1. Reportar clara y exactamente la presencia de errores 2. Recuperarse de cada error lo suficientemente rpido para poder detectar errores subsiguientes:

Tratar de evitar mensajes falsos de error Un error que produce un token errneo Errores lxicos posibles

5.5 Generadores de analizadores Lxicos Todos los analizadores lxicos realizan la misma funcin (se implementan de igual forma) excepto en los tokens que reconocen, las expresiones regulares que los definen. Resulta entonces natural y una forma de ahorrar esfuerzo, utilizar
Lenguajes y Autmatas. Pgina 4

generadores automticos de analizadores lxicos. Estos generadores solo necesitan conocer la especificacin de tokens a reconocer. 5.6 Aplicaciones (Caso de estudio) UNIDAD 6 Anlisis Sintctico. 6.1 GLC Capturan la nocin de constituyente sintctico y la nocin de orden. Herramienta formal que puede ser vista tanto desde un punto de vista generador como estructurador. Propiedades computacionales interesantes: se puede reconocer en tiempo polinmico. Una Gramtica Libre de Contexto es una tupla con 4 parmetros: G = (V,T,P,S) V conjunto de smbolos variables T conjunto de smbolos terminales S V, smbolo inicial P conjunto de reglas de produccin: A , con sucesin de smbolos de V T, eventualmente vaca ( = ). Una GLC es un dispositivo generador. Definimos el lenguaje LG generado por una gramtica G del siguiente modo: LG = { w / S * w } , siendo * una especie de clausura transitiva de y w una tira de terminales. Reglas para oraciones aseverativas (esbozo) O GN GV O GV GV V GV V GN GV V GAdj GV V GAdv GV GV GP [1] 6.2 rboles de derivacin. Podemos decir:

Del mismo modo se puede decir deriva en uno o ms pasos.


Lenguajes y Autmatas. Pgina 5

Una derivacin por la izquierda es aquella en la que se reemplaza el no terminal ms a la izquierda en cada paso de la derivacin. . anlogamente para la derecha Una derivacin por la izquierda corresponde a la numeracin preorden de los nodos internos de su rbol de anlisis gramatical asociado. . derecha . postorden inversa. Toda derivacin de las gramticas de tipo 1, 2 3 se puede representar mediante un rbol. 6.3 Formas normales de Chomsky. Una gramtica formal est en Forma normal de Chomsky si todas sus reglas de produccin son de alguna de las siguientes formas: o o donde , y son smbolos no terminales (o variables) y es un smbolo terminal. Todo lenguaje independiente del contexto que no posee a la cadena vaca, es expresable por medio de una gramtica en forma normal de Chomsky (GFNCH) y recprocamente. Adems, dada una gramtica independiente del contexto, es posible algortmicamente producir una GFNCH equivalente, es decir, que genera el mismo lenguaje. En algunos textos se puede encontrar una definicin de una GFNCH de forma que cualquier GFNCH produzca cualquier lenguaje independiente del contexto y de la misma manera, que para cualquier lenguaje independiente del contexto exista una GFNCH que lo defina. Esta definicin apenas se diferencia en permitir una regla de la siguiente forma: o o donde es el smbolo distinguido (o inicial) de la gramtica, es un smbolo no terminal (o variable), y tambin son smbolos no terminales pero distintos de vaca).[2] , es un smbolo terminal, y es la cadena nula (o

Lenguajes y Autmatas.

Pgina 6

6.4 Diagramas de sintaxis Un segundo 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 figura 10.5 se ilustrar 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.[3]

a) <w> ::= <w1> <w2> <w3>

b) <w> ::= <w1><w2> | <w1>a | bc<w2>

c) <w> ::= ab<w>.

Lenguajes y Autmatas.

Pgina 7

d) <w> ::= ab | ab<w>.

6.5 Eliminacin de la ambigedad. Una GLC es ambigua si existe una cadena w L(G) que tiene ms de una derivacin por la izquierda o ms de una derivacin por la derecha o si tiene dos o ms rboles de derivacin. En caso de que toda cadena w L(G) tenga un nico rbol de derivacin, la gramtica no es ambigua. TIPOS DE AMBIGEDAD Dentro del estudio de gramticas existen dos tipos fundamentales de ambigedad, los cuales son:
Ambigedad Inherente:

Las gramticas que presentan este tipo de ambigedad no pueden utilizarse para lenguajes de programacin, ya que por ms transformaciones que se realicen sobre ellas, nunca se podr eliminar completamente la ambigedad que presentan. Un lenguaje L es inherentemente ambiguo si todas sus gramticas son ambiguas; si existe cuando menos una gramtica no ambigua para L, L no es ambiguo. El lenguaje de las expresiones no es Ambiguo Las expresiones regulares no son ambiguas

Ambigedad Transitoria:

Este tipo de ambigedad puede llegar a ser eliminada realizando una serie de transformaciones sobre la gramtica original. Una vez que se logra lo anterior, la gramtica queda lista para ser reconocida por la mayor parte de los analizadores sintcticos. (Se le considera "ambigedad" porque existen mtodos para realizar anlisis sintctico que no aceptan gramticas con estas caractersticas) Dnde se presenta la Ambigedad Transitoria generalmente la ambigedad se presenta cuando existen producciones con factores comunes (distintas alternativas para un smbolo no-terminal que inician de la misma forma); cuando existen producciones que son recursivas izquierdas (producciones para un
Lenguajes y Autmatas. Pgina 8

smbolo no-terminal en las cuales el primer smbolo de su forma sentencial es ese mismo smbolo no-terminal).
Cmo solucionar el problema de la Ambigedad Transitoria?

Para eliminar este tipo de ambigedad, es necesario, primero eliminar: Factores comunes izquierdos inmediatos y No-inmediatos. Recursividad izquierda inmediata y No-inmediata.

ELIMINACIN DE LA AMBIGEDAD. No existe un algoritmo que nos indique si una GIC es ambigua Existen LIC que slo tienen GIC ambiguas: inherentemente ambiguos Para las construcciones de los lenguajes de programacin comunes existen tcnicas para la eliminacin de la ambigedad

Ejemplo: causas de ambigedad en la siguiente gramtica No se respeta la precedencia de operadores Una secuencia de operadores idnticos puede agruparse desde la izquierda y desde la derecha. Lo convencional es agrupar desde la izquierda. [4] 6.6 Generacin de matriz predictiva (clculo first y follow) FIRST Si es cualquier cadena de smbolos gramaticales, se considera FIRST() como el conjunto de terminales que encabezan las cadenas derivadas de . Si = * => , entonces tambin est en FIRST(). Para calcular FIRST(X) para algn smbolo X de la gramtica, se aplican las siguientes reglas hasta que no se pueda aadir nada nuevo al conjunto FIRST: 1. Si X es terminal, entonces FIRST(X) es {X}. 2. Si X es no terminal y existe la produccin X , entonces aadir a FIRST(X). 3. Si X es no terminal y X Y1 Y2 .. . Yk es una produccin entonces, para todo i (con i variando desde 1 hasta k) tal que Y1 , Y2 , ..., Yi-1 sean todos no terminales y FIRST(Y1), FIRST(Y2), ..., FIRST(Yi-1) contengan todos , se aaden todos los smbolos no nulos de FIRST(Yi ) a FIRST(X). Finalmente, si est en FIRST(Yj ) para j = 1, 2, ..., k (o sea, en todos), entonces se aade a FIRST(X). Dicho de otra forma, lo anterior significa que todos los elementos de FIRST(Y1), excepto , pertenecen tambin a FIRST(X). Si Y1 no deriva , entonces ya ha terminado el clculo de FIRST(X), pero en caso contrario, es decir, si Y1 =*=> ,
Lenguajes y Autmatas. Pgina 9

entonces todos los elementos de FIRST(Y2) excepto pertenecen tambin a FIRST(X), y as sucesivamente. Finalmente, si todos los Yi derivan , entonces se aade a FIRST(X). FOLLOW Se define FOLLOW(A), para el no terminal A, como el conjunto de terminales a que pueden aparecer inmediatamente a la derecha de A en alguna forma sentencial, es decir, el conjunto de terminales a tal que haya una derivacin de la forma S=*=>Aa para algn y . Si A puede ser el smbolo de ms a la derecha en alguna forma sentencial, entonces $ est en FOLLOW(A). Para calcular FOLLOW(A) para un smbolo no terminal A, se aplican las siguientes reglas hasta que no se pueda aadir nada ms al conjunto FOLLOW. 1. $ est en FOLLOW(S), siendo S el axioma de G. 2. Si existe una produccin A B, entonces todo lo que est en FIRST(), excepto , est en FOLLOW(B). 3. Si existe la produccin A B y FIRST() contiene (es decir, =*=>), o bien si existe una produccin A B, entonces todo lo que est en FOLLOW(A) est en FOLLOW(B). 6.7 Tipos de analizadores sintcticos Analizador Descendente: Se construye el rbol de anlisis sintctico partiendo del smbolo inicial y aplicando las producciones mediante derivaciones por la izquierda, el smbolo a expandir es el que este ms a la izquierda.

Ejemplo: G=({+,*, ID, (, )}, {E, T, P}, E, P) P={ E:=E+T | T; T:=T*P | P; P:= ID | ( E ) } Frase ID + ( ID * ID )
Analizador Ascendente: Se construye el rbol de anlisis sintctico partiendo de la frase a reconocer y aplicando las producciones mediante reducciones hasta llegar a smbolo inicial de la gramtica. Ejemplo: G=({+,*, ID, (, )}, {E, T, P}, E, P) P={ E:=E+T | T; T:=T*P | P; P:= ID | ( E ) } Frase ID + ( ID * ID )
Lenguajes y Autmatas. Pgina 10

L L (1) Es Predictivo

Descendentes

Se aplican las producciones por izquierda El orden de lectura de la entrada es de izquierda a derecha S L R (1)

Tipos de Analizadores

Es Predictivo Se aplican las producciones por derecha El orden de lectura de la entrada es de izquierda a derecha Simple L R (1) Es Predictivo

Ascendentes

Se aplican las producciones por derecha El orden de lectura de la entrada es de izquierda a derecha LA L R (1) Es Predictivo Se aplican las producciones por derecha El orden de lectura de la entrada es de izquierda a derecha Look a Head: Al construir el analizador va a tratar de mirar por adelantado el texto para comprenderlo y hacer mas sencillo y mejores estados

6.8 Manejo de errores Rutinas de Manejo de Errores Ocupan gran parte de los compiladores Objetivos Informar con claridad, exactitud Recuperacin rpida recuperacin no es correccin No debe retrasar el procesamiento de programas sin errores No generar errores en cascada (ej. eliminar identificador) Acciones posibles Detectar errores Informar de los errores Recuperar de los errores Corregir errores

Necesidad actual de recuperacin? Ms rpido re-compilar que leer siguiente erro


Pgina 11

Lenguajes y Autmatas.

Tipos de errores Lxicos: escribir mal un identificador, nmero. Sintcticos: no poner un ; al final de una sentencia, estructura incorrecta. Semnticos: multiplicar por una variable booleana Lgicos: bucle infinito Herramientas para disminuir el nmero de errores Lxicos Si se utiliza alguna herramienta que complete palabras Sintcticos Si se utiliza algn editor basado en sintaxis (colores) Semnticos Busca funciones/clases e indica tipos especificados Modo de Pnico Caractersticas Mtodo ms sencillo Lo pueden usar la mayora de los AS No entra en lazos infinitos Adecuado para lenguajes en los que son raros mltiples errores en la misma proposicin

Funcionamiento general El AS desecha smbolos de la entrada, uno por uno, hasta encontrar un token de sincronizacin para continuar Delimitadores (punto y coma, palabras clave como end) Inconvenientes Podran omitirse gran cantidad de smbolos sin analizar

A nivel de frase Caractersticas Correcciones en la cadena de entrada

Funcionamiento Descubierto el error se corrige (localmente) la entrada por un prefijo que permite continuar el AS Sustituir una coma por un punto y coma, insertar un punto y coma, etc.

Inconvenientes
Lenguajes y Autmatas. Pgina 12

Dificultad para resolver situaciones en las que el error se produjo antes de la deteccin de ste Pueden producir lazos infinitos Evitar insertar smbolos antes del smbolo actual en la entrada Producciones de error Funcionamiento Conocidos los errores ms comunes, se extiende la gramtica con producciones de error Reconocido el error, se dan diagnsticos precisos de la construccin errnea Ej.: E->E op T | E->T E-> E T //falta operador T->id | num Inconvenientes Dificultad para ir ms all de los casos particulares ms frecuentes Generacin ambigedades

6.9 Generadores de analizadores sintcticos Hemos visto cmo el anlisis lxico facilita la tarea de reconocer los elementos de un lenguaje uno a uno. A partir de ahora, vamos a centrarnos en el anlisis sintctico, que nos permitir averiguar si un fichero de entrada cualquiera respeta las reglas de una gramtica concreta. Para el tema del anlisis sintctico vamos a utilizar la herramienta yacc (Yet Another Compiler Compiler). Funcionamiento de yacc Igual que suceda con lex, yacc no es directamente un analizador sino un generador de analizadores. A partir de un fichero fuente en yacc, se genera un fichero fuente en C que contiene el analizador sintctico. Sin embargo, un analizador sintctico de yacc no puede funcionar por s solo, sino que necesita un analizador lxico externo para funcionar. Dicho de otra manera, el fuente en C que genera yacc contiene llamadas a una funcin yylex() que debe estar definida y debe devolver el tipo de lexema encontrado. Adems, es necesario incorporar tambin una funcin yyerror(), que ser invocada cuando el analizador sintctico encuentre un smbolo que no encaja en la gramtica.

Lenguajes y Autmatas.

Pgina 13

El lenguaje Yacc
Esquema general

Un programa fuente de Yacc se parece bastante a uno de lex. La diferencia principal est en la seccin de reglas, que en vez de expresiones regulares contiene las reglas de la gramtica:

De estas tres secciones, slo la segunda es obligatoria, y no debe estar vaca (ntese que en lex, las tres secciones pueden estar vacas). Esto quiere decir que el mnimo programa en yacc es: %% regla gramatical accin en C

La seccin de declaraciones puede incluir varias cosas, tal y como ocurra en lex, pero ahora su funcin principal no es definir expresiones regulares, sino declarar los smbolos terminales de la gramtica mediante la directriz
Pgina 14

Lenguajes y Autmatas.

%token. Todo lo que no sea un terminal, ser considerado un smbolo no terminal, y por tanto debe haber una regla para l: %token IF,ELSE,LLAVE_AB,LLAVE_CE,IDENT La seccin de reglas contiene la gramtica en s. Componentes es una combinacin de terminales y no terminales que describe al no terminal de la izquierda de la regla: no_terminal: componentes {acciones en C} La seccin de rutinas tiene la misma funcin que la de lex, pero yacc (dependiendo de su variante) no define por defecto las funciones main(), yylex() e yyerror(), as que hay que incluirlas aqu, o bien en otro fichero que se enlazar en la fase final de la compilacin.

Yacc genera una funcin llamada yyparse() que contiene el analizador sintctico. Esta funcin se comporta como una mquina de estados cuya misin es intentar reducir todo el fichero de entrada al smbolo inicial de la gramtica (el primero que se haya definido). Si yacc lo consigue, el analizador sintctico volver sin error, y en caso contrario, se invocar a la funcin yyerror(), que debe estar definida tambin en algn sitio. [5]

Lenguajes y Autmatas.

Pgina 15