Documente Academic
Documente Profesional
Documente Cultură
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
Compiladores
Trimestre 11I
1 / 240
Compiladores
Trimestre 11I
2 / 240
Exmenes y tareas a
Otros detalles
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
Compiladores
Trimestre 11I
3 / 240
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
Compiladores
Trimestre 11I
5 / 240
Compiladores
Trimestre 11I
6 / 240
Qu es un compilador? 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.
Compiladores
Trimestre 11I
7 / 240
Compiladores
Trimestre 11I
8 / 240
Contenido
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
Compiladores
Trimestre 11I
9 / 240
Compiladores
Trimestre 11I
10 / 240
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.
Compiladores
Trimestre 11I
11 / 240
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
Compiladores
Trimestre 11I
13 / 240
Compiladores
Trimestre 11I
14 / 240
Intrpretes y preprocesadores e
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
Compiladores
Trimestre 11I
15 / 240
Compiladores
Trimestre 11I
16 / 240
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
Compiladores
Trimestre 11I
17 / 240
Compiladores
Trimestre 11I
18 / 240
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
Compiladores
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
expresin de asignacin o o expresin de sub o ndice identicador identicador hola mundo expresin aditiva o nmero u 3 nmero u 1
Compiladores
Trimestre 11I
23 / 240
Compiladores
Trimestre 11I
24 / 240
Analizador semntico 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
identicador identicador
1 entero
Compiladores
Trimestre 11I
25 / 240
Compiladores
Trimestre 11I
26 / 240
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
Compiladores
Trimestre 11I
27 / 240
Compiladores
Trimestre 11I
28 / 240
Generador de cdigo 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
Compiladores
Trimestre 11I
29 / 240
Compiladores
Trimestre 11I
30 / 240
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
Compiladores
Trimestre 11I
31 / 240
Compiladores
Trimestre 11I
32 / 240
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.
Compiladores
Trimestre 11I
33 / 240
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.
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
Compiladores
Trimestre 11I
35 / 240
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
La representacin empleada tambin inuye en el tiempo de ejecucin o e o de las etapas de mejoramiento de cdigo. o
Compiladores
Trimestre 11I
37 / 240
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
Compiladores
Trimestre 11I
39 / 240
Compiladores
Trimestre 11I
40 / 240
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
Compiladores
Trimestre 11I
41 / 240
Compiladores
Trimestre 11I
42 / 240
Contenido
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
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
Compiladores
Trimestre 11I
43 / 240
Compiladores
Trimestre 11I
44 / 240
Diagramas T
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
Compiladores
Trimestre 11I
45 / 240
Compiladores
Trimestre 11I
46 / 240
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.
Compiladores
Trimestre 11I
47 / 240
Compiladores
Trimestre 11I
48 / 240
Compilacin cruzada o
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.
Compiladores
Trimestre 11I
49 / 240
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
Compiladores
Trimestre 11I
53 / 240
Compiladores
Trimestre 11I
54 / 240
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
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
Compiladores
Trimestre 11I
57 / 240
Compiladores
Trimestre 11I
58 / 240
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.
Compiladores
Trimestre 11I
59 / 240
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.
Compiladores
Trimestre 11I
61 / 240
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
Compiladores
Trimestre 11I
63 / 240
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 .
Compiladores
Trimestre 11I
65 / 240
Compiladores
Trimestre 11I
66 / 240
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.
Compiladores
Trimestre 11I
67 / 240
Compiladores
Trimestre 11I
68 / 240
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
Compiladores
Trimestre 11I
69 / 240
Compiladores
Trimestre 11I
70 / 240
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.
Compiladores
Trimestre 11I
71 / 240
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| . . .
Compiladores
Trimestre 11I
73 / 240
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.
Compiladores
Trimestre 11I
75 / 240
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.
Compiladores
Trimestre 11I
77 / 240
Compiladores
Trimestre 11I
78 / 240
Autmatas nitos 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
Compiladores
Trimestre 11I
79 / 240
Compiladores
Trimestre 11I
80 / 240
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.
Compiladores
Trimestre 11I
81 / 240
Compiladores
Trimestre 11I
82 / 240
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.
Compiladores
Trimestre 11I
83 / 240
Compiladores
Trimestre 11I
84 / 240
D / E
Compiladores
Trimestre 11I
85 / 240
Compiladores
Trimestre 11I
86 / 240
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
Compiladores
Trimestre 11I
87 / 240
Compiladores
Trimestre 11I
88 / 240
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
LE
>
NE
NE
LT 1 < LT
Compiladores
Trimestre 11I
91 / 240
Compiladores
Trimestre 11I
92 / 240
Contenido
LE
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
LT
Compiladores
Trimestre 11I
93 / 240
Compiladores
Trimestre 11I
94 / 240
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
Compiladores
Trimestre 11I
95 / 240
Compiladores
Trimestre 11I
96 / 240
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.
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]
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
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
Compiladores
Trimestre 11I
101 / 240
Compiladores
Trimestre 11I
102 / 240
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
Compiladores
Trimestre 11I
103 / 240
Compiladores
Trimestre 11I
104 / 240
S mbolos + MAS - MEN * POR / DIV = EQU < MEQ ( PIZ ) PDE ; PYC := ASI
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
Compiladores
Trimestre 11I
105 / 240
Compiladores
Trimestre 11I
106 / 240
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
Compiladores
Trimestre 11I
107 / 240
Compiladores
Trimestre 11I
108 / 240
Compiladores
Trimestre 11I
109 / 240
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
Compiladores
Trimestre 11I
111 / 240
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
Compiladores
Trimestre 11I
113 / 240
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
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
Compiladores
Trimestre 11I
117 / 240
Compiladores
Trimestre 11I
118 / 240
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).
Compiladores
Trimestre 11I
119 / 240
Compiladores
Trimestre 11I
120 / 240
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 |.
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.
Compiladores
Trimestre 11I
121 / 240
Compiladores
Trimestre 11I
122 / 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.
Compiladores
Trimestre 11I
124 / 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
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 +.
Compiladores
Trimestre 11I
127 / 240
Compiladores
Trimestre 11I
128 / 240
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
Compiladores
Trimestre 11I
129 / 240
Compiladores
Trimestre 11I
130 / 240
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
Compiladores
Trimestre 11I
131 / 240
Compiladores
Trimestre 11I
132 / 240
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
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)
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
Compiladores
Trimestre 11I
137 / 240
Compiladores
Trimestre 11I
138 / 240
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
Compiladores
Trimestre 11I
139 / 240
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
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
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
Compiladores
Trimestre 11I
143 / 240
Compiladores
Trimestre 11I
144 / 240
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
Compiladores
Trimestre 11I
145 / 240
Compiladores
Trimestre 11I
146 / 240
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.
Compiladores
Trimestre 11I
147 / 240
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
Compiladores
Trimestre 11I
149 / 240
Compiladores
Trimestre 11I
150 / 240
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)
N=3
Compiladores Trimestre 11I 151 / 240 Francisco Zaragoza (UAM Azcapotzalco) Compiladores Trimestre 11I 152 / 240
N = 42
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.
Compiladores
Trimestre 11I
155 / 240
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
Compiladores
Trimestre 11I
158 / 240
Compiladores
Trimestre 11I
159 / 240
Compiladores
Trimestre 11I
160 / 240
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
Compiladores
Trimestre 11I
161 / 240
Compiladores
Trimestre 11I
162 / 240
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
Compiladores
Trimestre 11I
163 / 240
Compiladores
Trimestre 11I
164 / 240
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
Compiladores
Trimestre 11I
165 / 240
Compiladores
Trimestre 11I
166 / 240
Solucin al problema o
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.
Compiladores
Trimestre 11I
167 / 240
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
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.
Compiladores
Trimestre 11I
171 / 240
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
Compiladores
Trimestre 11I
174 / 240
#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
{ 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)
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
Compiladores
Trimestre 11I
179 / 240
Compiladores
Trimestre 11I
180 / 240
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
Estos ultimos (los unicos que estudiaremos) intentan predecir la siguiente construccin sintctica usando uno o ms tokens por o a a adelantado.
Compiladores
Trimestre 11I
181 / 240
Compiladores
Trimestre 11I
182 / 240
Contenido
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
Compiladores
Trimestre 11I
183 / 240
Compiladores
Trimestre 11I
184 / 240
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
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
Compiladores
Trimestre 11I
188 / 240
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
Compiladores
Trimestre 11I
189 / 240
Compiladores
Trimestre 11I
190 / 240
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.
Compiladores
Trimestre 11I
191 / 240
Compiladores
Trimestre 11I
192 / 240
Contenido
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
Compiladores
Trimestre 11I
193 / 240
Compiladores
Trimestre 11I
194 / 240
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
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
Compiladores
Trimestre 11I
195 / 240
Compiladores
Trimestre 11I
196 / 240
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
Compiladores
Trimestre 11I
198 / 240
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
Compiladores
Trimestre 11I
199 / 240
Compiladores
Trimestre 11I
200 / 240
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
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
Compiladores
Trimestre 11I
205 / 240
Compiladores
Trimestre 11I
206 / 240
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
Compiladores
Trimestre 11I
207 / 240
Compiladores
Trimestre 11I
208 / 240
Compiladores
Trimestre 11I
210 / 240
Compiladores
Trimestre 11I
212 / 240
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 |.
Compiladores
Trimestre 11I
213 / 240
Compiladores
Trimestre 11I
214 / 240
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
Compiladores
Trimestre 11I
215 / 240
Compiladores
Trimestre 11I
216 / 240
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 |.
Compiladores
Trimestre 11I
217 / 240
Compiladores
Trimestre 11I
218 / 240
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|.
Compiladores
Trimestre 11I
219 / 240
Compiladores
Trimestre 11I
220 / 240
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
Compiladores
Trimestre 11I
221 / 240
Compiladores
Trimestre 11I
222 / 240
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
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 .
Compiladores
Trimestre 11I
225 / 240
Compiladores
Trimestre 11I
226 / 240
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
Compiladores
Trimestre 11I
227 / 240
Compiladores
Trimestre 11I
228 / 240
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.
Compiladores
Trimestre 11I
229 / 240
Compiladores
Trimestre 11I
230 / 240
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 )
Compiladores
Trimestre 11I
231 / 240
Compiladores
Trimestre 11I
232 / 240
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
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
Si calculamos los conjuntos primero y siguiente obtenemos: P S S if,c , else I if , else E D else, 0, 1 , else )
c c
else
0 1
|else S 0 1
Trimestre 11I
Compiladores
Trimestre 11I
238 / 240
Compiladores
Trimestre 11I
239 / 240
Compiladores
Trimestre 11I
240 / 240