Вы находитесь на странице: 1из 49

COMPILADORES

Introduccin
Historia de los compiladores
1946, se desarrolla el primer ordenador digital (lenguaje de mquina)

M.C. Hilda Castillo Zacatelco BUAP

1950, John Backus dirige una investigacin en IBM en un lenguaje algebraico 1954, se comienza a desarrollar FORTRAN 1957, FORTRAN se utiliza en la IBM modelo 704 Surge el concepto traductor El primer compilador de FORTRAN tard 18 aos-persona en realizarse FORTRAN era dependiente de la mquina Paralelamente al desarrollo de FORTRAN en Amrica, en Europa surge una corriente que pretende que los lenguajes fuesen independientes de la mquina, esta corriente estaba influida por los trabajos sobre GLC de Chomsky Surge un grupo Europeo encabezado por F.L. Bauer, en la que particip ACM y John Backus. De este grupo surge un informe que define un Lenguaje Algebraico Internacional, publicado en Zurich en 1958 1969, aparece Algol 60 Junto con los lenguajes tambin la tcnica de los compiladores avanza

COMPILADORES

Introduccin
Historia de los compiladores

M.C. Hilda Castillo Zacatelco BUAP

1958, Strong y otros proponen una solucin al problema de que un compilador fuera portable, y esta era dividir al compilador en dos fases front end (analiza el programa fuente) y back end (genera cdigo objeto para la mquina objeto). El puente de unin era un lenguaje intermedio denominado UNCOL (no funcion) 1959, Rabin y Scott proponen el empleo de AFD y AFN para el reconocimiento lexicogrfico de los lenguajes Aparece BNF (Backus-1960, Naur-1963, Knuth-1964) como una gua para el desarrollo del anlisis sintctico 1959, Sheridan describe un mtodo de parsing de FORTRAN para introducir parntesis en una expresin En los 60s se desarrollan diversos mtodos de parsers ascendentes y descendentes

COMPILADORES

Introduccin
Historia de los compiladores

M.C. Hilda Castillo Zacatelco BUAP

Floyd ms adelante introduce la tcnica de precedencia de operadores y uso de funciones de precedencia 1961, se usa por primera vez un parsing descendente recursivo En los 60s se estudia el paso de parmetros por nombre, valor y referencia y se incluyen los procedimientos recursivos para Algol 60 Se desarrolla la localizacin dinmica de datos 1968, se estudia y definen las GLC, los parsers predictivos y la eliminacin de recursividad izquierda 1975, aparece LEX generador automtico de analizadores lxicos a partir de expresiones regulares bajo UNIX A mitad de los 70s Johnson crea YACC para UNIX (generador de analizadores sintcticos) Ahora un compilador de divide en varias varias El ltimo lenguaje de programacin de amplia aceptacin es JAVA (es interpretado)

COMPILADORES

Introduccin

M.C. Hilda Castillo Zacatelco BUAP

Conceptos Bsicos
Traductor. Cualquier programa que toma como entrada un texto escrito en un lenguaje llamado fuente y da como salida un programa equivalente en otro lenguaje, el lenguaje objeto. Si el lenguaje fuente de un lenguaje de programacin de alto nivel y el objeto un lenguaje de bajo nivel (ensamblador o cdigo de mquina), al traductor se le denomina compilador. Ensamblador. Es un programa traductor cuyo lenguaje fuente es el lenguaje ensamblador. Intrprete. Es un programa que no genera un programa equivalente, sino que toma una sentencia del programa fuente en un lenguaje de alto nivel y la traduce al cdigo equivalente y al mismo tiempo lo ejecuta. En un principio debido a la escasez de memoria se utilizaban ms los intrpretes, ahora se usan ms los compiladores (a excepcin de JAVA)

COMPILADORES

Introduccin
Conceptos bsicos
Ventajas de compilar vs a interpretar Se compila una vez, se ejecuta n veces

M.C. Hilda Castillo Zacatelco BUAP

En ciclos, la compilacin genera cdigo equivalente, interpretndolo se traduce tantas veces una lnea como veces se repite el ciclo El compilador tiene un visin global del programa

Ventajas del intrprete vs el compilador Un intrprete necesita menos memoria que un compilador Permiten una mayor interactividad con el cdigo en tiempo de desarrollo

COMPILADORES

Introduccin

M.C. Hilda Castillo Zacatelco BUAP

Programas que el compilador necesita para obtener un programa ejecutable


Preprocesador Ligador Cargador Depurador Ensamblador

Tipos de compiladores
De una pasada De mltiples pasadas De carga y ejecucin De depuracin

COMPILADORES

Introduccin
De optimizacin Ensamblador Compilador cruzado Compilador con montador Autocompilador Metacompilador Descompilador

M.C. Hilda Castillo Zacatelco BUAP

Modelo de anlisis y sntesis de la compilacin


Partes en la que est dividida la compilacin: anlisis y sntesis
La sntesis es la que requiere las tcnicas ms especializadas.

COMPILADORES

Introduccin

M.C. Hilda Castillo Zacatelco BUAP

Herramientas de software que realizan algn tipo de anlisis a los programas fuente que manipulan: Editores de estructuras Impresoras estticas Verificadores estticos Intrpretes La tecnologa de compiladores se aplica en otros lugares, en especial la parte de anlisis de los siguientes ejemplos es parecida a la de un compilador convenvcional: Formadores de Texto . P/E TEX Compiladores de circuitos de silicio Intrpretes de consultas

COMPILADORES

Introduccin
Estructura de un compilador

M.C. Hilda Castillo Zacatelco BUAP

Para la realizacin del proceso de traduccin es necesario dividir el compilador en varias fases.
Programa fuente Anlisis lxico Anlisis sintctico Manejo de la Tabla de smbolos Anlisis semntico Generacin de cdigo intermedio Optimizacin de cdigo Generacin de cdigo Programa objeto Manejo de errores

COMPILADORES

Introduccin
Antes Una computadora no tena memoria suficiente Se tuvo que dividir al compilador en fases Cada fase lea un archivo y produca otro Actualmente Se tiene memoria suficiente

M.C. Hilda Castillo Zacatelco BUAP

El tamao del archivo ejecutable es relativamente pequeo Se han reducido el nmero de pasadas y el nmero de archivos que se tienen que leer y escribir Las fases de un compilador se agrupan en dos partes o etapas:
Anlisis lxico (lineal) Optimizacin de cdigo Generacin de cdigo intermedio Generacin de cdigo Anlisis sintctico (jerrquico) Anlisis semntico Back end (sntesis) Front end (anlisis)

COMPILADORES

Introduccin
Front end Dependiente del lenguaje fuente

M.C. Hilda Castillo Zacatelco BUAP

Independiente de la mquina objeto para la que se va a generar cdigo Back end Independiente del lenguaje objeto Dependiente del lenguaje objeto Anlisis lxico Tambin llamado exploracin o scanner. Lee caracteres uno a uno desde la entrada y va formando grupos de caracteres con alguna relacin entre s llamados tokens, los que sern la entrada para la siguiente etapa del compilador. Tipos de tokens: Tiras especficas Tiras no especficas

COMPILADORES

Introduccin
Componentes de un token Tipo Valor Las tiras especficas solo tienen tipo. Anlisis sintctico (parser)

M.C. Hilda Castillo Zacatelco BUAP

Recibe como entrada los tokens que le pasa el analizados lxico y comprueba si estos van llegando en el orden correcto. Su salida terica sera un rbol sintctico. Sus funciones son: Aceptar lo que es vlido sintcticamente y rechazar lo que no lo es Hacer explcito el orden jerrquico que tienen los operadores en el lenguaje de que se trate Guiar el proceso de traduccin (traduccin dirigida por sintaxis)

COMPILADORES

Introduccin

M.C. Hilda Castillo Zacatelco BUAP

Un factor de divisin entre el anlisis lxico y sintctico es la recursin. Anlisis semntico Es ms difcil de formalizar que el sintctico. Este trata de encontrar errores semnticos y reunir informacin sobre los tipos para la fase de generacin de cdigo, realizar verificacin de tipos. En definitiva comprobar que el significado de lo que va leyendo es vlido. La salida terica ser un rbol semntico. Ejemplo:
int i,j,k; char s[10]; s=i+j*k; Anlisis Lxico: Devuelve secuencia de tokens. tipo id coma id coma id coma puntoycoma tipo id cora entero corc puntoycoma id asignacin id suma id multiplicacin id puntoycoma

Anlisis sintctico: El orden de los tokens es vlido Anlisis semntico: Tipo de variables asignadas incorrecta

COMPILADORES

Introduccin
Generacin de cdigo intermedio

M.C. Hilda Castillo Zacatelco BUAP

Transforma un rbol sintctico (semntico) en un representacin en un lenguaje intermedio, que suele ser cdigo sencillo que despus se convertir en cdigo de mquina. Propiedades de la representacin intermedia: Debe ser fcil de producir Debe ser fcil de traducir al programa objeto Un formato de cdigo intermedio es el cdigo de tres direcciones. Forma: A:= B op C, donde A,B,C son operandos y op es un operador binario Se permiten condicionales simples simples y saltos.
P/E while (a >0) and (b<(a*4-5)) do a:=b*a-10; L1: if (a>0) goto L2 L4: t1:=b*a goto L3 t2:=t1-10 L2: t1:=a*4 a:=t2 t2:=t1-5 goto L1 if (b < t2) goto L4 L3: . goto L3

COMPILADORES

Introduccin
Optimizacin de cdigo

M.C. Hilda Castillo Zacatelco BUAP

Trata de conseguir que el programa objeto sea ms rpido en la ejecucin y que necesite menos memoria a la hora de ejecutarse.(No todos los compiladores llevan a cabo esta etapa) Posibles optimizaciones locales: Cuando hay dos saltos seguidos se puede quedar uno solo
P/E El ejemplo anterior quedara as: L1: if (a<=0) goto L3 t1:=a*4 t2:=t1-5 if (b >= t2) goto L3 t1:=b*a t2:=t1-10 a:=t2 goto L1 L3: . b:=t1+e

Eliminar expresiones comunes en favor de una sola expresin


a:=b+c+d Quedara t1:=b+c b:=b+c+e a:=t1+d

COMPILADORES

Introduccin
Optimizacin de bucles y lazos (sacar expresiones invariantes)
P/E Repeat x:=3; y:=y-x*2; until y<0; Se saca x:=3

M.C. Hilda Castillo Zacatelco BUAP

Generacin de cdigo Es la fase final de un compilador y consiste en generar cdigo relocalizable o en ensamblador Tabla de smbolos En esta estructura se almacena informacin como: variables, etiquetas, tipos, etc. Los accesos a la tabla deben ser lo ms rpido posibles Manejo de errores Es una de las misiones ms importantes del compilador. Se utiliza ms en el anlisis pero los errores pueden darse en cualquier fase. El manejo de errores es una tarea difcil por dos motivos:

COMPILADORES

Introduccin
1. A veces algunos errores ocultan otros

M.C. Hilda Castillo Zacatelco BUAP

2. Un error puede provocar una avalancha de errores que se solucionan con el primero Criterios a seguir a la hora de manejar errores 1. Pararse al detectar el primer error (conveniente para un compilador interactivo) 2. Detectar todos los errores de una pasada (conveniente para un compilador de lnea)

COMPILADORES

Anlisis Lxico
El papel del analizador lxico
Es la primera fase del programa traductor Es el nico que gestiona el fichero de entrada

M.C. Hilda Castillo Zacatelco BUAP

Es el que lee los caracteres del programa fuente y construye smbolos intermedios, los cuales sern la entrada del analizador sintctico Por qu separar el anlisis lxico del sintctico? El diseo de las partes posteriores dedicadas al anlisis queda simplificada Con fases separadas se pueden aplicar tcnicas especficas y diferenciadas para cada fase Se facilita la portabilidad Los componentes lxicos se especifican mediante expresiones regulares que generan lenguajes regulares ms fciles de reconocer que los LLC

COMPILADORES

Anlisis Lxico
Errores Lxicos
El analizador lxico tpicamente detecta los siguientes errores: El utilizar caracteres que no pertenecen al alfabeto del lenguaje

M.C. Hilda Castillo Zacatelco BUAP

Encontrar una cadena que no coincide con ninguno de los patrones de los tokens posibles Posibles acciones que el analizador lxico puede llevar a cabo para recuperarse de los errores Ignorar los caracteres no vlidos hasta formar un token segn los patrones dados Borrar los caracteres extraos Insertar un caracter que pudiera faltar Reemplazar un caracter presuntamente incorrecto por uno correcto Conmutar las posiciones de dos caracteres adyacentes

COMPILADORES

Anlisis Lxico
Funcionamiento del analizador lxico

M.C. Hilda Castillo Zacatelco BUAP

Su principal funcin es procesar la cadena de caracteres y devolver pares


(token, lexema). Generalmente debe funcionar como una subrutina del analizador sintctico.
Programa fuente Analizador lxico token Analizador sintctico

Tabla de smbolos

Operaciones que realiza el analizador lxico Procesador lxico del programa fuente e identificacin de tokens y de sus lexemas Manejo del fichero del programa fuente Ignorar comentarios y en los lenguajes de formato libre, ignorar los separadores

COMPILADORES

Anlisis Lxico

M.C. Hilda Castillo Zacatelco BUAP

Cuando se produzca una situacin de error ser el analizador lxico el que site el error en el programa fuente Preproceso de macros, definiciones, constantes y rdenes de inclusin de otros ficheros El analizador lxico debe intentar leer siempre el token ms largo posible Especificacin de un analizador lxico Trminos comunes en esta fase: token, patrn, lexema y atributo Ejemplo:
Token Identificador entero reservada Lexema cont, i, aux 178, -675 for Patrn (ER) Let(let|dig)* (+|-|e)digdig* for

COMPILADORES

Anlisis Lxico
Diagrama de Transiciones (DT) Diferencias entre un DT y un AFD

M.C. Hilda Castillo Zacatelco BUAP

Un AFD slo dice si la cadena de caracteres pertenece al lenguaje o no; un DT debe funcionar como un analizador lxico, debe retornar el token ledo y debe dejar el buffer de entrada listo para el siguiente llamado Un DT no puede tener estados de absorcin ni de error De los estados de aceptacin de un DT no deben salir transiciones En el caso de las tiras no especficas, ncesitamos otro estado al que ir cuando se lea un caracter que no pueda formar parte del patrn (caracteres de retroceso, se indican con un * o ms dependiendel nmero de caracteres de retroceso)
Ejemplo: Reconocedor de enteros sin signo
[0-9] 0 [0-9] AFD 1 0 [0-9] 1 DT [0-9] otro 2 * Num_entero

COMPILADORES

Anlisis Lxico
Atributos de los componentes lxicos

M.C. Hilda Castillo Zacatelco BUAP

Cuando concuerda con un lexema ms de un patrn el AL debe proporcionar informacin adicional sobre el lexema (atributos) p/e while es una palabra reservada pero tambin concuerda con el patrn de identificador. En la prctica los componentes lxicos suelen tener un solo atributo, un apuntador a la entrada de la tabla de smbolos donde se guarda informacin sobre los componentes lxicos. Identificacin de palabras reservadas Todas las palabras reservadas responden al mismo patrn que los identificadores, pero son tokens diferententes a los identificadores. Enfoques: 1. 2. Buscar una solucin prctica Integrar los DT de las PR en la mquina reconocedora

COMPILADORES

Anlisis Lxico
Pasos a seguir en la primera solucin:

M.C. Hilda Castillo Zacatelco BUAP

Iniciar la tabla de smbolos con todas las palabras reservadas, PR, (por orden alfabetico) Cuando encuentra un token id, ir a la tabla donde se encuentran las PR y revisar si el token es una PR, si la encuentra entonces el token es una PR; sino la encuentra, entonces el token es un identificador el cual ser aadido a la tabla de smbolos Segunda solucin: Se utilizarn formalmente expresiones regulares y diagramas de transicin. Problema: una PR puede ser un prefijo de un ID
Ejemplo: DT que revisa la PR if
0 L-i L|D 1 3 otro 2 * Id

L=letra D=digito otro=Caracteres-{L,D}

i L-f|D a1 otro a2

otro
4 5

PR_if

L|D

a1

COMPILADORES

Anlisis Lxico
Tabla de transicin Forma general
Estado Entradas token retroceso

M.C. Hilda Castillo Zacatelco BUAP

Ejemplo: Obtener la tabla de transicion para el DT anterior Entradas Estado 0 1 2 3 4 5 i 3 1 1 1 f 1 1 4 1 L 1 1 1 1 D 1 1 1 otro 2 2 5 token Id PR_if retroceso 1 1

while ((Estado!= Final) || Error) Estado=TablaTransiciones[Estado, Entrada];

COMPILADORES

Anlisis Lxico
Implementacin de analizadores lxicos

M.C. Hilda Castillo Zacatelco BUAP

1. Usar un generador automtico de analizadores lxicos (LEX) Ventaja: comodidad y rapidez en el desarrollo Desventaja: ineficiencia del analizador resultante y mantenimiento complicado 2. Escribir el AL en un lenguaje de alto nivel Ventaja: ms eficiente Desventaja: hay que hacerlo todo 3. Hacerlo en lenguaje ensamblador Ventaja: mxima eficiencia Desventaja: muy complicado de desarrollar

COMPILADORES

Anlisis Sintctico

M.C. Hilda Castillo Zacatelco BUAP

Se puede describir la sintaxis de las construcciones de los LP por medio de gramticas independientes del contexto o notacin BNF. Una gramtica da una especificacin sintctica precisa y fcil de entender de un LP A partir de algunas clases de gramticas se puede construir automticamente un analizador sintctico eficiente que determine si un programa fuente est sintcticamente bien formado Una gramtica diseada adecuadamente imparte una estructura a un lenguaje de programacin til para la traduccin de programas fuente a cdigo objeto correcto y para la deteccin de errores Los lenguajes evolucionan con el tiempo, adquiriendo nuevas construcciones y realizando tareas adicionales

COMPILADORES

Anlisis Sintctico
La funcin del analiador sintctico

M.C. Hilda Castillo Zacatelco BUAP

La principal tarea del analizador sintctico (o parser) no es comprobar que la sintaxis del programa fuente sea correcta, sino construir una representacin interna de ese programa y, en el caso de que sea un programa incorrecto, dar un mensaje de error.
Cdigo fuente token A.L. siguiente Tabla de smbolos A.S. Resto de etapas

El A.S. constituye el esqueleto principal del compilador Tipos de Analizadores Sintcticos Ascendentes. Construyen rboles sintcticos a partir de las hojas y suben a la raz Descendentes. Construyen rboles sintcticos de la raz a las hojas En ambos casos se examina la entrada al A.S. de izquierda a derecha, un smbolo a la vez

COMPILADORES

Anlisis Sintctico
Manejo de errores sintcticos

M.C. Hilda Castillo Zacatelco BUAP

A menudo, gran parte de la deteccin y recuperacin de errores en un compilador se centra en la fase de anlisis sintctico Razones La cadena de componentes lxicos no obedece las reglas gramaticales que definen al L.P. Precisin en los mtodos modernos de A.S. El manejador de errores en un A.S. tiene objetivos fciles de establecer: Debe informar de la presencia de errores con claridad y exactitud Se debe recuperar de cada error con la suficiente rapidez como para detectar errores posteriores No debe retrasar de manera significativa el procesamiento de programas correctos El manejador de errores debe informar de la presencia de un error, indicando el lugar preciso en el programa, y si sabe cul es el error, se incluye un mensaje.

COMPILADORES

Anlisis Sintctico
Opciones para implementar un parser 1. a mano

M.C. Hilda Castillo Zacatelco BUAP

2. Utilizando un generador de analizadores sintcticos, por ejemplo YACC Notacin EBNF Extended Backus-Naur Form. Objetivo, reducir el nmero de producciones en las gramticas. Notaciones adicionales. 1. Alternativas de una regla. Se utiliza el smbolo | para separar las distintas posibilidades que definen al no terminal de la izquierda.
Ejemplo: Si S a y S aSb entonces se escribe como S a | aSb

2. Llaves {}. Lo que aparece dentro de ellos se repite de cero a n veces.


Ejemplo: Linea_dec Tipo iden { , iden} ;

3. Llaves con repeticin especificada: { }yx . Lo que aparece dentro de ellas se repite un nmero de veces comprendido entre x e y.
Ejemplo: iden letra {digito | letra}70

COMPILADORES

Anlisis Sintctico

M.C. Hilda Castillo Zacatelco BUAP

4. Corchetes:[]. Es un caso particular de 3 ({}10). Lo que esta dentro puede o no aparecer.


Ejemplo: prop_if if condicion then bloque [else bloque]

Diseo de gramticas para lenguajes de programacin


1. Recursividad Problema: Un compilador debe procesar correctamente un nmero infinito de programas, pero por otra parte la especificacin sintctica de un lenguaje debe ser finita. Solucin: Recursividad Estructura de la recursividad 1. Regla no recursiva que se define como caso base 2. Una o mas reglas recursivas que permiten el crecimiento a partir del caso base

COMPILADORES

Anlisis Sintctico
Ejemplo: Gramtica para definir un nmero entero Digito 0 |1|2||9 Entero Digito Entero Entero Digito Regla recursiva

M.C. Hilda Castillo Zacatelco BUAP

Nota: En este caso la gramtica es recursiva y el no terminal recursivo es Entero

Caso base

Definicin. Una gramtica es recursiva, si podemos derivar una tira en la que nos vuelve a aparecer el smbolo no terminal que aparece en la parte izquierda de la regla de derivacin. A EAF A AF Recursividad izquierda A EA Recursividad derecha 2. Ambigedad Una gramtica es ambigua si el lenguaje que define contiene alguna sentencia que tenga ms de un nico rbol de anlisis sintctico, es no ambigua cuando cualquier tira del lenguaje que representa, tiene un nico rbol sintctico. No es posible construir analizadores sintcticos eficientes para gramticas ambiguas. No se disponen de tcnicas para saber si una gramtica es ambigua o no. La nica forma de saberlo es encontrando una cadena con dos o ms rboles sintcticos distintos

COMPILADORES

Anlisis Sintctico

M.C. Hilda Castillo Zacatelco BUAP

Algunas de las caractersticas que tiene las gramticas ambiguas son las siguientes: Gramticas con ciclos simples o menos simples
S A| a A S

Alguna regla con una forma


E EE

Un conjunto de reglas de forma parecida a:


S A| B A B

Producciones recursivas en las que las variables no recursivas de la produccin puedan derivar a la cadena vaca:
S HRS | s H h|P R r|P

Variables que puedan derivar a la cadena vaca y a la misma cadena de terminales, y que aparezcan juntas en la parte derecha de una regla o en alguna forma sentencial:
S HR H h|P R r|h| P

COMPILADORES

Anlisis Sintctico
Ejemplo: Sea la gramtica S Aa | C C S | Ac A a La tira aa tiene dos rboles sintcticos. Para solucionar la ambigedad se deben modificar las reglas de produccin de la gramtica

M.C. Hilda Castillo Zacatelco BUAP

S A a a A a

S C S a

3. Asociatividad y precedencia de operadores Asociatividad

La asociatividad de un operador se define cmo se operan tres o ms operandos. Tipos de asociatividad: Asociatividad izquierda (se evala de izquierda a derecha) Asociatividad derecha (se evala de derecha a izquierda) La asociatividad en una gramtica se refleja en el tipo de recursividad que se emplea. Si la asociatividad del operador es por la izquierda, la regla sintctica en la que interviene dicho operador debe ser recursiva por la izquierda; en el caso de asociatividad por la derecha se utiliza recursin por la derecha.

COMPILADORES

Anlisis Sintctico
Precedencia

M.C. Hilda Castillo Zacatelco BUAP

La precedencia de un operador especifica el orden relativo de cada operador con respecto a los dems operadores. La precedencia en una gramtica se refleja de la siguiente manera: cuanto ms cerca est la produccin de la del smbolo inicial, menor ser la precedencia del operador. Parentizacin Los parntesis son operadores especiales que tiene la mxima precedencia. Para incluirlos en la gramtica, se aade una variable que produzca expresiones entre parntesis y los operandos (nmeros, variables, etc.) a la mayor distancia posible del smbolo inicial. En esta produccin se colocan los operadores unarios a no ser que tengan una precedencia menor.

COMPILADORES

Anlisis Sintctico
Tipos de anlisis sintctico Estrategias para construir el rbol sintctico: Anlisis ascendente Anlisis descendente

M.C. Hilda Castillo Zacatelco BUAP

Ambas estrategias recorren la cadena de entrada de izquierda a derecha una sola vez, y necesitan que la gramtica no se ambigua. Para las GLC los algoritmos de anlisis sintctico tienen un coste de O(n3), por lo tanto es necesario buscar subclases de gramticas que permitan un anlisis sintctico en orden lineal. Las estrategias anteriores son eficientes (tienen un coste lineal O(n)) pero no son capaces de trabajar con todo tipo de gramticas. Algunas de las adecuadas son: Anlisis LL(n) .Se utilizan GLC Anlisis LR(n)
donde: L Left to Right: la secuencia de tokens de entrada se analiza de izquierda a derecha L Left-most (R = Right-most): utiliza las derivaciones ms a la izquierda (a la derecha) n es el nmero de smbolos de entrada que es necesario conocer en cada momento para poder hacer el anlisis.

COMPILADORES

Anlisis Sintctico Descendente


Gramticas LL(1)

M.C. Hilda Castillo Zacatelco BUAP

El anlisis sintctico descendente puede incluir retrocesos (backtracking), en la prctica esto no es necesario.
Ejemplo: S Ad A ab | a Analizar la cadena de entrada cad

Analizadores Sintcticos Predictivos (ASP) Para que el algoritmo tenga una complejidad lineal, siempre debe saber qu regla se debe aplicar, no debe hacer backtracking. Por lo tanto, es necesario que el analizador realice una prediccin de la regla a aplicar. La alternativa apropiada debe poderse predecir slo con ver el primer smbolo que produce.
Ejemplo: Instruccion printf ( arg_escritura ); | scanf (arg_lectura); | id = asigna;

En este tipo de analizadores se utilizan las gramticas LL(1).

COMPILADORES

Anlisis Sintctico Descendente

M.C. Hilda Castillo Zacatelco BUAP

Analizadores Sintcticos Predictivos = Analizadores Sintcticos Descendentes sin Retroceso.

Conjuntos de prediccin Son conjuntos de tokens que ayudan a predecir qu regla se debe aplicar para la variable que hay que derivar. Para saber qu regla se debe aplicar en cada caso, el analizador consulta el siguiente token en la entrada y si pertenece al conjunto de prediccin de una regla, aplica esa regla; sino se produce un mensaje de error. Las gramticas que pertencen al tipo LL(1) satisfacen lo siguiente: La secuencia de tokens se analiza de izquierda a derehca Utilizaremos la derivacin del no terminal que aparezca ms a la izquierda Slo tendremos que ver un token de la secuencia de entrada para saber qu produccin seguir.
Ejemplo: Lista_variables id , Lista_variables | id No pertenece a las gramticas LL(1)

COMPILADORES

Anlisis Sintctico Descendente


Clculo de los conjuntos de prediccin

M.C. Hilda Castillo Zacatelco BUAP

Los conjuntos de prediccin de una regla se calculan en funcin de los primeros smbolos que puede generar la parte derehca de esa regla, y a veces en funcin de los smbolos que pueden aparecer a continuacin de la parte izquierda de la regla en una forma sentencial. Los conjuntos de PRIMEROS Y SIGUIENTES contienen smbolos terminales. Clculo del conjunto de PRIMEROS. Definicin: Si E es una forma sentencial compuesta por una concatenacin de smbolos, PRIMEROS (E) es el conjunto de terminales (o P) que pueden aparecer iniciado las cadenas que pueden derivar de E. Definicin formal: a PRIMEROS(E) si a (T {P}) |  E * aF para alguna tira F.

COMPILADORES

Anlisis Sintctico Descendente


Reglas para el clculo del conjunto de los PRIMEROS

M.C. Hilda Castillo Zacatelco BUAP

1. Si E T, PRIMEROS(E)={E} 2. Si E N: Inicialmente, PRIMEROS(E)= Si aparece la produccin E P, PRIMEROS(E)=PRIMEROS(E) {P} Si E a1a2an entonces PRIMEROS(E)=PRIMEROS(E) PRIMEROS(a1a2an) y para el clculo de PRIMEROS(a1a2an) pueden darse dos casos: Si P PRIMEROS(a1) entonces PRIMEROS(E) =PRIMEROS(E) PRIMEROS(a1) Si P PRIMEROS(a1) entonces PRIMEROS(E)= PRIMEROS(E) (PRIMEROS(a1)-{P}) PRIMEROS(a2an) y de nuevo pueden darse estos dos casos para PRIMEROS(a2an) y siguientes, hasta an. Si I, P PRIMEROS(ai) entonces PRIMEROS(E)=PRIMEROS(E) {P} 3. Para recoger todos los casos posibles habra que considerar que 7 Si E E1 | E2 | | En entonces PRIMEROS (E) = PRIMEROS(Ei)
n i !1

COMPILADORES

Anlisis Sintctico Descendente


Clculo del conjunto de SIGUIENTES. En este caso se aade una produccin inicial: X S$

M.C. Hilda Castillo Zacatelco BUAP

Definicin: Si A es un smbolo no terminal de la gramtica, SIGUIENTES(A) es el conjunto de terminales que pueden aparecer a continuacin de A en alguna forma sentencial derivada del smbolo inicial. Definicin formal: a SIGUIENTES(A) si a (T {$}) |  S * EAaF para algn par de tiras E, F. Reglas para el clculo del conjunto de los SIGUIENTES 1. Inicialmente, SIGUIENTES(A)= 2. Si A es el smbolo inicial, entonces SIGUIENTES(A)=SIGUIENTES(A) {$} 3. (s1) Para cada regla de la forma: B EAF entonces SIGUIENTES(A)=SIGUIENTES(A) PRIMEROS(F)-{P} 4. (s2) Para cada regla de la forma: B EA o bien B EAF en la que P PRIMEROS(F) entonces SIGUIENTES(A)=SIGUIENTES(A) SIGUIENTES(B) 5. Repetir los pasos 3 y 4 hasta que no se puedan aadir ms smbolos a SIGUIENTES(A)
Nota: Las reglas (s1) y (s2) no son excluyentes

COMPILADORES

Anlisis Sintctico Descendente


Clculo del conjunto PREDICT

M.C. Hilda Castillo Zacatelco BUAP

La funcin PREDICT se aplica a producciones de la gramtica (A E) y devuelve un conjunto, llamado conjunto de prediccin, que puede contener cualesquiera terminales de la gramtica y el smbolo $, pero nunca puede contener P. Reglas para el clculo del conjunto PREDICT PREDICT(A E) = Si P PRIMEROS(E) entonces = (PRIMEROS(E)-{P}) {SIGUIENTES(A)} sino = PRIMEROS(E)

COMPILADORES

Anlisis Sintctico Descendente


La condicin LL(1)

M.C. Hilda Castillo Zacatelco BUAP

La condicin LL(1) es necesaria y suficiente para poder construir un ASDP para una gramtica. Dadas todas las producciones de la gramtica para un mismo no terminal: A 1| 2| | n  N

Se debe cumplir la siguiente condicin:


i,j (i{j) PREDICT(A

i) PREDICT(A

j) = *

Modificacin de gramticas no LL(1) 1.Eliminacin de la ambigedad 2. Factorizacin izquierda A


F1| F2|| Fn| Ki

Sustituir por:

A| KI

A F1| F2|| Fn

COMPILADORES

Anlisis Sintctico Descendente


3. Eliminacin de la recursividad izquierda A A 1| A 2|| A m| F1| F2|| Fn Sustituir por: A A F1A| F2A|| FnA| KI 1A| 2A|| mA|P

M.C. Hilda Castillo Zacatelco BUAP

Eliminacin de recursividad indirecta Pasos: 1. 2. Ordenar los no terminales segn A1.A2,,An Desde I 1 hasta n hacer Desde j 1 hasta I-1 hacer Sustituir cada Ai AjK por Ai H1K | H2K|| HkK donde Aj Fin_para Fin_para
H1 | H2 | | Hk son las producciones actuales de Aj

Eliminar la recursividad izquierda directa de la produccin de Ai

COMPILADORES

Anlisis Sintctico Descendente

M.C. Hilda Castillo Zacatelco BUAP

Algoritmo de ejecucin del Analizador Descendente Dirigido por Tabla:


Entrada: cadena de elementos lxicos devueltos por el A.L. Salida: producciones que construyen su rbol de anlisis sintctico Pasos: push($) push(S) Repetir Sea A el smbolo en el tope de la pila Sea a smbolo de preanlisis Si A es un terminal o $ entonces Si A = a entonces pop(A) a:= analex() sino Error sintctico (encontrado lexema, esperaba A) finsi sino /* Es un no terminal */ Si Tabla[A,a]=A E1E2Ek entonces pop(A) Desde I:=k hasta 1 hacer push(EI) findesde sino Error sintctico finsi Hasta A=$ /* La pila esta vaca */

COMPILADORES

Traduccin dirigida por sintaxis

M.C. Hilda Castillo Zacatelco BUAP

Una definicin dirigida por sintaxis es un instrumento que nos permite planear las acciones que queremos que se realicen por el analizador gramatical al cumplimiento de ciertas reglas gramaticales. Ejemplo: E E E E opsr T E T T T opmd F T F F (E) F numero escribe(E.s) E.s = concatena (E.s, T.s, opsr.o) E.s = T.s T.s = concatena (T.s, F.s, opmd.o) T.s = F.s F.s = E.s F.s = numero.s

COMPILADORES

Anlisis semntico

M.C. Hilda Castillo Zacatelco BUAP

Declaracin de Funciones
Variable Tipo

a b

2 2 3 Fun+2 Fun+1
Apuntador

a b

0 0

Verificacin de Tipos
Multiplicar/Dividir 1
1 Entero 2 Real 3 Caracter

c x y

w 2 c 2

2 2 2

3 4
Argumentos

1 2 3

1 2

a b

2 1

COMPILADORES

Anlisis semntico
Cdigo intermedio
Iteracion -> MIENTRAS expresion REPITE orden FMIENTRAS -> REPITE orden HASTA QUE expresion FREPITE

M.C. Hilda Castillo Zacatelco BUAP

En el caso de MIENTRAS-REPITE:
1 Evaluar expresin si 2 Falsa? no Orden

Iteracion -> MIENTRAS (1) expresion (2) REPITE orden FMIENTRAS (3) (1) inicio_mientras=Genera_etiqueta(); fin_mientras=Genera_etiqueta(); Escribe(inicio_mientras,:); (2) Escribe(CMP, Expresion.I,0); Escribe(JZ,fin_mientras); (3) Escribe(JMP,inicio_mientras); Escribe(fin_mientras,:);

Inicio_mientras Cdigo de expresin CMP Expresin,0 JZ fin_mientras Cdigo de orden JMP inicio_mientras Fin_mientras

COMPILADORES
M.C. Hilda Castillo Zacatelco BUAP

Cdigo intermedio
En el caso de REPITE-HASTA:

Iteracion -> REPITE (1) orden HASTA QUE expresion (2) FREPITE

(1) inicio_repite=Genera_etiqueta(); Escribe(inicio_repite,:); (2) Escribe(CMP, Expresion.I,0); Escribe(JZ,inicio_repite);

Вам также может понравиться