Com Pi Lad Ores

download Com Pi Lad Ores

of 187

Transcript of Com Pi Lad Ores

Compiladores

M. en C. Joel Omar Jurez Gambino

COMPILADORES E INTRPRETES

Compilador Un compilador es un programa que lee un programa escrito en algn lenguaje (lenguaje fuente) y lo traduce a un programa equivalente en otro lenguaje (lenguaje objeto)

Historia de los compiladores

La palabra compilador se atribuye a Grace Murray Hopper El concibi la implementacin de un lenguaje de alto nivel como una compilacin de una secuencia de subrutinas desde una librera Los primeros compiladores tipo traductor fueron escritos a fines de los 50

Historia de compiladores

El lenguaje FORTRAN se considera el primer lenguaje compilado con exito El diseo de este compilador lo encabez John Backus y su desarrollo tom 18 aos Existia un gran escepticismo con respecto a que un lenguaje semejante al ingls pudiera disearse y traducirse en algo que la mquina pudiera ejecutar eficazmente Los verdaderos programadores utilizan el lenguaje ensamblador

Historia de los compiladores

En la actualidad es posible disear e implementar un compilador mejor y ms rpido que FORTRAN por las siguientes razones:

Los lenguajes se comprenden mejor Se han desarrollado herramientas que facilitan algunas tareas del compilador Se han desarrollado estructuras de datos y algoritmos que realizan las tareas que son comunes a todos los compiladores

FUNDAMENTOS DE TEORA DE LENGUAJES

Alfabetos Es un conjunto no vacio y finito de smbolos Se utiliza el smbolo para denotar un alfabeto Ejemplo:

= {0,1} Descripcin: El alfabeto consiste en los dgitos 0 y 1

Cadenas o palabras Cadena o palabra. Es una secuencia finita de smbolos Ejemplo: C=1010 sobre el alfabeto = {0,1} Longitud de cadena. Es el nmero de smbolos que tiene una cadena Ejemplo: |C|= 4 Cadena vacia. Cadena con 0 ocurrencias de smbolos. Es denotada por

Cadenas o palabras Sea w=101 y z=111 dos cadenas, se definen las siguientes operaciones: Concatenacin de cadenas. La concatenacin de w y z es wz=101111 Potencia de cadenas ( w k): Denota la concatenacin de k copias de la cadena w Igualdad de cadenas: w y z estas cadenas son iguales si tienen la misma longitud y los mismos smbolos en la misma posicin

Lenguaje Conjunto de cadenas las cuales son parte de un alfabeto

Una cadena L sobre un alfabeto no necesita incluir todos los smbolos de

Lenguaje Ejemplos: El conjunto de todas las cadenas que consisten en n 0's seguida de n 1's para n0 El conjunto de cadenas formadas por 0's y 1's en cualquier posicin con igual nmero de repeticiones cada uno El lenguaje vacio El lenguaje que consiste solo en la cadena vacia {}

ACTIVIDAD GRUPAL 2

Proceso de compilacin

Programa fuente

Compilador

Programa objeto

Errores

Proceso de compilacin Es importante sealar que diferentes lenguajes de programacin requieren distintos compiladores No existen compiladores genricos Que pasa con MSIL!!!

Evidencia 2

Realizar en equipo un trabajo de investigacin sobre el Common Intermediate Languaje (CIL o MSIL) de Microsoft y el Bytecode de Java La evidencia de este trabajo es documento que consta de los siguientes puntos:

Introduccin Cuadro comparativo (al menos 5 caractersticas que ustedes consideren importantes) Conclusiones

Se enva al correo a ms tardar antes de la siguiente clase

LENGUAJES DE PROGRAMACIN

Evolucin de los LP Las computadora son capaces de ejecutar procedimientos que estn escritos en su lenguaje nativo Dicho lenguaje est definido en las instrucciones que el procesador es capaz de ejecutar Con estos lenguajes se producian programas gigantescos y con alta probabilidad de errores

Evolucin de los LP Con el paso del tiempo los LP han evolucionado Se acercan cada vez ms a los lenguajes algortmicos Esto obliga a traducir los programas al lenguaje de las computadoras

1.HACERSuma=0; 2.HACERValor=0; 3.HACERElemento=0; 4. 5.LEERElemento; 6. 7.ESElementoValor? 11.SI: 12.HACERValor=Elemento; 13.NO: 14.VOLVERALPASO5 15.SI: 16.DESPLEGARSuma,Valor 17. 18.FINDEPROCESO

Evolucin de los LP Actualmente los compiladores no producen programas objetos escritos en cdigo mquina Compilan el programa fuente a un cdigo intermedio Este cdigo intermedio puede ser interpretado directamente o traducido a cdigo mquina

Funciones del compilador

Fases de un compiladorPrograma fuente Analizador lxico

Analizador sintctico

Analizador semntico Administrador de la tabla de smbolos Generador de cdigo intermedio Manejador de errores

Optimador de cdigo

Generador de cdigo Programa objeto

Analizador lxico Lee los caracteres de entrada (programa fuente) Genera como salida una secuencia de componentes lxicos Mediante algunas tcnicas descompone los cadenas en una serie de elementos fundamentales del lenguaje variables, constantes, palabras reservadas, ect

Analizador lxicoarea :=( basealtura)/2 ;1.El identificador area 2.El smbolo de asignacin := 3.El smbolo de parntesis abierto ( 4.El identificador base. 5.El signo de multiplicacin * 6.El identificador altura 7.El smbolo de parntesis cerrado ) 8.El signo de divisin / 9.El nmero 2

Analizador sintctico Determina si una cadena de componentes lxicos puede ser generada por una gramtica Agrupa los componentes lxicos en frases gramaticales que se utilizan para sintetizar la salida Las frases gramaticales se representan mediante un rbol de anlisis sintctico

Analizador sintctico

Analizador sintctico La estructura jerrquica de un programa normalmente se expresa utilizando reglas recursivas Ejemplo:1. Cualquier identificador es una expresin 2. Cualquier nmero es una expresin 3. Si expresin1 y expresin2 son expresiones, entonces tambin lo son expresin1 + expresin2 expresin1 / expresin2 (expresin1)

Analizador sintctico Muchos lenguajes definen recursivamente las proposiciones mediante reglas Ejemplo:1. Si identificador1 es un identificador y expresion2 es una expresin, entoncesidentificador1:=expresin2

es una proposicin 1. Si expresin1 es una expresin y proposicin2 es una proposicin, entonceswhile (expresin1) do proposicin2 if (expresin1) do proposicin2

son proposiciones

Tabla de smbolos Estructura de datos que contiene un registro por cada identificador con campos especficos para sus atributos Permite encontrar rpidamente el registro de cada identificador Se puede almacenar y consultar datos de ese registro

Tabla de smbolos Los atributos que comnmente se almacenan para un identificador son:Memoria asignada Tipo mbito

Los atributos para un procedimiento:Cantidad y tipo de argumentos Mtodo de envo de argumentos Tipo retornado

Tabla de smbolos Gran parte de la informacin almacenada en la tabla de smbolos se introduce durante la fase de anlisis lxico Sin embargo, algunos atributos no se pueden determinar durante esta fasevar area, base, altura : real ;

Las fases restantes complementaran los atributos restantes de los identificadores de la tabla de smbolos

Anlisis semntico Revisa el programa en busca de errores semnticos y rene informacin sobre los tipos Uno de los errores ms comunes revisados por esta fase es la verificacin de tipos Esta verificacin comprueba si cada operador tiene los operandos permitidos por la especificacin del lenguajeint x=4, z; char y[3]=abc z = x + y;

Etapas del compilador En ocasiones el trabajo del compilador se suele dividir en solo dos fases: Fase de anlisis. Verifica posibles errores en diferentes niveles Fase de sntesis. construye el programa objeto a partir de la representacin intermedia

Etapa de anlisis Se suelen identificar las siguientes etapas: Anlisis lineal. La cadena de caracteres del programa fuente se leen de izquierda a derecha y se agrupan en componentes lxico Anlisis jerrquico. Los componentes lxicos se agrupan jerrquicamente en colecciones anidadas con un significado colectivo Anlisis semntico. Se realizan ciertas revisiones para asegurar que los componentes de un programa se ajustan de un modo significativo

Cdigo intermedio Algunos compiladores incluyen una ltima etapa que genera un cdigo intermedio Este cdigo se considera como un programa para una mquina abstracta Esta representacin debe de tener dos propiedades importantes:Fcil de producir Fcil de traducir

Cdigo intermedio Una representacin intermedia utilizada es el cdigo de tres direcciones Consiste en una secuencia de instrucciones, cada una con un mximo de tres operandos Ejemplo:area :=( basealtura)/2 ;temp:=entreal(2) temp2:=id2*id3 temp3:=temp2/temp id1:=temp3

Etapa de sntesis Una tarea importante de esta etapa es la optimizacin de cdigo La optimizacin trata de mejorar el cdigo intermedio de modo que el cdigo mquina se ejecute ms rpido Existen incluso compiladores que le dedican mucho tiempo de la compilacin a esta etapa

Optimizacin de cdigotemp:=entreal(2) temp2:=id2*id3 temp3:=temp2/temp id1:=temp3

temp1:=id2*id3 id1:=temp1/2.0

Generacin de cdigo objeto Despus de la optimizacin el compilador traduce las instrucciones a cdigo objeto El cdigo objeto generalmente se representa en lenguaje ensamblador Cada una de las instrucciones mquina se traducen a una secuencia de instrucciones mquina que ejecutan la misma tarea

Generacin de cdigo objeto

temp1:=id2*id3 id1:=temp1/2.0

MOVF id3, R2 MULF id2, R2 MOVF #2.0, R1 DIVF R2, R1 MOVF R1, id1

area :=( basealtura)/2 ;

temp:=entreal(2) temp2:=id2*id3 temp3:=temp2/temp id1:=temp3

Verificacin de tiposMOVF id3, R2 MULF id2, R2 MOVF #2.0, R1 DIVF R2, R1 MOVF R1, id1

temp1:=id2*id3 id1:=temp1/2.0

Agrupamiento de las fases Las fases del compilador se pueden agrupar en: Etapa inicial Etapa final

Etapa inicial Comprende las fases que dependen principalmente del lenguaje fuente Las fases de esta etapa son en gran parte independientes de la mquina objeto Generalmente incluye los anlisis lxico, sintctico, semntico, generacin de la tabla de smbolos, generacin de cdigo intermedio y manejo de errores

Etapa final Incluye fases del compilador que dependen de la mquina objeto Estas fases no trabajan con el cdigo fuente, sino con el cdigo intermedio Generalmente incluye la optimizacin de cdigo, generacin de cdigo, manejo de errores y operaciones con la tabla de smbolos

Nota libro compiladores (1986) Resulta tentador compilar varios lenguajes distintos en el mismo lenguaje intermedio y usar una etapa final comn para las distintas etapas iniciales, obteniendose as varios compiladores para una mquina. Sin embargo, dadas las sutiles diferencias en los puntos de vista de los distintos lenguajes, slo se han obtenido un xito limitado en ese aspecto

Pasadas Una pasada consiste en la lectura de una archivo de entrada y la escritura de un archivo de salida Normalmente se aplican varias fases de compilacin en una sola pasada Siguiendo esta idea se podra traducir directamente los componentes lxicos a cdigo intermedio Es deseable tener relativamente pocas pasadas, dado que la lectura y escritura de archivos intermedios lleva tiempo Una solucin a estos problemas es el relleno de retroceso (backpatching)

Pasadas

Si se agrupan varias fases dentro de una pasada, puede ser necesario mantener el programa completo en memoria En ocasiones el programa interno puede ser mayor que el programa fuente o el programa objeto El manejo de memoria no es un problema trivial

Pasadas El agrupamiento de las fases en una sola pasada no siempre es posible Algunos lenguajes permiten usar variables antes de declararlas, por lo que no se puede generar cdigo objeto si no se conocen los tipos de la variables implicadas En las sentencias goto no se puede determinar la direccin objeto de dichos saltos hasta haber visto el cdigo objeto implicado y haber generado el cdigo objeto correspondiente

Pasadas Es posible dejar un segmento de la tabla en blanco para la informacin que falta y llenarlo cuando la informacin est disponible La generacin de cdigo intermedio y cdigo objeto se puede fusionar en una sola pasada utilizando la tcnica de relleno de retroceso (backpatching)

Anlisis lxico

Analizador lxico Lee los caracteres de entrada y genera como salida una secuencia de componentes lxicos Otras tareas del analizador lxico: Eliminar comentarios, tabulaciones, espacios en blanco y saltos de lnea Relacionar los errores con las lineas del programa fuente

Fases del analizador lxico En algunas ocasiones los analizadores lxicos se dividen en dos fases: Fase de examen: Encargada de eliminar espacios en blanco, tabuladores, etc. Fase de anlisis: Reconoce los componentes lxicos

Interaccin entre analizadores Los componentes identificados por el analizador lxico son utilizados por el analizador sintctico Esta interaccin se logra convirtiendo al analizador lxico en una subrutina del analizador sintctico

Interaccin entre analizadoresComponente lxico Programa fuente Analizador lxico Obtn el siguiente componente lxico Analizador sintctico

Tabla de smbolos

Interaccin entre analizadores Los componentes lxicos producidos se pueden conservar en un buffer hasta ser consumidos por el analizador sintctico El analizador lxico no puede avanzar mientras el buffer este lleno El analizador sintctico no puede continuar cuando e buffer est vacio

Interaccin entre analizadores Es importante separar las etapas de anlisis lxico y sintctico Diseo claro y sencillo Mejorar eficiencia (manejo de buffers) Mejorar transportabilidad (identificacin de smbolos que no son parte del alfabeto)

Anlisis de cadenas Componente lxico. Cadenas que el analizador lxico es capaz de identificar y agrupar de acuerdo a un significado colectivo Patrn. Reglas mediante las cuales se describen los componentes lxicos Lexema. Secuencia de caracteres en el programa fuente con la que concuerda el patrn para un componente lxico

EjemplosComponente lxico Identificador if num_entero op_mult op_asign Lexemas area, base, altura if 1492, 2,1 * = Descripcin informal del patrn Letra seguida de letras o dgitos Letra i seguida de letra f Dgito seguido de ms dgitos Caracter * Carcater =

Componentes lxicos En la mayoria de los lenguajes de progamacin se consideran componentes lxicos: Palabras clave Operadores Identificadores Constantes Signos de puntuacin (coma, punto y coma, parntesis, etc.)

Palabras reservadas En algunos lenguajes ciertas cadenas tienen un significado predefinido Esas cadenas se reservan para usos exclusivo del lenguaje y el usuario no las puede modificar Si dichas palabras no se reservan el analizador lxico tendr la tarea de distinguir entre palabras reservadas e identificadores

Ejemplo En el lenguaje PL/I las palabras clave no son reservadas y se pueden complicar muchos las proposiciones IFTHENTHENTHEN=ELSE ELSEELSE=THEN

Atributos de los componentes lxicos Algunos patrones describen a ms de un lexema, por ejemplo, el patrn de identificador Por lo que varios lexemas pueden concordar con un mismo patrn Bajo estas circunstancias el analizador lxico debe proporcionar informacin adional sobre el lexema

Atributos de los componentes lxicos Los componentes lxicos influyen en las decisiones del anlisis sintctico Los atributos influyen en la traduccin de los componentes lxicos En la prctica los componentes lxicos suelen tener un solo atributo, el apuntador al registro de la tabla de smbolos donde se especifican sus atributos

Ejemplopermetro=lado*2 Secuencia de parejas

Errores lxicos Son pocos los errores que pueden ser detectados durante esta etapa Un error detectado en esta etapa es cuando no se encuentra un patrn que describa a una cadena del programa fuente Estos errores deben ser manejados correctamente por el compilador para poder continuar con el anlisis

Errores lxicos Existen varias estrategias que el compilador puede tomar para manejar el problema: Borrar caracteres extraos hasta reconocer un componente Insertar un carcter faltante Reemplazar un carcter incorrecto por otro correcto Intercambiar dos caracteres adyacentes

Lenguajes Un lenguaje es un conjunto de cadenas de un alfabeto fijo Hay varias operaciones importantes que se pueden aplicar a los lenguajes Para el anlisis lxico son interesantes principalmente la unin, la concatenacin y la cerradura

Operaciones sobre los lenguajesOperacin Unin de L y D, L D Concatenacin de L y D, LD Cerradura de Kleene de L, L* Cerradura positiva de L, L+ Definicin L D = {s | s est en L o est en D} LD = {st | s est en L y t est en D} L* denota cero concatenaciones de L L+ denota una concatenaciones de L o o ms ms

Ejemplo Sea L el conjunto {a,b,...,z} y D el conjunto {0,1,...,9}, al aplicar las operaciones se forman los siguientes lenguajes LD LD

L

4

L* L(L D)*

D

+

Expresiones regulares Es una notacin utilizada para especificar patrones Una expresin regular se construye a partir de expresiones regulares ms simples utilizando un conjunto de reglas definitorias Cada expresin regular r representa un lenguaje L(r)

Expresiones regulares Las siguientes reglas definen las expresiones regulares del alfabeto 1. es una expresin regular designada por {}, el conjunto que contiene la cadena vaca 2. Si a es un smbolo de , entonces a es una expresin regular designada por {a}; por ejemplo el conjunto que contiene la cadena a. Aunque usa la misma notacin para las 3, tcnicamente la expresin regular a es distinta de la cadena a o del smbolo a.

Expresiones regulares1. Suponiendo que r y s sean expresiones regulares representadas por los lenguajes L(r) y L(s), entonces: (r) | (s) es una expresin regular representada por L(r) L(s) (r)(s) es una expresin regular representada por L(r)L(s) (r)* es una expresin regular representada por (L(r))* (r) es una expresin regular representada por L(r)

Expresiones regulares Se pueden evitar los parntesis innecesarios en las expresiones regulares si se adoptan las siguientes convenciones1. El operador unario * tiene la mayor pr y es asociativo por izquierda 2. La concatenacin tiene la segunda mayor precedencia y es asociativa por izquierda 3. | tiene la menor precedencia y es asociativo por izquierda

Expresiones regulares Siguiendo las convenciones anteriores (a)|((b)*(c)) es equivalente a a|b*c

Qu conjunto de cadenas se forman con esa expresin?

Ejemplo Sea = {a,b}, definir el conjunto de cadenas que especifican las siguientes expresiones regulares1. 2. 3. 4. 5. a|b (a|b)(b|a) a* (a|b)* a|a*b

Expresiones regulares Si dos expresiones regulares r y s representan al mismo lenguaje, se dice que r y s son equivalentes (r = s) (a|b) = (b|a) ?

Son varias las leyes algebraicas que obedecen las expresiones regulares y pueden ser usadas para transformar dichas expresiones a otras equivalentes

Propiedades algebraicasAXIOMA r|s = s|r r|(s|t) = (r|s)|t (rs)t = r(st) r(s|t)= rs|rt (s|t)r = sr|tr r=r r=r r* = (r|)* r** = r* DESCRIPCIN | es conmutativo | es asociativo La concatenacin es asociativa La concatenacin distribuye sobre | es elemento identidad de la concatenacin La relacin entre * y * es idempotente

Definiciones regulares Por conveniencia de notacin es deseable dar nombres a las expresiones expresiones regulares Se pueden definir nuevas expresiones regulares utilizando dichos nombres como si fueran smbolos A esta operacin se le conoce como definicin regular

Definiciones regulares Si es un alfabeto de smbolos bsicos, entonces una definicin regular es una secuencia de definiciones Ejemplo: letra A|B|...|Z|a|b|...|z dgito 0|1|...|9 Cmo se definiran los identificadores en C?

Abreviatura en la notacin

Uno o ms casos. El operador unitario postfijo + significa uno o ms casos de. La expresin regular a representa al conjunto de todas las cadenas de una o ms a. El operador + tiene la misma precedencia y asociatividad que el operador *+

Cero o un caso. El operador unitario postfijo ? significa cero o un caso de. La notacin r? es una abreviatura de r| Clase de caracteres. Una clase abreviada de carcter como [a-z] designan la expresin regular a|b|...|z. Utilizando clase de caracteres, se puede definir los identificadores como cadenas generadas por la expresin regular [A-Za-z][A-Za-z0-9]*

Conjuntos no regulares Las expresiones regulares se utilizan para describir un nmero fijo o no especificado de repeticiones de una determinada construccin En general fallan al describir construcciones equilibradas o anidadas Por ejemplo: Conjunto de cadenas con parentesis equilibrados {wcw | w es una cadena de smbolos a y b}

Conjuntos no regulares Para especificar este tipo de conjuntos se utiliza una gramtica independiente (libre) del contexto Para reconocer una cadena de est gramtica se utiliza un autmata de pila (push-down)

Teora de Autmatas La teora de autmatas estudia dispositivos de computo abstractos En la poca de 1930, antes de que existieran las computadoras, Alan Turing inicio el estudio de mquinas abstractas Dichas mquinas tenan todas las capacidades de las computadoras actuales El estudio pretenda describir con precisin lo que estos dispositivos podan y no podan hacer

Teora de Autmatas Las conclusiones obtenidas por Turing aplican no solamente a sus mquinas abstractas (mquinas de Turing), sino a las computadoras de hoy en da Entre 1940 y 1950 se realiz el estudio unas mquinas simples llamadas autmatas finitos (AF) Estos autmatas pretendan modelar el funcionamiento del cerebro Los autmatas se han aplicado en muchas reas de la computacin donde han sido muy til

Aplicaciones de los autmatas1. Software para diseo y verificacin del comportamiento de circuitos digitales 2. Analizador lxico de un compilador tpico 3. Software para analizar grandes cantidades de texto, para encontrar palabras, frases, y otros patrones 4. Software para la verificacin de cualquier tipo de sistema que requiera un nmero finito de estados distintos, por ejemplo, protocolos de comunicacin

Definicin informal de los AF Un AF es un diagrama de transiciones, el cual cuenta con un conjunto de estados definidos La transicin de un estado a otro se realiza como respuesta a una entrada externa

Elementos de una AF Un estado Estado de inicio Estado de aceptacin Una transicina

Ejemplo

Ejemplo

Ejemplo Si se tiene el siguiente alfabeto = {0,1} disear un autmata finito que acepte la cadena 01

Estado de aceptacin Un AF acepta una cadena w si se pueden seguir las etiquetas de los arcos con los smbolos de la cadena w desde el estado de inicio hasta su estado de aceptacin En caso de hacer el seguimiento de los smbolos y no llegar a un estado de aceptacin la cadena no es valida

Autmatas finitos Un AF puede ser determinista (AFD) o no determinista (AFN) El no determinismo se refiere a que un estado puede tener ms de una transicin para el mismo smbolo de entrada Tanto los AFN como los AFD pueden reconocer con precisin los conjuntos regulares, por lo tanto ambos pueden reconocer lo que denotan las expresiones regulares

Autmata finito no deterministaEs un modelo matemtico formado por: 1. Un conjunto de estados S 2. Un conjunto de smbolos de entrada (el alfabeto de los smbolos de entrada) 3. Una funcin de transicin mueve que transforma pares estado-smbolo en conjuntos estados 4. Un estado So que se considera el estado de inicio (o inicial) 5. Un conjunto de estados F considerados como estados de aceptacin (o finales)

Ejemplo de un AFN Autmata que acepta cualquier cantidad de 0s y 1s y termina con un 0

Ejemplo AFN

(a|b)*abb

Ejemplo AFNEn el ejemplo anterior podemos identificar los siguientes elementos del AFN 1. Conjunto de estados S={0,1,2,3} 2. Alfabeto = {a,b} 3. Estado inicial S0=0 4. Conjunto de estados aceptacin F={3}

Tabla de transicionesLa funcin de transicin se puede especificar mediante una tabla de transicionesEstado 0 1 2 Smbolo de entrada a {0, 1} b {0} {2} {3}

Tabla de transiciones La tabla de transiciones es una alternativa sencilla de implementar un autmata En esta tabla existir una fila por cada estado Y una columna por cada smbolo de entrada, incluyendo de ser necesario

Transiciones vacas Los AFN permiten transiciones de Ejemplo:

aa*|bb*

EjerciciosDado el alfabeto ={0,1} disear el autmata que reconozca las siguientes cadenas 1. Cadenas que contengan cualquier cantidad de 0s y 1s y que terminen con la subcadena 00 o 11 2. Cadenas que contengan a la subcadena 010 3. Cadenas que solo contienen una cantidad par de 0s 4. Cadenas que solo contienen una cantidad impar de 1s

Ejercicios1. Todas las cadenas que contienen solo pares consecutivos de 0s o 1s o ambos 2. Todas las cadenas de 0s y 1s que no contienen la subcadena 001 3. Todas las cadenas de 0s y 1s con al menos un nmero par de dgitos 0 consecutivos

Anlisis ejercicio 5En el ejercicio 5 se pueden identificar 4 casos: 1. El nmero de 0s y 1s ledos hasta el momento son pares 2. El nmero de 0s ledos es par, pero el nmero de 1s es impar 3. El nmero de 1s ledos es par, pero el nmero de 0s es impar 4. El nmero de 0s y 1s ledos son impares

EjerciciosConstruir un autmata que reconozca las siguientes cadenas 1. Todas las cadenas de letras que contienen las 5 vocales en orden 2. Comentarios que consisten en una cadena encerrada entre /* y */ sin ningn */ intermedio 3. Todas las cadenas de 0s y 1s con al menos un nmero impar de dgitos 1 consecutivos

Autmata finito deterministaEs un caso especial de un AFN en el cual: Ningn estado tiene una transicin , es decir una transicin con la entrada Para cada estado S y cada smbolo de entrada a, hay a lo sumo una arista etiquetada a que sale de S

Autmata finito determinista Un AFD tiene a lo sumo una transicin desde cada estado con cualquier entrada Cada entrada en la tabla de transiciones es un solo estado Los AFD y los AFN son capaces de reconocer las mismas cadenas Debido a las diferencias entre los AFD y AFN, dos autmatas que reconocen la misma cadena pueden ser distinto (estados y transiciones)

Ejemplo AFD(a|b)*abb

Implementacin del analizador lxico

Aspectos prcticos de la implementacin Principio de mxima longitud Se da prioridad al componente lxico de mxima longitud. Por ejemplo: se interpreta como el operador distinto de, en vez de menor que y mayor que

Aspectos prcticos de la implementacin Palabras reservadas e identificadores El patrn que define a un identificador tambin se aplica a una palabra reservada, por lo tanto antes de determinar el tipo de componente lxico la cadena se busca en una tabla previamente inicializada con las palabras reservadas del lenguaje

Conversin de AFN a AFD

Ejemplo AFD(a|b)*abb

AFN y AFD Los autmatas no deterministas pueden moverse a dos estados distintos leyendo el mismo smbolo Esto produce ambigedad y esta situacin es difcil de simular en un programa de computadora Otro problema que se presenta son las transiciones de cadena vaca, ya que estas permiten estar en varios estados sin leer un smbolo Es ms sencillo convertir un AFN a un AFD que realizar una simulacin de su comportamiento

Conversin de un AFN a AFD La idea general de la transformacin de un AFN a un AFD es que cada estado de un AFD utiliza un estado para localizar todos los posibles estados en los que puede estar el AFN despus de leer los smbolos de entrada

Operaciones para la conversin

Algoritmo (construccin de subconjuntos) Entrada: Un AFN N Salida: Un AFD D que acepta el mismo lenguaje Mtodo: El algoritmo construye una tabla de transiciones tranD para D. Cada estado del AFD es un conjunto de estados del AFN y se construye tranD de modo que D simular en paralelo todos los posibles movimientos que N puede realizar con una cadena de entrada El algoritmo usa las operaciones descritas anteriormente para construir los subconjuntos

AlgoritmoAl inicio, cerradura- (So) es el nico estado dentro de estadosD y no est marcado; mientras haya un estado no marcado T en estadosD hacer marcar T; para cada smbolo de entrada a hacer U := cerradura- (mueve(T,a)); si U no est en estadosD entonces aadir U como estado no marcado a estadosD; tranD[T,a]:=U fin fin

Construccin de estadoDPara construir estadosD y tranD se siguen los siguientes pasos: Cada estado de D corresponde a un conjunto de estados del AFN en los que podra estar N despus de leer alguna secuencia de smbolos de entrada, incluidas todas las transiciones anteriores a la lectura El estado de inicio de D es cerradura-(So) Se aaden los estados y las transiciones a D utilizando el algoritmo anterior Un estado de D es de aceptacin si es un conjunto de estados del AFN que contenga al menos un estado de aceptacin de N

Paso de una ER a un AFN El algoritmo esta dirigido por la sintaxis en el sentido de que utiliza la estructura sintctica de la expresin regular para guiar el proceso de construccin Los casos del algoritmo siguen a los casos de la definicin de una expresin regular Cada paso del algoritmo introduce a lo sumo dos nuevos estados, por lo tanto el AFN resultante tendr a lo ms el doble de estados que smbolos y operadores que hay en la ER

Etapas de anlisis Anlisis lxico: Cules son las palabras del lenguaje?. Las palabras de un lenguaje de programacin reciben el nombre de smbolos o componentes lxicos (tokens) Anlisis sintctico: Cules son las frases del lenguaje?. En un lenguaje de programacin, las frases son los programas bien construidos sintcticamente Anlisis semntico: Qu significa cada frase del lenguaje?. El significado del programa se describe en tminos de lo que ste hace al ser ejecutado

Mtodos para especificar lenguajes

Estructura Lxica Sintctica

Especificacin

Reconocimiento Autmatas finitos deterministas Autmatas de pila Reglas ad-hoc

Expresiones regulares

Gramtica libre de contexto Semntica Semntica formal, lenguaje natural

Gramticas Las gramticas describen lenguajes Los lenguajes naturales son descritos por una gramtica que agrupa palabras en categoras sintcticas tales como sujeto, predicados, verbo, etc. Una gramtica impone una estructura a las sentencias en el lenguaje Una gramtica G, define un lenguaje L(G) mediante la definicin de un mecanismo para derivar todas las cadenas de un lenguaje

Gramticas libres de contexto Una gramtica libre de contexto es un cuarteto G = (V,T,P,S) Donde: V.- Conjunto de Variables T.- Conjunto de Terminales P.- Conjunto de Reglas de Produccin S.- Smbolo inicial de la gramtica

Gramticas libres de contexto Las reglas de produccin son de la forma:

A Donde AVy ( V T ) Para saber si una cadena forma parte de un lenguaje podemos verificar si se puede derivar a partir del smbolo inicial de la gramticaL= { S y T }

Ejemplo La siguiente gramtica describe el lenguaje de todas las cadenas de ceros y unos que son palndromos G = ({A}, {0,1},P,A)A 0A0 A 1A1 A 01

Derivemos la cadena 001100A 0A0 00 A00 001 A 100 001100

Gramtica libre de contexto En 1957 Noam Chomsky empleo una notacin denominada producciones para definir la sintaxis del ingls (tambin aplicable al espaol) Los trminos oracin, frase sustantiva, frase verbal, etc,, ms otras reglas describen un conjunto pequeo oraciones en espaol

|

Ejemplo

Forma Backus-Naur (BNF) El metalenguaje BNF es una forma de especificar lenguajes libres de contexto Fue creado por John Backus y Peter Naur como una forma de describir la sintaxis del lenguaje de programacin Algol

EjemploGramatica para definir una expresin consistente solo en la suma y multiplicacin

aritmtica

::= + | ::= * | ::= () | | ::= | | ::= | ::= A | B | ... | Z ::= 0 | 1 | 2 | ... | 9

Anlizador sintctico El analizador sintctico obtiene una cadena de componentes lxicos del analizador lxico y comprueba si la cadena puede ser generada por la gramtica del lenguaje fuente El analizador sintctico informar de cualquier error de sintaxis Tambin debera recuperarse de los errores que ocurren frecuentemente para poder continuar procesando el resto de la entrada

Programa fuente

Analizador lxico

Componente lxico Obtn el siguiente componente lxico

Analizador sintctico

rbol de anlisis sintctico

Resto de la etapa inicial

Representacin intermedia

Tabla de smbolos

Anlisis sintctico Los mtodos empleados por los compiladores se clasifican generalmente en ascendentes y descendentes Los analizadores sintcticos descentes construyen rboles de anlisis sintctico desde arriba (la raz) hasta abajo (las hojas) Los analizadores sintcticos ascendetes comienzan en las hojas y terminan en la raz En ambos casos, se examina la entrada de izquierda a derecha, un smbolo a la vez

Anlisis sintctico Los mtodos descendentes y ascendentes ms eficientes trabajan slo con subclases de gramticas Varias de estas subclases, como las gramticas LL y LR, son lo suficientemente expresivas para describir la mayoria de las construcciones sintcticas de los lenguajes de programacin

rboles sintcticos y derivaciones De las derivaciones hechas por izquierda y por derecha se puede producir un rbol de anlisis sintctico Este rbol se define como G = (V,T,P,S) y cumple con las siguientes propiedades: Cada nodo tiene una etiqueta La raz tiene etiqueta S La etiqueta de los nodos que no son hojas debe estar en V, y las de las hojas en T Si un nodo n tiene etiqueta A, y los nodos n1, ..., nm son sus hijos (de izquierda a derecha), con etiquetas respectivamnete A1, ..., Am, entonces A A1 ,. . . Am P

rboles sintcticos y derivaciones Al efectuar un recorrido en orden del rbol de derivacin recuperamos la cadena a partir de la cual se construyo dicho rbol De esta forma el problema de analizar una cadena consiste en construir el rbol de derivacin a partir del producto de este

Gramticas ambiguas Es importante sealar que una frase puede generar ms de un rbol de anlisis sintctico Este problema se le denomina gramticas ambiguas Una gramtica es ambigua si produce ms de un rbol de anlisis sintctico para una frase (derivacin izquierda y derecha)

Gramticas ambiguas La mayoria de los compiladores no pueden trabajar con gramticas ambiguas No podran determinar de manera exclusiva que rbol de anlisis sintctico seleccionar para una frase Los compiladores que manejan estas gramticas implementan reglas que desechan rboles de anlisis sintctico indeseables, dejando solo un rbol para cada frase

Ejemplo1. 2. 3. 4. EE + E EE * E Ex EyE x + y * x x +Derivar la cadena: x+y*x

E

E E y * x

Gramticas ambiguas Existen dos formas para evitar las gramticas ambiguas Tranformar la gramtica Establecer precedencias entre operadores y de asociatividad

Gramticas ambiguas La transformacin de la gramtica agrupa todos los operadores de igual precedencia en grupos y asocia a cada uno una regla De esta forma los que tienen menor precedencia aparecen ms cercanos al smbolo de inicio Esto conlleva el aumento de la complejidad y del rbol sintctico generado La gramtica deja de ser intuitiva

Ejemplo1. 2. 3. 4. EE + E EE * E Ex Ey x + (y * x)1.exp exp + term | term 2.term term * factor | factor 3.factor (exp) | x | y

exp exp + term term + term factor + term x + term x + factor x + (exp) x + (term) x + (term * factor) x + (factor * factor) x + (y * factor) x + (y * x)

Anlisis sintctico predictivoLa seleccin de una produccin para un no terminal puede implicar un proceso de prueba y error En caso de que no se pueda generar el rbol que concuerde con la cadena de entrada, se retrocede para hacer otro intento de produccin Un analizador sintctico que no requiere retroceso es el analizador sintctico predictivo

Anlisis sintctico predictivo El anlisis sintctico descendente recursivo es un mtodo descendente en el que se ejecuta un conjunto de procedimientos recursivos para procesar la entrada Una forma especial de este anlisis uno denominado anlisis sintctico predictivo El anlisis sintctico predictivo utiliza un smbolo de preanlisis para determinar sin ambigedad la produccin que genera la cadena deseada

Gramticas recursivas Es posible que una analizador sintctico descendente recursivo entre en un ciclo infinito El problema se presenta con producciones recursivas del tipo expr expr + trmino El smbolo situado ms a la izquierda del lado derecho es el mismo que el no terminal del lado izquierdo de la produccin Debido a que el smbolo de preanlisis cambia solo cuando coincide un terminal del lado derecho y la produccin inicia con el no terminal expr, no se realiza ningn cambio en la entrada entre llamadas recursivas, entrando a un ciclo infinito

Gramticas recursivas Las gramticas pueden ser recursivas por izquierda o por derecha Los analizadores sintcticos requieren que la gramatica este libre de recursividad

Gramticas recursivas por izquierda Una gramtica es recursiva por izquierda si tiene un no terminal A tal que existe una derivacin A A para alguna cadena Ejemplo: AA A A A A A

Algoritmo para eliminar la recursividad izquierda1) Se agrupan las producciones de A en la formaA A 1A 2. ..A m 1 2. .. n

1) Se sustituyen las producciones de A por:A 1 A' 2 A'. . . n A' A' 1 A' 2 A' .. . m A'

Algoritmo para eliminar la recursividad izquierdaA A A A' A' A' A' A A' A' A' |

EjemploEE+T|T TT*F|F F (E) | id E TE' E' +TE' | T FT' T' * F' | F (E) | id

Factorizacin En ocasiones un smbolo no terminal genera ms de una produccin y no esta claro cual es mejor opcin para el anlisis Se pueden reescribir las producciones para retrasar la desicin hasta haber visto lo suficiente de la entrada como para elegir la opcin correcta Esta tcnica se conoce como factorizacin

Factorizacin La factorizacin por izquierda es una transformacin gramatical adecuada para el anlisis sintctico predictivo La factorizacin izquierda ayuda a seleccionar una de varias producciones con prefijo comn

Algoritmo para realizar la factorizacin izquierda Para cada no terminal A, encuentrese el prefijo ms largo comn a dos o ms de sus alternativas

Algoritmo para realizar la factorizacin izquierda Si es decir, existe un prefijo comn no trivial, sustityanse todas las producciones de A, A 1 2. .. n, donde representa todas las alternativas que no comienzan con , por A A'A' 1 2. . . n

Algoritmo para realizar la factorizacin izquierda Esta transformacin se aplica hasta que no haya dos alternativas para un no terminal con un prefijo comn

EjemploA 1 2

A A' A' 1 2

P iE+PiE+PePaE b

P iE+PP'a P eP E b

Anlisis sintctico descendente El anlisis sintctico descendente es un mtodo que intenta encontrar una derivacin por la izquierda para una cadena de entrada El rbol de anlisis sintctico generado por este mtodo es construido desde la raz, creando los nodos del rbol en preorden

EjemploDada la gramtica y la cadena S cAd A aba w=cad

Primero se utiliza el nodo etiquetado como S y un apuntador a la izquierda que apunta a C, el primer smbolo de w Despus se utiliza la primera produccin de S para expandir el rbol

Ejemplo En cada nueva produccin se intentar emparejar la hoja situada ms a la izquierda, con el smbolo apuntado por w Si se encuentra una concordancia entonces se avanza el apuntador al siguiente smbolo de w En caso de que no exista concordancia, se indica el fallo y se regresa al no terminal anterior para verificar si existe otra alternativa de reescritura

EjemploS cAd A abaS c A d c a S A b d c S A a d

Anlisis sintctico predictivo Si se disea una gramtica eliminando su recursin izquierda y factorizando por izquierda se puede obtener una gramtica que puede utilizar un analizador sintctico descendente recursivo que no necesite retroceso Este analizador se conoce como sintctico predictivo

Analizador sintctico predictivo Para construir un analizador sintctico predictivo se debe conocer dado el smbolo actual a de entrada y el no terminal A a expandir, cual de las alternativas de produccin A 1 2. .. n es la nica alternativa que da lugar a una cadena que comience con a

Diagramas de transiciones para analizadores sintcticos predictivos Al igual que existen diagramas de transiciones para un analizador lxico, tambin se puede crear un diagrama de transiciones como plan para un analizador sintctico predictivo

Diagramas de transiciones para analizadores sintcticos predictivos Existen varias diferencias entre los diagramas del analizador lxico y el sintctico En un analizador sintctico existe un diagrama para cada no terminal Las etiquetas de las aristas son componentes lxicos y no terminales

Ejemplo Para cada no terminal se hace los siguiente:1) Crear un estado inicial y un estado final 2) Para cada produccinA x 1x 2. ..x n crear un camino desde el estado inicial al estado final, con aristas etiquetadas con

x 1 ,x 2 ,. . . ,x n

EjemploE TE' E' +TE' | T FT' T' * FT' | F (E) | id id + id

Anlisis sintctico predictivo no recursivo Los algoritmos recursivos generalmente ocupan ms recursos (memoria y procesamiento) que los iterativos Se puede construir un analizador sintctico predictivo no recursivo manteniendo explicitamente una pila, en vez de hacerlo implicitamente con las llamadas recursivas

Anlisis sintctico predictivo no recursivo El problema clave durante el anlisis sintctico predictivo es determinar la produccin que debe aplicarse a un no terminal El analizador sintctico no recursivo busca la produccin que debe aplicarse en una tabla de anlisis sintctico

Modelo del analizador sintctico predictivo no recursivoEntrada

a+b$ Programa para anlisis sintctico predictivo Tabla de anlisis sintctico M

buffer

X Pila Y Z $

Salida

Componentes del analizador sintctico predictivo no recursivo Buffer de entrada: contiene la cadena que se va a analizar, seguida de un smbolo $, un smbolo utilizado como delimitador derecho para inidicar el fin de la cadena de entrada Pila: contiene una secuencia de smbolos gramaticales con $ en la parte de abajo, que indica la base de la pila. Al principio, la pila contiene el smbolo inicial de la gramtica encima de $ Tabla de anlisis sintctico: es una matriz bidimensional M [A, a], donde A es un no terminal, y a es un terminal o el smbolo $

Algoritmo de anlisis sintctico predictivo no recursivo Entrada: una cadena w y una tabla de anlisis sintctico predictivo no recursivo Salida: si w est en L(G), una derivacin por la izquierda de w; de lo contrario una indicacin de error

Apuntaralprimersmbolodew$ Repetir Seaxelsmbolodelacimaenlapilayaelsmboloapuntado Sixesunterminalo$entonces Six=aentonces Extraerxdelapilayavanzaralsiguientesmbolo Sino Error() Sino/*xnoesterminal*/ SiM[x,a]=xy1y2...ykentonces Extraerxdelapila Meteryk,yk1,...,y1enlapila,cony1enlacima Else Error() Finsi Hastax=$/*lapilaestvacia*/

Gramtica: E TE No terminal +TE | E T FT T *FT | F (E) | id

Smbolo de entrada

PILA

ENTRADA

SALIDA

Clculo de conjuntos primero y siguiente Las funciones primero y siguiente, permiten rellenar siempre que sea posible, las entradas de una tabla de anlisis sintctico predictivo Tambin se pueden utilizar los conjuntos de componentes lxicos devueltos por la funcin siguiente como componentes lxicos de sincronizacin durante la recuperacin de errores en modo pnico

Conjunto primero Si es una cadena de smbolos gramaticales, se considera primero () como el conjunto de terminales que inician las cadenas derivadas de Para calcular primero (x) para todos los smbolos gramaticales x, aplquense las reglas siguientes hasta que ya no se puedan agregar terminales o a ningn conjunto primero

Conjunto primero1. 2. 3. Si x es terminal, entonces primero (x) es {x} Si x es una produccin, entonces adase a primero (x) Si x es no terminal entonces se analizan todas las reglas de produccin con x en la izquierda de la forma:

x y 1 y 2 y 3. . . y k donde y k puede ser un terminal o no terminalPara cada produccin realizar las siguientes acciones:

Conjunto primero Aadir primero ( y 1 ) - {} a primero (x) Si est en primero ( y 1 ), entonces aadir primero ( y 2 ) - {} en primero (x) Si est en primero ( y 2 ), entonces aadir primero ( y 3 ) en primero(x) ... Si est en primero ( y i ) para1ik (todas sus producciones del lado derecho) entonces poner dentro de primero (x)

En resumen... Adase a primero ( x 1 x 2 x 3 . . . x)n todos los smbolos distintos de primero ( ) x1 Si est en primero( x ) adase tambin los 1 smbolos distintos de de primero( ) x 2 Si est tanto en primero( ) como en primero( ) x1 x2 adase tambin los smbolos distintos de de primero( ), y as sucesivamente x3 Por ltimo, adase a primero( ) si para x 1 x 2 x 3. . . x n toda i primero( ) contiene

xi

Siguiente Para un no terminal A, siguiente(A) es el conjunto de terminales que pueden aparecer inmediatamente a al derecha de A en alguna derivacin parcial Por ejemplo: El terminal t est en siguiente(A) si s ...At... donde t es un terminal

Siguiente1. 2. Si A es el no terminal inicial, poner $ en siguiente(A) Encontrar las producciones con A en el lado derecho , poner primero Para cada produccin ( ) - {} en siguiente (A) Si est en primero( ) entonces poner x A siguiente(X)en siguiente(A) ,poner siguiente (X) Por cada produccin en siguiente(X) en siguiente(A)

x A

Recuperacin de errores en el anlisis sintctico predictivo Durante el anlisis sintctico predictivo se detecta un error cuando: el terminal de la cima de la pila (tope) no concuerda con el siguiente smbolo de entrada Cuando el no terminal A esta en la cima de la pila, a es el siguiente smbolo de entrada, y la entrada M[A,a] de la tabla de anlisis sintctico est vacia

Recuperacin de errores en el anlisis sintctico predictivo La recuperacin en modo de pnico se basa en la idea de saltarse smbolos de la entrada hasta que aparezca un componente lxico que pertenezca a un conjunto seleccionado de componentes lxicos de sincronizacin

Recuperacin de errores en el anlisis sintctico predictivo Para generar los componentes lxicos de sincronizacin se aplica el siguiente procedimiento: Se colocan todos los smbolos de siguiente (A) dentro del conjunto de sincronizacin para el no terminal A

Si se saltan componentes lxicos hasta encontrar un elemento de siguiente (A) y se saca a A de la pila, es probable que el anlisis sintctico pueda continuar

Ejemplo

No terminal

Smbolo de entrada

Aplicacin del algoritmo Si el analizador sintctico busca la entrada M[A,a] y ve que est en blanco, debe saltarse el smbolo de entrada a Si la entrada es sinc, se saca el no terminal de la cima de la pila para continuar el anlisis Si un componente lxico de la cima de la pila no concuerda con el smbolo de entrada, entonces se saca el componente lxico de la pila, como ya se ha mencionado