Teoría de lenguajes y compiladores

Slides:



Advertisements
Presentaciones similares
ÁRBOLES DE SINTAXIS ÁRBOL grafo dirigido acíclico.
Advertisements

Ejemplo Práctico de un Compilador Pequeño
Análisis Sintáctico Predictivo No Recursivo
Análisis Sintáctico Descendente
INSTITUTO TECNOLÓGICO DE MINATITLÁN
Filminas Segunda semana
Filminas Undécima Semana CI-1322 Autómatas y Compiladores Elaborado por: Sergio Pastrana Espinoza A33888.
Filminas Octava Semana CI-1322 Autómatas y Compiladores Elaborado por: Sergio Pastrana Espinoza A33888.
Compiladores e intérpretes Análisis Sintáctico II
Compiladores e intérpretes Generación de código intermedio II
Compiladores e intérpretes
Compiladores e intérpretes Análisis Sintáctico III
Analizador Sintáctico
Gramáticas Libres de Contexto
Nuestro reto es educar al pensamiento, para que razone de acuerdo a ciertas reglas; con ello podremos ser más eficientes al momento en que ordenamos.
Tema 2.- Gramáticas independientes de contexto.
Estructuras de Decisión I IF - THEN - ELSE
Tema: Decibilidad Integrantes: Ileana Rdguez Soto
Organización de Lenguajes y Compiladores 1
ANALIZADOR SINTACTICO
Analizadores Sintácticos Descendentes Predictivos
Unidad 3. Análisis Sintáctico
Teoría de lenguajes y compiladores
Teoría de Autómatas y Lenguajes Formales Alma María Pisabarro, 2007
Traducción dirigida por la Sintaxis
ANALISIS SINTACTICO DESCENDENTE
Teoría de lenguajes y compiladores
Lógica Temporal. Tablas semánticas.
Tema 3. Optimización de Código
ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como.
Analizador Sintáctico Descendente
Matemáticas Discretas y Algoritmos
Arboles Binarios de expresiones
Tema 2 Lenguajes Formales.
Algoritmos para calcular el Conjunto Primero y el Conjunto Siguiente
Programación de sistemas
Análisis sintáctico LR: SLR (LR simple)
Instituto Tecnologico de Durango Programacion de Sistemas II
DIVISIÓN DE POLINOMIOS 1
Teoría de lenguajes y compiladores
Autómatas de Pila Teoría del Autómata.
ANALISIS SINTACTICO Parte I
Estructura de Datos y Algoritmos
Diseño y análisis de algoritmos
Clasificación de Gramáticas y Manejo de Errores
Teoría de lenguajes y compiladores
Teoría de lenguajes y compiladores
Todo traductor esta basado en una gramática para el lenguaje fuente. Todo traductor esta basado en una gramática para el lenguaje fuente. Una gramática.
Introducción al Análisis Sintáctico
UNIDAD 2. ALGORITMOS Y ESTRUCTURAS DE DATOS.
Teoría de lenguajes y compiladores Analizadores lexicográficos
Planteos Recursivos Resolución de Problemas y Algoritmos
Programación de Sistemas
Compiladores e intérpretes
Teoría de lenguajes y compiladores
ALGORITMOS La palabra algoritmo se deriva de la traducción al latín de la palabra árabe alkhowarizmi, nombre de un matemático y astrónomo árabe que escribió.
Autómatas de Pila (Pushdown Automatón)
Programación de Sistemas FEI – 2008
UNIVERSIDAD LATINA (UNILA)
1 Sebastián Argüello A60490 semana 3 Autómatas y compiladores CI-1322.
Teoría de lenguajes y compiladores
Teoría de lenguajes y compiladores
Teoría de lenguajes y compiladores
Teoría de lenguajes y compiladores
IV. GRAMÁTICAS DISTRIBUIDAS Y TABLAS DE SÍMBOLOS
Semana #8 Kathryn Jones Pérez A Analizadores sintácticos LR Existen tres técnicas para construir tablas de análisis sintáctico LR para una gramática.
Programación de Sistemas
Autómatas y Compiladores Semana 13. Ricardo Vargas Del Valle A35469.
República Bolivariana de Venezuela Ministerio del Poder Popular para la Educación Superior Universidad Valle del Momboy Carvajal, Trujillo Alumnas Luzmila.
Sintaxis y Semántica. S.Takahashi Fases en el proceso de análisis de lenguajes Lexer Parser caracteres tokensrespuesta.
Transcripción de la presentación:

Teoría de lenguajes y compiladores Unidad I Analizador Sintáctico Semana 8 Temas Análisis Sintáctico Descendente

Objetivo General El alumno al finalizar el curso podrá desarrollar aplicaciones que le permitan determinar si una estructura gramatical corresponde a una sentencia valida en la definición de un lenguaje en particular, teniendo en cuenta el contexto sintáctico y semántico. Así mismo estará capacitado para proponer nuevas formas estructurales en la definición de lenguajes de programación.

Objetivos Específicos Diseñar e implementar un analizador lexicográfico. Diseñar e implementar un analizador sintáctico. Diseñar e implementar un analizador semántico.

Objetivos Instruccionales Aplicar el método descendente para la creación de analizadores sintácticos.

Temas Generalidades Gramáticas LL Estrategia descendente recursiva Análisis sintáctico tabular

ANALIZADOR SINTÁCTICO DESCENDENTE Generalidades Se basa en gramáticas LL, construyendo árboles de análisis sintáctico desde arriba (raíz) hasta abajo (hojas). La primera “L” significa que la entrada será leída de izquierda a derecha y la segunda “L” indica derivaciones por la izquierda.

“Estos son los conjuntos llamados PRIMERO y SIGUIENTE” Gramáticas LL Para cada producción de la forma:   A  α1 | α2 | α3 | … | αn Siempre debemos ser capaces de elegir la alternativa correcta para la generación de un árbol de análisis sintáctico. Para cumplir esta regla necesitamos información adicional, a saber: El conjunto de todos los símbolos terminales que pueden aparecer al principio de una frase que puede derivarse de una secuencia arbitraria de símbolos. El conjunto de todos los símbolos terminales que pueden aparecer después de uno no terminal. “Estos son los conjuntos llamados PRIMERO y SIGUIENTE”

CONJUNTO PRIMERO(1) Gramáticas LL Sea G(N,T,P,S) una gramática y α secuencia arbitraria de símbolos, es decir α Є (NUT)*, entonces; Primero(α) = { t / t Є TЄ ^ α  t α ‘} , donde T Є = T U { Є }   Para calcular Primero(X) para todos los símbolos gramaticales X, aplíquense las reglas siguientes hasta que no se puedan añadir mas terminales o Є a ningún conjunto Primero. 1.   Si X es terminal, entonces primero(X) es {X} 2.   Si X  Є es una producción, entonces añadase Є a Primero(X) 3.  a. Si X es no terminal y X  Y1 Y2 … Yk , es una producción, entonces póngase “a” en Primero(X) si para alguna i, “a” esta en Primero(Yi) y Є esta en todos los Primero(Y1)…Primero(Yi-1) ; es decir Y1..Yi-1  Є b. Si Є esta en primero(Yj) para toda i = 1,2,…,k, entonces añadase Є a primero(X). Por ejemplo, todo lo que esta en Primero(Y1) sin duda esta en Primero(X). Si Y1 no deriva a Є, entonces no se añade nada más a Primero(X). Pero si Y1  Є, entonces se le añade Primero(Y2), y así sucesivamente.

CONJUNTO PRIMERO(2) Gramáticas LL Ahora se puede calcular el conjunto Primero para cualquier cadena X1X2…Xn de la siguiente forma: añádase a Primero(X1X2…Xn) todos los símbolos distintos de Є de Primero(X1). Si Є esta en Primero(X1), añádase también los símbolos distintos de Є de Primero(X2); si Є esta tanto en Primero(X1) y Primero(X2) añádanse también los símbolos distintos de Є de Primero(X3) y así sucesivamente. Por ultimo añádase Є a Primero (X1X2…Xn) si para toda i Primero(Xi) contiene Є.

CONJUNTO PRIMERO(3) Gramáticas LL Ejemplo:   Considérese la gramática siguiente: E  TE’ E’  +TE’ | Є T  F T’ T’  *F T’ | Є F  ( E ) | id Entonces : Primero(E) = { ( , id } Primero(E’) = { + , Є } Primero(T) = { ( , id } Primero(T’) = { * , Є } Primero(F) = { ( , id }

CONJUNTO SIGUIENTE(1) Gramáticas LL Sea G(N,T,P,S) una gramática y α secuencia arbitraria de símbolos, es decir α Є (NUT)*, entonces;   Siguiente(X) = { t / t Є TЄ ^ S  α X t β} Para calcular Siguiente(A) para todos los no terminales A, aplíquense las reglas siguientes hasta que no se pueda añadir nada mas a ningún conjunto siguiente. 1. Póngase $ en Siguiente(S), donde S es el símbolo inicial y $ es el delimitador derecho de la entrada. 2. Si hay una producción A  α B β, entonces todo lo que este en Primero(β) excepto Є se pone en Siguiente(B). 3. Si hay una producción A  α B o una producción A  α B β donde Primero(β) contenga Є ( es decir β  Є), entonces todo lo que este en Siguiente(A) se pone en Siguiente(B).

CONJUNTO SIGUIENTE(2) Gramáticas LL Ejemplo: Considerando la gramática anterior: E  TE’ Se determinó que: E’  +TE’ | Є Primero(E) = { ( , id } T  F T’ Primero(E’) = { + , Є } T’  *F T’ | Є Primero(T) = { ( , id } F  ( E ) | id Primero(T’) = { * , Є }   Primero(F) = { ( , id } Entonces: Siguiente(E) = { ) , $ } Regla 1 Regla 2 aplicada a F  ( E )   Siguiente(E’) = { ) , $ } Regla 3 aplicada a E  T E’ Siguiente(T) = { + , ) , $ } Regla 2 aplicada a E’  +TE’ Regla 3 aplicada a E’  +TE’ Siguiente(T’) = { + , ) , $ } Regla 3 aplicada a T  F T’ Siguiente(F) = { + , * , ) , $ } Regla 2 aplicada a T’  *FT’ Regla 3 aplicada a T’  *FT’

GRAMÁTICAS LL(1) Gramáticas LL Una gramática independiente del contexto G(N,T,P,S) se denomina gramática LL(1) si tiene las siguientes características:   C1) Para cada producción A  α1 | α2 | α3 | … | αn Se requiere: Primero(αi) ∩ Primero(αi) = Ø Para todo i <> j C2) si puede derivarse la cadena vacía (Є) de un símbolo no terminal X, Se requiere que: Primero(X) ∩ Siguiente(X) = Ø Una gramática cuya tabla de análisis sintáctico no tiene entradas con definiciones múltiples se define como LL(1). Queda la cuestión de lo que se debe hacer cuando la tabla de análisis sintáctico tiene entradas con múltiples definiciones. Un recurso es transformar la gramática eliminando la recursión por la izquierda y factorizando por la izquierda siempre que sea posible, con la esperanza de producir una gramática para la cual la tabla de análisis sintáctico no tenga entradas con múltiples definiciones. 

GRAMÁTICAS LL(1) Gramáticas LL Ejemplo: Considerar una gramática que permita la generación de frases como:   program declaracion; begin proposicion; end. La gramática G viene dada por: T = { b , d , e , p , s , ; , . } N = { A , X , Y } P = { A  pX X  d ; X | bsYe Y  Є | ; sY S = {A} ¿Es una gramática tipo LL(1)? p = programa d = declaracion b = begin s = proposicion e = end

GRAMÁTICAS LL(1) Gramáticas LL Primero(A) = { p } Siguiente(A) = { $ } Solución: Primero(A) = { p } Siguiente(A) = { $ } Primero(X) = { d , b } Siguiente(X) = { $ } Primero(Y) = { Є , ; } Siguiente(Y) = { e , $ } Luego:   Por C1) Primero(d;X) ∩ Primero(bsYe) = { d } ∩ { b } = Ø Primero(Є) ∩ Primero(;sY) = { Є } ∩ { ; } = Ø Por C2) Primero(Y) ∩ Siguiente(Y) = { Є , ; } ∩ { Є } = Ø Entonces a partir de la definición de LL(1) se concluye que esta gramática es no ambigua y nunca puede ser recursiva izquierda. Esto es obvio ya que una gramática G es ambigua si hay una palabra en L(G) que posea 2 derivaciones por la izquierda (a partir del símbolo inicial). EN CONCLUSION: Las gramáticas LL(1) se usan preferentemente para el análisis sintáctico descendente. 

ESTRUCTURA DE UN ANALIZADOR SINTACTICO DESCENDENTE RECURSIVO Estrategia descendente recursiva Implantación: Se asocia un procedimiento a cada no terminal de la gramática. El árbol sintáctico esta dado implícitamente por la secuencia de llamadas a procedimientos.

ESTRUCTURA DE UN ANALIZADOR SINTACTICO DESCENDENTE RECURSIVO Estrategia descendente recursiva PROGRAM Analizador_sintactico; PROCEDURE Error (…); PROCEDURE N0; PROCEDURE N1; … PROCEDURE Nm; BEGIN Leer_simbolo; N0; END.

s1 s2 sm CORRESPONDENCIA ENTRE GRAFOS SINTACTICOS Y LOS PROGRAMAS Estrategia descendente recursiva REGLA 1: Representación de alternativas. s1 s2 sm IF ch IN PRIMERO(S1) THEN P(S1) ELSE IF ch IN PRIMERO(S2) THEN P(S2) ELSE … IF ch IN PRIMERO(Sm) THEN P(Sm) ELSE Error;

S1 S2 Sn CORRESPONDENCIA ENTRE GRAFOS SINTACTICOS Y LOS PROGRAMAS Estrategia descendente recursiva REGLA 2: Secuencia de llamada a procedimientos. S1 S2 Sn BEGIN P(S1); P(S2); ….; P(S3) END;

S CORRESPONDENCIA ENTRE GRAFOS SINTACTICOS Y LOS PROGRAMAS Estrategia descendente recursiva REGLA 3: Proposición de repetición. S WHILE ch IN PRIMERO(S) DO P(S);

S CORRESPONDENCIA ENTRE GRAFOS SINTACTICOS Y LOS PROGRAMAS Estrategia descendente recursiva REGLA 4: Proposición condicional. S IF ch IN PRIMERO(S) THEN P(S);

S CORRESPONDENCIA ENTRE GRAFOS SINTACTICOS Y LOS PROGRAMAS Estrategia descendente recursiva REGLA 5: Llamada a procedimiento S P(S);

S CORRESPONDENCIA ENTRE GRAFOS SINTACTICOS Y LOS PROGRAMAS Estrategia descendente recursiva REGLA 6: Lectura condicional S IF ch = “t” THEN read(ch) ELSE Error;

CONSTRUCCIÓN DE TABLAS DE ANÁLISIS SINTÁCTICO(1) Análisis Sintáctico Tabular Sea G una gramática ; supóngase que A  α , es una producción con “a” en Primero(α). Entonces, el analizador sintáctico expandirá A por α cuando el símbolo actual de entrada sea “a”.   Algoritmo: Construcción de una tabla de análisis sintáctico predictivo Entrada: Una gramática G Salida: La tabla de análisis sintáctico M Método: Para cada producción A  α de la gramática dense los pasos 2 y 3. Para cada terminal “a” de primero(α) , añádase A  α a M[A,a] a. Si Є esta en Primero(α), añádase A  α a M[A,b] para cada terminal b de Siguiente(A). b. Si Є esta en Primero(α) y $ esta en Siguiente(A), añádase A α a M[A,$] 4. Hágase que cada entrada no definida de M sea error.

CONSTRUCCIÓN DE TABLAS DE ANÁLISIS SINTÁCTICO(2) Análisis Sintáctico Tabular   En la gramática anterior: No Terminal Símbolo de entrada id + * ( ) $ E E  T E’   E’ E’  +TE’ E’  Є T T  F T’ T’ T’  Є T’  *FT’ F F  id F  ( E )  

ANÁLISIS SINTÁCTICO PREDICTIVO NO RECURSIVO(1) Análisis Sintáctico Tabular Algoritmo: Entrada: Una cadena W y una tabla de análisis sintáctico M para la gramática G Salida: Si W esta en L(G) , una derivación por la izquierda de W; de lo contrario una indicación de error. Método: Al principio, el analizador sintáctico esta en una configuración en la que tiene a $S en la pila S, el símbolo inicial de G en el tope y W$ en el buffer de entrada. Apuntar ptr al primer símbolo de W$ Repetir Sea X el símbolo de la cima de la pila y a el símbolo apuntado por ptr Si X es un terminal o $ entonces   Si X = a entonces Extraer X de la pila y avanzar ptr Caso contrario “Error” Si M[X,a] = X  Y1Y2…Yk entoces Extraer X de la pila Meter Yk,Yk-1,…,Y1 en la pila con Y1 en la cima Emitir la producción X  Y1Y2…Yk “Error “ Hasta X = $ /* la pila esta vacia */

ANÁLISIS SINTÁCTICO PREDICTIVO NO RECURSIVO(2)     ANÁLISIS SINTÁCTICO PREDICTIVO NO RECURSIVO(2) Análisis Sintáctico Tabular Ejemplo:   Analizar si: id + id * id es valida para la gramática anteriormente presentada. PILA ENTRADA SALIDA $E id + id * id $   $E’T E  TE’ $E’T’F T  FT’ $E’T’id F  id $E’T’ + id * id $ $E’ T’  Є $E’T+ E’  +TE’ id * id $ * id $ $E’T’F* T’  *FT’ id $ $ E’  Є    

Teoría de lenguajes y compiladores Unidad I Analizador Sintáctico Semana 8 Temas Análisis Sintáctico Descendente