Sunteți pe pagina 1din 30

Contenido Compiladores

Notas de clase basadas en Construccin de compiladores de Kenneth C. Louden o Dr. Francisco Javier Zaragoza Mart nez franz@correo.azc.uam.mx
UAM Azcapotzalco Departamento de Sistemas 1

Compiladores Lenguajes regulares y anlisis lxico a e Gramticas y anlisis sintctico a a a Anlisis sintctico descendente a a

Trimestre 2011 Invierno

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

1 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

2 / 240

Exmenes y tareas a

Otros detalles

Cinco exmenes parciales: a


Individuales. Cada dos semanas. Por cada tema del curso. Fuera del horario de clase (Moodle).

Para aprobar se requiere al menos 30 puntos en cada parte y:


Al menos 60 puntos para S. Al menos 73 puntos para B. Al menos 87 puntos para MB.

Cinco tareas de programacin: o


Individuales. En C o C++ (ningn otro lenguaje). u En gcc o g++ para Linux (ningn otro ambiente). u Debern funcionar en el servidor callix. a

Los exmenes tendrn un horario amplio pero un tiempo limitado de a a aplicacin. o El cdigo fuente de las tareas se deber enviar a tiempo desde callix. o a No guardar calicacin. e o

Cada examen y cada tarea valdr 10 puntos. a

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

3 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

4 / 240

Contenido

Contenido

Compiladores Lenguajes regulares y anlisis lxico a e Gramticas y anlisis sintctico a a a Anlisis sintctico descendente a a

Compiladores Introduccin a los compiladores o Una breve historia de los compiladores Programas relacionados con los compiladores Proceso de traduccin o Estructura de un compilador La estructura del compilador Arranque automtico y portabilidad a Lenguaje y compilador de muestra

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

5 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

6 / 240

Qu es un compilador? e

Por qu estudiar compiladores? e

Programa fuente

Compilador

Programa objetivo

Los compiladores suelen ser programas muy complejos, dif ciles de escribir y de entender. Pero los compiladores se usan en todos los aspectos prcticos de la a computacin. o Una tarea frecuente es la de escribir aplicaciones con interfaces e intrpretes de instrucciones, ms pequeos que un compilador pero e a n usando las mismas tcnicas. e En este curso estudiaremos las tcnicas bsicas que permiten la e a escritura de compiladores y de estas otras aplicaciones.

Un compilador es un programa que traduce de un lenguaje a otro. Su entrada es un programa escrito en un lenguaje fuente. Su salida es un programa escrito en un lenguaje objetivo. Los programas fuente y objetivo son equivalentes. Normalmente el lenguaje fuente es de alto nivel como C o C++. Normalmente el lenguaje objetivo es de bajo nivel como C o ASM.

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

7 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

8 / 240

Contenido

Lenguaje mquina y lenguaje ensamblador a


Con las computadoras de programa almacenado se comenzaron a escribir secuencias de cdigos para realizar clculos (40s). o a Estos programas se escrib en lenguaje de mquina. Por ejemplo an a C7 06 0000 0002 quiere decir mover el nmero 2 a la direccin 0 en un procesador x86. u o Esta actividad fue reemplazada por la escritura de programas en lenguaje ensamblador donde las instrucciones y direcciones de memoria pueden ser simblicas. El ejemplo anterior se escribir o a MOV X, 2 si el s mbolo X representa la direccin 0. o Los programas que traducen de lenguaje ensamblador a lenguaje de mquina se llaman ensambladores. a

Compiladores Introduccin a los compiladores o Una breve historia de los compiladores Programas relacionados con los compiladores Proceso de traduccin o Estructura de un compilador La estructura del compilador Arranque automtico y portabilidad a Lenguaje y compilador de muestra

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

9 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

10 / 240

Lenguaje ensamblador e independencia de la mquina a

Compiladores y teor de lenguajes a

El lenguaje ensamblador todav se usa cuando se requiere una gran a velocidad o un cdigo muy pequeo: videojuegos, sistemas embebidos. o n Sin embargo tiene varios defectos:
An no es fcil de escribir. u a Es dif de leer y comprender. cil Es completamente dependiente de la mquina. a Por lo que el cdigo debe reescribirse todo el tiempo. o

Al principio se crey que esto era imposible o poco eciente. o Esto fue desmentido con el desarrollo de FORTRAN por Backus (50s). Al mismo tiempo Chomsky comenz a estudiar la teor de lenguajes. o a La jerarqu de Chomsky clasica a los lenguajes segn la complejidad a u a de sus gramticas y los algoritmos necesarios para reconocerlos. Los lenguajes regulares nos resultarn utiles para llevar a cabo el a proceso de anlisis lxico. a e Los lenguajes libres de contexto son la forma estndar de representar a la estructura de los lenguajes de programacin y son fundamentales o a a para el proceso de anlisis sintctico.

Por lo tanto, el siguiente paso natural era la posibilidad de escribir programas en una notacin ms natural, independientes de la o a mquina y que todav se pudieran traducir a lenguaje de mquina. a a a Por ejemplo X = 2.

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

11 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

12 / 240

Generacin de cdigo o o

Contenido

El desarrollo de mtodos para la generacin de cdigo objeto es e o o mucho ms complejo y contina hasta nuestros d a u as. Estas tcnicas de mejoramiento de cdigo tienen como objetivo e o aumentar la velocidad del cdigo ejecutable o disminuir su longitud. o Tambin se logr automatizar parte del desarrollo de los compiladores e o a con los generadores de analizadores sintcticos y los generadores de analizadores lxicos (70s). e

Compiladores Introduccin a los compiladores o Una breve historia de los compiladores Programas relacionados con los compiladores Proceso de traduccin o Estructura de un compilador La estructura del compilador Arranque automtico y portabilidad a Lenguaje y compilador de muestra

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

13 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

14 / 240

Intrpretes y preprocesadores e

Ensambladores, ligadores y cargadores

Un intrprete es un traductor que en vez de generar cdigo objeto e o ejecuta el programa fuente inmediatamente. Cualquier lenguaje se puede interpretar o compilar, pero a veces se preere un intrprete dependiendo de la situacin espec e o ca:
Algunos lenguajes son usualmente interpretados: BASIC, LISP, PHP. En situaciones de enseanza o de desarrollo de software. n

Un ensamblador es un traductor del lenguaje ensamblador al lenguaje de mquina de una computadora en particular. a Un ligador es un programa que recopila el cdigo objeto de varios o programas que se compilaron o ensamblaron de forma separada (por ejemplo las bibliotecas) en un solo programa ejecutable. Un cargador es un programa que se encarga de llevar un programa ejecutable a cualquier parte de la memoria de modo que se pueda ejecutar.

Un preprocesador es un programa separado que se ejecuta antes de la traduccin real de un programa fuente. o Generalmente se usan para eliminar comentarios, incluir archivos, hacer sustituciones de macros, efectuar compilacin condicional, etc. o

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

15 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

16 / 240

Editores, depuradores, perladores y administradores

Contenido

Un editor es un programa que se puede usar para escribir cualquier archivo de texto. Sin embargo, hay editores especializados para escribir programas llamados editores basados en estructura. Un depurador es un programa que se usa para determinar los errores de ejecucin de un programa compilado. o Un perlador es un programa que junta estad sticas acerca de la ejecucin de un programa, como el nmero de veces que se llam a un o u o procedimiento o la cantidad de tiempo que ocupa cada uno de ellos. Un administrador de proyecto es un programa que sirve para coordinar el trabajo de escritura de un gran proyecto de software en el que se involucra a ms de un programador. a

Compiladores Introduccin a los compiladores o Una breve historia de los compiladores Programas relacionados con los compiladores Proceso de traduccin o Estructura de un compilador La estructura del compilador Arranque automtico y portabilidad a Lenguaje y compilador de muestra

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

17 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

18 / 240

Fases del proceso de traduccin o


Cdigo fuente o Analizador lxico e Tokens Arbol con anotaciones Optimizador de fuente Cdigo intermedio o

Componentes auxiliares de un compilador

Tabla de literales. Tabla de s mbolos. Manejador de errores.

Analizador sintctico Generador de cdigo a o Arbol sintctico a Analizador semntico a Cdigo objetivo o Optimizador de objetivo Cdigo objetivo o
Trimestre 11I 19 / 240

Arbol con anotaciones

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

20 / 240

Analizador lxico e
Esta fase lee el programa fuente como un ujo de caracteres. El anlisis lxico junta secuencias de caracteres en tokens. a e Como ejemplo, el cdigo en C o hola[mundo]=3+1 contiene 15 caracteres, pero slo ocho tokens: o
1 2 3 4 5 6 7 8

Analizador sintctico a

Esta fase recibe la secuencia de tokens y determina los elementos estructurales del programa. El resultado del anlisis sintctico es un rbol sintctico, tambin a a a a e a a llamado rbol de anlisis gramatical. Estos rboles son auxiliares utiles para visualizar la sintaxis de un a programa pero no son una representacin eciente. o En lugar de eso, se usan los rboles sintcticos abstractos. a a

hola (identicador) ( (corchete izquierdo) mundo (identicador) ) (corchete derecho) = (asignacin) o 3 (nmero) u + (suma) 1 (nmero) u

Un analizador lxico tambin puede introducir identicadores en la e e tabla de s mbolos y literales en la tabla de literales.
Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 21 / 240 Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 22 / 240

Ejemplo de rbol sintctico a a


expresin o asignacin o expresin o sub ndice expresin ( expresin ) o o identicador identicador hola mundo = expresin o adicin o expresin + expresin o o nmero u 3 nmero u 1

Ejemplo de rbol sintctico abstracto a a

expresin de asignacin o o expresin de sub o ndice identicador identicador hola mundo expresin aditiva o nmero u 3 nmero u 1

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

23 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

24 / 240

Analizador semntico a

Ejemplo de rbol sintctico abstracto con anotaciones a a

La semntica de un programa es su signicado. a La semntica determina el comportamiento de un programa en a ejecucin. o La mayor de los lenguajes de programacin tienen caracter a o sticas que se pueden determinar antes de la ejecucin. o A estas se les llama la semntica esttica. a a T picamente incluyen a la vericacin de tipos. o Por ejemplo, el cdigo en C o hola[mundo]=3+1 requiere que hola sea arreglo de enteros y que mundo sea entero. expresin o de sub ndice entero

expresin de o asignacin o expresin o aditiva entero nmero u nmero u

identicador identicador

hola arreglo mundo entero 3 entero de enteros

1 entero

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

25 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

26 / 240

Optimizador (mejorador) de cdigo fuente o

Ejemplo de rbol sintctico abstracto con incorporacin de a a o constantes


expresin de o asignacin o expresin o de sub ndice entero identicador identicador hola arreglo mundo entero de enteros nmero u

Muchos compiladores incluyen etapas para el mejoramiento del cdigo. o El primer lugar donde se puede hacer esto es despus del anlisis e a semntico. a Algunas de estas mejoras slo dependen del cdigo fuente. o o Por ejemplo, el cdigo en C o hola[mundo]=3+1 permite precalcular la expresin del lado derecho para que quede o hola[mundo]=4. A esto se le llama incorporacin de constantes. o

4 entero

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

27 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

28 / 240

Generador de cdigo o

Ejemplo de cdigo generado o

El generador de cdigo toma cualquier representacin interna del o o cdigo (cdigo intermedio) y genera cdigo para la mquina objetivo. o o o a Aqu usaremos cdigo ensamblador, aunque la mayor de los o a compiladores genera cdigo mquina de manera directa. o a Es en esta etapa cuando las propiedades de la mquina objetivo se a convierten en el factor principal: se deben usar instrucciones que existan y se debe tener cuidado con la representacin interna de los o datos. MOV MUL MOV ADD MOV

Una posible secuencia de cdigo generado para nuestro ejemplo ser o a: Usamos la convencin de C para los modos de direccionamiento. o R0, mundo R0, 2 R1, &hola R1, R0 *R1, 4 ;; ;; ;; ;; ;; valor de mundo a R0 doble valor en R0 direccin de hola a R1 o sumar R0 a R1 constante 4 a direccin en R1 o

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

29 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

30 / 240

Optimizador (mejorador) de cdigo objetivo o

Contenido

En esta fase se intenta mejorar el cdigo objetivo generado por el o generador de cdigo. o Dichas mejoras incluyen:
Seleccin de modos de direccionamiento para mejorar el rendimiento. o Reemplazar instrucciones lentas por rpidas. a Eliminacin de operaciones redundantes o innecesarias. o

Nuestro ejemplo podr quedar as a : MOV R0, mundo ;; valor de mundo a R0 SHL R0 ;; doble valor en R0 MOV &hola[R0], 4 ;; constante 4 a direccin de hola + R0 o

Compiladores Introduccin a los compiladores o Una breve historia de los compiladores Programas relacionados con los compiladores Proceso de traduccin o Estructura de un compilador La estructura del compilador Arranque automtico y portabilidad a Lenguaje y compilador de muestra

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

31 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

32 / 240

Estructuras de datos principales en un compilador

Tokens

Existe una gran interaccin entre las fases del compilador y las o estructuras de datos que soportan esas fases. Por lo tanto es importante que cuando se implementen se haga de la forma ms ecaz posible sin aumentar la complejidad. a Idealmente, un compilador debe compilar un programa en tiempo proporcional al nmero de caracteres del mismo. u A continuacin describiremos algunas de las estructuras de datos o principales que existen en un compilador.

Cuando el analizador lxico rene los caracteres en un token, e u generalmente lo representa de manera simblica. o Para esto se usa un valor de un tipo de datos enumerado que represente al conjunto de tokens del lenguaje. A veces se necesita tambin almacenar informacin adicional: el e o nombre de un token identicador o el valor de un token literal. En la mayor de los lenguajes slo se procesa un token a la vez, pero a o en otros se requiere un arreglo de tokens.

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

33 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

34 / 240

Arbol sintctico a

Tabla de s mbolos

El rbol sintctico se construye como una estructura de datos a a dinmica que crece conforme se lleva a cabo el anlisis sintctico. a a a Cada nodo del rbol es un registro cuyos campos almacenan la a informacin obtenida por el anlisis sintctico (y posteriormente el o a a anlisis semntico). a a Por ejemplo, el tipo de datos de una expresin se puede almacenar en o un campo del nodo correspondiente.

Esta estructura mantiene la informacin asociada con los o identicadores:


Funciones. Variables. Constantes. Tipos de datos.

La tabla de s mbolos interacta con todas las fases del compilador. u Debido a esto, las operaciones de insercin, eliminacin y acceso o o deben ser muy ecientes, incluso de tiempo constante. Generalmente se usa una tabla de dispersin. o

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

35 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

36 / 240

Tabla de literales

Cdigo intermedio o

Esta estructura mantiene la informacin asociada con las literales o (constantes y cadenas usadas en el programa). La bsqueda e insercin rpida tambin son esenciales, pero la u o a e eliminacin no ocurre en esta estructura. o Esta tabla es importante porque permite la reutilizacin de constantes o y cadenas y, por lo tanto, la reduccin de tamao del programa. o n

Dependiendo de la clase de cdigo intermedio generado, se puede o almacenar de diversas formas:


Arreglo de cadenas de texto. Archivo de texto temporal. Lista ligada.

La representacin empleada tambin inuye en el tiempo de ejecucin o e o de las etapas de mejoramiento de cdigo. o

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

37 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

38 / 240

Contenido

Anlisis y s a ntesis

Compiladores Introduccin a los compiladores o Una breve historia de los compiladores Programas relacionados con los compiladores Proceso de traduccin o Estructura de un compilador La estructura del compilador Arranque automtico y portabilidad a Lenguaje y compilador de muestra

La estructura de un compilador tambin se puede describir como una e etapa de anlisis seguida de una etapa de s a ntesis. El anlisis corresponde con las etapas del compilador que analizan el a programa fuente para calcular sus propiedades:
Anlisis lxico. a e Anlisis sintctico. a a Anlisis semntico. a a Tcnicas matemticas y algor e a tmicas.

La s ntesis corresponde con las etapas del compilador que generan el cdigo traducido. o
Generacin de cdigo. o o Mejoramiento de cdigo. o Tcnicas ms especializadas. e a

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

39 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

40 / 240

Etapa inicial y etapa nal

Pasadas

Otra forma de ver el proceso de compilacin lo divide en etapas que o dependen del lenguaje fuente o del lenguaje objetivo. La etapa inicial depende slo del lenguaje fuente. o La etapa nal depende slo del lenguaje objetivo. o Estas dos etapas quedan divididas por el cdigo intermedio, lo cual o resulta muy importante para la portabilidad del compilador. Desafortunadamente este ideal ha sido imposible de conseguir.

A cada lectura del programa fuente se le llama una pasada. Algunos compiladores llevan a cabo ms de una pasada: a
Una Una Una Una para para para para el anlisis lxico. a e construir el rbol sintctico. a a construir el cdigo intermedio. o construir el cdigo objetivo, etc. o

Algunos lenguajes como C permiten la compilacin en una pasada. o Sin embargo, los compiladores con mejoramiento de cdigo suelen o hacer varias pasadas: ocho no es fuera de lo comn. u

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

41 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

42 / 240

Contenido

Lenguajes involucrados en el proceso

Compiladores Introduccin a los compiladores o Una breve historia de los compiladores Programas relacionados con los compiladores Proceso de traduccin o Estructura de un compilador La estructura del compilador Arranque automtico y portabilidad a Lenguaje y compilador de muestra

En realidad hay tres lenguajes involucrados en el proceso de compilacin: o


El lenguaje fuente. El lenguaje objeto. El lenguaje antrin o

Este ultimo es el lenguaje en el que est escrito el compilador. a Histricamente, este lenguaje comenz siendo el lenguaje de mquina. o o a Pero actualmente se escriben en lenguajes para los que ya existen compiladores para las mquinas objetivo. a

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

43 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

44 / 240

Diagramas T

Primer tipo de combinacin de diagramas T o

S H

T A H B B H C H A C

Muchas situaciones se pueden describir mediante un diagrama en el que se indican los lenguajes fuente S, objetivo T y antrin H. o Este diagrama es equivalente a decir que el compilador correspondiente traduce de S a T ejecutndose sobre una mquina H. a a T picamente H es igual a T, pero esto puede variar.

Si tenemos dos compiladores de A a B y de B a C que se ejecutan en la misma mquina H entonces obtenemos un compilador de A a C a que se ejecuta tambin en la mquina H. e a

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

45 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

46 / 240

Segundo tipo de combinacin de diagramas T o

Traduccin de compiladores o

A H

B H M K

A K

A B

H B H H

A H

Podemos usar un compilador de la mquina H a la mquina K para a a traducir el lenguaje de implementacin de otro compilador de H a K. o

Podemos utilizar un compilador para el lenguaje B en la mquina H a para traducir un compilador de A a H escrito en el lenguaje B.

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

47 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

48 / 240

Compilacin cruzada o

Compilador escrito en el lenguaje que compila

A B

H B K K

A K

S S

Es comn escribir un compilador en el mismo lenguaje que compila. u Podemos utilizar un compilador para el lenguaje B en la mquina K a para obtener un compilador cruzado de A a H en la mquina K. a Aunque parece que esto es un problema debido a que el compilador no se puede compilar a s mismo, esto resulta muy util. Veamos dos casos.

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

49 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

50 / 240

Arranque automtico a
S S T S T S S T S T El compilador azul est escrito en su propio lenguaje. a El compilador rojo (limitado) est escrito en lenguaje mquina. a a El compilador verde es ineciente. El compilador caf es la versin nal. e o
Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 51 / 240

Portabilidad
T S T T A A K A H T S T T A A K A H El compilador azul est redirigido a la mquina K. a a El compilador rojo se ejecuta en la mquina H. a El compilador verde es un compilador cruzado. El compilador caf se ejecuta en la mquina K. e a
Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 52 / 240

A H

A K

Contenido

Lenguaje TINY

Compiladores Introduccin a los compiladores o Una breve historia de los compiladores Programas relacionados con los compiladores Proceso de traduccin o Estructura de un compilador La estructura del compilador Arranque automtico y portabilidad a Lenguaje y compilador de muestra

Un programa en TINY tiene una estructura muy simple: es una secuencia de sentencias separadas por puntos y coma. Todas las variables son enteras y se declaran automticamente. a Existen solamente dos secuencias de control: if y repeat. Existen sentencias de lectura y escritura. Se permiten comentarios no anidados. Las expresiones son aritmticas y booleanas. e

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

53 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

54 / 240

Ejemplo de programa en TINY

Mquina TM a
El lenguaje objetivo ser un ensamblador para la mquina TM, de la a a cual mostramos un ejemplo de traduccin del cdigo C a[i] = 6. o o Note que hay tres modos de direccionamiento: LDC es constante de carga, LD es carga de memoria y LDA es direccin de carga. o Todas las direcciones se dan como registro ms desplazamiento. a LDC 1,0(0) carga 0 en registro 1 * supone que i est en la posicin 10 de memoria a o LD 0,10(1) carga valor para 10+R1 en R0 LDC 1,2(0) carga 2 en registro 1 MUL 0,1,0 pon R1*R0 en R0 LDC 1,0(0) carga 0 en registro 1 * supone que a comienza en la posicin 20 de memoria o LDA 1,20(1) carga 20+R1 en R0 ADD 0,1,0 pon R1+R0 en R0 LDC 1,6(0) carga 6 en registro 1 ST 1,0(0) almacena R1 en 0+R0
Trimestre 11I 55 / 240 Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 56 / 240

{ Programa de muestra en lenguaje TINY calcula el factorial } read x; { introducir un entero } if x > 0 then { no calcule si x <= 0 } fact := 1; repeat fact := fact * x; x := x - 1; until x = 0; write fact { salida del factorial de x } end

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Contenido

Contenido

Compiladores Lenguajes regulares y anlisis lxico a e Gramticas y anlisis sintctico a a a Anlisis sintctico descendente a a

Lenguajes regulares y anlisis lxico a e Anlisis lxico a e Expresiones regulares Autmatas nitos o Autmatas no determin o sticos Implementacin de un analizador lxico o e

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

57 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

58 / 240

El proceso del anlisis lxico a e


El trabajo del analizador lxico es leer los caracteres del cdigo fuente e o y agruparlos en unidades lgicas llamadas tokens. o Formar tokens es parecido a deletrear palabras en espaol. n En un compilador los tokens se denen como un tipo enumerado: typedef enum { IF, THEN, ELSE, PLUS, MINUS, NUM, ID, ...} TokenType; Los tokens caen en diversas categor as:
Las palabras reservadas como IF y THEN que representan a las cadenas de caracteres if y then. Los s mbolos especiales como PLUS y MINUS que representan a los caracteres + y -. Las literales como NUM que representa a los nmeros. u Los identicadores como ID que representa a los nombres.

Lexemas
Note que los primeros dos tipos de token representan a una unica cadena de caracteres y que los ultimos dos representan a varias cadenas de caracteres. Para distinguir claramente entre un token y la cadena que representa se le llama a esta ultima su lexema. Por ejemplo, el token IF tiene a la cadena if como lexema. Los tokens que corresponden con las palabras reservadas y los s mbolos especiales tienen un unico lexema. Los tokens que corresponden con literales representan una cantidad innita de lexemas, como NUM y los nmeros. u Los tokens que corresponden con identicadores tambin representan e una cantidad innita de lexemas.

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

59 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

60 / 240

Atributos

Registro de token
A menudo es util recolectar todos los atributos de un token en un tipo estructurado al que llamaremos registro de token: typedef struct { TokenType tokenval; char* stringval; int numval; } TokenRecord; O posiblemente como una unin, suponiendo que no se usan los o valores numrico y de cadena al mismo tiempo: e typedef struct { TokenType tokenval; union { char* stringval; int numval; } attribute; } TokenRecord;
Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 62 / 240

Cualquier valor asociado con un token se denomina atributo. Ejemplos de atributos de tokens pueden ser:
El lexema del token. Un valor de cadena (lo que est escrito en el cdigo fuente). a o Un valor numrico (que se calcula del valor de cadena). e El signicado de un s mbolo especial (como un operador).

El analizador lxico debe calcular tantos atributos de cada token e como sea necesario para la siguiente fase, pero a veces calcula todos los posibles.

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

61 / 240

Funcionamiento del analizador lxico e

Ejemplo del funcionamiento de getToken

Aunque la tarea del analizador lxico es la de convertir todo el e programa fuente en una secuencia de tokens, normalmente no lo hace todo a la vez. En lugar de eso lo har bajo el control del analizador sintctico, a a simplemente devolviendo el siguiente token de la entrada: TokenType getToken(void); Esta funcin devolver el siguiente token de la entrada y calcular sus o a a atributos, guardando los resultados en un buer.

Considere la l nea de cdigo fuente: o a[index] = 4 + 2 Suponga que esta l nea de entrada se almacena en un buer: a [ i n d e x ] = 4 + 2 Entonces una llamada a getToken deber saltarse el primer espacio, a reconocer a la cadena a como un token y devolver el valor de token ID, de modo que la siguiente llamada a getToken comenzar a leer el a carcter [. a

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

63 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

64 / 240

Contenido

Expresiones regulares

Lenguajes regulares y anlisis lxico a e Anlisis lxico a e Expresiones regulares Autmatas nitos o Autmatas no determin o sticos Implementacin de un analizador lxico o e

Las expresiones regulares representan patrones simples de caracteres. Una expresin regular r dene un lenguaje L(r ): el conjunto de las o cadenas con las que concuerda. A L(r ) se le llama el lenguaje generado por r . Este lenguaje depende del conjunto de caracteres disponible. A este conjunto se le llama alfabeto y se suele denotar por .

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

65 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

66 / 240

Denicin de expresiones regulares o

Ejemplos de expresiones y lenguajes regulares

Las expresiones regulares se denen de manera recursiva como sigue:


La cadena vac es una expresin regular con L() = {}. a o Si a entonces a es una expresin regular con L(a) = {a}. o El conjunto vac es una expresin regular con L() = {} o o Note la diferencia entre L() y L(). Si r y s son expresiones regulares entonces r |s es una expresin regular o o con L(r |s) = L(r ) L(s), la unin de r y s. Si r y s son expresiones regulares entonces rs es una expresin regular o o con L(rs) = L(r )L(s), la concatenacin de r y s. Si r es una expresin regular entonces r es una expresin regular con o o L(r ) = L(r ) , la cerradura de Kleene de r .

L(a|b) = L(a) L(b) = {a} {b} = {a, b}. L((a|b)c) = L(a|b)L(c) = {a, b}{c} = {ac, bc}. L(((a|b)c) ) = {ac, bc} = {, ac, bc, acac, acbc, bcac, bcbc, . . .}. Si D = L(0|1|2|3|4|5|6|7|8|9) entonces D es el conjunto de d gitos. Si E = DD entonces E es el conjunto de los enteros en decimal. Si V = L(a|e|i|o|u) entonces V es el conjunto de vocales. El lenguaje a ba consta de las cadenas con exactamente una b. El lenguaje a (b|)a consta de las cadenas con una b o menos.

Ninguna otra cosa es una expresin regular. o

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

67 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

68 / 240

Lenguajes que no son regulares

Extensiones para las expresiones regulares

Es muy fcil encontrar ejemplos de lenguajes que no son regulares. a Uno de ellos es el lenguaje S = {an ban |n 0} que consta de las cadenas con la misma cantidad de a antes y despus de una b. e Demostrar que S no es regular requiere de un resultado sobre lenguajes regulares llamado el lema de bombeo.

Si r es una expresin regular entonces r + = rr . o La expresin regular representa a cualquier carcter. o a El intervalo a|b| |z tambin se escribe [a z]. e Cualquier subconjunto A se escribe A. Observe que A = \ A . Si r es una expresin regular entonces r ? = |r . o

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

69 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

70 / 240

Expresiones regulares para tokens

Nmeros enteros u
Los d gitos decimales son 0, 1, . . . , 9, por lo tanto podemos usar la expresin regular o D = 0|1| |9 = [0 9].

No es dif dar expresiones regulares que denan a los diferentes cil tokens de un lenguaje de programacin. o En particular, veremos los siguientes casos:
Nmeros enteros. u Nmeros otantes. u Palabras reservadas. Identicadores. Comentarios.

Los nmeros naturales estn hechos de uno o ms digitos, por lo que u a a podemos usar la expresin regular o N = D + = [0 9]+ . Si se quiere excluir a los que empiezan con cero (pero no al 0) entonces N = 0|[1 9][0 9] . Los nmeros enteros son los naturales posiblemente con signo u Z = (| + |)N = (+|)?N.

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

71 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

72 / 240

Nmeros otantes u

Palabras reservadas

Hay dos formas de escribir los nmeros otantes: con un punto u decimal o con notacin exponencial. o En el primer caso son un entero seguido de un punto seguido de otro natural, por lo que podemos usar la expresin regular o F = Z .N. En el segundo caso debemos considerar que posiblemente incluyan la letra e y un entero para el exponente E = F eZ . Estas son las ms fciles de escribir como expresiones regulares. a a Simplemente necesitamos una lista de cadenas que correspondan con estas. R = if|while|do| . . .

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

73 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

74 / 240

Identicadores
Generalmente un identicador comienza con una letra y sigue con una secuencia de letras o d gitos. Recordemos que los d gitos se denen as D = 0|1| |9 = [0 9]. Y las letras se pueden denir as L = a|b| |z|A|B| |Z = [a zA Z ]. Por lo que los identicadores se pueden describir con I = L(L|D) .

Comentarios
Curiosamente, casi siempre es ms dif describir un comentario a cil como una expresin regular excepto para casos sencillos. o En Pascal un comentario comienza con una llave izquierda y termina con una llave derecha, as que CPascal = {(}) }. En Scheme un comentario comienza con un punto y coma y termina con un carcter de nueva l a nea, as que CScheme =; (NL) NL. En C la situacin se complica porque los delimitadores de comentarios o constan de ms de un carcter. a a En Modula el problema es que los comentarios pueden estar anidados.

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

75 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

76 / 240

Ambigedad u

Contenido

En ocasiones una misma cadena se puede interpretar como distintas sucesiones de tokens. Por ejemplo una palabra reservada tambin es un identicador. e Otro ejemplo es la cadena <> que se podr interpretar como dos a tokens menor que y mayor que o un token distinto. Esto generalmente se resuelve aplicando una de dos reglas:
Si una cadena puede ser palabra reservada se interpreta de esta forma. Si una cadena puede extenderse para formar un token se har esto. a
2

Lenguajes regulares y anlisis lxico a e Anlisis lxico a e Expresiones regulares Autmatas nitos o Autmatas no determin o sticos Implementacin de un analizador lxico o e

As que la unica pregunta adicional que queda es cmo saber dnde o o termina un token y a esto generalmente se le llama un espacio en blanco, el cual puede ser una nueva l nea, un espacio, un tabulador o un comentario.

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

77 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

78 / 240

Autmatas nitos o

Ejemplo de un autmata nito o

L Los autmatas nitos son modelos matemticos para describir cierto o a tipo de algoritmos. En particular se pueden usar para reconocer patrones de cadenas. Por lo tanto se pueden usar para construir analizadores lxicos. e Se puede ver que los autmatas nitos reconocen exactamente a los o lenguajes regulares. D Si las letras estn denidas por L y los d a gitos estn denidos por D a entonces los identicadores se pueden denir por I = L(L|D) . Esto representa a cualquier cadena que comienza con una letra y sigue con cero o ms d a gitos o letras. L

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

79 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

80 / 240

Qu signica el diagrama anterior? e

Autmatas nitos determin o sticos

Los c rculos representan estados. Las echas representan transiciones debidas a sus etiquetas. El c rculo verde representa el estado inicial. Los c rculos rojos representan estados de aceptacin. o El proceso de reconocimiento se puede representar por una secuencia de estados que comienza en el estado inicial y que tiene una transicin por cada carcter de la entrada hasta llegar a un estado de o a aceptacin, como en o 1 x 2 t 2 m 2 p 2 7 2 2 2.

Denicin o
Un autmata nito determin o stico M consta de un alfabeto , un conjunto de estados S, una funcin de transicin T : S S, un o o estado inicial s0 S y un conjunto de estados de aceptacin A S. o

Lenguaje aceptado
El lenguaje L(M) aceptado por M es el conjunto de cadenas de caracteres c = c1 c2 cn tales que s1 = T (s0 , c1 ), s2 = T (s1 , c2 ), ldots, sn = T (sn1 , cn ) con sn A.

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

81 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

82 / 240

Diferencias entre la denicin y nuestro uso o

Ejemplo de un autmata nito con todas las transiciones o


L L O O error

Una primera diferencia es que no etiquetamos las transiciones con caracteres del alfabeto sino con subconjuntos del mismo. Esto se debe a que ser abrumador dibujar una enorme cantidad de a transiciones idnticas para cada elemento de este conjunto. e Una segunda diferencia es que no dibujamos transiciones para todos los caracteres desde cada estado. Estas transiciones faltantes signican que no tenemos un token como el esperado o que el reconocimiento del token ha concluido.

inicio

ident

L son la letras. D son los d gitos. O = (L|D) son los otros caracteres.

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

83 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

84 / 240

Un autmata para reconocer enteros con signo o

Un autmata para reconocer comentarios en C o

+ inicio signo D D entero D A / B

A C O A representa a cualquier carcter excepto . a

D / E

D son los d gitos. No dibujamos las transiciones o estado de error.

O representa a cualquier carcter excepto y /. a No dibujamos las transiciones o estado de error.

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

85 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

86 / 240

Acciones en un autmata nito o

Ejemplo de un autmata nito con acciones o

La denicin matemtica de un autmata no indica todos los o a o aspectos de su funcionamiento. Por ejemplo, no indica qu hacer cuando se alcance un estado de e error o de aceptacin. o Cuando se hace una transicin generalmente se agrega el carcter de o a entrada a una cadena que eventualmente ser el lexema de un token. a Cuando se alcanza un estado de aceptacin se devuelve el token o encontrado y sus atributos. Cuando se alcanza un estado de error se devuelve un carcter a la a entrada o se genera un token de error. inicio L

L [O]

ident

ID

D El estado inicial tiene otras transiciones en L no mostradas. En el estado nal se devuelve el token ID. En la transicin [O] se devuelve el carcter le a la entrada. o a do

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

87 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

88 / 240

Dos o ms autmatas con caracteres iniciales distintos a o


1 : 2 = assign

Combinados en un solo autmata o

2 : < = 1 < = EQ 1
Francisco Zaragoza (UAM Azcapotzalco)

assign

LE

LE

EQ
Compiladores Trimestre 11I 89 / 240 Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 90 / 240

Dos o ms autmatas con caracteres iniciales iguales a o


1 < 2 = LE

Combinados equivocadamente en un solo autmata o

2 < < > 1 < < 4

LE

>

NE

NE

LT 1 < LT

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

91 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

92 / 240

Combinados correctamente en un solo autmata o

Contenido

LE
2

= 1 < 2 > [O] NE

Lenguajes regulares y anlisis lxico a e Anlisis lxico a e Expresiones regulares Autmatas nitos o Autmatas no determin o sticos Implementacin de un analizador lxico o e

LT

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

93 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

94 / 240

Autmatas no determin o sticos

Autmatas combinados en uno no determin o stico

En principio se pueden combinar los autmatas correspondientes a o todos los tipos de token en uno gigante. Sin embargo esto se vuelve una tarea muy complicada. Una posibilidad es ampliar la denicin de autmata para permitir o o cero o ms transiciones desde un estado con un mismo s a mbolo. A estos autmatas los llamaremos no determin o sticos. Tambin permitiremos transiciones con la cadena vac . e a Estos autmatas no representan algoritmos. o 0

1 5 3

<

LE

<

>

NE

<

LT

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

95 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

96 / 240

Autmatas nitos no determin o sticos

Ejemplo de un autmata nito no determin o stico


2

Denicin o
Un autmata nito no determin o stico M consta de un alfabeto , un conjunto de estados S, una funcin de transicin T : S ( ) 2S , un o o estado inicial s0 S y un conjunto de estados de aceptacin A S. o a b 1 a 3 4

Lenguaje aceptado
El lenguaje L(M) aceptado por M es el conjunto de cadenas de caracteres c = c1 c2 cn ( ) tales que s1 T (s0 , c1 ), s2 T (s1 , c2 ), ldots, sn T (sn1 , cn ) con sn A.

La cadena abb puede aceptarse por cualquiera de las transiciones: 1 a 2 b 4 2 b 4 o 1 a 3 4 2 b 4 2 b 4.


Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 97 / 240 Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 98 / 240

Implementacin de autmatas nitos en cdigo o o o

Cdigo con condicionales anidados o


L

Existen diversas maneras de implementar un autmata nito en un o programa. No todas son apropiadas en general, pero algunas son sencillas. Por el momento analizaremos tres opciones bsicas: a
1 2 3

2 D

[O]

Condicionales anidados. Casos anidados. Tabla de transicin. o

if siguiente carcter es una letra then a avanzar en la entrada while siguiente carcter es una letra o un d a gito do avanzar en la entrada aceptar else error u otros casos
Compiladores Trimestre 11I 99 / 240 Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 100 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Cdigo con casos anidados o


s1 while s = 1 or s = 2 do case s of 1: case c of letra: avanzar en la entrada y s 2 else s 4 (error) 2: case c of letra o d gito: avanzar en la entrada y s 2 else s 3 if s = 3 then aceptar else error

Tabla de transicin o
En los ejemplos anteriores el autmata se alambr en el cdigo. o o o Otra opcin es la de expresar el autmata en una estructura de datos. o o Esto nos permitir escribir un cdigo genrico. a o e Esta estructura puede ser una tabla de transicin T en la que T (s, c) o representa el estado que se alcanza al estar en s y leer el carcter c de a la entrada. Como ejemplo: s,c L D O acepta error 1 2 no no 2 2 2 [3] no no 3 s no Llamaremos A a la columna de aceptacin, E a la columna de error y o L[s, c] a la decisin de si se debe leer un caracter de la entrada o no. o

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

101 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

102 / 240

Cdigo con tabla de transicin o o

Contenido

s1 c se lee de la entrada while not A[s] and not E [s] do n T [s, c] if L[s, c] then c se lee de la entrada sn if A[s] then aceptar else error

Lenguajes regulares y anlisis lxico a e Anlisis lxico a e Expresiones regulares Autmatas nitos o Autmatas no determin o sticos Implementacin de un analizador lxico o e

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

103 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

104 / 240

Tokens del lenguaje de muestra

Convenciones lxicas adicionales e

Palabras reservadas if then else end repeat until read write

S mbolos + MAS - MEN * POR / DIV = EQU < MEQ ( PIZ ) PDE ; PYC := ASI

Otros nmero u ident

Los comentarios estn encerrados entre llaves {}. a Los comentarios no pueden estar anidados. El cdigo es de formato libre. o El espacio en blanco consta de espacios, tabuladores y nuevas l neas. Se sigue el principio de la subcadena ms larga. a

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

105 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

106 / 240

Diseo del analizador lxico n e

Autmata para los s o mbolos de un caracter


MAS +

Ya tenemos autmatas para los nmeros y los identicadores. o u El autmata para los comentarios es particularmente simple. o Los autmatas para los dems tokens son sencillos pues constan de o a cadenas jas. inicio MEN ; + / =< (); inicio FIN

PYC

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

107 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

108 / 240

Autmata para los s o mbolos, nmeros e identicadores u


D

Autmata para el analizador lxico o e


D

NUM D inicio + / =< (); L L [O] ID [O]

NUM O D FIN COM }{ L inicio : B O = [O] ASI


Trimestre 11I 110 / 240

L [O] ID [O] FIN

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

109 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Palabras reservadas

Contenido

Qu pasa con las palabras reservadas? e El analizador lxico las reconoce como identicadores y despus hace e e una bsqueda en una tabla. u Esta bsqueda debe ser tan eciente como sea posible: u
La bsqueda lineal resulta muy lenta. u La bsqueda binaria es razonable si no hay demasiadas palabras u reservadas. Una tabla de dispersin resulta casi siempre adecuada. o

Compiladores Lenguajes regulares y anlisis lxico a e Gramticas y anlisis sintctico a a a Anlisis sintctico descendente a a

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

111 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

112 / 240

Contenido

Anlisis sintctico a a

Gramticas y anlisis sintctico a a a El proceso del anlisis sintctico a a Gramticas libres de contexto a Arboles de sintaxis abstracta Ambigedad u Notacin EBNF o Sintaxis del lenguaje Tiny

Secuencia de tokens

Analizador sintctico a

Arbol sintctico a

La tarea del analizador sintctico es determinar la estructura a sintctica de un programa a partir de los tokens producidos por el a analizador lxico. e Adems debe construir de manera impl a cita o expl cita un rbol de a anlisis gramatical o rbol sintctico. a a a Se puede ver al analizador sintctico como una funcin que toma a o como entrada la secuencia de tokens producida por el analizador lxico y que produce como salida el rbol sintctico correspondiente. e a a

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

113 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

114 / 240

Analizador sintctico a
Por lo regular la secuencia de tokens no es un parmetro de entrada a expl cito para el analizador sintctico. a En realidad el analizador sintctico llama a una funcin del analizador a o lxico como getToken para obtener el siguiente token de la entrada e cuando lo necesite. La etapa de anlisis sintctico del compilador se reduce a una llamada a a al analizador lxico como syntaxTree = parse(). e En un compilador de una sola pasada no es necesario construir el rbol sintctico expl a a cito, por lo que una llamada a parse() har todo el trabajo. a En un compilador de varias pasadas la primera pasada usar la a secuencia de tokens como entrada y las siguientes pasadas usarn el a rbol sintctico como entrada. a a
Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 115 / 240

Arbol sintctico a

La estructura del rbol sintctico depender fuertemente de la a a a estructura sintctica tanto del lenguaje como del programa que a est siendo compilado. a Generalmente el rbol sintctico es una estructura dinmica en la que a a a cada nodo contiene en sus campos toda la informacin necesaria para o continuar con el proceso de compilacin. o A veces los nodos son estructuras variables para ahorrar espacio. Los campos de atributo tambin pueden ser estructuras dinmicas. e a

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

116 / 240

Tratamiento de errores

Contenido

En el analizador lxico si aparece un caracter inesperado simplemente e se genera un token de error. De esa manera se le deja la labor al analizador sintctico. a El analizador sintctico deber generar un mensaje de error adecuado. a a Adems debe recuperarse del error para continuar con el proceso y a encontrar tantos errores como sea posible. A veces tambin lleva a cabo una reparacin de error cuando ste es e o e tan simple que se puede inferir el cdigo correcto. o Ninguna de estas labores es fcil pues el error a veces se detecta a mucho despus de que ocurri. e o

Gramticas y anlisis sintctico a a a El proceso del anlisis sintctico a a Gramticas libres de contexto a Arboles de sintaxis abstracta Ambigedad u Notacin EBNF o Sintaxis del lenguaje Tiny

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

117 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

118 / 240

Gramticas libres de contexto a

Notacin para gramticas libres de contexto o a

Una gramtica libre de contexto es un tipo ms sosticado de a a especicacin sintctica de un lenguaje. o a Son similares a las expresiones regulares pero permiten la recursin. o Un ejemplo de lenguaje que se puede expresar con una gramtica libre a de contexto es el que representa a las expresiones simples aritmticas e con operaciones de suma, resta y multiplicacin. o Estas expresiones se pueden dar mediante la siguiente gramtica: a
1 2

En el ejemplo anterior se us el s o mbolo para indicar que un s mbolo genera cualquiera de las cadenas a su derecha separadas por el s mbolo |. Como con las expresiones regulares se usa la concatenacin, pero a o diferencia de stas no se usa la cerradura de Kleene para la repeticin. e o Esto se debe a que la repeticin se puede expresar recursivamente. o El alfabeto de una gramticas libres de contexto suele constar de a tokens (denidos a su vez por expresiones regulares) y caracteres simples. A esto se le llama la forma Backus-Naur (BNF).

E EOE |(E )|N. O +| |.

Donde N representa a un nmero entero. u

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

119 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

120 / 240

Especicacin de una gramtica libre de contexto o a

Especicacin alternativa de una gramtica o a

Una regla gramatical libre de contexto en BNF es una cadena de s mbolos donde:
El primer s mbolo es el nombre de una estructura. El segundo s mbolo es . Los siguientes s mbolos son caracteres del alfabeto, nombres de estructuras o |.

Ser perfectamente vlido especicar nuestro ejemplo como: a a


1 2 3 4 5 6

Informalmente, una regla gramatical dene una estructura. En nuestro ejemplo anterior:
E EOE |(E )|N dene una expresin E . o O +| | dene un operador O.

E EOE . E (E ). E N. O +. O . O .

Sin embargo, normalmente agruparemos todas las opciones que denan a una estructura en una sola regla.

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

121 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

122 / 240

Cadenas de tokens legales


Las reglas gramaticales libres de contexto determinan un conjunto de cadenas legales de tokens para las estructuras denidas. Por ejemplo, la expresin aritmtica o e (34 3) 42 corresponde a la cadena legal de siete tokens (N N) N. Aqu el token N (nmero) tiene su estructura determinada por el u analizador lxico. e Como segundo ejemplo, la cadena (34 3 42 no es una cadena legal pues no tiene parntesis derecho y la regla e E (E ) indica que los parntesis deben venir en pares. e
Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 123 / 240

Derivaciones

Una derivacin es una secuencia de reemplazos de nombres de o estructuras por alguna de las opciones en los lados derechos de las reglas gramaticales que las denen. Una derivacin comienza con un nombre de estructura simple y o termina con una cadena de tokens o caracteres. Las cadenas que se pueden obtener como resultado de estas derivaciones son las cadenas sintcticamente legales denidas por las a reglas gramaticales.

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

124 / 240

Ejemplo de una derivacin o


Una derivacin para la cadena (N N) N: o E EOE EON E N (E ) N (EOE ) N (EON) N (E N) N (N N) N. (1) (2) (3) (4) (5) (6) (7) (8)

Lenguaje denido por una gramtica a


El conjunto de todas las cadenas obtenidas por derivaciones desde un a s mbolo de estructura es el lenguaje denido por la gramtica. Esto se puede escribir de manera simblica como o L(G ) = {s : E s} donde G es la gramtica, s es una cadena arbitraria de tokens o a caracteres, E es la estructura inicial y signica una secuencia de pasos de derivacin. o Cada estructura dene un lenguaje, pero en general slo nos interesa o el lenguaje denido por la estructura ms general de la gramtica. a a A las estructuras se les llama tambin no terminales, a los tokens o e caracteres se les llama tambin terminales y a las reglas se les llama e tambin producciones. e
Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 126 / 240

Observe que usamos el s mbolo para cada paso de una derivacin. o Tambin observe que pudimos obtener la misma cadena con otra e secuencia de pasos.
Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 125 / 240

Ejemplo de gramtica para parntesis anidados a e

Ejemplo de una gramtica para sumas a

Considere la gramtica G con unica regla gramatical: a E (E )|a. Esta gramtica tiene un no terminal E y tres terminales (, ), a. a El lenguaje generado por esta gramtica es a L(G ) = {(n a)n : n 0} es decir el lenguaje de cierta cantidad de parntesis izquierdos, e seguidos de una a y seguida de la misma cantidad de parntesis e derechos.

Considere la gramtica G con unica regla gramatical: a E E + a|a. Esta gramtica tiene un no terminal E y dos terminales +, a. a El lenguaje generado por esta gramtica es a L(G ) = {a, a + a, a + a + a, . . .} es decir el lenguaje de todas las cadenas de a separadas por signos +.

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

127 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

128 / 240

Ejemplo de una gramtica para decisiones anidadas a

Recursin por la izquierda y por la derecha o


Antes dijimos que las gramticas libres de contexto no usan a la a cerradura de Kleene para expresar la repeticin. o Esto resulta innecesario puesto que tanto la regla A Aa|a como la regla A aA|a generan al mismo lenguaje que la expresin regular a+ . o A la primera de esas reglas se le llama recursiva por la izquierda y a la segunda recursiva por la derecha por la ubicacin del no terminal. o Si queremos generar el lenguaje a entonces necesitamos una produccin vac como A para obtener A Aa| o A aA|. o a

Considere la gramtica G con tres reglas gramaticales: a S I I| c if (D)S| if (D)S else S

D 0|1. Esta gramtica tiene tres no terminales S, I , D y siete terminales a 0, 1, (, ), c, if, else. El lenguaje generado por esta gramtica es una simplicacin de las a o sentencias de decisiones anidadas (con decisiones simplicadas a 0 o 1 y las dems sentencias agrupadas en c). a

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

129 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

130 / 240

Ejemplo de gramtica para parntesis balanceados a e


Considere la gramtica G con unica regla gramatical: a E (E )E |. Esta gramtica tiene un no terminal E y dos terminales (, ). a El lenguaje generado por esta gramtica es el lenguaje de los a parntesis balanceados. e Ejemplo de una derivacin: o E (E )E ((E )E )E ((E )E )(E )E (()E )(E )E (()E )()E (())()E (())().

Ejemplo de otra gramtica para decisiones anidadas a

Considere la gramtica G con cuatro reglas gramaticales: a S I E I| c if (D)SE else S|

D 0|1. Esta gramtica tiene cuatro no terminales S, I , D, E y siete terminales a 0, 1, (, ), c, if, else. Observe cmo el indica que la parte E es opcional. o

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

131 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

132 / 240

Ejemplos de gramticas para secuencia de sentencias a


La gramtica con dos reglas gramaticales: a P S; P|S S s

Contenido

dene el lenguaje de secuencias de sentencias {s, s; s, s; s; s, . . .} La gramtica con dos reglas gramaticales: a P S; P| S s dene el lenguaje de secuencias de sentencias {, s; , s; s; , s; s; s; , . . .} En el primero el ; es un separador y en el segundo un terminador.
Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 133 / 240

Gramticas y anlisis sintctico a a a El proceso del anlisis sintctico a a Gramticas libres de contexto a Arboles de sintaxis abstracta Ambigedad u Notacin EBNF o Sintaxis del lenguaje Tiny

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

134 / 240

Mltiples derivaciones u
Otra derivacin para la cadena (N N) N: o E EOE (E )OE (EOE )OE (NOE )OE (N E )OE (N N)OE (N N) E (N N) N. (9) (10) (11) (12) (13) (14) (15) (16)

Arboles de anlisis gramatical a

Necesitamos una representacin que mantenga la estructura de una o cadena de terminales, abstrayendo las caracter sticas esenciales de una derivacin al mismo tiempo que se eliminan las diferencias o superciales. Un rbol de anlisis gramatical correspondiente a una derivacin es a a o un rbol en el cual los nodos interiores estn etiquetados por no a a terminales, las hojas estn etiquetadas por terminales y los hijos de a cada nodo interno representan el reemplazo del no terminal asociado en un paso de la derivacin. o

La diferencia entre esta derivacin y la que vimos antes es el orden de o los reemplazos Esto es en realidad una diferencia supercial.
Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 135 / 240 Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 136 / 240

Ejemplo de un rbol de anlisis gramatical en preorden a a

Ejemplo de un rbol de anlisis gramatical en posorden a a

La derivacin o E 1 EOE 2 NOE 3 N + E 4 N + N corresponde al rbol de anlisis gramatical: a a E1 E2 N O3 + E4 N

La derivacin o E 1 EOE 2 EON 3 E + N 4 N + N corresponde al rbol de anlisis gramatical: a a E1 E4 N O3 + E2 N

Observe que la numeracin de los nodos internos fue en preorden. o

Observe que la numeracin de los nodos internos fue en posorden o inverso.

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

137 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

138 / 240

Derivaciones por la izquierda y por la derecha

Un ejemplo ms complejo a

Un rbol de anlisis gramatical corresponde en general a muchas a a derivaciones que representan la misma estructura bsica. a Sin embargo podemos distinguir dos derivaciones particulares: Una derivacin por la izquierda es aquella en la que se reemplaza el o no terminal ms a la izquierda en cada paso. Corresponde a la a numeracin en preorden de los nodos internos. o Una derivacin por la derecha es aquella en la que se reemplaza el no o terminal ms a la derecha en cada paso. Corresponde a la numeracin a o en posorden inverso de los nodos internos. ( E8 N E4 E5 O7 + E6 N )

E1 O3 E2 N

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

139 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

140 / 240

Exceso de informacin o
Un rbol de anlisis gramatical es util pero contiene informacin no a a o necesaria. Por ejemplo, el rbol de anlisis gramatical a a E1 E4 N=3 se puede simplicar al rbol a + 3 4 O3 + E2

Otro ejemplo de un rbol simplicado a

En el siguiente rbol simplicado algunos tokens desaparecieron: a N=4 34 3 Por ejemplo los parntesis, pero el signicado se mantiene. e 42

que contiene estrictamente la informacin necesaria. o En este ultimo rbol se muestran los valores verdaderos de los tokens. a
Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 141 / 240 Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 142 / 240

Arboles sintcticos abstractos a

Ejemplo de estructura para un rbol sintctico abstracto a a


Los rboles sintcticos abstractos para expresiones aritmticas simples a a e se pueden representar con las siguientes estructuras en C:

Estos rboles simplicados representan abstracciones de las a secuencias de tokens. Las secuencias de tokens originales no se pueden recuperar de estos rboles. a Pero contienen toda la informacin necesaria para llevar a cabo la o traduccin. o Estos rboles se conocen como rboles sintcticos abstractos o a a a simplemente como rboles sintcticos. a a

typedef enum {Plus,Minus,Times} OpKind; typedef enum {OpKind,ConstKind} ExpKind; typedef struct streenode { ExpKind kind; OpKind op; struct streenode *lchild, *rchild; int val; } STreeNode; typedef STreeNode *SyntaxTree; Observe que se usaron tipos enumerados para denir los tipos de nodos del rbol. a

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

143 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

144 / 240

Ejemplo de rbol sintctico abstracto para decisiones a a

Ejemplo de estructura para decisiones


Los rboles sintcticos abstractos para decisiones se pueden a a representar con las siguientes estructuras en C:

Un rbol sintctico abstacto para la cadena if (a) b else c ser a a a: if a b c

En este ejemplo usamos el token if como ra del rbol y a, b, c z a corresponden con los rboles sintcticos abstractos correspondientes a a a la condicin, el caso verdadero y el caso falso, respectivamente. o

typedef enum {ExpK,StmtK} NodeKind; typedef enum {Zero,One} ExpKind; typedef enum {IfK,OtherK} StmtKind; typedef struct streenode { NodeKind kind; ExpKind ekind; StmtKind skind; struct streenode *test, *thenpart, *elsepart; } STreeNode; typedef STreeNode *SyntaxTree; Observe que se usaron tipos enumerados para denir los tipos de nodos del rbol. a

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

145 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

146 / 240

Ejemplo de rbol sintctico abstracto para secuencias de a a sentencias

Ejemplo alternativo de rbol sintctico abstracto para a a secuencias de sentencias


Otro rbol sintctico abstacto para la cadena p;q;r podr ser: a a a seq p q r

Un rbol sintctico abstracto para la cadena p;q;r ser a a a: ; p q ; r

En este ejemplo usamos el token seq como ra del rbol y p, q, r z a corresponden con los rboles sintcticos abstractos correspondientes a a a las sentencias p,q,r, respectivamente. Un problema de esta representacin es que el nmero de hijos de seq o u es variable. Esto se puede resolver reemplazando esta estructura por una lista ligada.

En este ejemplo usamos el token ; como ra del rbol y p, q, r z a corresponden con los rboles sintcticos abstractos correspondientes a a a las sentencias p,q,r, respectivamente.

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

147 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

148 / 240

Contenido

Gramticas ambiguas a
Los rboles de anlisis gramatical y los rboles sintcticos expresan la a a a a estructura de la sintaxis de un programa.

Gramticas y anlisis sintctico a a a El proceso del anlisis sintctico a a Gramticas libres de contexto a Arboles de sintaxis abstracta Ambigedad u Notacin EBNF o Sintaxis del lenguaje Tiny

Hemos visto cmo a partir de un rbol de anlisis gramatical se puede o a a obtener una derivacin por la izquierda y una derivacin por la o o derecha. Sin embargo, una gramtica puede permitir que una cadena tenga a ms de un rbol de anlisis gramatical. a a a Considere la cadena N N N generada por la gramtica a E EOE |(E )|N y O +| | que tiene dos rboles de anlisis gramatical distintos. a a Por lo tanto, esta gramtica es ambigua. a

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

149 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

150 / 240

Primer rbol de anlisis gramatical a a


Primer rbol de anlisis gramatical: a a E E E N O E N O E N

Primera derivacin izquierda o

Una derivacin izquierda para la cadena N N N: o E EOE EOEOE NOEOE N EOE N NOE N N E N N N. N = 42 (17) (18) (19) (20) (21) (22) (23)

Y su rbol sintctico correspondiente: a a N = 34


Francisco Zaragoza (UAM Azcapotzalco)

N=3
Compiladores Trimestre 11I 151 / 240 Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 152 / 240

Segundo rbol de anlisis gramatical a a


Segundo rbol de anlisis gramatical: a a E E N O E N Y su rbol sintctico correspondiente: a a N = 34 N=3
Francisco Zaragoza (UAM Azcapotzalco) Compiladores

Segunda derivacin izquierda o

Otra derivacin izquierda para la cadena N N N: o E O E N E EOE NOE N E N EOE N NOE N N E N N N. N = 42


Trimestre 11I 153 / 240 Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 154 / 240

(24) (25) (26) (27) (28) (29) (30)

Problemas de las gramticas ambiguas a


Una gramtica ambigua representa un problema para un compilador a porque no indica con precisin la estructura sintctica de un o a programa. Por lo tanto debe considerarse como una especicacin incompleta de o un lenguaje y debe evitarse. Para tratar de resolver las ambigedades se usan dos mtodos u e bsicos: a
Establecer una regla que determine cul de los rboles sintcticos es el a a a correcto. Modicar la gramtica de modo que no exista la ambigedad. a u

Otro ejemplo de ambigedad u


La cadena N N N nos presenta otro ejemplo de ambigedad. u Primer rbol sintctico, que representa a (34 3) 42 = 11: a a N = 34 N=3 N = 34 N=3 N = 42
Trimestre 11I 156 / 240

N = 42

Segundo rbol sintctico, que representa a 34 (3 42) = 73: a a

En cualquier caso, debemos decidir cul es el rbol sintctico a a a correcto, es decir, cul es el que reeja correctamente el signicado a del programa.

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

155 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Precedencia y asociatividad
El primer ejemplo de ambigedad (N N N) se resuelve cuando u consideramos que la multiplicacin tiene precedencia sobre la resta: o N = 34 N=3 N = 42

Cascada de precedencia
Para manejar la precedencia de las operaciones en la gramtica a debemos agrupar a los operadores en grupos de igual precedencia y para cada uno de ellos debemos escribir una regla diferente:
E ESE |T S +| T TMT |F M F (E )|N

El segundo ejemplo de ambigedad (N N N) se resuelve si u consideramos que la resta es una operacin asociativa por la izquierda: o N = 34
Francisco Zaragoza (UAM Azcapotzalco)

En esta gramtica las multiplicaciones se agrupan en la regla T , a mientras que las sumas y restas se agrupan en la regla E . Como el caso base de E es T esto signica que las sumas y restas aparecern ms arriba en un rbol de sintaxis y por lo tanto tendrn a a a a una precedencia ms baja. a A estas agrupaciones se les llama cascadas de precedencia.

N = 42 N=3

Compiladores

Trimestre 11I

157 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

158 / 240

Ambigedad, recursin y asociatividad u o


La gramtica que acabamos de presentar sigue siendo ambigua y a todav no representa la asociatividad de los operadores. a La razn es la recursin en ambos lados de las reglas E ESE y o o T TMT . La solucin es reemplazar una de las recursiones con el caso base, o forzando las repeticiones del lado en el que aparece la recursin. o Por ejemplo, la regla E EST |T hace que la suma y la resta sean asociativas por la izquierda, mientras que la regla E TSE |T hace que la suma y la resta sean asociativas por la derecha.

Solucin con operadores asociativos por la izquierda o

Si aplicamos estos cambios obtenemos la nueva gramtica: a


E EST |T S +| T TMF |F M F (E )|N

Ahora todos los operadores son asociativos por la izquierda.

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

159 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

160 / 240

Arbol de anlisis gramatical para N N N a

Arbol de anlisis gramatical para N N N a

E E E E T F N S T F N N T E M F T N F N F N S T F S T

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

161 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

162 / 240

El problema del else ambiguo

Primer rbol de anlisis gramatical a a

Considere la gramtica simplicada para decisiones anidadas: a S I I| c if (D)S| if (D)S else S if ( D 0

S I ) S I if ( D 1 ) S c else S c

D 0|1. Esta gramtica es ambigua debido al else opcional. a Considere por ejemplo la cadena if (0) if (1) c else c que tiene dos rboles de anlisis gramatical. a a

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

163 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

164 / 240

Segundo rbol de anlisis gramatical a a

Cul es el rbol correcto? a a

S I if ( D 0 if ( D 1 ) S I ) S c else S c La respuesta depende de si queremos asociar el else con el primero o con el segundo if. El siguiente fragmento de cdigo en C nos ayudar a decidir: o a if (x != 0.0) if (y == 1.0/x) ok = 1; else z = 1.0/x; Es decir: esperamos que el else se asocie con el ultimo if no asociado. A esto se le llama la regla de la anidacin ms cercana. o a

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

165 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

166 / 240

Solucin al problema o

Nuevo rbol de anlisis gramatical a a

S Una solucin para el problema es como sigue: o S I I |J if (D)I else I |c if (D)S| if (D)I else J 0 if ( D 1 I ) I c else I c if ( J D ) S

D 0|1. Esto funciona al permitir que llegue solamente una sentencia igualada J antes que un else en una sentencia if.

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

167 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

168 / 240

Ambigedad no esencial u
En ocasiones una gramtica puede ser ambigua y an as producir a u rboles sintcticos unicos. a a Un ejemplo de esto es la gramtica para secuencias de sentencias a P S; P|S S s

Contenido

o incluso una gramtica donde la primera regla fuera P P; P|S. a A esto lo llamaremos una ambigedad no esencial puesto que la u semntica asociada no depende de cul regla de eliminacin de a a o ambigedad se use. u Otro ejemplo aparece con los operadores asociativos como la suma. En este caso (a + b) + c = a + (b + c) y por lo tanto no importa cul a de los dos rboles sintcticos se use para representar a + b + c. a a
Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 169 / 240

Gramticas y anlisis sintctico a a a El proceso del anlisis sintctico a a Gramticas libres de contexto a Arboles de sintaxis abstracta Ambigedad u Notacin EBNF o Sintaxis del lenguaje Tiny

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

170 / 240

Notacin EBNF o

Ejemplos de repeticin o
En el caso de secuencias de sentencias tenemos que la regla

Las construcciones repetitivas y opcionales son muy comunes en las estructuras de los lenguajes de programacin. o Es por eso que en ocasiones se extiende la notacin BNF con o notaciones especiales para estos casos. Una de estas notaciones es la BNF extendida o EBNF. La repeticin se simboliza con llaves {}, como en A {} en lugar o de la regla recursiva por la izquierda A A|. La opcin se simboliza con corchetes [], como en A [] en lugar o de A |.

P S; P|S se escribir en EBNF como a P S{; S} lo que resulta en recursin por la izquierda. o En el caso de las expresiones aritmticas tenemos que la regla e E EST |T se escribir en EBNF como a E {TS}T lo que implica asociatividad por la izquierda.

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

171 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

172 / 240

Ejemplos de opcin o
En el caso de secuencias de sentencias tenemos que la regla P S; P|S se escribir en EBNF como a P S[; P] lo que resulta en recursin por la derecha. o En el caso de las expresiones aritmticas tenemos que la regla e E EST |T se escribir en EBNF como a E T [SE ] lo que implica asociatividad por la derecha.
Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 173 / 240

Contenido

Gramticas y anlisis sintctico a a a El proceso del anlisis sintctico a a Gramticas libres de contexto a Arboles de sintaxis abstracta Ambigedad u Notacin EBNF o Sintaxis del lenguaje Tiny

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

174 / 240

Una gramtica libre de contexto para Tiny a


Programa P P; S|S Sentencia S I |R|A|L|W If I if E then P end|if E then P else P end Repeat R repeat P until E Asignacin A D := E o Lectura L read D Escritura W write E Expresin E XCX |X o Comparacin C < | = o Exp. Simple X XUT |T Suma U +| Trmino T TMF |F e Multiplicacin M |/ o Factor F (E )|N|D (Nmero e iDenticador). u
Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 175 / 240

Declaraciones en C para un nodo de rbol sintctico a a


typedef typedef typedef typedef enum enum enum enum {StmtK,ExpK} NodeKind; {IfK,RepeatK,AssignK,ReadK,WriteK} StmtKind; {OpK,ConstK,IdK} ExpKind; {Void, Integer, Boolean} ExpType;

#define MAXCHLIDREN 3 typedef struct treeNode { struct treeNode *child[MAXCHILDREN]; struct treeNode *sibling; int lineno; NodeKind nodekind; union {StmtKind stmt; ExpKind exp;} kind; union {TokenType op; int val; char *name;} attr; ExpType type; } TreeNode;
Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 176 / 240

Ejemplo de un programa en Tiny

Ejemplo de un rbol sintctico para un programa a a


read(x) if

{ Programa de muestra en lenguaje Tiny Calcula el factorial } read x; { entrada de un entero } if 0 < x then { no calcula si x <= 0 } fact := 1; repeat fact := fact * x; x := x - 1; until x = 0; write fact { salida factorial de x } end const(0) id(x)

op(<) assign(fact) repeat write

const(1)

assign(fact)

op(=)

id(fact)

id(x) op(*)

const(0)

id(fact)id(x)
Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 177 / 240 Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 178 / 240

Contenido

Contenido

Compiladores
4

Lenguajes regulares y anlisis lxico a e Gramticas y anlisis sintctico a a a Anlisis sintctico descendente a a

Anlisis sintctico descendente a a Anlisis sintctico descendente a a Anlisis sintctico descendente recursivo a a Anlisis sintctico LL(1) a a Conjuntos primero y siguiente

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

179 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

180 / 240

Anlisis sintctico descendente a a

Analizadores sintcticos predictivos a

Un algoritmo de anlisis sintctico descendente analiza una cadena de a a tokens de entrada mediante una bsqueda de los pasos de una u derivacin por la izquierda. o Estos algoritmos se llaman as porque el recorrido implicado del rbol a de anlisis gramatical es en preorden, por lo que va de la ra a las a z hojas. Existen dos tipos de analizadores sintcticos descendentes: a
Analizadores sintcticos inversos. a Analizadores sintcticos predictivos. a

Las dos clases de analizadores sintcticos predictivos que a estudiaremos son:


Analizadores sintcticos descendentes recursivos: Son muy verstiles y a a adecuados para disearse e implementarse a mano. n Analizadores sintcticos LL(1): No se usan a menudo en la prctica, a a pero son utiles para analizar algunos de los problemas que aparecen en el anlisis descendente recursivo. a

Por el momento basta saber que LL(1) signica:


La primera L que la entrada se lee de izquierda a derecha. La segunda L que la derivacin buscada es por la izquierda. o El (1) que slo se usa un s o mbolo de la entrada para decidir.

Estos ultimos (los unicos que estudiaremos) intentan predecir la siguiente construccin sintctica usando uno o ms tokens por o a a adelantado.

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

181 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

182 / 240

Contenido

El mtodo bsico descendente recursivo e a

Anlisis sintctico descendente a a Anlisis sintctico descendente a a Anlisis sintctico descendente recursivo a a Anlisis sintctico LL(1) a a Conjuntos primero y siguiente

La idea es considerar la regla gramatical para un no terminal A como una denicin de un procedimiento (posiblemente recursivo) que o reconocer una A. a El lado derecho de la regla gramatical especica la estructura del cdigo para este procedimiento: o La secuencia de terminales y no terminales en una seleccin o corresponde a concordancias de la entrada y llamadas a otros procedimientos, respectivamente. Las selecciones corresponden a las alternativas (switch o if) dentro del cdigo. o

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

183 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

184 / 240

Ejemplo con la gramtica de expresin a o


Considere la gramtica de expresin vista anteriormente: a o
E EST |T S +| T TMF |F M F (E )|N

Aclaraciones
En el algoritmo anterior suponemos que existe una variable que mantiene el token actual de la entrada. Tambin suponemos que existe un procedimiento que empata el token e actual con su parmetro, avanza en la entrada si tiene xito y seala a e n un error en caso contrario: if el token es el esperado then lee un nuevo token else seala un error. n Por el momento suponemos que el sealar un error imprime un n mensaje y termina el proceso de compilacin. o Observe tambin que reconocer un factor es un procedimiento e recursivo. Esto se debe a que debe reconocer una expresin, el o procedimiento para reconocer una expresin debe reconocer un o trmino y el procedimiento para reconocer un trmino debe reconocer e e un factor.
185 / 240 Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 186 / 240

Entonces un procedimiento que reconoce un factor F ser a: if token es un ( then empata un ( reconoce una expresin E o empata un ) else if token es un nmero then u empata un nmero u else seala un error. n
Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I

Uso de EBNF para seleccin o


Considere la gramtica simplicada para una sentencia de decisin a o D if (E )S| if (E )S else S. Esto se puede reescribir en EBNF como: D if (E )S[else S]. Esto se puede traducir al algoritmo de reconocimiento de decisiones: empata un if empata un ( reconoce una expresin E o empata un ) reconoce una sentencia S if el token es un else then empata un else reconoce una sentencia S.
Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 187 / 240

Uso de EBNF para repeticin o

No se puede usar directamente la regla E EST |T para reconocer una expresin puesto que esto implica que lo primero que haga ese o procedimiento sea llamarse recursivamente, es decir, un ciclo innito. En vez de eso se reescribe en EBNF para obtener E T {ST }. Esto se puede traducir al algoritmo de reconocimiento de expresiones: reconoce un trmino T e while token es un + o un do empata un token (ya sea + o ) reconoce un trmino T . e Aqu se elimin el no terminal S (que slo puede ser + o ). o o

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

188 / 240

Otro uso de EBNF para repeticin o

Conversin de EBNF a cdigo o o

De manera similar no se puede usar la regla T TMF |F para reconocer un trmino. e En vez de eso se reescribe en EBNF para obtener T F {MF }. Esto se puede traducir al algoritmo de reconocimiento de expresiones: reconoce un factor F while token es un do empata un reconoce un factor F . Aqu se elimin el no terminal M (que slo puede ser ). o o

Este mtodo es muy poderoso y lo usaremos despus. e e Pero debemos tener cuidado de seguir algunas reglas. Por ejemplo, para mantener la variable de token:
Esta debe inicializarse antes de que comience el anlisis sintctico. a a Debe leerse un token precisamente despus de haber comprobado otro e token.

Un cuidado similar debe seguirse al programar la construccin del o rbol sintctico. a a Esto ser vital para mantener la asociatividad de los operadores. a

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

189 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

190 / 240

Construccin del rbol sintctico de una expresin o a a o

Construccin del rbol sintctico de una decisin o a a o


El siguiente algoritmo corresponde a la construccin del rbol o a sintctico de una decisin D: a o empata un if empata un ( t nuevo nodo de decisin o hijo de prueba de t rbol de una expresin a o empata un ) hijo verdadero de t rbol de una sentencia a if el token es un else then empata un else hijo falso de t rbol de una sentencia a else hijo falso de t nulo. En este algoritmo t es una variable temporal local.

El siguiente algoritmo corresponde a la construccin del rbol o a sintctico de una expresin E : a o t rbol de un trmino a e while token es un + o un do n nuevo nodo de operador con token empata un token hijo izquierdo de n t hijo derecho de n rbol de un trmino a e tn return t En este algoritmo t y n son dos variables temporales locales.

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

191 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

192 / 240

Contenido

El mtodo bsico del anlisis sintctico LL(1) e a a a


El anlisis sintctico LL(1) usa una pila expl a a cita en vez de recursin. o Representaremos una pila como una lista que crece hacia la derecha.

Anlisis sintctico descendente a a Anlisis sintctico descendente a a Anlisis sintctico descendente recursivo a a Anlisis sintctico LL(1) a a Conjuntos primero y siguiente

Para comenzar haremos un ejemplo con la gramtica a S (S)S| que genera cadenas de parntesis balanceados. e Al inicio la pila contendr un s a mbolo especial (que permanecer en a el fondo de la pila) y el s mbolo inicial de la estructura a reconocer (en este caso S). En nuestro ejemplo reconoceremos la cadena () seguida de un s mbolo especial que seala el n de la entrada. n

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

193 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

194 / 240

Ejemplo de reconocimiento de una cadena

Caso general

Paso Pila Entrada Accin o 1 S () S (S)S 2 S)S( () empata ( 3 S)S ) S 4 S) ) empata ) 5 S S 6 acepta

El analizador sintctico comenzar con el s a a mbolo especial s mbolo inicial en la pila.

y el

Aceptar una cadena de entrada si despus de una serie de acciones a e la pila y la entrada terminan unicamente con el s mbolo especial. Paso Pila 1 . . . N S Entrada Accin o ABC accin o accin o acepta

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

195 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

196 / 240

Acciones bsicas de un analizador sintctico a a


El analizador sintctico realiza su trabajo al reemplazar un no a terminal en la parte superior de la pila por una de las selecciones en la regla gramatical para ese no terminal. La idea es producir el token en la entrada en la parte superior de la pila. De esta manera, las dos acciones bsicas de un analizador sintctico a a son: Generar: Reemplazar un no terminal A en la parte superior de la pila por una cadena usando la regla gramatical A . Empatar: Empatar el token en la parte superior de la pila con el siguiente token de la entrada. Observe que la cadena se debe insertar en reversa. Tambin observe que la lista de acciones corresponde con una e derivacin por la izquierda. o
Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 197 / 240

Tabla de anlisis sintctico LL(1) a a

Cuando un terminal est en la parte superior de la pila slo hay dos a o opciones:
Si coincide con el siguiente token de la entrada se empata. Si no coincide entonces se ha detectado un error de sintaxis.

En cambio, cuando un no terminal est en la parte superior de la pila a se debe tomar una decisin, basada en el token de la entrada, que o selecciona la regla gramatical que reemplaza al no terminal. Estas decisiones de pueden codicar en una tabla de anlisis a sintctico. a

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

198 / 240

Construccin de la tabla de anlisis sintctico o a a

Reglas para la tabla de anlisis sintctico a a

Estas son las dos reglas que usaremos:


1

Esta tabla es un arreglo bidimensional M[N, T ], donde N es el conjunto de no terminales y T es el conjunto de terminales (incluyendo al s mbolo especial ). Al inicio cada una de las entradas de la tabla est vac a a. Agregaremos entradas a la tabla de acuerdo a dos reglas. Cada entrada de la tabla que al nal quede vac es un error potencial. a

Si A es una opcin de produccin y existe una derivacin o o o a en la que a es un token, entonces se agrega A a la entrada M[A, a]. Si A es una opcin de produccin y existen derivaciones y o o S Aa, entonces se agrega A a la entrada M[A, a]. Si A est en el tope de la pila y a es el token siguiente entonces a debemos escoger una regla A tal que genere una a que podamos empatar con la entrada. Si A est en el tope de la pila y genera la cadena vac con la derivacin a a o A entonces debemos escoger una regla A si a es un token que puede venir legalmente despus de A en una derivacin. e o

Las ideas detrs de estas dos reglas son: a


1

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

199 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

200 / 240

Ejemplo de tabla de anlisis sintctico a a


Considere la gramtica S (S)S|. a Como slo hay una produccin no vac de S o o a S (S)S entonces cada cadena derivable de S es vac o comienza con un ( y a por lo tanto esta produccin se agrega a M[S, (]. o Como S (S)S entonces la segunda regla se aplica con = , = (, A = S, a =) y = S de manera que S se agrega a M[S, )]. Como S S entonces S se agrega a M[S, ]. Esto completa la tabla: M[N, T ] ( S S (S)S
Francisco Zaragoza (UAM Azcapotzalco) Compiladores

Gramticas LL(1) a

Observe que la tabla presentada contiene a lo ms una opcin para a o cada combinacin de no terminal en la pila y token en la entrada. o A las gramticas que cumplen esto se les llama gramticas LL(1). a a Esto tambin signica que una gramtica que cumple esta propiedad e a no puede ser ambigua (aunque en ocasiones permitiremos una ambigedad si tenemos una regla de eliminacin de ambigedad). u o u A continuacin mostraremos un algoritmo que es capaz de realizar el o anlisis sintctico usando la tabla de anlisis sintctico para una a a a a gramtica LL(1). a

) S S
Trimestre 11I 201 / 240 Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 202 / 240

Algoritmo de anlisis sintctico LL(1) a a


Inserta y el s mbolo inicial en la pila while el tope no es and el token no es do if el tope es a y el token es a then elimina el tope de la pila avanza un token en la entrada else if el tope es A and el token es a and M[A, a] contiene A X1 X2 . . . Xn then elimina el tope de la pila inserta Xn , . . . , X2 , X1 en la pila else seala un error n if el tope es and el token es then acepta else seala un error. n
Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 203 / 240

Ejemplo con la gramtica simplicada de decisiones a


Considere la gramtica simplicada para decisiones anidadas: a S I E I| c if (D)SE |else S

D 0|1. Entonces la tabla de anlisis sintctico correspondiente es: a a if M[N, T ] S I if (D)SE I E D c c else 0 1

|else S 0 1

En la entrada M[E , else] se preere la produccin E else S. o


Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 204 / 240

Ejemplo de anlisis sintctico LL(1) a a


Paso Pila 1 2 3 4 5 6 7 8 9 10 11 S I ES)D(i ES)D( ES)D ES)0 ES) ES EI EES)D(i EES)D( Entrada Accin o i(0)i(1)cec i(0)i(1)cec i(0)i(1)cec (0)i(1)cec 0)i(1)cec 0)i(1)cec )i(1)cec i(1)cec i(1)cec i(1)cec (1)cec S I I i(D)SE empata i empata ( D0 empata 0 empata ) S I I i(D)SE empata i empata (

Ejemplo de anlisis sintctico LL(1) a a


Paso Pila 12 13 14 15 16 17 18 19 20 21 22 EES)D EES)1 EES) EES EEc EE ESe ES Ec E Entrada Accin o 1)cec 1)cec )cec cec cec ec ec c c D1 empata 1 empata ) S c empata c E eS empata e S c empata c E aceptar

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

205 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

206 / 240

Eliminacin de recursin y factorizacin por la izquierda o o o

Eliminacin de la recursin por la izquierda o o


Esta tcnica se usa para hacer operaciones asociativas por la e izquierda. Dos ejemplos simples son E EST |T y E E + T |E T |T en los que existe recursin inmediata por la izquierda. o Un ejemplo ms complicado involucrar recursin indirecta por la a a o izquierda: A Bb| . . . y B Aa| . . . aunque esto casi nunca ocurre en la prctica. a

En el anlisis LL(1) se presentan los mismos problemas relacionados a a la repeticin y la seleccin que se presentan en el anlisis recursivo. o o a Para el anlisis recursivo la solucin fue usar la notacin EBNF. a o o Pero ahora no podemos hacer lo mismo y debemos reescribir la gramtica. a Las dos tcnicas estndares que se usan son: e a
Eliminacin de la recursin por la izquierda. o o Factorizacin por la izquierda. o

Aunque ninguna de estas dos tcnicas garantiza que el resultado e ser una gramtica LL(1), en lo general son utiles en las situaciones a a prcticas. a

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

207 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

208 / 240

Recursin inmediata por la izquierda simple o


En este caso estamos considerando reglas gramaticales de la forma A A| donde y son cadenas de terminales y no terminales y no comienza con A. Estas reglas generan cadenas de la forma . El caso base es A y el recursivo es A A. Para eliminar la recursin inmediata por la izquierda se reemplazan o estas reglas por otras dos reglas: una que primero genera A A y otra que genera las repeticiones de usando recursin por la o derecha A A |.
Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 209 / 240

Ejemplo de recursin inmediata por la izquierda simple o


Considere la regla recursiva inmediata por la izquierda E EST |T que genera expresiones simples. Esta regla se puede reescribir como E TE para generar un trmino y luego e E STE | para generar las siguientes sumas de trminos. e

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

210 / 240

Recursin inmediata por la izquierda general o


En este caso estamos considerando reglas gramaticales de la forma A A1 |A2 | |An |1 |2 | |m donde i y j son cadenas de terminales y no terminales y ninguna de las j comienza con A. Estas reglas generan cadenas de la forma j {i : 1 i n} . El caso base es A j y el recursivo es A Ai . Para eliminar la recursin inmediata por la izquierda se reemplazan o estas reglas por otros dos conjuntos de reglas: uno que primero genera j A 1 A |2 A | |m A y otro que genera las repeticiones de i usando recursin por la o derecha A 1 A |2 A | |n A |.
Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 211 / 240

Ejemplo de recursin inmediata por la izquierda general o


Considere la regla recursiva inmediata por la izquierda E E + T |E T |T que genera expresiones simples. Esta regla se puede reescribir como E TE para generar un trmino y luego e E +TE | TE | para generar las siguientes sumas de trminos. e

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

212 / 240

Recursin por la izquierda general o

Ejemplo de recursin por la izquierda general o

Enseguida mostramos un algoritmo que slo est garantizado para o a funcionar con gramticas sin producciones vac (A ) ni ciclos de a as al menos un paso (A + A). Se supone que los no terminales tienen un orden A1 , . . . , Am . for i = 1 to m do for j = 1 to i 1 do Reemplaza cada seleccin de regla gramatical de la forma o Ai Aj por la regla Ai 1 | |k donde Aj 1 | |k es la regla actual para Aj . Elimina la recursin inmediata por la izquierda de Ai . o

Considere la gramtica A Ba|Aa|c y B Bb|Ab|d con el orden a A, B. Primero se elimina la recursin inmediata por la izquierda de A de o modo que la primera regla se reemplaza por A BaA |cA y aA |. A Segundo se elimina la regla B Ab de modo que la segunda regla se reemplaza por B Bb|BaA b|cA b|d. Tercero se elimina la recursin inmediata por la izquierda de B de o modo que la segunda regla se reemplaza por B cA bB |dB y B bB |aA bB |.

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

213 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

214 / 240

Ejemplo de eliminacin de recursin por la izquierda o o

Arbol de anlisis gramatical de a b c a

Si eliminamos la recursin por la izquierda de la gramtica de o a expresiones (que era recursiva por la izquierda para representar la asociatividad de las operaciones) obtenemos:
E TE . E STE |. S +|. T FT . T MFT |. M . F (E )|N.

E T F S E T F S E T F N=c E

N=a

Esta gramtica no es recursiva por la izquierda y es LL(1), pero sus a rboles de anlisis gramaticales ya no expresan la asociatividad a a izquierda de la resta.

N=b

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

215 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

216 / 240

Tabla LL(1) para las expresiones simples

Factorizacin por la izquierda o


La factorizacin por la izquierda se requiere cuando dos o ms o a opciones de reglas gramaticales comparten un prejo comn u

M[N, T ] ( N ) + E TE TE STE STE E S + FT FT T T MFT M F (E ) N

A |. Esta situacin ocurre en la regla recursiva por la derecha para o programas P S; P|S o en esta versin de decisiones o I if (E )S|if (E )S else S. En este caso la solucin es simplemente factorizar la por la o izquierda y reescribir la regla con las dos reglas A A y A |.

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

217 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

218 / 240

Algoritmo para factorizacin por la izquierda o

Primer ejemplo de factorizacin por la izquierda o

while existan cambios en el lenguaje do for cada no terminal A do Sea un prejo de longitud mxima que se comparte por dos o a ms opciones de produccin para A. a o if = then Sean A 1 | |n todas las selecciones de produccin para A o y supongamos que 1 | |k comparten , de manera que A 1 | |k |k+1 | |n , las j no comparten prejos comunes y las k+1 , . . . , n no comparten . Reemplace la regla A 1 | |n por las reglas A A |k+1 | |n y A 1 | |k .

Considere la produccin o P S; P|S de las secuencias de sentencias. La produccin tiene un prejo compartido S que se puede factorizar o por la izquierda. Esto nos genera las dos producciones P SP y P ; S|.

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

219 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

220 / 240

Segundo ejemplo de factorizacin por la izquierda o


Considere la produccin o I if (E )S|if (E )S else S para decisiones simples. La produccin tiene un prejo compartido if (E )S que se puede o factorizar por la izquierda. Esto nos genera las dos producciones I if (E )SI y I else S|.

Construccin del rbol sintctico en anlisis LL(1) o a a a

La construccin del rbol sintctico cuando se usa anlisis sintctico o a a a a LL(1) no es trivial. Una razn es que la eliminacin de la recursin izquierda y la o o o factorizacin por la izquierda oscurecen la gramtica. o a Pero la razn principal es que la pila de anlisis sintctico no contiene o a a tokens vistos, sino predicciones de tokens. Por lo tanto, se debe posponer la creacin de nodos del rbol hasta o a que se eliminen las estructuras de la pila. En general, esto requiere que se use una pila extra para seguir la pista de los nodos del rbol sintctico y que se inserten marcadores de a a a a accin en la pila de anlisis sintctico. o

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

221 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

222 / 240

Ejemplo de clculo de valores a


En lugar de presentar un ejemplo de la creacin del rbol sintctico, o a a presentaremos un ejemplo de clculo de valores usando expresiones a muy simples (sumas). Usaremos la gramtica E NE y E +NE |. a Para calcular el valor de una expresin necesitamos dos acciones sobre o una pila de valores:
Insertar un valor cuando se empata en la entrada: esto se har en el a procedimiento empata. Sumar dos nmeros en la pila de valores: esto se har insertando un u a s mbolo especial en la pila de anlisis sintctico. a a

Ejemplo de pila de anlisis sintctico con pila de valores a a


Pila AS Entrada E 3+4+5 E n 3+4+5 E +4 + 5 E N+ +4 + 5 E N 4+5 E +5 E +5 N+ E +5 E N 5 E E Accin o Pila V E NE empatar e insertar E +NE 3 empatar 3 empatar e insertar 3 sumar en la pila 43 E +NE 7 empatar 7 empatar e insertar 7 sumar en la pila 57 E 12 aceptar 12

El s mbolo ahora debe igualar un + en la regla para E , es decir, E +NE |. Esto hace que la suma se programa despus de haber le el siguiente e do nmero, pero antes de que se procese el siguiente no terminal. u As se garantiza la asociatividad por la izquierda.
Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 223 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

224 / 240

Contenido

Conjunto primero

Anlisis sintctico descendente a a Anlisis sintctico descendente a a Anlisis sintctico descendente recursivo a a Anlisis sintctico LL(1) a a Conjuntos primero y siguiente

Si X es un s mbolo de la gramtica (terminal, no terminal o ) a entonces el conjunto primero de X , llamado P(X ), compuesto de terminales y posiblemente se dene de la siguiente manera:
1 2

Si X es un terminal o entonces P(X ) = {X }. Si X es no terminal entonces para cada produccin X X1 X2 . . . Xn el o conjunto P(X ) contiene a P(X1 ) \ {}. Si tambin para alguna i < n e todos los conjuntos P(X1 ), . . . , P(Xi ) contienen entonces el conjunto P(X ) contiene a P(Xi+1 ) \ {}. Si todos los conjuntos P(X1 ), . . . , P(Xn ) contienen entonces el conjunto P(X ) contiene a .

De manera similar se dene P() para cualquier cadena de terminales y no terminales.

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

225 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

226 / 240

Algoritmo para calcular el conjunto primero


for todo no terminal A do P(A) while existan cambios a cualquier P(A) do for cada seleccin de produccin A X1 X2 . . . Xn do o o k 1 c true while c = true and k n do agregar P(Xk ) \ {} a P(A) if P(Xk ) then / c false k k +1 if c = true then agregar a P(A)

Algoritmo simplicado para calcular el conjunto primero

Si no hay producciones A se puede simplicar el algoritmo: for todo no terminal A do P(A) while existan cambios a cualquier P(A) do for cada seleccin de produccin A X1 X2 . . . Xn do o o agregar P(X1 ) a P(A) En caso de que s haya producciones A , el algoritmo original tambin calcula los no terminales anulables, es decir, aquellos no e terminales A para los que existe alguna derivacin A . o Un no terminal A es anulable si y slo si P(A) contiene a . o

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

227 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

228 / 240

Ejemplo de clculo del conjunto primero para expresiones a


Considere la gramtica de expresiones simples con nueve a producciones: E EST S M E T T TMF F (E ) S + T F F N

Ejemplo de clculo del conjunto primero para decisiones a

Considere la gramtica de decisiones con siete producciones: a S I I if (D)SE E D1 S c E else S D0

Como no tiene producciones podemos usar el algoritmo simplicado. En el primer paso se actualiza P(S) = {+}, P(S) = {+, }, P(M) = {}, P(F ) = {(} y P(F ) = {(, N}. En el segundo paso se actualiza P(T ) = {(, N}. En el tercer paso se actualiza P(E ) = {(, N}. En el cuarto paso ya no hay actualizaciones.

Como tiene producciones debemos usar el algoritmo completo. En el primer paso se actualiza P(S) = {c}, P(I ) = {if}, P(E ) = {else}, P(E ) = {else, }, P(D) = {0} y P(D) = {0, 1}. En el segundo paso se actualiza P(S) = {c, if}. En el tercer paso ya no hay actualizaciones.

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

229 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

230 / 240

Conjunto siguiente

Algoritmo para calcular el conjunto siguiente

Si A es un no terminal de la gramtica entonces el conjunto siguiente a de X , llamado S(X ), compuesto de terminales y posiblemente se dene de la siguiente manera:
1 2 3

Si A es el s mbolo inicial entonces est en S(A). a Si hay una produccin B A entonces P() \ {} est en S(A). o a Si hay una produccin B A tal que est en P() entonces S(A) o a contiene a S(B).

Observe que siempre est en S(A) para el s a mbolo inicial A y que nunca es un elemento de S(A).

S(s mbolo inicial) { } for todo no terminal A = s mbolo inicial do S(A) while existan cambios a cualquier S(A) do for cada seleccin de produccin A X1 X2 . . . Xn do o o for cada Xi que sea un no terminal do agregar P(Xi+1 Xi+2 . . . Xn ) \ {} a S(Xi ) if P(Xi+1 Xi+2 . . . Xn ) then agregar S(A) a S(Xi )

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

231 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

232 / 240

Ejemplo de clculo del conjunto siguiente para expresiones a


Considere la gramtica de expresiones simples con nueve a producciones: E EST S M E T T TMF F (E ) S + T F F N

Ejemplo de clculo del conjunto siguiente para decisiones a


Considere la gramtica de decisiones con siete producciones: a S I I if (D)SE E D1 S c E else S D0

Para la que obtuvimos P(E ) = {(, N}, P(T ) = {(, N}, P(F ) = {(, N}, P(S) = {+, } y P(M) = {}. Comenzamos con S(E ) = { } y S(T ) = S(F ) = S(S) = S(M) = . En el primer paso se actualiza S(E ) = { , +, }, S(S) = {(, N}, S(T ) = { , +, }, S(T ) = { , +, , }, S(M) = {(, N}, S(F ) = { , +, , } y S(E ) = { , +, , }. En el segundo paso se actualiza S(T ) = { , +, , , )} y S(F ) = { , +, , , )}. En el tercer paso ya no hay actualizaciones.
Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 233 / 240

Para la que obtuvimos P(S) = {c, if}, P(I ) = {if}, P(E ) = {else, } y P(D) = {0, 1}. Comenzamos con S(S) = { } y S(I ) = S(E ) = S(D) = . En el primer paso se actualiza S(I ) = { }, S(D) = {)}, S(S) = { , else} y S(E ) = { }. En el segundo paso se actualiza S(I ) = { , else} y S(E ) = { , else}. En el tercer paso ya no hay actualizaciones.
Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 234 / 240

Construccin de tablas de anlisis sintctico LL(1) o a a


Considere las reglas para la creacin de la tabla LL(1): o
1

Ejemplo para el clculo de la tabla LL(1) de expresiones a

Si A es una opcin de produccin y existe una derivacin o o o a en la que a es un token, entonces se agrega A a la entrada M[A, a]. Si A es una opcin de produccin y existe una derivacin y o o o S Aa, donde S es el s mbolo inicial y a es un token o , entonces se agrega A a la entrada M[A, a].

Consideremos la gramtica de expresin simple a la que le hemos a o eliminando la recursin por la izquierda: o
E TE . E STE |. S +|. T FT . T MFT |. M . F (E )|N.

Obviamente el token a en la primera regla est en P() y el token a a en la segunda regla est en S(A). a Esto nos da un algoritmo para la creacin de la tabla LL(1). o Repita los siguientes dos pasos para cada no terminal A y opcin de o produccin A : o
1 2

Para cada token a en P() agregue A a la entrada M[A, a]. Si est en P(), para cada elemento a S(A) agregue A a la a entrada M[A, a].
Compiladores Trimestre 11I 235 / 240 Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 236 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Tabla LL(1) para las expresiones simples


Si calculamos los conjuntos primero y siguiente obtenemos: E S P (, N +, , +, S ,) ,) (, N E T (, N , ), +, M , , ), +, (, N T F (, N , ), +, ,

Ejemplo para el clculo de la tabla LL(1) de decisiones a


Considere la gramtica simplicada para decisiones anidadas: a S E I| c |else S I if (D)SE D 0|1.

Si calculamos los conjuntos primero y siguiente obtenemos: P S S if,c , else I if , else E D else, 0, 1 , else )

Y de esto obtenemos la tabla: ( N ) + M[N, T ] E TE TE STE STE E S + FT FT T T MFT M F (E ) N


Francisco Zaragoza (UAM Azcapotzalco) Compiladores

Y de esto obtenemos la tabla: if M[N, T ] S I I if (D)SE E D


237 / 240 Francisco Zaragoza (UAM Azcapotzalco)

c c

else

0 1

|else S 0 1

Trimestre 11I

Compiladores

Trimestre 11I

238 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

239 / 240

Francisco Zaragoza (UAM Azcapotzalco)

Compiladores

Trimestre 11I

240 / 240

S-ar putea să vă placă și